'use strict'; const { CrudService } = require('naf-framework-mongoose/lib/service'); const { BusinessError, ErrorCode } = require('naf-core').Error; const { ObjectId } = require('mongoose').Types; const _ = require('lodash'); const assert = require('assert'); // 首页-数据动态统计 class IndexService extends CrudService { constructor(ctx) { super(ctx, 'index'); this.redis = this.app.redis; this.patentModel = this.ctx.model.Patent; // 专利 this.code = this.ctx.model.Code; // 字典 this.productModel = this.ctx.model.Product; // 产品 this.expertModel = this.ctx.model.Expert; // 专家 this.mechanismModel = this.ctx.model.Mechanism;// 机构 this.orgModel = this.ctx.model.Organization; // 企业 this.policyModel = this.ctx.model.Policy; // 高企政策 this.ticketModel = this.ctx.model.Ticket; // 创新券 } /** * 首页专利统计 */ async patent() { const res = await this.patentModel.aggregate([ { $group: { _id: '$apply_personal', value: { $sum: 1 }, }, }, ]); let arr = []; const other = { name: '其他', value: 0 }; for (const i of res) { const { _id, value } = i; const unitList = this.patentUnitList(); const unit = unitList.find( f => (_id && _id.includes(f.name)) || f.name.includes(_id) ); if (unit) { // 说明是需要单拎出来的数据,现查arr中是否有该单位:有=>数字合并;没有=>创建条目 const { name } = unit; const arrItem = arr.find(f => f.name === name); if (arrItem) { const index = arr.findIndex(f => f.name === name); arr[index] = { name, value: (arrItem.value || 0) + value }; } else { arr.push({ name, value }); } } else { other.value += value; } } arr = _.orderBy(arr, [ 'value' ], [ 'desc' ]); arr.push(other); return arr; } /** * 首页成果统计 */ async product() { const categroy = await this.code.find({ category: '01' }); const condition = { type: '1', status: '2' }; const arr = []; for (const c of categroy) { const { name } = c; const value = await this.productModel.count({ ...condition, field: name, }); arr.push({ value, name }); } return arr; } /** * 统计用户(企业,专家,机构)数量 */ async users() { const org = await this.orgModel.count({ status: '1' }); const expert = await this.expertModel.count({ status: '1' }); const mech = await this.mechanismModel.count({ status: '1' }); const arr = []; arr.push({ name: '企业用户', value: org }); arr.push({ name: '专家用户', value: expert }); arr.push({ name: '机构用户', value: mech }); return arr; } /** * 统计各种数据 */ async data() { // 高企政策服务通过数量 1 const policy = await this.policyModel.count({ status: '1' }); // 创新券领取成果数量 4 const ticket = await this.ticketModel.count({ status: '4' }); // 科技成果成功的数量 6 const product = await this.productModel.count({ status: '6' }); const arr = []; arr.push({ name: '高企政策服务', value: policy }); arr.push({ name: '创新券服务', value: ticket }); arr.push({ name: '科技成果评价服务', value: product }); return arr; } /** * 专利单位列表 */ patentUnitList() { return [ { name: '吉林大学' }, { name: '长春理工大学' }, { name: '东北电力大学' }, { name: '吉林工程技术师范学院' }, { name: '长春工业大学' }, { name: '北华大学' }, { name: '吉林农业大学' }, { name: '吉林师范大学' }, { name: '长春工程学院' }, { name: '吉林建筑大学' }, { name: '通化师范学院' }, { name: '长春大学' }, { name: '东北师范大学' }, { name: '吉林农业科技学院' }, ]; } /** * 创新劵统计 */ async ticket() { const statusList = [ { label: '资质审查中', value: '0' }, { label: '准备订单', value: '1' }, { label: '资质审查失败', value: '-1' }, { label: '待中介审核', value: '2' }, { label: '订单入库', value: '3' }, { label: '信息资料审查失败', value: '-3' }, { label: '高企申报成功', value: '4' }, ]; const res = await this.ctx.model.Ticket.aggregate([ { $group: { _id: '$status', value: { $sum: 1 }, } }, ]); const data = statusList.map(i => { const { label: name, value } = i; const r = res.find(f => f._id === value); const obj = { name, value: 0 }; if (r) obj.value = r.value; return obj; }); // 政策服务 // 高企认定(ticket);奖励兑现(policy);研发补贴(policy) const tcount = await this.ctx.model.Ticket.count(); const jldx = await this.ctx.model.Policy.count({ type: '奖励兑现' }); const yfbt = await this.ctx.model.Policy.count({ type: '研发补贴' }); const ticket = await this.ctx.model.Policy.count({ type: '创新券' }); const arr = []; arr.push({ name: '高企申报', value: tcount }); arr.push({ name: '奖励兑现', value: jldx }); arr.push({ name: '研发补贴', value: yfbt }); arr.push({ name: '创新券', value: ticket }); return { ticket: data, policy: arr }; } } module.exports = IndexService;