Commit 6fe47743 by lixinming

数据看板+基础维护(去掉mysql的模型层)

parent 9375ba2c
...@@ -432,7 +432,7 @@ export async function getInitialTeamList(name:string, member:string, type:number ...@@ -432,7 +432,7 @@ export async function getInitialTeamList(name:string, member:string, type:number
} }
let dataBaseList = await initialTeamData.findEnterpriseInitialTeamsByParamToPage(selectParam, (page-1)*10 ); let dataBaseList = await initialTeamData.findEnterpriseInitialTeamsByParamToPage(selectParam, (page-1)*10 );
let count = await initialTeamData.findEnterpriseInitialTeamsCountByParamToPage(selectParam);
let dataList = []; let dataList = [];
dataBaseList.forEach(info => { dataBaseList.forEach(info => {
let changeData:any = extractData(splitResultConfig.EnterpriseInitialTeamDataListConfig, info, true); let changeData:any = extractData(splitResultConfig.EnterpriseInitialTeamDataListConfig, info, true);
...@@ -443,7 +443,7 @@ export async function getInitialTeamList(name:string, member:string, type:number ...@@ -443,7 +443,7 @@ export async function getInitialTeamList(name:string, member:string, type:number
dataList.push(changeData); dataList.push(changeData);
}); });
return { dataList }; return { dataList, count, pageCount:Math.ceil(count/10) };
} }
......
...@@ -61,7 +61,7 @@ export async function financingList(monthData:string, fuHuaQiName:string, indust ...@@ -61,7 +61,7 @@ export async function financingList(monthData:string, fuHuaQiName:string, indust
dataList.push(changeData); dataList.push(changeData);
}); });
return {count, dataList}; return {count, dataList, pageCount:Math.ceil(count/1) };
} }
...@@ -148,6 +148,7 @@ export async function getEnterpriseFinancing(name:string, financingRounds:number ...@@ -148,6 +148,7 @@ export async function getEnterpriseFinancing(name:string, financingRounds:number
} }
let dataBaseList = await financingInfoData.selectFinancingListByParamsToPage(selectParam, page); let dataBaseList = await financingInfoData.selectFinancingListByParamsToPage(selectParam, page);
let count = await financingInfoData.selectFinancingCountByParamsToPage(selectParam);
let dataList = []; let dataList = [];
dataBaseList.forEach(info => { dataBaseList.forEach(info => {
...@@ -159,7 +160,7 @@ export async function getEnterpriseFinancing(name:string, financingRounds:number ...@@ -159,7 +160,7 @@ export async function getEnterpriseFinancing(name:string, financingRounds:number
dataList.push(changeData); dataList.push(changeData);
}); });
return { dataList }; return { dataList, count, pageCount:Math.ceil(count/10)};
} }
......
/** /**
* 管理后台 数字看板 孵化器看板 主要逻辑 * 管理后台 数字看板 孵化器看板 基本信息 主要逻辑
* 作者:lxm * 作者:lxm
*/ */
import { FUHUASTATE } from "../../../config/enum"; import { GuanWeiHuiChnageFuHuaQiBaseConfig } from "../../../../config/eccParam/admin";
import { ERRORENUM } from "../../../config/errorEnum"; import { OrganizationParamUpdateConfig } from "../../../../config/eccParam/fuHuaQi";
import { StarConfig } from "../../../config/scoreConfig"; import { FUHUAINDUSTRY, FUHUAQILV, INSTITUTIONALNATURE, OPERATIONMODEL, SCOREWAYS } from "../../../../config/enum";
import { findEnterpriseCount, findEnterpriseCountByFuHuaQiUscc } from "../../../data/enterprise/enterprise"; import { ERRORENUM } from "../../../../config/errorEnum";
import { findFuHuaQiByUSCC } from "../../../data/fuHuaQi/fuhuaqi"; import { StarConfig } from "../../../../config/scoreConfig";
import * as i18nRegisterData from "../../../data/fuHuaQi/instituQualify/i18nRegister"; import { findFuHuaQiByUSCC } from "../../../../data/fuHuaQi/fuhuaqi";
import * as zjBeyondLayoutData from "../../../data/fuHuaQi/instituQualify/zjBeyondLayout"; import * as i18nRegisterData from "../../../../data/fuHuaQi/instituQualify/i18nRegister";
import { findMonthTableList } from "../../../data/fuHuaQi/monthTask/monthTable"; import * as zjBeyondLayoutData from "../../../../data/fuHuaQi/instituQualify/zjBeyondLayout";
import * as scoreData from "../../../data/fuHuaQi/score"; import * as scoreData from "../../../../data/fuHuaQi/score";
import { BizError } from "../../../util/bizError"; import { BizError } from "../../../../util/bizError";
import { checkChange } from "../../../../util/piecemeal";
import { eccEnumValue } from "../../../../util/verificationEnum";
import { eccFormParam } from "../../../../util/verificationParam";
import { updateScore } from "../../../mobileFuHuaQi/fuHuaQi/score";
/** /**
* 获取孵化器基本信息 * 获取孵化器基本信息
...@@ -74,10 +78,9 @@ export async function fuHuaQiBaseData(uscc:string) { ...@@ -74,10 +78,9 @@ export async function fuHuaQiBaseData(uscc:string) {
participatingFundCompany: fuHuaQiInfo.isParticipateInPTP ? fuHuaQiInfo.participatingFundCompany : '',//参股基金公司名 participatingFundCompany: fuHuaQiInfo.isParticipateInPTP ? fuHuaQiInfo.participatingFundCompany : '',//参股基金公司名
}; };
return {BaseData, PTPData, ScoreData, FuHuaQiData}; return {baseData:BaseData, PTPData, scoreData:ScoreData, fuHuaQiData:FuHuaQiData};
} }
/** /**
* 根据分数算星数 * 根据分数算星数
* @param socre 分数 * @param socre 分数
...@@ -97,25 +100,38 @@ function starCount(socre:number) { ...@@ -97,25 +100,38 @@ function starCount(socre:number) {
/** /**
* 孵化器运营分析 * 修改孵化器基本信息
* @param uscc * @param uscc
* @param param
*/ */
export async function fuHuaQiOperateStats(uscc:string) { export async function updateFuHuaQiBaseData(uscc:string, param) {
let enterpriseTotal = await findEnterpriseCountByFuHuaQiUscc(uscc); //非迁出企业总数 /**校验表单内容 */
let virtualEnterpriseNum = await findEnterpriseCount({fuHuaQiUscc:uscc, state:FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 eccFormParam("更新孵化器机构信息数据", GuanWeiHuiChnageFuHuaQiBaseConfig, param);
let year = new Date().getFullYear(); /**校验是否符合枚举范围 */
if (param.lv) eccEnumValue("管委会更新孵化器信息", " 孵化器级别 ", FUHUAQILV, param.lv);
let monthTableDataList = await findMonthTableList({uscc, year}); if (param.industry) eccEnumValue("管委会更新孵化器信息", " 领域 ", FUHUAINDUSTRY, param.industry);
monthTableDataList.socre((a, b) => {return a.month - b.month}); if (param.institutionalNature) eccEnumValue("更新孵化器机构信息数据", " 机构性质 ", INSTITUTIONALNATURE, param.institutionalNature);
if (param.operationModel && param.operationModel.length) eccEnumValue("更新孵化器机构信息数据", " 运营模式 ", OPERATIONMODEL, param.operationModel);
//限制企业简介长度
if (param.introduction) {
if (param.introduction.length > 200) throw new BizError(ERRORENUM.字数超过200限制, "更新孵化器机构信息数据 孵化器简介");
}
let monthTableList = []; let baseDataInfo = await findFuHuaQiByUSCC(param.uscc);
monthTableDataList.forEach(info => {
monthTableList.push({month:info.month, value:info.occupancyRate});
});
/**在孵企业行业领域 */ /**赋值内容 */
let changeList = checkChange(param, baseDataInfo);
for (let i = 0; i < changeList.length; i++) {
let key = changeList[i];
if (key == "operationName" || key == "uscc") continue;
baseDataInfo[key] = param[key];
}
await baseDataInfo.save();
/**更新分数 */
await updateScore(param.uscc, SCOREWAYS.我的信息, false);
return {isSuccess:true};
} }
\ No newline at end of file
/**
* 管理后台 数字看板 孵化器看板 运营分析 主要逻辑
* 作者:lxm
*/
import moment = require("moment");
import { ENTERPRISETEAM, FUHUASTATE, INDUSTRY, MOVEOUTTYPE, STATEENUM } from "../../../../config/enum";
import { ENTERPRISENODEENUM, FUHUAQINODEENUM, POINTTYPEENUM } from "../../../../config/pointConfig";
import { findEnterpriseCount, findEnterpriseCountByFuHuaQiUscc, findEnterpriseList } from "../../../../data/enterprise/enterprise";
import { findMonthTableList } from "../../../../data/fuHuaQi/monthTask/monthTable";
import { getPointDataByParam } from "../../../point";
import { findBusinessDataByParam } from "../../../../data/fuHuaQi/quarterTask/businessData";
import { changeEnumValue } from "../../../../util/verificationEnum";
/**
* 孵化器运营分析
* @param uscc
*/
export async function fuHuaQiOperateStats(uscc:string, year:number) {
let enterpriseTotal = await findEnterpriseCountByFuHuaQiUscc(uscc); //非迁出企业总数
let virtualEnterpriseNum = await findEnterpriseCount({fuHuaQiUscc:uscc, state:FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let monthTableDataList = await findMonthTableList({uscc, year});
monthTableDataList.sort((a, b) => {return a.month - b.month});
let czlbhqs = {monthList:[], dataList:[]};
monthTableDataList.forEach(info => {
let {month, occupancyRate} = info;
czlbhqs.monthList.push(month);
czlbhqs.dataList.push(occupancyRate);
});
let zfqyqs = await getFuHuaQiOwnEnterpriseCountStats(uscc, year);
let byqyslbhqs = await getFuHuaQiOwnEnterpriseGraduateCountStats(uscc, year);
let enterpriseIndustryList = await getEnterpriseIndustry(uscc, year);
let businessDbList = await findBusinessDataByParam({fuHuaQiUscc:uscc, draftLock:true, year});
let businessMap = {
TR:{key:"综合收入", count:0},
ROR:{key:"投资收入", count:0},
RR:{key:"租金收入", count:0},
FS:{key:"财政补贴", count:0},
MIS:{key:"其他", count:0}
};
businessDbList.forEach(info => {
let {TR, ROR, RR, FS, MIS } = info;
if ( TR ) businessMap["TR"].count += TR;
if ( ROR ) businessMap["ROR"].count += ROR;
if ( RR ) businessMap["RR"].count += RR;
if ( FS ) businessMap["FS"].count += FS;
if ( MIS ) businessMap["MIS"].count += MIS;
});
let businessList = Object.values(businessMap);
return {enterpriseTotal, virtualEnterpriseNum, zfqyqs, byqyslbhqs, businessList, czlbhqs, enterpriseIndustryList};
}
/**
* 孵化器拥有企业数量趋势
* @param uscc
*/
async function getFuHuaQiOwnEnterpriseCountStats(uscc:string, year:number) {
let dataStartMs = new Date().valueOf();
let dataEndMs = new Date().valueOf();
if (year!= new Date().getFullYear()) {
dataStartMs = new Date(year+"-01-01 00:00:00").valueOf();
dataEndMs = new Date((year+1)+"-01-01 00:00:00").valueOf();
} else {
dataStartMs = new Date(moment().subtract(12, 'months').format("YYYY-MM")+"-01 00:00:00").valueOf();
}
let param = {
uid:uscc,
ct:{"$gt":dataStartMs, "$lt":dataEndMs},
};
let pointDataList = await getPointDataByParam(POINTTYPEENUM.孵化器, FUHUAQINODEENUM.企业状态变化, param);
let distinctMap = {}; //{ month:{ct:xxx, dataInfo:{} } }
/**获取每个月的最后一次改动 */
pointDataList.forEach(info => {
let {p1, ct } = info;
let pointInfo = JSON.parse(p1);
let dataMonth = new Date(ct).getMonth() + 1;
if (!distinctMap[dataMonth]) distinctMap[dataMonth] = {ct, pointInfo};
else if(distinctMap[dataMonth].ct < ct) distinctMap[dataMonth] = {ct, pointInfo};
});
let dataList = [];
for (let monthStr in distinctMap) {
let {ct, pointInfo} = distinctMap[monthStr];
dataList.push({month:monthStr, ct, xn:pointInfo.xn||0, st:pointInfo.st||0 });
}
/**按时间从小到大 */
dataList.sort((a,b) => {return a.ct - b.ct});
let xnData = [];
let stData = [];
let monthData = [];
dataList.forEach(info => {
let {month, xn, st} = info;
monthData.push(month);
xnData.push(xn);
stData.push(st);
});
return {xnData, stData, monthData}
}
/**
* 毕业企业数量变化趋势
* @param uscc
* @param year
* @returns
*/
async function getFuHuaQiOwnEnterpriseGraduateCountStats(uscc:string, year:number) {
let dataStartMs = new Date().valueOf();
let dataEndMs = new Date().valueOf();
if (year!= new Date().getFullYear()) {
dataStartMs = new Date(year+"-01-01 00:00:00").valueOf();
dataEndMs = new Date((year+1)+"-01-01 00:00:00").valueOf();
} else {
dataStartMs = new Date(moment().subtract(12, 'months').format("YYYY-MM")+"-01 00:00:00").valueOf();
}
let param = {
uid:uscc,
ct:{"$gt":dataStartMs, "$lt":dataEndMs},
};
let pointDataList = await getPointDataByParam(POINTTYPEENUM.孵化器, FUHUAQINODEENUM.我的企业_孵化状态, param);
let monthDataMap = {};
pointDataList.forEach(info => {
let { p2, ct } = info;
let { state, moveOutType } = JSON.parse(p2);
let dataMonth = new Date(ct).getMonth() + 1;
if (state == FUHUASTATE.迁出 && moveOutType == MOVEOUTTYPE.毕业迁出) {
if (!monthDataMap[dataMonth]) monthDataMap[dataMonth] = {ct, month:dataMonth, count:0}
monthDataMap[dataMonth].count += 1;
}
});
let dataList = Object.values(monthDataMap);
let monthData = [];
let graduateData = [];
dataList.forEach(info => {
let {month, count}:any = info;
monthData.push(month);
graduateData.push(count)
});
//todo 这缺一个 拟毕业
return {monthData, graduateData};
}
async function getEnterpriseIndustry(uscc:string, year:number) {
/**逻辑:以enterprise数据为基础,如有 基本信息_行业领域 埋点,跟进埋点*/
let enterpriseList = await findEnterpriseList({fuHuaQiUscc:uscc});
let distinctMap = {};
enterpriseList.forEach(info => {
let {uscc, industry} = info;
distinctMap[uscc] = industry;
});
let startTime = new Date(year+'-01-01 00:00:00').valueOf();
let endTime = new Date((year+1)+'-01-01 00:00:00').valueOf();
let pointDataList = await getPointDataByParam(POINTTYPEENUM.企业, ENTERPRISENODEENUM.基本信息_行业领域, {p3:uscc, ct:{"$gt":startTime, "$lt":endTime} });
pointDataList.forEach(info => {
let {uid, p2} = info;
distinctMap[uid] = JSON.stringify(p2 || "[]");
});
let countMap = {};
for (let key in distinctMap) {
distinctMap[key].forEach(industryItem => {
if (!countMap[industryItem]) countMap[industryItem] = 0;
countMap[industryItem] += 1;
})
}
let dataList = [];
for (let key in countMap) {
let name = changeEnumValue(INDUSTRY, parseInt(key));
dataList.push({name, value:countMap[key]});
}
return dataList;
}
\ No newline at end of file
/**
* 管理后台 数字看板 孵化器看板 价值分析 主要逻辑
* 作者:lxm
*/
import { findTeamDataByParams } from "../../../../data/enterprise/quarterTask/team";
import * as i18nRegisterData from "../../../../data/fuHuaQi/instituQualify/i18nRegister";
import * as icrData from "../../../../data/fuHuaQi/instituQualify/icr";
import { findFinancingList } from "../../../../data/fuHuaQi/monthTask/financing";
import { findBusinessDataByParam } from "../../../../data/fuHuaQi/quarterTask/businessData";
export async function getValueStats(uscc) {
const ThisYear = new Date().getFullYear();
let i18nCount = await i18nRegisterData.getCount(uscc);//国际合作/大企业合作机构数
let icrCount = await icrData.getCount(uscc); //大学/科研院所合作机构
let businessData = await findBusinessDataByParam({fuHuaQiUscc:uscc, year:ThisYear });
businessData.sort((a, b)=>{return a.quarter - b.quarter});
let queryDataMap = {
1:{TP:0, member:0},
2:{TP:0, member:0},
3:{TP:0, member:0},
4:{TP:0, member:0}
};
businessData.forEach(info => {
let {quarter, TP} = info;
queryDataMap[quarter].TP = TP;
});
let teamData = await findTeamDataByParams({fuHuaQiUscc:uscc, year:ThisYear });
teamData.forEach(info => {
let { quarter } = info;
let quarterDataCount = 0;
quarterDataCount += info.doctor || 0;//博士
quarterDataCount += info.master || 0;//硕士
quarterDataCount += info.undergraduate || 0;//本科
quarterDataCount += info.juniorCollege || 0;//专科
quarterDataCount += info.other || 0;//其他
queryDataMap[quarter].member += quarterDataCount;
});
let tpList = [];
let jyrsqsList = [];
let queryList = [];
for (let key in queryDataMap) {
queryList.push(parseInt(key));
tpList.push( queryDataMap[key].TP );
jyrsqsList.push( queryDataMap[key].member );
}
/**融资企业数量趋势 */
let startTime = new Date(`${ThisYear}-01-01 00:00:00`).valueOf();
let endTime = new Date(`${ThisYear+1}-01-01 00:00:00`).valueOf();
let financingData = await findFinancingList({fuHuaQiUscc:uscc, timeToObtainInvestment:{"$gt":startTime, "$lt":endTime} });
let financingMap = {};//结构 {month:{distinctKey:0,} }
financingData.forEach(info => {
let { uscc, investmentInstitutionsName, timeToObtainInvestment } = info;
let distinctKey = uscc + investmentInstitutionsName + timeToObtainInvestment;
let month = new Date(timeToObtainInvestment).getMonth() + 1;
if ( !financingMap[month] ) financingMap[month] = {};
financingMap[month][distinctKey] = 1;
});
let rzqyslqs = [];
for (let key in financingMap) {
let count = Object.keys(financingMap[key]);
rzqyslqs.push({
month:parseInt(key),
count
});
}
return { jyrsqs:{jyrsqsList, queryList}, i18nCount, icrCount, rzqyslqs, tpInfo:{tpList, queryList} };
}
/**
* 管理后台 数字看板 孵化器看板 风险预警 主要逻辑
* 作者:lxm
*/
import { FUHUASTATE, TASKTYPEENUM } from "../../../../config/enum";
import { findEnterpriseCount, findEnterpriseList, findEnterpriseListToPage5, findEnterpriseTotalByFuHuaQiUscc } from "../../../../data/enterprise/enterprise";
import { findTaskListByParam } from "../../../../data/fuHuaQi/monthTask/task";
import { changeEnumValue } from "../../../../util/verificationEnum";
/**
* 概览
* @param uscc
* @returns
*/
export async function worningTips(uscc:string) {
let year = new Date().getFullYear();
/**查找孵化器本年未填报 */
let notSubmittedDataList = await findTaskListByParam({fuHuaQiUscc:uscc, year, isSubmit:false});
let notSubmittedList = [];
notSubmittedDataList.forEach(info => {
let {type, month} = info;
notSubmittedList.push({
month:`${month}月份`,
title:`${changeEnumValue(TASKTYPEENUM, type)}`
});
});
let fuHuaQiTaskNotFillingCount = notSubmittedDataList.length;//未填报任务数
/**查找办公地点冲突的企业 */
let enterpriseList = await findEnterpriseList({fuHuaQiUscc:uscc});
let distinctMap = {};
let logonAddressDistinctList = [];
enterpriseList.forEach(info => {
let {uscc, name, logonAddress} = info;
if (logonAddress && logonAddress[3]) {
let addStr = logonAddress[3];
if (!distinctMap[addStr]) distinctMap[addStr] = name;
else {
logonAddressDistinctList.push({name, target:distinctMap[addStr], addStr});
}
}
});
let addConflictCount = logonAddressDistinctList.length;
/**出租率异常 */
let param = {
fuHuaQiUscc:uscc,
state:FUHUASTATE.实体孵化,
leasedArea:0
};
let fuHuaQiLettingRateCoutn = await findEnterpriseCount(param);
return {fuHuaQiTaskNotFillingCount, addConflictCount, fuHuaQiLettingRateCoutn};
}
/**
* 孵化器本年未填报
* @param uscc
* @param page
* @returns
*/
export async function fuHuaQiTaskNotFillingList(uscc:string, page:number) {
let year = new Date().getFullYear();
let notSubmittedDataList = await findTaskListByParam({fuHuaQiUscc:uscc, year, isSubmit:false});
let notSubmittedList = [];
notSubmittedDataList.forEach(info => {
let {type, month} = info;
notSubmittedList.push({
month:`${month}月份`,
title:`${changeEnumValue(TASKTYPEENUM, type)}`
});
});
let dataList = notSubmittedList.splice((page-1)*5, page*5);
let count = notSubmittedDataList.length;
return { count, dataList, pageCount:Math.ceil(count/5)};
}
/**
* 孵化器旗下企业办公地点冲突的企业
* @param uscc
* @param page
*/
export async function fuHuQiAddConflictList(uscc:string, page:number) {
let enterpriseList = await findEnterpriseList({fuHuaQiUscc:uscc});
let distinctMap = {};
let logonAddressDistinctList = [];
enterpriseList.forEach(info => {
let {uscc, name, logonAddress} = info;
if (logonAddress && logonAddress[3]) {
let addStr = logonAddress[3];
if (!distinctMap[addStr]) distinctMap[addStr] = name;
else {
logonAddressDistinctList.push({name, target:distinctMap[addStr], addStr});
}
}
});
let count = logonAddressDistinctList.length;
let dataList = logonAddressDistinctList.splice((page-1)*5, page*5);
return { count, dataList, pageCount:Math.ceil(count/5)};
}
/**
* 孵化器出租率异常
* 实际上只是返回该孵化器下实孵企业孵化面积为0的 2023.8.4需求
* @param uscc
* @param page
*/
export async function fuHuaQiLettingRateList(uscc:string, page:number) {
let param = {
fuHuaQiUscc:uscc,
state:FUHUASTATE.实体孵化,
leasedArea:0
};
let list = await findEnterpriseListToPage5(param, (page-1)*5);
let count = await findEnterpriseCount(param);
let dataList = [];
list.forEach(info => {
let {name, leasedArea} = info;
dataList.push({name, leasedArea, bcos:"租赁面积为0"});
});
return {dataList, count, pageCount:Math.ceil(count/5)};
}
\ No newline at end of file
/**
* 管理后台 数据看板 张江看板 企业信息
*/
import moment = require("moment");
import { ENTERPRISETEAM, FINANCINGROUNDS, FUHUASTATE } from "../../../../config/enum";
import { findEnterpriseCount, statsIntellectualPropertyData } from "../../../../data/enterprise/enterprise";
import { statsEnterpriseFinancing, statsEnterpriseFinancingByTime } from "../../../../data/enterprise/financingInfo";
import { statsBusinessDataByParam } from "../../../../data/enterprise/quarterTask/businessdata";
import { changeEnumValue } from "../../../../util/verificationEnum";
import { statsEnterpriseTeamData } from "../../../../data/enterprise/quarterTask/team";
import { statsEnterpriseInitalTeamsType } from "../../../../data/enterprise/initialTeam";
export async function enterpriseBaseData() {
let dqstqy = findEnterpriseCount({state:FUHUASTATE.实体孵化});//当前实孵企业
let dqxnqy = findEnterpriseCount({state:FUHUASTATE.虚拟孵化});//当前虚拟企业
let businessData = await statsBusinessDataByParam();
let businessDataList = [ //经营数据
{key:"营业收入", count:businessData.BICount}, //营业收入
{key:"研发投入", count:businessData.RDCount}, //研发投入
{key:"纳税", count:businessData.TXPCount} //纳税
];
let intellectualPropertyData = await statsIntellectualPropertyData();
let intellectualPropertyDataList = [//专利数据
{key:"海外专利", count:intellectualPropertyData.alienPatent}, //海外专利
{key:"一类专利", count:intellectualPropertyData.classIPatent}, //一类专利
{key:"二类专利", count:intellectualPropertyData.secondClassPatent} //二类专利
];
let gnylcrCount = 0;//国内一流人才
let gjylcrCount = 0;//国际一流人才
let initalTeamsList = await statsEnterpriseInitalTeamsType();
initalTeamsList.forEach(item => {
if (item._id == ENTERPRISETEAM.国内一流人才) gnylcrCount = item.count;
else if (item._id == ENTERPRISETEAM.国际一流人才) gjylcrCount = item.count;
});
let gnylrczb = Math.round( gjylcrCount/(gjylcrCount + gnylcrCount) *100)/100
let gjylrczb = 1 - gnylrczb;
let initalTeamsData = {gnylrczb, gjylrczb};
let financingRoundsDataList = await statsEnterpriseFinancing();
let financingRoundsList = [];//融资轮次
financingRoundsDataList.forEach(info => {
financingRoundsList.push({
key:changeEnumValue(FINANCINGROUNDS, info._id),
count:info.count
});
});
let financingStatsStartTime = moment().subtract(12, 'months').format("YYYY-MM")+'-01 00:00:00';
let financingStatsList:any = await statsEnterpriseFinancingByTime(new Date(financingStatsStartTime).valueOf());
financingStatsList.sort((a, b) => {return a.ms - b.ms});
let financingTrendList = [];//融资趋势
financingStatsList.forEach(info => {
financingTrendList.push({
month:info.month,
count:info.count
});
});
/**从业人员数 */
let {declarationQuarter, declarationYear} = getDeclarationTime();
let enterpriseTeamData = await statsEnterpriseTeamData(declarationYear, declarationQuarter);
let enterpriseTeamDataList = [//从业人员数
{key:"博士", count:enterpriseTeamData.doctorCount},//博士
{key:"硕士", count:enterpriseTeamData.masterCount},//硕士
{key:"本科", count:enterpriseTeamData.undergraduateCount},//本科
{key:"专科", count:enterpriseTeamData.juniorCollegeCount},//专科
{key:"其他", count:enterpriseTeamData.otherCount},//其他
];
return {dqstqy, dqxnqy}
}
function getDeclarationTime() {
let thisYear = new Date().getFullYear();
let thisQuarter = moment().quarter();//当月填报季度
if ( (thisQuarter - 1) < 1 ) {
thisYear = moment().subtract(1, 'years').year();
thisQuarter = 4;
} else thisQuarter = thisQuarter - 1;
return {declarationYear:thisYear, declarationQuarter:thisQuarter};
}
/**
* 管理后台 -> 数据看板 -> 张江看板 -> 企业风险预警
*/
import moment = require("moment");
import { statsBusinessCount } from "../../../../data/enterprise/quarterTask/businessdata";
import { statsEnterpriseTeamCountByNull } from "../../../../data/enterprise/quarterTask/team";
/**
* 企业预警 概览
*/
export async function enterpriseWarningData() {
let revenueCount = await getBussinessAnomalyCount();//营收数据
let tpxCount = await getEnterpriseTXPAnomalyCount();//纳税异常数
let teamCount = await getTeamAnomalyCount();//团队异常数
return {revenueCount, tpxCount, teamCount};
}
/**
* 营收数据异常
* @param page
* @returns
*/
export async function bussinessAnomaly(page:number) {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let param:any = {"$and":[{BI:0}, {"$or":[{isSubmit:true}, {fhqIsSubmit:true}] }]};
if (declarationQuarter - 1 == 0 ) { /**跨年运算 */
param["$and"].push({
"$or":[
{year:declarationYear, quarter:declarationQuarter},
{year:declarationYear-1, quarter:4}
]
});
} else {
param["$and"].push({year:declarationYear});
param["$and"].push({quarter:{"$gte":declarationQuarter-1}});
}
/**param格式预期 = {"$and":[{"$or":[{},{}] }], {"$or":[{}, {}] }, {}} */
let warnData = await statsBusinessCount(param);
let warnList = [];
warnData.forEach(info => {
warnList.push({name:info._id, bcos:"多次填报为0"});
});
let dataList = warnList.splice((page-1)*5, page*5);
let count = warnList.length;
let pageCount = Math.ceil(count/5);
return {count, pageCount, dataList};
}
async function getBussinessAnomalyCount() {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let param:any = {"$and":[{BI:0}, {"$or":[{isSubmit:true}, {fhqIsSubmit:true}] }]};
if (declarationQuarter - 1 == 0 ) { /**跨年运算 */
param["$and"].push({
"$or":[
{year:declarationYear, quarter:declarationQuarter},
{year:declarationYear-1, quarter:4}
]
});
} else {
param["$and"].push({year:declarationYear});
param["$and"].push({quarter:{"$gte":declarationQuarter-1}});
}
/**param格式预期 = {"$and":[{"$or":[{},{}] }], {"$or":[{}, {}] }, {}} */
let warnData = await statsBusinessCount(param);
return warnData.length;
}
/**
* 企业纳税异常数据
* @returns
*/
export async function enterpriseTXPAnomaly(page:number) {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let param:any = {"$and":[{TXP:0}, {"$or":[{isSubmit:true}, {fhqIsSubmit:true}] }]};
if (declarationQuarter - 1 == 0 ) { /**跨年运算 */
param["$and"].push({
"$or":[
{year:declarationYear, quarter:declarationQuarter},
{year:declarationYear-1, quarter:4}
]
});
} else {
param["$and"].push({year:declarationYear});
param["$and"].push({quarter:{"$gte":declarationQuarter-1}});
}
/**param格式预期 = {"$and":[{"$or":[{},{}] }], {"$or":[{}, {}] }, {}} */
let warnData = await statsBusinessCount(param);
let warnList = [];
warnData.forEach(info => {
warnList.push({name:info._id, bcos:"多次填报为0"});
});
let dataList = warnList.splice((page-1)*5, page*5);
let count = warnList.length;
let pageCount = Math.ceil(count/5);
return {count, pageCount, dataList};
}
async function getEnterpriseTXPAnomalyCount() {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let param:any = {"$and":[{TXP:0}, {"$or":[{isSubmit:true}, {fhqIsSubmit:true}] }]};
if (declarationQuarter - 1 == 0 ) { /**跨年运算 */
param["$and"].push({
"$or":[
{year:declarationYear, quarter:declarationQuarter},
{year:declarationYear-1, quarter:4}
]
});
} else {
param["$and"].push({year:declarationYear});
param["$and"].push({quarter:{"$gte":declarationQuarter-1}});
}
/**param格式预期 = {"$and":[{"$or":[{},{}] }], {"$or":[{}, {}] }, {}} */
let warnData = await statsBusinessCount(param);
return warnData.length;
}
/**
* 团队异常
* @param page
* @returns
*/
export async function teamAnomaly(page:number) {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let list = await statsEnterpriseTeamCountByNull(declarationYear, declarationQuarter);
let rankList = [];
list.forEach(info => {
rankList.push({name:info.name, count:0, bcos:"填报为0" });
});
let dataList = rankList.splice((page-1)*5, page*5);
let count = rankList.length;
let pageCount = Math.ceil(count/5);
return {count, pageCount, dataList};
}
async function getTeamAnomalyCount() {
let {declarationQuarter, declarationYear} = getDeclarationTime();
let list = await statsEnterpriseTeamCountByNull(declarationYear, declarationQuarter);
return list.length;
}
function getDeclarationTime() {
let thisYear = new Date().getFullYear();
let thisQuarter = moment().quarter();//当月填报季度
if ( (thisQuarter - 1) < 1 ) {
thisYear = moment().subtract(1, 'years').year();
thisQuarter = 4;
} else thisQuarter = thisQuarter - 1;
return {declarationYear:thisYear, declarationQuarter:thisQuarter};
}
/**
* 数据看板 张江看板 孵化器信息
*/
import moment = require("moment");
import { FUHUAINDUSTRY, FUHUAQILV, INSTITUTIONALNATURE } from "../../../../config/enum";
import { findFuHuaQiList } from "../../../../data/fuHuaQi/fuhuaqi";
import { changeEnumValue } from "../../../../util/verificationEnum";
import { findMonthTableListCount, statsFuHuaQiMonthDataCount } from "../../../../data/fuHuaQi/monthTask/monthTable";
import { findScoreDataByParam } from "../../../../data/fuHuaQi/score";
export async function fuHuaQiBaseData() {
let fuHuaQiList = await findFuHuaQiList({});
let fuHuaQiCount = 0;
let institutionalNatureMap = {};//用户计算机构性质分布
let logonTimeMap = {//用于计算注册时间分布
"未满1年":{key:"未满1年", count:0},
"1年-2年":{key:"1年-2年", count:0},
"2年-3年":{key:"2年-3年", count:0},
"3年-5年":{key:"3年-5年", count:0},
"5年以上":{key:"5年以上", count:0},
};
let lvMap = {};//用于计算级别分布
let industryMap = {};//用于计算孵化领域
let nameMap = {};
fuHuaQiList.forEach( info => {
let { userState, institutionalNature, logonTime, lv, industry, uscc, operationName } = info;
nameMap[uscc] = operationName;
if (!userState) fuHuaQiCount += 1;
let institutionalStr = changeEnumValue( INSTITUTIONALNATURE, institutionalNature);
if (!institutionalNatureMap[institutionalStr]) institutionalNatureMap[institutionalStr] = {count:0, key:institutionalStr};
institutionalNatureMap[institutionalStr].count += 1;
logonTime = new Date('2023-02-01 00:11:00')
if (logonTime) {
let ago = moment(logonTime).fromNow(true);
if (ago.indexOf('months') > -1) {
logonTimeMap["未满1年"].count += 1;
} else {
if (parseInt(ago) <= 2) logonTimeMap["1年-2年"].count += 1;
else if (parseInt(ago) <= 3)logonTimeMap["2年-3年"].count += 1;
else if (parseInt(ago) <= 5)logonTimeMap["3年-5年"].count += 1;
else logonTimeMap["5年以上"].count += 1;
}
}
if (lv) {
let lvStr = changeEnumValue(FUHUAQILV, lv);
if (!lvMap[lvStr]) lvMap[lvStr] = {key:lvStr, count:0};
lvMap[lvStr].count += 1;
}
if (industry) {
industry.forEach(item => {
let industryStr = changeEnumValue(FUHUAINDUSTRY, item);
if (!industryMap[industryStr]) industryMap[industryStr] = {key:industryStr, count:0};
industryMap[industryStr].count += 1;
});
}
});
let zcsjfb = Object.values(logonTimeMap);//注册时间分布
let jgxzfb = Object.values(institutionalNatureMap); //机构性质分布
let fhqjbfb = Object.values(lvMap);//孵化器级别分布
let fhqlyfb = Object.values(industryMap);//孵化器领域分布
let scoreDataList = await findScoreDataByParam({});
let rankList = [];
scoreDataList.forEach((info) => {
let name = nameMap[info.uscc]
if (!name) return;
let score = Math.ceil(info.startScore+info.myDataScore+info.baseDataScore+info.myEnterpriseScore+info.taskScore);
rankList.push({ name, score });
});
rankList.sort((a, b) => {return a.score - b.socre});
let fhqpfpm = rankList.slice(0, 10);
/**出租率趋势 */
let czlqsInfo = await czlqs();
return {czlqsInfo, fhqpfpm, zcsjfb, jgxzfb, fhqjbfb, fhqlyfb};
}
async function czlqs() {
let dataList = [];
for (let i = 0; i < 6; i++) {
let dataMonth = moment().subtract(6, 'months').month() +1
let dataYear = moment().subtract(6, 'months').year();
let ms = moment().subtract(6, 'months').valueOf();
let dataSum = await statsFuHuaQiMonthDataCount(dataYear, dataMonth);
let dataCount = await findMonthTableListCount({year:dataYear, month:dataMonth, draftLock:true});
dataList.push({avg:Math.ceil((dataSum/dataCount) * 100)/100, month:dataMonth, ms });
}
dataList.sort( (a, b) => {return a.ms-b.ms});
let monthList = [];
let czlList = [];
dataList.forEach(item => {
monthList.push(item.month);
czlList.push(item.avg);
});
return {czlList, monthList};
}
\ No newline at end of file
...@@ -113,8 +113,8 @@ export async function updateEnterpriseBaseInfo(uscc:string, param) { ...@@ -113,8 +113,8 @@ export async function updateEnterpriseBaseInfo(uscc:string, param) {
let enterpriseInfo = await enterpriseData.findEnterpriseByUscc(uscc); let enterpriseInfo = await enterpriseData.findEnterpriseByUscc(uscc);
addPoint(POINTTYPEENUM.企业, uscc, ENTERPRISENODEENUM.基本信息_经营地址, enterpriseInfo.operatingAddress, param.operatingAddress); addPoint(POINTTYPEENUM.企业, uscc, ENTERPRISENODEENUM.基本信息_经营地址, enterpriseInfo.operatingAddress, param.operatingAddress, enterpriseInfo.fuHuaQiUscc);
addPoint(POINTTYPEENUM.企业, uscc, ENTERPRISENODEENUM.基本信息_行业领域, enterpriseInfo.industry, param.industry); addPoint(POINTTYPEENUM.企业, uscc, ENTERPRISENODEENUM.基本信息_行业领域, enterpriseInfo.industry, param.industry, enterpriseInfo.fuHuaQiUscc);
/**修改字段 */ /**修改字段 */
let changeList = checkChange(param, enterpriseInfo); let changeList = checkChange(param, enterpriseInfo);
if ( !changeList.length ) throw new BizError(ERRORENUM.数据无更新, `${param.uscc}数据无更新`); if ( !changeList.length ) throw new BizError(ERRORENUM.数据无更新, `${param.uscc}数据无更新`);
...@@ -124,8 +124,6 @@ export async function updateEnterpriseBaseInfo(uscc:string, param) { ...@@ -124,8 +124,6 @@ export async function updateEnterpriseBaseInfo(uscc:string, param) {
} }
}); });
addPoint
await enterpriseInfo.save(); await enterpriseInfo.save();
return {isSuccess:true}; return {isSuccess:true};
......
...@@ -291,12 +291,8 @@ export async function addTeamInfo(uscc:string, form) { ...@@ -291,12 +291,8 @@ export async function addTeamInfo(uscc:string, form) {
* @param uscc 企业统一信用代码 * @param uscc 企业统一信用代码
*/ */
export async function getTeamInfo(uscc:string) { export async function getTeamInfo(uscc:string) {
//todo 测试注释 后续要放开 v
if (!isInTime()) throw new BizError(ERRORENUM.不在填报范围之内, `${uscc}进行了违规操作`, '在非填报时间调用了回显接口'); if (!isInTime()) throw new BizError(ERRORENUM.不在填报范围之内, `${uscc}进行了违规操作`, '在非填报时间调用了回显接口');
let {declarationQuarter, declarationYear} = getDeclarationTime(); let {declarationQuarter, declarationYear} = getDeclarationTime();
//todo 测试注释 7-15日删除 v
// let declarationQuarter = 1;
// let declarationYear = 2023;
let teamInfo = await teamData.findTeamByUsccAndTime(uscc, declarationYear, declarationQuarter); let teamInfo = await teamData.findTeamByUsccAndTime(uscc, declarationYear, declarationQuarter);
if (!teamInfo || !teamInfo.year) throw new BizError(ERRORENUM.未提交填报数据, `${uscc}进行了违规操作`, '未提交数据就调用了回显接口'); if (!teamInfo || !teamInfo.year) throw new BizError(ERRORENUM.未提交填报数据, `${uscc}进行了违规操作`, '未提交数据就调用了回显接口');
......
...@@ -147,10 +147,10 @@ export async function updatePhysicalInfo(fuHuaQiUscc:string, uscc:string, leased ...@@ -147,10 +147,10 @@ export async function updatePhysicalInfo(fuHuaQiUscc:string, uscc:string, leased
if (changeState) { if (changeState) {
/**企业状态改变埋点 */ /**企业状态改变埋点 */
let xl = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 let xn = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化 let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化
let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化 let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xl, st, qc}, {}); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xn, st, qc}, {});
} }
...@@ -205,10 +205,10 @@ export async function updateVirtualInfo(fuHuaQiUscc:string, uscc:string, virtual ...@@ -205,10 +205,10 @@ export async function updateVirtualInfo(fuHuaQiUscc:string, uscc:string, virtual
await enterpriseInfo.save(); await enterpriseInfo.save();
/**企业状态改变埋点 */ /**企业状态改变埋点 */
let xl = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 let xn = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化 let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化
let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化 let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xl, st, qc}, {}); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xn, st, qc}, {});
return {isUsccess:true}; return {isUsccess:true};
} }
...@@ -285,10 +285,10 @@ export async function updateMoveOutInfo(fuHuaQiUscc:string, uscc:string, moveOu ...@@ -285,10 +285,10 @@ export async function updateMoveOutInfo(fuHuaQiUscc:string, uscc:string, moveOu
await enterpriseInfo.save(); await enterpriseInfo.save();
/**企业状态改变埋点 */ /**企业状态改变埋点 */
let xl = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 let xn = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化 let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化
let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化 let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xl, st, qc}, {}); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xn, st, qc}, {});
return {isUsccess:true}; return {isUsccess:true};
} }
...@@ -399,10 +399,10 @@ export async function replenishMyEnterpriseInPutInfo(fuHuaQiUscc:string, param) ...@@ -399,10 +399,10 @@ export async function replenishMyEnterpriseInPutInfo(fuHuaQiUscc:string, param)
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.我的企业_补录企业, param.uscc, '新迁入' ); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.我的企业_补录企业, param.uscc, '新迁入' );
/**企业状态改变埋点 */ /**企业状态改变埋点 */
let xl = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 let xn = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化 let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化
let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化 let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xl, st, qc}, {}); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xn, st, qc}, {});
return {isSuccess:true}; return {isSuccess:true};
} }
...@@ -433,10 +433,10 @@ export async function replenishMyEnterpriseCreateInfo(fuHuaQiUscc:string, param) ...@@ -433,10 +433,10 @@ export async function replenishMyEnterpriseCreateInfo(fuHuaQiUscc:string, param)
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.我的企业_补录企业, param.uscc, '新注册' ); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.我的企业_补录企业, param.uscc, '新注册' );
/**企业状态改变埋点 */ /**企业状态改变埋点 */
let xl = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化 let xn = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0; //虚拟孵化
let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化 let st = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.实体孵化, draftLock:true}) || 0; //实体孵化
let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化 let qc = await enterpriseData.findEnterpriseCount({fuHuaQiUscc, state:configEnum.FUHUASTATE.迁出, draftLock:true}) || 0; //迁出孵化
addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xl, st, qc}, {}); addPoint(POINTTYPEENUM.孵化器, fuHuaQiUscc, FUHUAQINODEENUM.企业状态变化, {xn, st, qc}, {});
return {isSuccess:true}; return {isSuccess:true};
} }
...@@ -29,7 +29,7 @@ export async function unauditedList(uscc:string, state:number, type:number ) { ...@@ -29,7 +29,7 @@ export async function unauditedList(uscc:string, state:number, type:number ) {
if (state == 2) { //已填报 if (state == 2) { //已填报
query.isSubmit = true; query.isSubmit = true;
} else { //未填报 } else if (state == 3) { //未填报
query.isSubmit = false; query.isSubmit = false;
} }
......
...@@ -199,10 +199,10 @@ export async function updateOrganizationData(uscc:string, param) { ...@@ -199,10 +199,10 @@ export async function updateOrganizationData(uscc:string, param) {
if (!param.operationModelDes) throw new BizError(ERRORENUM.请完善信息, `缺失运营模式描述`); if (!param.operationModelDes) throw new BizError(ERRORENUM.请完善信息, `缺失运营模式描述`);
} }
/**校验是否符合枚举范围 */ /**校验是否符合枚举范围 */
if (param.lv) eccEnumValue("更新孵化器机构信息数据", " 孵化器级别 ", configEnum.FUHUAQILV, param.fuHuaQiInvestmentStyle); if (param.lv) eccEnumValue("更新孵化器机构信息数据", " 孵化器级别 ", configEnum.FUHUAQILV, param.lv);
if (param.industry) eccEnumValue("更新孵化器机构信息数据", " 领域 ", configEnum.FUHUAINDUSTRY, param.fuHuaQiInvestmentStyle); if (param.industry) eccEnumValue("更新孵化器机构信息数据", " 领域 ", configEnum.FUHUAINDUSTRY, param.industry);
if (param.institutionalNature) eccEnumValue("更新孵化器机构信息数据", " 机构性质 ", configEnum.INSTITUTIONALNATURE, param.fuHuaQiInvestmentStyle); if (param.institutionalNature) eccEnumValue("更新孵化器机构信息数据", " 机构性质 ", configEnum.INSTITUTIONALNATURE, param.institutionalNature);
if (param.operationModel && param.operationModel.length) eccEnumValue("更新孵化器机构信息数据", " 运营模式 ", configEnum.OPERATIONMODEL, param.fuHuaQiInvestmentStyle); if (param.operationModel && param.operationModel.length) eccEnumValue("更新孵化器机构信息数据", " 运营模式 ", configEnum.OPERATIONMODEL, param.operationModel);
//限制企业简介长度 //限制企业简介长度
if (param.introduction) { if (param.introduction) {
if (param.introduction.length > 200) throw new BizError(ERRORENUM.字数超过200限制, "更新孵化器机构信息数据 孵化器简介"); if (param.introduction.length > 200) throw new BizError(ERRORENUM.字数超过200限制, "更新孵化器机构信息数据 孵化器简介");
......
...@@ -79,7 +79,9 @@ export async function selectBusiness(uscc:string) { ...@@ -79,7 +79,9 @@ export async function selectBusiness(uscc:string) {
let businessInfo = await findBusinessByTaskId(TaskId); let businessInfo = await findBusinessByTaskId(TaskId);
/**不可以重复创建 */ /**不可以重复创建 */
if ( !businessInfo.isUpdate ) throw new BizError(ERRORENUM.请先填报数据, `孵化器 ${uscc}调用回显接口时经营数据不存在`); if ( !businessInfo.isUpdate ) throw new BizError(ERRORENUM.请先填报数据, `孵化器 ${uscc}调用回显接口时经营数据不存在`);
if ( businessInfo.draftLock ) throw new BizError(ERRORENUM.已提交的数据不能进行操作, `孵化器 ${uscc}尝试 回显 已经提交的经营数据`); let {declarationQuarter, declarationYear} = getDeclarationTime();
if ( businessInfo.quarter != declarationQuarter || businessInfo.year != declarationYear ) throw new BizError(ERRORENUM.已提交的数据不能进行操作, `孵化器 ${uscc}尝试 回显 已经提交的经营数据`);
// if ( businessInfo.draftLock ) throw new BizError(ERRORENUM.已提交的数据不能进行操作, `孵化器 ${uscc}尝试 回显 已经提交的经营数据`);
let businessData = extractData(FuHuaQiBusinessDataInfoConfig, businessInfo, false); let businessData = extractData(FuHuaQiBusinessDataInfoConfig, businessInfo, false);
...@@ -122,7 +124,6 @@ export async function updateBusiness(uscc:string, param) { ...@@ -122,7 +124,6 @@ export async function updateBusiness(uscc:string, param) {
if ( businessInfo.quarter != declarationQuarter || businessInfo.year != declarationYear ) throw new BizError(ERRORENUM.已提交的数据不能进行操作, `孵化器 ${uscc}尝试 修改 已经提交的经营数据`); if ( businessInfo.quarter != declarationQuarter || businessInfo.year != declarationYear ) throw new BizError(ERRORENUM.已提交的数据不能进行操作, `孵化器 ${uscc}尝试 修改 已经提交的经营数据`);
/**更新状态和数据 */ /**更新状态和数据 */
for (let key in param) { for (let key in param) {
businessInfo[key] = param[key]; businessInfo[key] = param[key];
} }
......
...@@ -3,13 +3,14 @@ ...@@ -3,13 +3,14 @@
*/ */
import { ENTERPRISENODEENUM, FUHUAQINODEENUM, POINTTYPEENUM } from "../config/pointConfig"; import { ENTERPRISENODEENUM, FUHUAQINODEENUM, POINTTYPEENUM } from "../config/pointConfig";
import { logError } from "../util/log";
import { post } from "../util/request"; import { post } from "../util/request";
const Sign = "xxxx8901231kldosdjkfsdlk";
export async function addPoint(pointType:number, uid:string, pointId:number, p1, p2?, p3?) { export async function addPoint(pointType:number, uid:string, pointId:number, p1, p2?, p3?) {
let url = 'http://localhost:7078/point/'; let url = 'http://localhost:7078/point/';
let sign = "xxxx8901231kldosdjkfsdlk";
let pointInfo:any = {uid, ct:new Date().valueOf() }; let pointInfo:any = {uid, ct:new Date().valueOf() };
if (pointType == POINTTYPEENUM.企业 ) { if (pointType == POINTTYPEENUM.企业 ) {
...@@ -21,12 +22,12 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1, ...@@ -21,12 +22,12 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1,
if (pointId >= ENTERPRISENODEENUM.经营数据补录_营业收入 && pointId <= ENTERPRISENODEENUM.经营数据补录_纳税) { if (pointId >= ENTERPRISENODEENUM.经营数据补录_营业收入 && pointId <= ENTERPRISENODEENUM.经营数据补录_纳税) {
/**经营数据不必保存旧值 */ /**经营数据不必保存旧值 */
pointInfo.p1 = JSON.stringify(p1); pointInfo.p1 = JSON.stringify(p1);
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} else if (pointId == ENTERPRISENODEENUM.政策速递) { } else if (pointId == ENTERPRISENODEENUM.政策速递) {
pointInfo.p1 = p1; pointInfo.p1 = p1;
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} else if (pointId == ENTERPRISENODEENUM.进入首页) { } else if (pointId == ENTERPRISENODEENUM.进入首页) {
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} else { } else {
/**数组类型 or 对象类型 */ /**数组类型 or 对象类型 */
let oldData; let oldData;
...@@ -45,7 +46,10 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1, ...@@ -45,7 +46,10 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1,
if (oldData != newData) { if (oldData != newData) {
pointInfo.p1 = oldData; pointInfo.p1 = oldData;
pointInfo.p2 = newData; pointInfo.p2 = newData;
post(url, {pointInfo, pointId}, {sign}); if (ENTERPRISENODEENUM.基本信息_经营地址 == pointId || ENTERPRISENODEENUM.基本信息_行业领域 == pointId) {
pointInfo.p3 = p3;
}
post(url, {pointInfo, pointId}, {sign:Sign});
} }
} }
} else { } else {
...@@ -53,9 +57,9 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1, ...@@ -53,9 +57,9 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1,
url += "fuhuaqi/add"; url += "fuhuaqi/add";
if (pointId == FUHUAQINODEENUM.政策速递 ) { if (pointId == FUHUAQINODEENUM.政策速递 ) {
pointInfo.p1 = p1; pointInfo.p1 = p1;
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} else if (pointId == FUHUAQINODEENUM.进入首页) { } else if (pointId == FUHUAQINODEENUM.进入首页) {
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} else { } else {
pointInfo.pid = pointId; pointInfo.pid = pointId;
let oldData; let oldData;
...@@ -78,7 +82,7 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1, ...@@ -78,7 +82,7 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1,
if (oldData != newData) { if (oldData != newData) {
pointInfo.p1 = oldData; pointInfo.p1 = oldData;
pointInfo.p2 = newData; pointInfo.p2 = newData;
post(url, {pointInfo, pointId}, {sign}); post(url, {pointInfo, pointId}, {sign:Sign});
} }
} }
...@@ -87,3 +91,22 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1, ...@@ -87,3 +91,22 @@ export async function addPoint(pointType:number, uid:string, pointId:number, p1,
} }
/**
* 获取埋点数据
* @param type 类型
* @param pointId 埋点id
* @param param 参数
* @returns
*/
export async function getPointDataByParam(type:number, pointId:number, param) {
let url = 'http://localhost:7078/point/query';
let result:any = await post(url, {type, pointId, param}, {sign:Sign});
if (!result.success || result.countDocuments != 200) {
logError(url, "请求失败", JSON.stringify(result) );
console.log(url, "请求失败", JSON.stringify(result));
return [];
}
return result.data || [];
}
\ No newline at end of file
...@@ -16,5 +16,26 @@ export const FuHuaQiUserConfig = { ...@@ -16,5 +16,26 @@ export const FuHuaQiUserConfig = {
uscc:{type:"String" },//营业执照 uscc:{type:"String" },//营业执照
personInChargePhone:{type:"String" },//负责人手机号 personInChargePhone:{type:"String" },//负责人手机号
personInCharge:{type:"String" }//负责人 personInCharge:{type:"String" }//负责人
} };
/**
* 场景: 数据看板管委会修改孵化器信息
*/
export const GuanWeiHuiChnageFuHuaQiBaseConfig = {
name:{type:"String"},// {key:"名称"},
operationName:{type:"String"},// {key:"运营机构名称"},
uscc:{type:"String"},// {key:"统一信用代码"},
incubatedAcreage:{type:"Number"},//在孵面积(㎡)
acreageTotal:{type:"Number"},//孵化器总面积(㎡)
acreagePersonalUse:{type:"Number"},//孵化器自用面积(㎡)
logonTime:{type:"Number"},// {key:"注册时间", changeDate:true},
lv:{type:"Number"},// {key:"孵化器级别"},
identificationTime:{type:"Number"},// {key:"认定时间", changeDate:true},
industry:{type:"[Number]"},// {key:"孵化领域"},
institutionalNature:{type:"Number"},// {key:"机构性质"},
liaison:{type:"String"},// {key:"联系人"},
liaisonPhone:{type:"String"},// {key:"联系电话"},
personInCharge:{type:"String"},// {key:"负责人"},
introduction:{type:"String", notMustHave:true},//孵化器简介
};
\ No newline at end of file
...@@ -457,3 +457,4 @@ export enum CREATEENTERPRISETYPE { ...@@ -457,3 +457,4 @@ export enum CREATEENTERPRISETYPE {
新注册 = 1, 新注册 = 1,
新迁入 新迁入
} }
...@@ -234,10 +234,15 @@ export async function deleteEnterprise(draftId:string) { ...@@ -234,10 +234,15 @@ export async function deleteEnterprise(draftId:string) {
* @param skipCount 跳过数量 * @param skipCount 跳过数量
* @returns [] 孵化器列表 * @returns [] 孵化器列表
*/ */
export async function findEnterpriseListToPage(selectParam, skipCount) { export async function findEnterpriseListToPage(selectParam, skipCount) {
return await enterpriseModel.find(selectParam).skip(skipCount).limit(10); return await enterpriseModel.find(selectParam).skip(skipCount).limit(10);
} }
export async function findEnterpriseListToPage5(selectParam, skipCount) {
return await enterpriseModel.find(selectParam).skip(skipCount).limit(5);
}
/** /**
* 获取符合条件的所有企业 * 获取符合条件的所有企业
...@@ -323,3 +328,32 @@ export async function findStats() { ...@@ -323,3 +328,32 @@ export async function findStats() {
export async function getHighTechEnterpriseByFuHuaQiUsccId(fuHuaQiUscc:string) { export async function getHighTechEnterpriseByFuHuaQiUsccId(fuHuaQiUscc:string) {
return await enterpriseModel.find({"$and":[{"qualification.isHighTech":true}, {"qualification.isZjtx":true}, {fuHuaQiUscc}]}); return await enterpriseModel.find({"$and":[{"qualification.isHighTech":true}, {"qualification.isZjtx":true}, {fuHuaQiUscc}]});
} }
export async function statsIntellectualPropertyData() {
let statsList = enterpriseModel.aggregate([
{"$match":{state:{"$ne":FUHUASTATE.迁出}}},
{"$group":{_id:"stats",
alienPatent:{"$sum":"$intellectualProperty.alienPatent"},//海外专利
classIPatent:{"$sum":"$intellectualProperty.classIPatent"},//一类专利
secondClassPatent:{"$sum":"$intellectualProperty.secondClassPatent"},//二类专利
}}
]);
return statsList[0] ? statsList[0] : {alienPatent:0, classIPatent:0, secondClassPatent:0};
}
export async function statsFHQHaveEnterpriseCount() {
let statsList = enterpriseModel.aggregate([
{"$match":{state:{"$ne":FUHUASTATE.迁出}}},
{"$group":{
_id:"$fuHuaQiUscc",
count:{"$sum":1}
}}
]);
let map = {};
statsList.forEach(info => {
map[info._id] = info.count;
});
return map;
}
\ No newline at end of file
...@@ -75,6 +75,10 @@ export async function selectFinancingListByParamsToPage(param, skipNumber) { ...@@ -75,6 +75,10 @@ export async function selectFinancingListByParamsToPage(param, skipNumber) {
return await financingInfoModel.find(param).skip(skipNumber).limit(10); return await financingInfoModel.find(param).skip(skipNumber).limit(10);
} }
export async function selectFinancingCountByParamsToPage(param) {
return await financingInfoModel.find(param).countDocuments();
}
export async function selectFinancingListByParams(param) { export async function selectFinancingListByParams(param) {
return await financingInfoModel.find(param); return await financingInfoModel.find(param);
} }
...@@ -87,8 +91,10 @@ export async function selectEnterpriseTwoYeasFinancing(uscc:string, startTime:nu ...@@ -87,8 +91,10 @@ export async function selectEnterpriseTwoYeasFinancing(uscc:string, startTime:nu
let data = await financingInfoModel.find(param); let data = await financingInfoModel.find(param);
let distinctMap = {}; let distinctMap = {};
data.forEach(info => { data.forEach(info => {
let { timeToObtainInvestment, investmentInstitutionsName } = info; let { timeToObtainInvestment, investmentInstitutionsName, financingAmount } = info;
let distinctKey = `${timeToObtainInvestment}_${investmentInstitutionsName}`;
if (!distinctMap[distinctKey]) distinctMap[distinctKey] = 0;
distinctMap[distinctKey] += financingAmount;
}); });
let count = 0; let count = 0;
...@@ -96,3 +102,27 @@ export async function selectEnterpriseTwoYeasFinancing(uscc:string, startTime:nu ...@@ -96,3 +102,27 @@ export async function selectEnterpriseTwoYeasFinancing(uscc:string, startTime:nu
return count; return count;
} }
export async function statsEnterpriseFinancing() {
let statsList = await financingInfoModel.aggregate([
{"$group":{_id:"$financingRounds", count:{"$sum":"$financingAmount"} }}
]);
return statsList;
}
export async function statsEnterpriseFinancingByTime(startTimeMs:number) {
let param = { timeToObtainInvestment:{"$gt":startTimeMs} };
let data = await financingInfoModel.find(param);
let dataMap = {};
data.forEach(info => {
let {timeToObtainInvestment, financingAmount} = info;
let month = new Date(timeToObtainInvestment).getMonth() + 1;
if (!dataMap[month]) dataMap[month] = {ms:timeToObtainInvestment, count:0, month};
dataMap[month].count += financingAmount;
});
return Object.values(dataMap);
}
\ No newline at end of file
...@@ -68,6 +68,17 @@ export async function findEnterpriseInitialTeamsByParamToPage(param, skipCount:n ...@@ -68,6 +68,17 @@ export async function findEnterpriseInitialTeamsByParamToPage(param, skipCount:n
return await initialTeamModel.find(param).skip(skipCount).limit(10); return await initialTeamModel.find(param).skip(skipCount).limit(10);
} }
export async function findEnterpriseInitialTeamsCountByParamToPage(param) {
return await initialTeamModel.find(param).countDocuments();
}
export async function findEnterpriseInitialTeamsByParam(param) { export async function findEnterpriseInitialTeamsByParam(param) {
return await initialTeamModel.find(param); return await initialTeamModel.find(param);
} }
export async function statsEnterpriseInitalTeamsType() {
let statsCountList = await initialTeamModel.aggregate([
{"$group":{_id:"$type", count:{"$sum":1} } }
]);
return statsCountList;
}
\ No newline at end of file
...@@ -49,7 +49,6 @@ export async function save(throwError=false) { ...@@ -49,7 +49,6 @@ export async function save(throwError=false) {
*/ */
export async function findBusinessDataByUsccAndYear(uscc:string, year:number) { export async function findBusinessDataByUsccAndYear(uscc:string, year:number) {
return await businessDataModel.find({uscc, year}); return await businessDataModel.find({uscc, year});
} }
export async function findBusinessDataByTimeAndUscc(uscc:string, year:number, quarter:number) { export async function findBusinessDataByTimeAndUscc(uscc:string, year:number, quarter:number) {
...@@ -99,6 +98,8 @@ export async function addManyBusinessData(addList) { ...@@ -99,6 +98,8 @@ export async function addManyBusinessData(addList) {
export async function findBusinessDataCountByTime(year:number, quarter:number) { export async function findBusinessDataCountByTime(year:number, quarter:number) {
return await businessDataModel.find({year, quarter}).countDocuments(); return await businessDataModel.find({year, quarter}).countDocuments();
} }
export async function findBusinessDataByYear(uscc:string, startYear:number, endYear:number) { export async function findBusinessDataByYear(uscc:string, startYear:number, endYear:number) {
let dataList = await businessDataModel.find({"$or":[{year:startYear}, {year:endYear}], uscc}); let dataList = await businessDataModel.find({"$or":[{year:startYear}, {year:endYear}], uscc});
let count = 0; let count = 0;
...@@ -109,3 +110,22 @@ export async function findBusinessDataByYear(uscc:string, startYear:number, endY ...@@ -109,3 +110,22 @@ export async function findBusinessDataByYear(uscc:string, startYear:number, endY
return count; return count;
} }
export async function statsBusinessDataByParam() {
let statsList = await businessDataModel.aggregate([
{"$match":{"$or":[{isSubmit:true}, {fhqIsSubmit:true}]}},
{"$group":{_id:"stats", BICount:{"$sum":"$BI"}, RDCount:{"$sum":"$RD"}, TXPCount:{"$sum":"$TXP"} }}
]);
return statsList.length ? statsList[0] : {BICount:0, RDCount:0, TXPCount:0};
}
export async function statsBusinessCount(param) {
let statsList = await businessDataModel.aggregate([
{"$match":param},
{"$group":{_id:"$name", count:{"$sum":1} }},
{"$match":{count:{"$gt":1}}}
]);
return statsList;
}
...@@ -105,3 +105,50 @@ export async function addTeamData(addInfo) { ...@@ -105,3 +105,50 @@ export async function addTeamData(addInfo) {
export async function addManyTeamData(addList) { export async function addManyTeamData(addList) {
await teamModel.insertMany(addList); await teamModel.insertMany(addList);
} }
export async function statsEnterpriseTeamData(year:number, quarter:number) {
let statsList = await teamModel.aggregate([
{"$match":{year, quarter, draftLock:true}},
{"$group":{
_id:"stats",
doctorCount:{"$sum":"$doctor"},
masterCount:{"$sum":"$master"},
undergraduateCount:{"$sum":"$undergraduate"},
juniorCollegeCount:{"$sum":"$juniorCollege"},
otherCount:{"$sum":"$other"},
}}
]);
return statsList[0] ? statsList[0] : {doctorCount:0, masterCount:0, undergraduateCount:0, juniorCollegeCount:0, otherCount:0};
}
export async function statsEnterTeamDataByFHQ(year:number, quarter:number) {
let statsList = await teamModel.aggregate([
{"$match":{year, quarter, draftLock:true}},
{"$group":{
_id:"$fuHuaQiUscc",
doctorCount:{"$sum":"$doctor"},
masterCount:{"$sum":"$master"},
undergraduateCount:{"$sum":"$undergraduate"},
juniorCollegeCount:{"$sum":"$juniorCollege"},
otherCount:{"$sum":"$other"},
}}
]);
let map = {};
statsList.forEach(info => {
let { doctorCount, masterCount, undergraduateCount, juniorCollegeCount, otherCount } = info;
map[info._id] = doctorCount + masterCount + undergraduateCount + juniorCollegeCount + otherCount;
});
return map;
}
export async function statsEnterpriseTeamCountByNull(year:number, quarter:number) {
let statsList = await teamModel.aggregate([
{"$match":{year, quarter, draftLock:true}},
{"$project":{
name:1, count:[ "$doctor", "$master", "$undergraduate", "$juniorCollege", "$other"]
}},
{"$match":{count:0}},
]);
return statsList;
}
\ No newline at end of file
...@@ -270,3 +270,8 @@ export async function createFuHuaQiToList(fuHuaQiList:object) { ...@@ -270,3 +270,8 @@ export async function createFuHuaQiToList(fuHuaQiList:object) {
export async function findFuHuaQiByBindId(bindId:string) { export async function findFuHuaQiByBindId(bindId:string) {
return await fuHuaQiModel.find({bindId}); return await fuHuaQiModel.find({bindId});
} }
export async function findFuHuaQiFilesDataByParam(param, files) {
return await fuHuaQiModel.find(param, files);
}
\ No newline at end of file
...@@ -86,6 +86,7 @@ export async function findMonthTableListToPage(selectParam:object, skipNum:numbe ...@@ -86,6 +86,7 @@ export async function findMonthTableListToPage(selectParam:object, skipNum:numbe
} }
/** /**
* 查询符合条件的月度任务列表 * 查询符合条件的月度任务列表
* @param selectParam 查询参数 * @param selectParam 查询参数
...@@ -125,3 +126,26 @@ export async function createMonthTableToList(tableList:object) { ...@@ -125,3 +126,26 @@ export async function createMonthTableToList(tableList:object) {
export async function findMonthCount(selectParam) { export async function findMonthCount(selectParam) {
return await monthTableModel.find(selectParam).countDocuments(); return await monthTableModel.find(selectParam).countDocuments();
} }
/**
*
*/
export async function statsFuHuaQiMonthDataCount(year:number, month:number) {
let statsList = await monthTableModel.aggregate([
{"$match":{year, month, draftLock:true}},
{"$group":{_id:"$month", count:{"$sum":"$occupancyRate"} }}
]);
return statsList[0] ? statsList[0].count : 0;
}
/**
* 获取某月填报的最低的出租率
* @param year
* @param month
* @returns
*/
export async function getLowOccupancyRateForMonthData(year:number, month:number) {
return await monthTableModel.find({year, month, draftLock:true}).sort({occupancyRate:1}).limit(5);
}
\ No newline at end of file
...@@ -22,8 +22,8 @@ const fuHuaQiTaskSchema = new Schema({ ...@@ -22,8 +22,8 @@ const fuHuaQiTaskSchema = new Schema({
submitTime:Number,//提交时间 submitTime:Number,//提交时间
// relevanceId:String,//任务关联的表 financing 或 enterprise 的id 弃用 // relevanceId:String,//任务关联的表 financing 或 enterprise 的id 弃用
isSubmit:Boolean,//是否提交 isSubmit:Boolean,//是否提交
month:Number,//数据填报 month:Number,//数据
year:Number,//数据填报年 2.0算分的时候加入的 year:Number,//数据年 2.0算分的时候加入的
submitCount:{type:Number, default:0},//提交数量 默认0 submitCount:{type:Number, default:0},//提交数量 默认0
}); });
...@@ -134,3 +134,18 @@ export async function findTaskCountByParamCount(selectParam) { ...@@ -134,3 +134,18 @@ export async function findTaskCountByParamCount(selectParam) {
export async function updateSubmitCount(taskId:string, type:number, count:number) { export async function updateSubmitCount(taskId:string, type:number, count:number) {
await fuHuaQiTaskModel.updateOne({type, taskId}, {$set:{submitCount:count}}); await fuHuaQiTaskModel.updateOne({type, taskId}, {$set:{submitCount:count}});
} }
/**
* 获取当个月的所有孵化器的填报率
* @param year
* @param month
* @returns
*/
export async function statsFuHuaQiTaskReportingRate(year:number, month:number) {
let statsList = await fuHuaQiTaskModel.aggregate([
{"$match":{year, month, isSubmit:true}},
{"$group":{_id:{uid:"$fuHuaQiUscc", isSubmit:"$isSubmit"}, count:{"$sum":1} } }
]);
return statsList;
}
...@@ -88,3 +88,5 @@ export async function findBusinessDataCountByParam(param) { ...@@ -88,3 +88,5 @@ export async function findBusinessDataCountByParam(param) {
export async function findBusinessDataByParam(param) { export async function findBusinessDataByParam(param) {
return await fuHuaQiBusinessModel.find(param); return await fuHuaQiBusinessModel.find(param);
} }
import { mysqlDB } from "./mysqlInit";
/**
* mysql数据表实体类
*/
export class mySqlTableClass {
file;//字段对象
tableName;//表名
sql;//sql
moreTableSql;//多表sql
constructor(tableName:string, file?, sqlEnum?, moreSqlEnum?) {
this.tableName = tableName;
this.file = file || {};
this.sql = sqlEnum || {};
this.moreTableSql = moreSqlEnum || {};
}
/**
* 查询单表
* @param param 条件参数
* @param res 指定返回
*/
async find(param, res?) {
let sqlStr = 'select ';
if (!res) sqlStr += '* ';
else {
res.forEach((itemStr, index) => {
sqlStr += itemStr;
if (index == res.length - 1) sqlStr += ' ';
else sqlStr += ', ';
});
}
sqlStr += `from ${this.tableName} `;
const KeyLength = Object.keys(param).length;
let valueList = [];
if ( KeyLength > 0) {
sqlStr += 'where ';
let index = 0;
for (let key in param) {
sqlStr += `${key} = ?`;
valueList.push(param[key]);
if (index < KeyLength - 1) sqlStr += ', ';
else sqlStr += ' ';
index += 1;
}
}
return await mysqlDB.selectData(sqlStr, valueList);
}
/**
* 查询单个
* @param param
* @param res
* @returns
*/
async findOne(param, res?) {
let sqlStr = 'select ';
if (!res) sqlStr += '* ';
else {
res.forEach((itemStr, index) => {
sqlStr += itemStr;
if (index == res.length - 1) sqlStr += ' ';
else sqlStr += ', ';
});
}
sqlStr += `from ${this.tableName} `;
const KeyLength = Object.keys(param).length;
let valueList = [];
if ( KeyLength > 0) {
sqlStr += 'where ';
let index = 0;
for (let key in param) {
sqlStr += `${key} = ?`;
valueList.push(param[key]);
if (index < KeyLength - 1) sqlStr += ', ';
else sqlStr += ' ';
index += 1;
}
}
return await mysqlDB.findOne(sqlStr, valueList);
}
/**
* 修改
* @param table
* @param param
* @param contition
* @returns
*/
async update(param:object, contition:object) {
return await mysqlDB.updateData(this.tableName, param, contition);
}
/**
* 删除
* @param paramater
* @returns
*/
async delete(paramater:object) {
return await mysqlDB.deleteData(this.tableName, paramater);
}
/**
* 创建
* @param param
* @returns
*/
async install(param:object) {
return await mysqlDB.createData(this.tableName, param);
}
}
\ No newline at end of file
import * as mysql from 'mysql'
export function createMySqlConnect(host:string, port:number, user:string, password:string, database:string) {
return mysql.createConnection({ host, port, user, password, database });
}
export function createLocatMySql() {
return mysql.createConnection({ host:'127.0.0.1', port:3306, user:'root', password:'root', database:'projectDB', insecureAuth:true });
}
\ No newline at end of file
import { systemConfig } from "../../config/serverConfig";
import { BizError } from "../../util/bizError";
import { createMySqlConnect } from "./mysqlConnect";
let mysqlDB;
export function initMysqlDB() {
// mysqlDB = createMySqlConnect(dbConfig.mysqlHost, dbConfig.mysqlPort, dbConfig.mysqlUser, dbConfig.mysqlPwd, dbConfig.dataBase);
mysqlDB.connect(handleError);
mysqlDB.on('error', handleError);
//自定义方法
bindSqlFunc();
console.log("mysqlDB init success");
}
//断线重连
function handleError(err) {
if (err) {
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
initMysqlDB();
} else {
console.error(err.stack || err);
}
}
}
//绑定方法
function bindSqlFunc() {
mysqlDB.selectData = function(sql, ...param) {
let _this = this;
let paramList = [];
param.forEach(thisStr => {
paramList.push(thisStr);
});
return new Promise( (resolve, reject) => {
_this.query(sql, paramList, (err, results, fields) => {
if (err) throw new BizError(err); //todo要把数据库异常捕捉,并且输出: 逻辑错误
else resolve(results);
});
});
};
mysqlDB.createData = function(table:string, param:object) {
let _this = this;
let sql = `insert into ${table} SET ?`;
return new Promise( (resolve, reject) => {
_this.query(sql, param, (err, results, fields) => {
if (err) throw new BizError(err); //todo要把数据库异常捕捉,并且输出: 逻辑错误
else resolve(results);
});
});
}
mysqlDB.updateData = function(table:string, param:object, contition:object) {
let _this = this;
let sql = `update ${table} set `;
let valueList = [];
let index = 1;
let length = Object.keys(param).length;
for (let key in param) {
sql += ` ${key} = ? `;
if ( index < length ) sql += `,`;
index += 1;
valueList.push(param[key]);
}
length = Object.keys(contition).length;
if (length) {
sql += ` where `;
index = 1;
for (let key in contition) {
sql += ` ${key} = ? `;
if ( index < length ) sql += `and`;
index += 1;
valueList.push(contition[key]);
}
}
return new Promise( (resolve, reject) => {
_this.query(sql, valueList, (err, results, fields) => {
if (err) throw new BizError(err); //todo要把数据库异常捕捉,并且输出: 逻辑错误
else resolve(results);
});
});
}
mysqlDB.findOne = function(sql, ...param) {
let _this = this;
let paramList = [];
param.forEach(thisStr => {
paramList.push(thisStr);
});
return new Promise( (resolve, reject) => {
_this.query(sql, paramList, (err, results, fields) => {
if (err) throw new BizError(err); //todo要把数据库异常捕捉,并且输出: 逻辑错误
else resolve(results[0]);
});
});
};
mysqlDB.deleteData = function(tableName, paramaterInfo) {
let _this = this;
let sql = `DELETE FROM ${tableName} WHERE `;
let index = 1;
let paramList = [];
let length = Object.keys(paramaterInfo).length;
for (let key in paramaterInfo) {
sql += ` ${key} = ? `;
if ( index < length ) sql += `,`;
index += 1;
paramList.push(paramaterInfo[key]);
}
return new Promise( (resolve, reject) => {
_this.query(sql, paramList, (err, results, fields) => {
if (err) throw new BizError(err); //todo要把数据库异常捕捉,并且输出: 逻辑错误
else resolve(results[0]);
});
});
};
}
export {mysqlDB}
\ No newline at end of file
...@@ -20,7 +20,6 @@ async function lanuch() { ...@@ -20,7 +20,6 @@ async function lanuch() {
httpServer.createServer(systemConfig.port); httpServer.createServer(systemConfig.port);
// await smsTask(); // await smsTask();
console.log('This indicates that the server is started successfully.'); console.log('This indicates that the server is started successfully.');
} }
......
/**
* 企业信息表
* draftLock 草稿锁 当任务提交的时候,将此字段改为true
*/
import { mySqlTableClass } from "../../db/mysql/mysqlClass";
/**表结构 */
const TableConfig = {
name:"string",//企业名称
taskId:"string",//绑定的任务id
uscc:"string",//统一信用代码
fuHuaQiUscc:"string",//孵化器统一信用代码
industry:"string",//领域 逗号隔开
logonTime:"date",//注册时间
firstIncubationTime:"date",//首次入孵时间
timeOfImmigration:"date",//迁入时间
isNaturalPersonHolding:"boolean",//是否自然人控股企业
oldLogonAdd:"string",//迁入前注册地址
logonAdd:"string",//注册地址
operatingAdd:"string",//经营地址
leasedArea:"number",//租赁面积(平方米)
draftLock:"boolean",//草稿锁,true为提交之后,false为草稿 默认=false
createTime:"date"//录入时间
// isPhysicalPresence:boolean//是否实地孵化 暂时弃用
}
/**sql */
enum SQLENUM {
}
/**多表sql */
enum MORETABLESQLENUM {
}
let enterpriseModel;
export function initModel() {
enterpriseModel = new mySqlTableClass("enterprise", TableConfig, SQLENUM, MORETABLESQLENUM);
}
/**
* 企业投资信息表
* draftLock 草稿锁 当任务提交的时候,将此字段改为true
* 一个企业在一个月只能录入一个融资数据 2023-02-07 确定此需求
*/
import { mySqlTableClass } from "../../db/mysql/mysqlClass";
/**表结构 */
const TableConfig = {
uscc:"string",//融资企业统一信用代码 冗余字段
fuHuaQiUscc:"string",//孵化器统一信用代码 冗余字段
name:"string",//企业名称
taskId:"string", //任务id
logonAdd:"string",//注册地址
operatingAdd:"string",//经营地址
financingAmount:"number",//融资金额(万元)
investmentInstitutionsName:"string",//投资机构名称
timeToObtainInvestment:"date",//获得投资时间
fuHuaQiInvestment:"boolean", //孵化器是否投资
fuHuaQiInvestmentAmount:"number",//孵化器投资金额(万元)
fuHuaQiInvestmentStyle:"number",//孵化器投资方式
draftLock:"boolean", //草稿锁,true为提交之后,false为草稿
createTime:"date",//录入时间
industry:"string",//领域
}
/**sql */
enum SQLENUM {
}
/**多表sql */
enum MORETABLESQLENUM {
}
let financingModel;
export function initModel() {
financingModel = new mySqlTableClass("financing", TableConfig, SQLENUM, MORETABLESQLENUM);
}
/**
* 孵化器信息表
* operationName不可修改 2023-02-06 确定此需求
* uscc不可修改 2023-02-06 确定此需求
* 首次登录要求改密码 不改密码不能继续操作 2023-02-07 确定此需求
* 管理后台列表页面一页展示10条 2023-02-08 确定此需求
* 孵化器账号不能被删除 只能被禁用 2023-02-08 确定此需求
*/
import { mySqlTableClass } from "../../db/mysql/mysqlClass";
/**表结构 */
const TableConfig = {
name:'string',//名称
operationName:'string',//运营机构名称 不可修改
uscc:'string',//统一信用代码 也是登录账号 不可修改
virtualEnterpriseNum:'number',//虚拟企业数量
logonTime:'number',//注册时间
incubatedAcreage:'number',//在孵面积(㎡)
acreageTotal:'number',//孵化器总面积(㎡)
acreagePersonalUse:'number',//孵化器自用面积(㎡)
lv:'number',//孵化器级别
identificationTime:'number',//认定时间
industry:'string',//孵化领域
institutionalNature:'number',//机构性质
liaison:'string',//联系人
liaisonPhone:'string',//联系电话
personInCharge:'string',//负责人
personInChargePhone:'string',//负责人联系电话
// hatchingGround:{type:[hatchingGroundSchema], default:[] },//经备案孵化场地
/**登录相关 */
pwd:'string',//登录密码
token:'string',
tokenMs:'number',
firstLoginIsChangePwd:'boolean',//首次登录是否修改密码
createTime:'number',
userState:'boolean' //是否禁用
}
/**sql */
enum SQLENUM {
}
/**多表sql */
enum MORETABLESQLENUM {
}
let financingModel;
export function initModel() {
financingModel = new mySqlTableClass("fuhuaqi", TableConfig, SQLENUM, MORETABLESQLENUM);
}
/**
* 孵化器月度填报表
* draftLock 草稿锁 当任务提交的时候,将此字段改为true
* occupancyRate 取%号前的数据 例如 填报数据为80% 库中数据为80
* name 为系统生成 此月填报上一月内容 即2月填报时 name中月份为1月 2023-02-06 确定此需求
*
*/
import { mySqlTableClass } from "../../db/mysql/mysqlClass";
/**表结构 */
const TableConfig = {
taskId:{type:String, index:true},//任务id
name:String,//任务名称
fuHuaQiUscc:String,//任务所属孵化器id
occupancyRate:Number,//出租率 单位为%
createTime:Number,//创建时间
/**不下发字段 */
draftLock:{type:Boolean, default:false},//草稿锁,true为提交之后,false为草稿
}
/**sql */
enum SQLENUM {
}
/**多表sql */
enum MORETABLESQLENUM {
}
let financingModel;
export function initModel() {
financingModel = new mySqlTableClass("monthTable", TableConfig, SQLENUM, MORETABLESQLENUM);
}
export async function createMonthTableToList(fuHuaQiList:object) {
await financingModel.insertMany(fuHuaQiList);
}
\ No newline at end of file
...@@ -22,6 +22,7 @@ import * as adminTaskRouters from './admin/task'; ...@@ -22,6 +22,7 @@ import * as adminTaskRouters from './admin/task';
import * as informationRouters from './admin/information'; import * as informationRouters from './admin/information';
import * as instituQualifyRouters from './admin/instituQualify'; import * as instituQualifyRouters from './admin/instituQualify';
import * as dataMaintenanceRouters from './admin/dataMaintenance'; import * as dataMaintenanceRouters from './admin/dataMaintenance';
import * as statsRouters from './admin/stats';
import * as provideRouters from './provide'; import * as provideRouters from './provide';
...@@ -60,6 +61,7 @@ export function setRouter(httpServer){ ...@@ -60,6 +61,7 @@ export function setRouter(httpServer){
filesRouters.setRouter(httpServer); filesRouters.setRouter(httpServer);
instituQualifyRouters.setRouter(httpServer); instituQualifyRouters.setRouter(httpServer);
dataMaintenanceRouters.setRouter(httpServer); dataMaintenanceRouters.setRouter(httpServer);
statsRouters.setRouter(httpServer);
/**系统维护 入口路由 */ /**系统维护 入口路由 */
provideRouters.setRouter(httpServer); provideRouters.setRouter(httpServer);
......
...@@ -41,7 +41,7 @@ export function eccFormParam(name:string, keyTypeConf:object, param:object) { ...@@ -41,7 +41,7 @@ export function eccFormParam(name:string, keyTypeConf:object, param:object) {
isError = true; isError = true;
} else { } else {
if ((""+param[key]).indexOf('.') > -1) { if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *100}`)/100; param[key] = parseInt(`${param[key] *1000}`)/1000;
} }
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment