Commit 342957fb by chenjinjing

no message

parent eb85f2cf
......@@ -168,13 +168,8 @@ export async function getOperateData(year) {
"毕业企业数变化趋势": {
"毕业企业": []
},
// "出租率变化趋势": [],//换成在孵企业面积变化趋势
// "在孵企业面积变化趋势":{
// "在孵面积":[]
// },
"企业需求新增趋势": [],
"在孵企业行业领域": [],
"在孵企业学历分布": []
// "孵化器收入": []
};
let qushiConf = { "01": 0, "02": 0, "03": 0, "04": 0, "05": 0, "06": 0, "07": 0, "08": 0, "09": 0, "10": 0, "11": 0, "12": 0 };
......@@ -185,7 +180,6 @@ export async function getOperateData(year) {
state: { "%notIn%": [FUHUASTATE.迁出] }
};
let zaifuList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业孵化信息, zaifuParam, {});
operateData.当前在孵企业数 = zaifuList.length;
......@@ -234,17 +228,6 @@ export async function getOperateData(year) {
// .sort((a, b) => a.key - b.key);
.sort((a, b) => parseInt(a.key) - parseInt(b.key));
/**出租率 */
// let chuzulvParam = {startTime:{"%lt%":yearTime}, endTime:{"%gt%":yearTime}};
// // let chuzulvList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME., chuzulvParam);
// let chuzulvInfo = qushiConf;
// for(let key in chuzulvInfo) {
// operateData.出租率变化趋势.push({key, value:chuzulvInfo[key].toString()});
// }
// //X轴排序
// operateData.出租率变化趋势.sort( (a, b) => {
// return a.key - b.key;
// })
/**在孵企业租赁面积 */
let araeParam = { column: ["area", "building", "roomNumber", "rent"], where: {} };
let zaifuTableInfo: any = {};
......@@ -256,33 +239,6 @@ export async function getOperateData(year) {
// zaifuTableInfo[TABLENAME.参保记录] = { column: ["zhuanKe", "benKe", "shuoshi", "boShi", "boshiyishang", "qiTa"], where: {} };
let zaifuResList = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.企业基础信息表, {}, ["eId", "industry"], zaifuTableInfo);
// // 新增:在孵企业面积变化趋势
// let zaifuAreaTrend = { ...qushiConf }; // 初始化每月累计面积为0
// zaifuResList.forEach(info => {
// info.enterprise_leases.forEach(lease => {
// let leaseEndTime = moment(lease.endTime);
// let year = leaseEndTime.format("YYYY");
// let month = leaseEndTime.format("MM");
// if (year === moment(yearTime).format("YYYY")) {
// zaifuAreaTrend[month] += parseFloat(lease.area);
// }
// });
// });
// // 转换为数组并排序
// for (let key in zaifuAreaTrend) {
// operateData.在孵企业面积变化趋势.在孵面积.push({ key, value: zaifuAreaTrend[key].toString() });
// }
// operateData.在孵企业面积变化趋势.在孵面积.sort((a, b) => parseInt(a.key) - parseInt(b.key));
/**在孵企业行业领域 */
// let araeParam = { column: ["area", "unitPrice", "roomNumber", "rent"], where: {} };
//将 industry 字符串转换为数组
zaifuResList.forEach(info => {
if (info.industry) {
......@@ -312,192 +268,45 @@ export async function getOperateData(year) {
}
/**在孵企业学历分布(参保记录) */
let educationDistribution = {};
for (let key in DEGREE) {
if (!isNaN(Number(key))) continue; // 跳过数字键
educationDistribution[key] = 0;
}
/**企业需求新增趋势 */
//获取所有企业服务表联查企业信息表 applyTime:申请服务时间
let 企业服务dbList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业服务表, {applyTime: { "%lt%": yearTime }}, null);
// 新增:统一统计每个月的数据
let xuqiuInfo = { ...qushiConf }; // 初始化每月数据为0
企业服务dbList.forEach(info => {
let applyTime = info.applyTime;
if (!applyTime) return;
let canbaoYear = moment(yearTime).format("YYYY");
let canbaoList = await selectData(OPERATIONALDATATYPE.查询多个,TABLENAME.参保记录,{ annual: canbaoYear },null);
let year = moment(applyTime).format("YYYY");
let month = moment(applyTime).format("MM");
canbaoList.forEach(cb => {
if (cb.zhuanKe) educationDistribution["专科"] += parseInt(cb.zhuanKe);
if (cb.benKe) educationDistribution["本科"] += parseInt(cb.benKe);
if (cb.shuoshi) educationDistribution["硕士"] += parseInt(cb.shuoshi);
if (cb.boShi) educationDistribution["博士"] += parseInt(cb.boShi);
if (cb.boshiyishang) educationDistribution["博士以上"] += parseInt(cb.boshiyishang);
if (cb.qiTa) educationDistribution["其他"] += parseInt(cb.qiTa);
if (year === moment(yearTime).format("YYYY")) {
xuqiuInfo[month] += 1;
}
});
// 转换为数组并推入 operateData
operateData.在孵企业学历分布 = Object.entries(educationDistribution).map(([key, value]) => ({
key,
value: value.toString()
}));
// /**孵化器收入 */
// for (let key in INCOME) {
// let anyKey: any = key;
// if (isNaN(anyKey)) {
// operateData.孵化器收入.push({ key: anyKey, value: 0 });
// }
// }
operateData.企业需求新增趋势 = Object.keys(xuqiuInfo)
.map(key => ({ key, value: xuqiuInfo[key].toString() }))
.sort((a, b) => parseInt(a.key) - parseInt(b.key));
// for(let i = 0; i < month.length; i++) {
// let fuwuMonth = 0;
// 企业服务dbList.forEach(info => {
// // 检查企业申请时间的月份是否与当前月份相同
// let parsedStartTime = moment(info.applyTime); // 获取企业申请时间
// if (parsedStartTime.isValid() && moment(parsedStartTime).format("YY/MM") === month[i]) {
// fuwuMonth += 1;
// }
// })
// qyxqfw.dataList.push({key:month[i], value:fuwuMonth});
// }
return { operateData };
}
/**
* 风险预警
* 暂未接入数据库数据
*/
// export async function getRiskData() {
// let riskData = [
// {
// key:"出租率异常",
// value:0
// },
// {
// key:"办公地址冲突",
// value:0
// },
// {
// key:"连续未填报",
// value:0
// },
// ]
// return riskData;
// }
// export async function getRiskData() {
// let riskData = [
// {
// key: "迁出异常",
// value: 0
// },
// {
// key: "办公地址冲突",
// value: 0
// },
// {
// key: "连续未填报",
// value: 0
// },
// ];
// let bgdzctTable = {headerList:["", "", ""]}
// // 1. 获取所有迁出记录(state 为迁出)
// let zaifuList = await selectManyTableData(OPERATIONALDATATYPE.多表联查,TABLENAME.企业基础信息表,{},["eId", "enterpriseName"],
// {
// [TABLENAME.企业孵化信息]: {
// column: ["state", "moveOutTime", "moveOutType", "endTime"],
// where: { state: FUHUASTATE.迁出 }
// }
// }
// );
// let abnormalCount = 0;
// for (const info of zaifuList) {
// const incubationInfo = info.enterprise_fuhuas[0]; // 关联的孵化信息
// if (!incubationInfo || !incubationInfo.moveOutTime) continue;
// let moveOutTime = new Date(incubationInfo.moveOutTime);
// let endTime = info.enterprise_fuhuas[0].endTime ? new Date(info.enterprise_fuhuas[0].endTime) : null;
// // 1. 违约迁出
// let isBreachExit = incubationInfo.moveOutType === EMIGRATIONTYPE.违约退租;
// // 2. 未到期迁出(迁出早于孵化结束)
// let isEarlyExit = endTime && moveOutTime < endTime;
// // 如果满足任一异常条件,计为异常
// if (isBreachExit || isEarlyExit) {
// abnormalCount++;
// }
// }
// riskData[0].value = abnormalCount;
// // 2. 办公地址冲突(楼号 + 室号 + 时间段冲突)
// let 企业基础信息includeConf = {};
// 企业基础信息includeConf[TABLENAME.企业基础信息表] = { cloum: ["enterpriseName"], where: {} }
// let leaseList = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.租赁信息, {}, ["eId", "building", "roomNumber", "startTime", "endTime"], 企业基础信息includeConf);
// // let leaseList = await selectData(OPERATIONALDATATYPE.查询多个,TABLENAME.租赁信息,{},["eId", "building", "roomNumber", "startTime", "endTime"]);
// // 构建一个 map,key 是 building_roomNumber:楼号_室号,值是租赁时间段列表
// let addressMap = new Map<string, Array<{ eId: number; enterpriseName:string; start: Date; end: Date }>>();
// for (const lease of leaseList) {
// const key = `${lease.building}_${lease.roomNumber}`;
// const timeRange = {
// eId: lease.eId,
// enterpriseName: lease.enterprise.enterpriseName,
// start: new Date(lease.startTime),
// end: new Date(lease.endTime)
// };
// if (!addressMap.has(key)) {
// addressMap.set(key, []);
// }
// addressMap.get(key)?.push(timeRange);
// }
// let conflictCount = 0;
// let conflictList = [];
// // 遍历每个地址组合,检查时间段是否有重叠
// for (const [key, ranges] of addressMap.entries()) {
// for (let i = 0; i < ranges.length; i++) {
// for (let j = i + 1; j < ranges.length; j++) {
// const a = ranges[i];
// const b = ranges[j];
// // 判断时间段是否重叠
// if (a.start < b.end && b.start < a.end) {
// conflictCount++;
// conflictList.push([a.enterpriseName, b.enterpriseName, "同时间段内,地址相同"])
// break; // 当前地址组合已冲突,跳出循环
// }
// }
// }
// }
// riskData[1].value = conflictCount;
// // 3. 连续未填报(改进:在孵企业中没有任何经营数据)
// let selectParam = {state:STATE.是};
// /**在孵企业 当前时间小于孵化结束时间 */
// let araeParam = {column:["area", "unitPrice", "roomNumber", "rent", "startTime", "endTime"], where:{} };
// let zaifuTableInfo:any = {};
// zaifuTableInfo[TABLENAME.租赁信息] = araeParam;
// zaifuTableInfo[TABLENAME.企业孵化信息] = {column:["state", "startTime", "endTime"], where:{state:{"%ne%":FUHUASTATE.迁出}} };
// let allIncubatingEnterprises = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.企业基础信息表, selectParam, ["eId"], zaifuTableInfo );
// // 收集所有有填报记录的企业
// let reportedEnterprises = await selectData(OPERATIONALDATATYPE.查询多个,TABLENAME.企业经营信息,{},["eId"]);
// let reportedEIds = new Set(reportedEnterprises.map(e => e.eId));
// // 找出没有填报的在孵企业
// let continuousUnreported = new Set<number>();
// allIncubatingEnterprises.forEach(ent => {
// if (!reportedEIds.has(ent.eId)) {
// continuousUnreported.add(ent.eId);
// }
// });
// riskData[2].value = continuousUnreported.size;
// return riskData;
// }
export async function getRiskData() {
let yj = {
高风险: 0,
......@@ -538,8 +347,13 @@ export async function getRiskData() {
]);
});
let yujiData = [];
for (let key in yj) {
yujiData.push({key, value:yj[key]});
}
return {
yj,
yujiData,
riskEnterprises
};
}
......
import { OPERATIONALDATATYPE, TABLENAME } from "../config/enum/dbEnum";
import { MAILTYPE } from "../config/enum/enum";
import { ERRORENUM } from "../config/enum/errorEnum";
import { selectData } from "../data/operationalData";
import { successResult } from "../tools/system";
import { BizError } from "../util/bizError";
const nodemailer = require('nodemailer');
// 创建发送邮件的传输对象
let transporter = nodemailer.createTransport({
host: 'smtp.qq.com', // SMTP 服务器地址
port: 465, // SMTP 服务器端口(通常是 465 或 587)
secure: true, // 使用 SSL
auth: {
user: '1685675085@qq.com', // 你的邮箱地址
pass: 'hppnsfvnzzhlbdfh' // 你的邮箱密码或应用专用密码
}
});
async function send(toMail, name, type, code?) {
let {title, mailStr} = getModel(name, type, code);
// 设置邮件选项
let mailOptions = {
from: '羽翼 <1685675085@qq.com>', // 发送者地址
to: toMail,
subject: `羽翼的${title}通知`, // 邮件主题
// text: 'Hello world?', // 邮件正文(纯文本)
html: mailStr // 邮件正文(HTML 格式)
};
// new promises
return new Promise((resolve, reject) => {
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
throw new BizError(ERRORENUM.邮件发送失败);
}
resolve(info);
});
});
}
function getModel(name, type, code?) {
let str = "";
let title = "";
switch (type) {
case MAILTYPE.通过入孵材料审核:
str = "您提交的企业材料审核成功,欢迎入驻羽翼孵化器。";
title = "审核通过";
break;
}
let mailStr = ""
mailStr +=`<p>尊敬的${name}:</p>`;
mailStr +=`<p>您好!</p>`;
mailStr +=`<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${str}</p>`;
return {mailStr, title};
}
/**
* 系统发送邮件
* @param userId
* @param type
*/
export async function systemSendMail(eId, type) {
let userInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.企业基础信息表, {eId}, ["eId", "enterpriseName", "uscc", "mail"]);
if (!userInfo || !userInfo.eId) throw new BizError(ERRORENUM.企业不存在);
if (!userInfo.mail) {
new BizError(ERRORENUM.该用户邮箱为空, eId, eId.enterpriseName);
} else {
let result = await send(userInfo.mail, userInfo.enterpriseName, type);
}
return successResult();
}
......@@ -15,6 +15,7 @@ import { changeAdd, extractData } from "../util/piecemeal";
import { EnterpriseApplyForConfig } from "../config/splitResult/enterprise";
import { changeEnumValue } from "../util/verificationEnum";
import { systemConfig } from "../config/serverConfig";
import { systemSendMail } from "./mail";
//=======================================================新入孵企业
......@@ -484,6 +485,9 @@ export async function enterpriseRegisterExaminePass(eId:string) {
})
let yuyiList = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.羽翼孵化器信息, {}, []);
if (在孵面积 != yuyiList.zaifuArea) await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.羽翼孵化器信息, {zaifuArea:在孵面积}, {yId:yuyiList.yId});
//发送邮件
await systemSendMail(eId, enumConfig.MAILTYPE.通过入孵材料审核 );
return {isSuccess:true};
}
......
......@@ -18,14 +18,14 @@ import { BUILDING } from "../config/enum/enum";
* 在孵企业列表
* @param enterpriseName
* @param page
* @param logonStartTime
* @param logonEndTime
* @param startTime
* @param endTime
* @param building
* @param logonStartTime 注册开始时间
* @param logonEndTime 注册结束时间
* @param startTime 租赁开始时间
* @param endTime 租赁结束时间
* @param building 园区楼号
* @returns
*/
export async function enterpriseList(enterpriseName:string, page:number, logonStartTime:string, logonEndTime:string, startTime: number,endTime: number, building: number ) {
export async function enterpriseList(enterpriseName:string, page:number, logonStartTime:string, logonEndTime:string, building: number ) {
let selectParam: any = { state: enumConfig.CHANGESTATE.已通过};
if (enterpriseName) {
selectParam.enterpriseName = { "%like%": enterpriseName };
......@@ -38,39 +38,15 @@ export async function enterpriseList(enterpriseName:string, page:number, logonSt
let filesList = ["eId", "enterpriseName", "uscc", "logonTime", "logonAddress", "qiYeGuiMo"];
// 子表配置:租赁信息
let leaseWhere:any = {};
if (building) leaseWhere.building = building;
// if (startTime && endTime) {
// if (!leaseWhere["%literal%"]) {
// leaseWhere["%literal%"] = `(enterprise_lease.startTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}'
// or enterprise_lease.endTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}') `;
// }
// // leaseWhere["%or%"] = [
// // {startTime: { "%between%":[getMySqlMs(startTime), getMySqlMs(endTime)] }},
// // {endTime: { "%between%":[getMySqlMs(startTime), getMySqlMs(endTime)] }}
// // ]
// }
// if (building) {
// if (!leaseWhere["%literal%"]) {
// leaseWhere["%literal%"] = `enterprise_lease.building = '${building}'`;
// } else {
// leaseWhere["%literal%"] += ` and enterprise_lease.building = '${building}'`;
// }
// leaseWhere["%literal%"] = `(enterprise_lease.startTime BETWEEN '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}'
// or enterprise_lease.endTime BETWEEN '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}') `;
// }
// leaseWhere.building = building;
let manyTableInfo: any = {};
manyTableInfo[TABLENAME.租赁信息] = { column: ["area", "startTime", "endTime", "building", "roomNumber"], where: leaseWhere };
// manyTableInfo[TABLENAME.企业孵化信息] = {
// column: ["moveOutTime", "moveOutType", "startTime", "endTime"],
// where:
// // {"state": {"%ne%":enumConfig.FUHUASTATE.迁出}}
// {"%literal%": `enterprise_fuhuas.state <> ${enumConfig.FUHUASTATE.迁出}`}
// }
// 查询分页数据
let resInfo = await selectManyTableData( OPERATIONALDATATYPE.多表分页, TABLENAME.企业基础信息表, selectParam, filesList, manyTableInfo, page );
// 查询总数
let dataCount = await selectManyTableData( OPERATIONALDATATYPE.多表联查, TABLENAME.企业基础信息表, selectParam, filesList, manyTableInfo );
let dataList = [];
......@@ -157,6 +133,7 @@ export async function enterpriseMoveOut(eId: string, moveOutType: number) {
return { isSuccess: true };
}
/**
* 迁出企业列表
* @param enterpriseName
......@@ -403,54 +380,6 @@ export async function enterpriseFinancingById(eId:string) {
let filesList = ["enterpriseName", "uscc"];
let resInfo = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.企业基础信息表, {eId}, filesList, manyTableInfo);
// let resData = [];
// resInfo.forEach( info => {
// let {enterpriseName, uscc, enterprise_financings} = info;
// resData.push({enterpriseName, uscc, enterprise_financings, investmentDate:new Date(enterprise_financings[0].investmentDate).valueOf()});
// })
// resData.sort( (a, b) => {
// return b.investmentDate - a.investmentDate;
// })
// let dataList = [];
// resData.forEach(info => {
// let {enterpriseName, uscc, enterprise_financings} = info;
// if (enterprise_financings.length != 0) {
// enterprise_financings.forEach( item => {
// let dataInfo = [
// {
// key:"企业名称",
// value:enterpriseName
// },
// {
// key:"统一信用代码",
// value:uscc
// },
// {
// key:"融资金额(万元)",
// value:item.financingAmount
// },
// {
// key:"融资轮次",
// value:changeEnumValue(enumConfig.FINANCINGROUNDS, item.financingRounds)
// },
// {
// key:"获得投资时间",
// value:moment(item.investmentDate).format("YYYY-MM-DD")
// },
// {
// key:"投资机构名称",
// value:item.investmentInstitutionsName
// },
// ]
// dataList.push(dataInfo);
// })
// }
// });
let resData = [];
resInfo.forEach( info => {
let {enterpriseName, uscc, enterprise_financings} = info;
......@@ -718,7 +647,7 @@ export async function enterpriseServiceById(eId:string) {
/**
* 加了注册时间,租赁时间,园区楼号筛选的
*/
export async function dwEnterpriseTable(enterpriseName:string, type:number, logonStartTime:string, logonEndTime:string, startTime: number, endTime: number, building: number ) {
export async function dwEnterpriseTable(enterpriseName:string, type:number, logonStartTime:string, logonEndTime:string, building: number ) {
let files = [{key:"企业名称",value:"enterpriseName"},
{key:"统一信用代码",value:"uscc"},
{key:"注册时间",value:"logonTime"},
......@@ -748,16 +677,14 @@ export async function dwEnterpriseTable(enterpriseName:string, type:number, logo
// 租赁信息表配置
let leaseWhere:any = {};
if (startTime && endTime) {
if (!leaseWhere["%literal%"]) {
leaseWhere["%literal%"] = `(startTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}'
or endTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}') `;
}
}
// if (startTime && endTime) {
// if (!leaseWhere["%literal%"]) {
// leaseWhere["%literal%"] = `(startTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}'
// or endTime between '${getMySqlMs(startTime)}' and '${getMySqlMs(endTime)}') `;
// }
// }
if (building) {
leaseWhere.building = building;
}
if (building) leaseWhere.building = building;
// 租赁信息表配置
manyTableInfo[TABLENAME.租赁信息] = {
......
......@@ -370,3 +370,14 @@ export enum RISKTYPE {
破产重整 = 2520,
监管处罚 = 5050
}
/**
* 邮件类型
*/
export enum MAILTYPE {
通过入孵材料审核 = 1,
}
......@@ -36,7 +36,10 @@ export enum ERRORENUM {
该企业已迁出,
账号不存在,
密码只能由618位字符和数字组成,
请上传所有入孵材料
请上传所有入孵材料,
企业不存在,
该用户邮箱为空,
邮件发送失败
}
export enum ERRORCODEENUM {
......
......@@ -337,8 +337,8 @@ async function outPutTalentList(req, res) {
*/
async function enterpriseList(req, res) {
const UserInfo = req.userInfo;
let {enterpriseName, page, logonStartTime, logonEndTime, startTime, endTime, building } = req.body
let result = await zaiFuBiz.enterpriseList(enterpriseName, page, logonStartTime, logonEndTime, startTime, endTime, building);
let {enterpriseName, page, logonStartTime, logonEndTime, building } = req.body
let result = await zaiFuBiz.enterpriseList(enterpriseName, page, logonStartTime, logonEndTime, building);
res.success(result);
}
......@@ -430,8 +430,8 @@ async function enterpriseDetails(req, res) {
* @param res
*/
async function dwEnterpriseList(req, res) {
let {enterpriseName, type, logonStartTime, logonEndTime, startTime, endTime, building } = req.body
let result = await zaiFuBiz.dwEnterpriseTable(enterpriseName, type, logonStartTime, logonEndTime, startTime, endTime, building );
let {enterpriseName, type, logonStartTime, logonEndTime, building } = req.body
let result = await zaiFuBiz.dwEnterpriseTable(enterpriseName, type, logonStartTime, logonEndTime, building );
// let {enterpriseName, type, files} = req.body
// let result = await zaiFuBiz.dwEnterpriseTable(enterpriseName, type, files);
......
......@@ -8,6 +8,15 @@ import moment = require("moment");
import pinyin from 'pinyin';
const md5 = require("md5");
/**
* 返回编辑正确的结果
* @returns
*/
export function successResult() {
return {success:true}
}
/**
* 生成任务草稿箱Id
......
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