Commit c8ff749a by chenjinjing

bug修复

parent b8e90c2a
No preview for this file type
No preview for this file type
No preview for this file type
<config>
<port>7071</port>
<excelModelUrl>http://192.168.0.71:7071/template/</excelModelUrl>
<excelModelUrl>http://127.0.0.1:7071/template/</excelModelUrl>
<!-- <excelModelUrl>http://101.89.111.202:7071/template/</excelModelUrl> -->
<mongodb>
<path>192.168.0.105</path>
<path>192.168.0.71</path>
<!-- <path>127.0.0.1</path> -->
<port>27017</port>
<w>1</w>
<!-- <dataBase>baseDB</dataBase> -->
......
......@@ -31,24 +31,44 @@ export async function activityList(title:string, startTime:number, endTime:numbe
selectParam.title = {"$regex":`${title}`};
}
if (startTime && endTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.endTime = { "$lte": endTime };
selectParam.startTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
}
if (target) {
verificationEnumTools.eccEnumValue('管理后台获取园区活动列表', 'target', configEnum.ACTIVITYTARGET, target);
selectParam.target = {"$in":target};
}
// if (state) {
// verificationEnumTools.eccEnumValue('管理后台获取园区活动列表', 'state', configEnum.ACTIVITYSTATE, state);
// selectParam.state = state;
// }
/**需要用到的查询数据 */
let activityDbList = await activityData.findActivityListToPage(selectParam, (page - 1) * 10);
let allActivityDbList = await activityData.findActivityListByParam(selectParam);
// 如果有状态筛选,过滤数据
let filteredActivityDbList = activityDbList;
if (state) {
verificationEnumTools.eccEnumValue('管理后台获取园区活动列表', 'state', configEnum.ACTIVITYSTATE, state);
selectParam.state = state;
filteredActivityDbList = activityDbList.filter(info => {
const activityState = calculateActivityState(info.startTime, info.endTime);
return activityState === state;
});
}
// 重新计算总数
let count = allActivityDbList.length;
if (state) {
count = allActivityDbList.filter(info => {
const activityState = calculateActivityState(info.startTime, info.endTime);
return activityState === state;
}).length;
}
/**需要用到的查询数据 */
let activityDbList = await activityData.findActivityListToPage(selectParam, (page - 1) * 10);
let count = await activityData.findActivityCount(selectParam);//符合查询条件的数据总数
/**组合返回结果 */
let dataList = [];
activityDbList.forEach( info => {
filteredActivityDbList.forEach( info => {
/**截取返回数据 */
let changeData:any = extractData(splitResultConfig.activityListConfig, info, true);
......@@ -58,7 +78,10 @@ export async function activityList(title:string, startTime:number, endTime:numbe
target.push(verificationEnumTools.changeEnumValue(configEnum.ACTIVITYTARGET, info))
})
changeData.target = target;
changeData.state = verificationEnumTools.changeEnumValue(configEnum.ACTIVITYSTATE, changeData.state);
// 计算活动状态
let stateType = calculateActivityState(info.startTime, info.endTime)
changeData.state = verificationEnumTools.changeEnumValue(configEnum.ACTIVITYSTATE, stateType);
dataList.push(changeData);
})
......@@ -79,15 +102,18 @@ export async function activityCreate(param) {
if (param.target && param.target.length > 0) {
verificationEnumTools.eccEnumValue('管理后台新增园区活动', 'target', configEnum.ACTIVITYTARGET, param.target);
}
verificationEnumTools.eccEnumValue('管理后台新增园区活动', 'state', configEnum.ACTIVITYSTATE, param.state);
// 校验时间
if (param.startTime >= param.endTime) {
throw new BizError(ERRORENUM.参数错误, '活动开始时间不能晚于或等于结束时间');
}
let enterpriseInfo = await activityData.findActivityByParam({title:param.title});
let enterpriseInfo = await activityData.findActivityByParam({title:param.title, startTime:param.startTime});
if (enterpriseInfo && enterpriseInfo.title) throw new BizError(ERRORENUM.该活动已存在, `${param.title}已经在库中存在`);
let activityInfo = {
id: randomId(TABLEID.活动),
title: param.title,
state: param.state,
startTime: param.startTime,
endTime: param.endTime,
target: param.target,
......@@ -106,13 +132,12 @@ export async function activityCreate(param) {
* @param uscc
*/
export async function activityInfo(id:string) {
/**校验企业 */
/**校验活动 */
let activityDbInfo = await activityData.findActivityByParam({id});
if (!activityDbInfo || !activityDbInfo.id) throw new BizError(ERRORENUM.未找到数据, `库中不存在id=${id}这个活动`);
let dataInfo = {
title: activityDbInfo.title,
state: activityDbInfo.state,
startTime: activityDbInfo.startTime,
endTime: activityDbInfo.endTime,
target: activityDbInfo.target,
......@@ -126,7 +151,7 @@ export async function activityInfo(id:string) {
/**
* 园区活动-修改
* @param uscc
* @param id
* @param param
*/
export async function activityUpdate(id:string, param) {
......@@ -137,15 +162,19 @@ export async function activityUpdate(id:string, param) {
if (param.target && param.target.length > 0) {
verificationEnumTools.eccEnumValue('管理后台新增园区活动', 'target', configEnum.ACTIVITYTARGET, param.target);
}
verificationEnumTools.eccEnumValue('管理后台新增园区活动', 'state', configEnum.ACTIVITYSTATE, param.state);
// 校验时间
if (param.startTime >= param.endTime) {
throw new BizError(ERRORENUM.参数错误, '活动开始时间不能晚于或等于结束时间');
}
/**校验企业 */
/**校验活动 */
let activityDbInfo = await activityData.findActivityByParam({id});
if (!activityDbInfo || !activityDbInfo.id) throw new BizError(ERRORENUM.未找到数据, `库中不存在id=${id}这个活动`);
/**修改字段 */
let changeList = checkChange(param, activityDbInfo);
if (!changeList.length) throw new BizError(ERRORENUM.数据无更新, `${param.name}数据无更新`);
if (!changeList.length) throw new BizError(ERRORENUM.数据无更新, `${param.title}数据无更新`);
changeList.forEach(key => {
activityDbInfo[key] = param[key];
});
......@@ -179,29 +208,39 @@ export async function activityDelete(id:string) {
* @param state 活动状态
* @returns 二维数组,第一行为表头,后续行为数据
*/
export async function outPutActivityData(title: string, startTime: number, endTime: number, target: number[], state: number) {
export async function outPutActivityData(title: string, startTime: number, endTime: number, target: number[], state: number, id:string[]) {
/** 拼接查询条件 */
let selectParam: any = {};
if (title) {
selectParam.title = { "$regex": `${title}` };
}
if (startTime && endTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.endTime = { "$lte": endTime };
selectParam.startTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
} else if (startTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.startTime = { "$lte": endTime };
} else if (endTime) {
selectParam.endTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
}
if (target && target.length > 0) {
selectParam.target = { "$in": target };
}
if (state) {
selectParam.state = state;
}
/** 查询园区活动数据 */
let activityDbList = await activityData.findActivityListByParam(selectParam);
// 如果有状态筛选,在内存中过滤
if (state) {
activityDbList = activityDbList.filter(info => {
const activityState = calculateActivityState(info.startTime, info.endTime);
return activityState === state;
});
}
// 如果有ID筛选
if (id) {
activityDbList = activityDbList.filter(info => id.includes(info.id));
}
/** 表头定义 */
const titleList = [
......@@ -211,7 +250,7 @@ export async function outPutActivityData(title: string, startTime: number, endTi
"结束时间",
"活动类型",
"活动地点",
"活动描述"
// "活动描述"
];
let dataList = [titleList]; // 第一行为表头
......@@ -233,8 +272,9 @@ export async function outPutActivityData(title: string, startTime: number, endTi
}
changeData.target = targetTexts.join("、") || "未选择";
// 活动状态
changeData.state = verificationEnumTools.changeEnumValue(configEnum.ACTIVITYSTATE, changeData.state) || "未选择";
// 计算活动状态并转为文本
const activityState = calculateActivityState(info.startTime, info.endTime);
changeData.state = verificationEnumTools.changeEnumValue(configEnum.ACTIVITYSTATE, activityState) || "未选择";
/** 时间格式化 */
changeData.startTime = changeData.startTime ? formatDateTime(changeData.startTime) : "-";
......@@ -253,7 +293,7 @@ export async function outPutActivityData(title: string, startTime: number, endTi
changeData.endTime,
changeData.target,
changeData.location || "-",
changeData.desc || "-"
// changeData.desc || "-"
];
dataList.push(row);
......@@ -280,4 +320,25 @@ function formatDateTime(timestamp: number): string {
}
/**
* 根据活动时间计算活动状态
* @param startTime 开始时间戳
* @param endTime 结束时间戳
* @returns 活动状态枚举值
*/
function calculateActivityState(startTime:number, endTime:number) {
const now = Date.now();
if (now < startTime) {
return configEnum.ACTIVITYSTATE.未开始;
} else if (now >= startTime && now <= endTime) {
return configEnum.ACTIVITYSTATE.活动中;
} else {
return configEnum.ACTIVITYSTATE.已结束;
}
}
......@@ -17,7 +17,8 @@ export async function getLabel(labelType?) {
labelDbList.forEach( info => {
dataList.push({
key: info.id,
value: info.labelName
value: info.labelName,
type: info.labelType
})
})
......
......@@ -6,7 +6,7 @@ import * as verificationEnumTools from "../util/verificationEnum";
import * as configEnum from "../config/enum";
import * as industryEnum from "../config/enum/industryEnum";
import * as manageData from "../data/manage";
import { checkChange, extractData } from "../util/piecemeal";
import { checkChange, extractData, getManageData } from "../util/piecemeal";
import * as splitResultConfig from '../config/splitResultConfig';
import { eccFormParam } from "../util/verificationParam";
import { ManageAddConfig, ManageUpdateConfig } from "../config/eccParam/admin";
......@@ -38,7 +38,7 @@ export async function manageList(name:string, year:number, period:number, page:n
}
/**需要用到的查询数据 */
let manageDbList = await manageData.findManageListToPage(selectParam, (page - 1) * 10);
let manageDbList = await manageData.findManageListToPageSort(selectParam, (page - 1) * 10, {year: -1});
let count = await manageData.findManageCount(selectParam);//符合查询条件的数据总数
/**组合返回结果 */
......@@ -67,8 +67,9 @@ export async function manageCreate(param) {
/**校验枚举 */
verificationEnumTools.eccEnumValue('管理后台新增经营数据', 'period', configEnum.PERIOD, param.period);
let enterpriseInfo = await manageData.findManageByParam({name:param.name});
if (enterpriseInfo && enterpriseInfo.name) throw new BizError(ERRORENUM.该企业已存在, `${param.name}已经在库中存在`);
/**校验经营数据是否重复 */
let isAdd = await getManageData(param.uscc, param.year, param.period);
if (!isAdd) throw new BizError(ERRORENUM.请勿重复提交填报数据, `${param.uscc}已有${param.year}${param.period}时间经营数据`);
let manageInfo = {
id: randomId(TABLEID.企业经营数据),
......@@ -168,7 +169,7 @@ export async function manageDelete(id:string) {
* @param period 数据期间 上半年、下半年、全年
* @returns 二维数组,第一行为表头,后续行为数据
*/
export async function outPutManageData(name: string, year: number, period: number) {
export async function outPutManageData(name: string, year: number, period: number, id:string[]) {
/** 拼接查询条件 */
let selectParam: any = {};
if (name) {
......@@ -180,6 +181,9 @@ export async function outPutManageData(name: string, year: number, period: numbe
if (period) {
selectParam.period = period;
}
if (id) {
selectParam.id = {"$in": id};
}
/** 查询经营数据 */
let manageDbList = await manageData.findManageListByParam(selectParam);
......@@ -220,7 +224,7 @@ export async function outPutManageData(name: string, year: number, period: numbe
/** 枚举值转文本 */
changeData.period = verificationEnumTools.changeEnumValue(configEnum.PERIOD, changeData.period) || "未选择";
changeData.isSubmit = changeData.isSubmit ? "已提交" : "未提交";
changeData.isSubmit = info.isSubmit ? "已提交" : "未提交";
/** 数字格式化(保留两位小数) */
const numberKeys = ["BI", "VAT", "CIT", "PIT", "RD"];
......
......@@ -187,7 +187,7 @@ export async function negotiationDelete(id:string) {
* @param contactDepartment 对接部门
* @returns 二维数组,第一行为表头,后续行为数据
*/
export async function outPutNegotiationData(name:string, industry:string[], registrationStatus:number, primaryContact:string, contactDepartment:string) {
export async function outPutNegotiationData(name:string, industry:string[], registrationStatus:number, primaryContact:string, contactDepartment:string, id:string[]) {
/** 拼接查询条件 */
let selectParam: any = {};
if (name) {
......@@ -207,6 +207,9 @@ export async function outPutNegotiationData(name:string, industry:string[], regi
if (contactDepartment) {
selectParam.contactDepartment = {"$regex": `${contactDepartment}`};
}
if (id) {
selectParam.id = {"$in": id};
}
/** 查询在谈在跟数据 */
let negotiationDbList = await negotiationData.findNegotiationListByParam(selectParam);
......@@ -219,7 +222,7 @@ export async function outPutNegotiationData(name:string, industry:string[], regi
"注册情况",
"负责人/首谈人",
"对接部门",
"创建时间"
// "创建时间"
];
/** 字段映射 */
......@@ -230,7 +233,7 @@ export async function outPutNegotiationData(name:string, industry:string[], regi
"registrationStatus",
"primaryContact",
"contactDepartment",
"createTime"
// "createTime"
];
let dataList = [titleList]; // 第一行为表头
......@@ -249,7 +252,7 @@ export async function outPutNegotiationData(name:string, industry:string[], regi
changeData.progressStatus = verificationEnumTools.changeEnumValue(configEnum.PROGRESSSTATUS, changeData.progressStatus) || "未选择";
/** 时间格式化 */
changeData.createTime = changeData.createTime ? moment(changeData.createTime).format("YYYY-MM-DD HH:mm:ss") : "-";
// changeData.createTime = changeData.createTime ? moment(changeData.createTime).format("YYYY-MM-DD HH:mm:ss") : "-";
/** 生成一行数据 */
let row = [];
......
......@@ -17,9 +17,9 @@ import { ERRORENUM } from "../config/errorEnum";
/**
* 政策-列表
* @param title 活动标题
* @param startTime 活动开始时间
* @param endTime 活动结束时间
* @param title 政策标题
* @param startTime 政策开始时间
* @param endTime 政策结束时间
* @param policyType 政策类型 财政补贴 资质申报 政策扶持
* @param page 页
*/
......@@ -29,15 +29,16 @@ export async function policyList(title:string, startTime:number, endTime:number,
selectParam.title = {"$regex":`${title}`};
}
if (startTime && endTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.endTime = { "$lte": endTime };
// 条件:政策开始时间 <= 传入结束时间 且 政策结束时间 >= 传入开始时间
selectParam.startTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
}
if (policyType) {
verificationEnumTools.eccEnumValue('管理后台获取政策列表', 'policyType', configEnum.POLICYTYPE, policyType);
selectParam.policyType = policyType;
}
/**需要用到的查询数据 */
let policyDbList = await policyData.findPolicyListToPage(selectParam, (page - 1) * 10);
let policyDbList = await policyData.findPolicyListToPageSort(selectParam, (page - 1) * 10, {createTime: -1});
let count = await policyData.findPolicyCount(selectParam);//符合查询条件的数据总数
/**组合返回结果 */
......@@ -78,6 +79,7 @@ export async function policyCreate(param) {
endTime: param.endTime,
source: param.source,
desc:param.desc,
createTime: new Date().valueOf(),
}
await policyData.createDataByParam(policyInfo);
......@@ -159,26 +161,29 @@ export async function policyDelete(id:string) {
* @param policyType 政策类型
* @returns 二维数组,第一行为表头,后续行为数据
*/
export async function outPutPolicyData(title: string, startTime: number, endTime: number, policyType: number) {
export async function outPutPolicyData(title: string, startTime: number, endTime: number, policyType: number, id: string[]) {
/** 拼接查询条件 */
let selectParam: any = {};
if (title) {
selectParam.title = { "$regex": `${title}` };
}
if (startTime && endTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.endTime = { "$lte": endTime };
selectParam.startTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
} else if (startTime) {
selectParam.startTime = { "$gte": startTime };
selectParam.startTime = { "$lte": endTime };
} else if (endTime) {
selectParam.endTime = { "$lte": endTime };
selectParam.endTime = { "$gte": startTime };
}
if (policyType) {
selectParam.policyType = policyType;
}
if (id) {
selectParam.id = {"$in": id};
}
/** 查询政策数据 */
let policyDbList = await policyData.findPolicyListByParam(selectParam);
let policyDbList = await policyData.findPolicyByParamSort(selectParam, {createTime: -1});
/** 表头定义 */
const titleList = [
......@@ -187,7 +192,7 @@ export async function outPutPolicyData(title: string, startTime: number, endTime
"生效时间",
"失效时间",
"政策来源",
"政策内容"
// "政策内容"
];
let dataList = [titleList]; // 第一行为表头
......@@ -216,7 +221,7 @@ export async function outPutPolicyData(title: string, startTime: number, endTime
changeData.startTime,
changeData.endTime,
changeData.source || "-",
descText
// descText
];
dataList.push(row);
......
......@@ -382,7 +382,7 @@ export async function trackDelete(id:string) {
* @param trackType 需求跟进状态
* @returns 二维数组,第一行为表头,后续行为数据(空行分隔)
*/
export async function outPutTrackDetailsData(name: string, demand: number, trackType: number) {
export async function outPutTrackDetailsData(name: string, demand: number, trackType: number, id:string[]) {
/** 拼接查询条件 */
let selectParam: any = {};
if (name) {
......@@ -394,6 +394,9 @@ export async function outPutTrackDetailsData(name: string, demand: number, track
if (trackType) {
selectParam.trackType = trackType;
}
if (id) {
selectParam.id = {"$in": id};
}
/** 查询服务追踪数据 */
let trackDbList = await trackData.findTrackListByParam(selectParam);
......
......@@ -87,7 +87,7 @@ export const EnterpriseUpdateConfig = {
labels:{type:"[String]"}, //企业标签
industry:{type:"[Number]"}, //行业领域
property:{type:"Number"}, //企业所属物业
enterpriseNature:{type:"Number"}, //企业性质
enterpriseNature:{type:"String"}, //企业性质
leasedArea:{type:"Number"}, //租赁面积(㎡)
RAS:{type:"Number"}, //登记状态
jingYingFanWei:{type:"String"}, //经营范围
......@@ -147,7 +147,7 @@ export const TrackAddConfig = {
contactUs:{type:"String"}, //企业联系方式
// trackType:{type:"Number"}, //需求跟进状态 同步详情记录的跟进状态
createTime:{type:"Number"}, //创建服务追踪时间
details:{type:"Array"}, //服务追踪记录
details:{type:"Array", notMustHave:true}, //服务追踪记录
};
......@@ -178,7 +178,7 @@ export const TrackUpdateConfig = {
contactUs:{type:"String"}, //企业联系方式
// trackType:{type:"Number"}, //需求跟进状态 同步详情记录的跟进状态
createTime:{type:"Number"}, //创建服务追踪时间
details:{type:"Array"}, //服务追踪记录
details:{type:"Array", notMustHave:true}, //服务追踪记录
};
......@@ -202,7 +202,7 @@ export const TrackDetailsUpdateConfig = {
*/
export const ActivityAddConfig = {
title:{type:"String"}, //活动标题
state:{type:"Number"}, //活动状态
// state:{type:"Number"}, //活动状态
startTime:{type:"Number"}, //活动开始时间
endTime:{type:"Number"}, //活动结束时间
target:{type:"[Number]"}, //活动类型
......@@ -218,7 +218,7 @@ export const ActivityAddConfig = {
*/
export const ActivityUpdateConfig = {
title:{type:"String"}, //活动标题
state:{type:"Number"}, //活动状态
// state:{type:"Number"}, //活动状态
startTime:{type:"Number"}, //活动开始时间
endTime:{type:"Number"}, //活动结束时间
target:{type:"[Number]"}, //活动类型
......
......@@ -2,8 +2,6 @@
* 事件标签枚举
*
*/
export enum LABELTYPE {
基础标签 = 1,
入驻年份 = 2,
......@@ -13,7 +11,6 @@ export enum LABELTYPE {
}
/**
* 企业系统标签
*/
......
......@@ -81,7 +81,10 @@ export enum ERRORENUM {
该账号已存在,
该标签不存在,
该活动已存在,
该政策已存在
该政策已存在,
企业性质不可多选,
所属物业不可多选,
入驻年份不可多选
}
export enum ERRORCODEENUM {
......
......@@ -39,6 +39,9 @@ export const enterpriseListConfig = {
zhuceziben:{key:"注册资本"},
property:{key:"所属物业"},
enterpriseNature:{key:"企业性质"},
logonAddress:{key:"注册地址"},
legalPerson:{key:"法人"},
dianHua:{key:"联系电话"},
};
......
......@@ -8,7 +8,7 @@ import {sasp} from '../db/mongo/dbInit';
const activitySchema = new Schema({
id:{type:String, index:true}, //唯一标识
title:String, //活动标题
state:{type:Number, default:1}, //活动状态 未开始、活动中、已结束
// state:{type:Number, default:1}, //活动状态 未开始、活动中、已结束 -- 移除state字段,根据startTime和endTime动态计算状态
startTime:Number, //活动开始时间
endTime:Number, //活动结束时间
target:{type:[Number], default:[]}, //活动类型
......
......@@ -161,6 +161,17 @@ export async function save(throwError=false) {
/**
* 分页获取所有企业-排序
* @param selectParam 查询参数
* @param skipCount 跳过数量
* @returns [] 在跟在谈企业列表
*/
export async function findEnterpriseListToPageSort(selectParam, skipCount, sortParam) {
return await enterpriseModel.find(selectParam).sort(sortParam).skip(skipCount).limit(10);
}
/**
* 分页获取所有企业
* @param selectParam 查询参数
* @param skipCount 跳过数量
......@@ -202,6 +213,15 @@ export async function findEnterpriseListByParam(selectParam) {
/**
* 获取按时间排序的符合条件的企业列表
* @param selectParam
*/
export async function findEnterpriseListByParamSort(selectParam, sortParam) {
return await enterpriseModel.find(selectParam).sort(sortParam);
}
/**
* 获取符合条件的单个企业
* @param selectParam
*/
......
......@@ -56,6 +56,17 @@ export async function findManageListToPage(selectParam, skipCount) {
/**
* 分页获取所有经营数据
* @param selectParam 查询参数
* @param skipCount 跳过数量
* @returns [] 经营数据列表
*/
export async function findManageListToPageSort(selectParam, skipCount, sortParam) {
return await manageModel.find(selectParam).sort(sortParam).skip(skipCount).limit(10);
}
/**
* 获取符合条件的经营数据数量
* @param selectParam 查询参数
* @returns number 数据数量
......
......@@ -14,6 +14,7 @@ const policySchema = new Schema({
endTime:Number, //政策结束时间
source:String, //来源,发布单位
desc:String, //政策详情
createTime:Number, //创建时间
})
......@@ -43,7 +44,7 @@ export async function save(throwError=false) {
* 分页获取所有政策
* @param selectParam 查询参数
* @param skipCount 跳过数量
* @returns [] 在跟在谈政策列表
* @returns [] 政策列表
*/
export async function findPolicyListToPage(selectParam, skipCount) {
return await policyModel.find(selectParam).skip(skipCount).limit(10);
......@@ -51,6 +52,17 @@ export async function findPolicyListToPage(selectParam, skipCount) {
/**
* 分页获取所有政策-排序
* @param selectParam 查询参数
* @param skipCount 跳过数量
* @returns [] 政策列表
*/
export async function findPolicyListToPageSort(selectParam, skipCount, sortParam) {
return await policyModel.find(selectParam).sort(sortParam).skip(skipCount).limit(10);
}
/**
* 获取符合条件的政策数量
* @param selectParam 查询参数
* @returns number 数据数量
......@@ -70,6 +82,15 @@ export async function findPolicyByParam(selectParam) {
/**
* 获取符合条件的政策
* @param selectParam
*/
export async function findPolicyByParamSort(selectParam, sortParam) {
return await policyModel.find(selectParam).sort(sortParam);
}
/**
* 获取符合条件的政策列表
* @param selectParam
*/
......
import { updateQCCDataTask } from "./biz/qccInit";
import { initApiDataStorage } from "./biz/qccInit";
import { initConfig, systemConfig} from "./config/serverConfig";
import { initDB } from "./db/mongo/dbInit";
import { httpServer } from "./net/http_server";
......@@ -10,14 +10,13 @@ async function lanuch() {
/**初始化数据库 */
await initDB();
/**初始化底表数据 */
// await initBasicData();
await initBasicData();
/**创建http服务 */
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
/**初始化企查查数据 */
// await updateQCCDataTask();
await initApiDataStorage();
}
......
......@@ -5,7 +5,7 @@ import compression = require('compression');
import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path";
// import * as fallback from 'express-history-api-fallback';
import fallback from 'express-history-api-fallback';
export class httpServer {
static createServer(port:number) {
......@@ -34,7 +34,7 @@ export class httpServer {
httpServer.use(express.static("./files") );
const root = path.join(__dirname, "../../public");
httpServer.use(express.static(root));
// httpServer.use(fallback('index.html', { root }));
httpServer.use(fallback('index.html', { root }));
httpServer.use(compression());
httpServer.use(watch);
httpServer.use(bodyParser.json({limit:"5000kb"}));
......
......@@ -94,11 +94,11 @@ async function delActivity(req, res) {
* @param res
*/
async function outPutActivityList(req, res) {
let reqConf = {title:'String', startTime:'Number', endTime:'Number', target:'[Number]', state:'Number'};
const NotMustHaveKeys = ['title', 'startTime', 'endTime', 'target', 'state'];
let {title, startTime, endTime, target, state} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {title:'String', startTime:'Number', endTime:'Number', target:'[Number]', state:'Number', id:'[String]'};
const NotMustHaveKeys = ['title', 'startTime', 'endTime', 'target', 'state', 'id'];
let {title, startTime, endTime, target, state, id} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await activityBiz.outPutActivityData(title, startTime, endTime, target, state);
let result = await activityBiz.outPutActivityData(title, startTime, endTime, target, state, id);
res.success(result);
}
......
......@@ -94,11 +94,11 @@ async function delEnterprise(req, res) {
* @param res
*/
async function outPutEnterprise(req, res) {
let reqConf = {name:'String', industry:'[Number]', parkEntryTime:'Number', logonTime:'Number', labelIdList:'[String]', dataType:'Number'};
const NotMustHaveKeys = ['name', 'industry', 'parkEntryTime', 'logonTime', 'labelIdList', 'dataType'];
let {name, industry, parkEntryTime, logonTime, labelIdList, dataType} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {name:'String', industry:'[Number]', parkEntryTime:'Number', logonTime:'Number', labelIdList:'[String]', dataType:'Number', uscc:'[String]'};
const NotMustHaveKeys = ['name', 'industry', 'parkEntryTime', 'logonTime', 'labelIdList', 'dataType', 'uscc'];
let {name, industry, parkEntryTime, logonTime, labelIdList, dataType, uscc} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await enterpriseBiz.outPutEnterpriseData(name, industry, parkEntryTime, logonTime, labelIdList, dataType);
let result = await enterpriseBiz.outPutEnterpriseData(name, industry, parkEntryTime, logonTime, labelIdList, dataType, uscc);
res.success(result);
}
......
......@@ -94,11 +94,11 @@ async function delManage(req, res) {
* @param res
*/
async function outPutManageList(req, res) {
let reqConf = {name:'String', year:'Number', period:'Number'};
const NotMustHaveKeys = ['name', 'year', 'period'];
let {name, year, period} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {name:'String', year:'Number', period:'Number', id:'[String]'};
const NotMustHaveKeys = ['name', 'year', 'period', 'id'];
let {name, year, period, id} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await manageBiz.outPutManageData(name, year, period);
let result = await manageBiz.outPutManageData(name, year, period, id);
res.success(result);
}
......
......@@ -89,16 +89,16 @@ async function delNegotiation(req, res) {
/**
* 在谈在跟-列表
* 在谈在跟-导出
* @param req
* @param res
*/
async function outPutNegotiation(req, res) {
let reqConf = {name:'String', industry:'[Number]', registrationStatus:'Number', primaryContact:'String', contactDepartment:'String'};
const NotMustHaveKeys = ['name', 'industry', 'registrationStatus', 'primaryContact', 'contactDepartment'];
let {name, industry, registrationStatus, primaryContact, contactDepartment} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {name:'String', industry:'[Number]', registrationStatus:'Number', primaryContact:'String', contactDepartment:'String', id:'[String]'};
const NotMustHaveKeys = ['name', 'industry', 'registrationStatus', 'primaryContact', 'contactDepartment', 'id'];
let {name, industry, registrationStatus, primaryContact, contactDepartment, id} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await negotiationBiz.outPutNegotiationData(name, industry, registrationStatus, primaryContact, contactDepartment);
let result = await negotiationBiz.outPutNegotiationData(name, industry, registrationStatus, primaryContact, contactDepartment, id);
res.success(result);
}
......
......@@ -94,11 +94,11 @@ async function delPolicy(req, res) {
* @param res
*/
async function outPutPolicyList(req, res) {
let reqConf = {title:'String', startTime:'Number', endTime:'Number', policyType:'Number'};
const NotMustHaveKeys = ['title', 'startTime', 'endTime', 'policyType'];
let {title, startTime, endTime, policyType} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {title:'String', startTime:'Number', endTime:'Number', policyType:'Number', id:'[String]'};
const NotMustHaveKeys = ['title', 'startTime', 'endTime', 'policyType', 'id'];
let {title, startTime, endTime, policyType, id} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await policyBiz.outPutPolicyData(title, startTime, endTime, policyType);
let result = await policyBiz.outPutPolicyData(title, startTime, endTime, policyType, id);
res.success(result);
}
......
......@@ -109,11 +109,11 @@ async function delTrack(req, res) {
* @param res
*/
async function outPutTrackList(req, res) {
let reqConf = {name:'String', demand:'Number', trackType:'Number'};
const NotMustHaveKeys = ['name', 'demand', 'trackType'];
let {name, demand, trackType} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let reqConf = {name:'String', demand:'Number', trackType:'Number', id:'[String]'};
const NotMustHaveKeys = ['name', 'demand', 'trackType', 'id'];
let {name, demand, trackType, id} = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let result = await trackBiz.outPutTrackDetailsData(name, demand, trackType);
let result = await trackBiz.outPutTrackDetailsData(name, demand, trackType, id);
res.success(result);
}
......
......@@ -10,6 +10,7 @@ import * as labelEnum from "../config/enum/labelEnum";
import { createDataByParam, findEnterpriseByUscc } from "../data/enterprise";
import { formatAddress, getPwdMd5, randomId } from "./system";
import { TABLEID } from "../config/enum/dbEnum";
import moment from "moment";
let xlsx = require('node-xlsx');
let path = require('path');
let md5 = require("md5");
......@@ -151,6 +152,7 @@ function parseIndustry(industryCategoryGb, industryMajorGb) {
};
}
/**
* 处理日期字符串
* @param {string} dateStr
......@@ -160,8 +162,36 @@ function parseDateString(dateStr) {
if (!dateStr || dateStr === '-') return null;
try {
// 处理"2024年"格式的日期
if (typeof dateStr === 'string' && dateStr.includes('年')) {
// 提取年份数字,例如:"2024年" -> 2024
const yearMatch = dateStr.match(/(\d{4})年/);
if (yearMatch && yearMatch[1]) {
const year = parseInt(yearMatch[1], 10);
// 返回该年份1月1日的时间戳
return new Date(`${year}-01-01`).getTime();
}
}
// 处理Excel日期格式(如:2020-07-16)
if (typeof dateStr === 'string') {
// 尝试多种日期格式
const dateFormats = [
'YYYY-MM-DD',
'YYYY/MM/DD',
'YYYY年MM月DD日',
'YYYY-MM',
'YYYY年'
];
for (const format of dateFormats) {
const parsedDate = moment(dateStr, format, true);
if (parsedDate.isValid()) {
return parsedDate.valueOf();
}
}
// 如果上述格式都不匹配,尝试原生Date解析
let date = new Date(dateStr);
return isNaN(date.getTime()) ? null : date.getTime();
}
......@@ -179,6 +209,7 @@ function parseDateString(dateStr) {
}
}
/**
* 处理注册资本和实缴资本
* @param {string} capitalStr
......@@ -192,6 +223,7 @@ function parseCapital(capitalStr) {
return match ? match[1] + '万元' : capitalStr;
}
/**
* 处理参保人数
* @param {string|number} peopleStr
......@@ -208,6 +240,7 @@ function parsePeopleCount(peopleStr) {
return isNaN(num) ? 0 : num;
}
/**
* 处理租赁面积
* @param {string|number} areaStr
......@@ -224,6 +257,7 @@ function parseLeasedArea(areaStr) {
return isNaN(num) ? 0 : num;
}
/**
* 处理数字字段
*/
......@@ -240,6 +274,7 @@ function parseNumber(value, defaultValue = 0) {
return isNaN(num) ? defaultValue : num;
}
/**
* 处理企业标签
* @param {Object} rowData Excel行数据
......@@ -295,22 +330,22 @@ function parseLabels(rowData) {
if (entryYear && entryYear != "-") {
let yearValue;
switch (entryYear.toString()) {
case '2023':
case '2023':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2023年"];
break;
case '2024':
case '2024':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2024年"];
break;
case '2025':
case '2025':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2025年"];
break;
case '2026':
case '2026':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2026年"];
break;
case '2027':
case '2027':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2027年"];
break;
case '2028':
case '2028':
yearValue = labelEnum.ENTERPRISESYSTEMLABEL["2028年"];
break;
// default:
......@@ -659,7 +694,8 @@ async function initEnterpriseFromExcel() {
logonTime: parseDateString(rowData.logonTime),
parkEntryTime: parseDateString(rowData.parkEntryTime),
leasedArea: parseNumber(rowData.leasedArea, 0),
enterpriseNature: EnterpriseNatureMap[rowData.enterpriseNature] || labelEnum.ENTERPRISENATURE.实体型,
// enterpriseNature: EnterpriseNatureMap[rowData.enterpriseNature] || labelEnum.ENTERPRISENATURE.实体型,
enterpriseNature: EnterpriseNatureMap[rowData.enterpriseNature] || null,
property: propertyMap[rowData.property] || null,
//用户相关
......
......@@ -221,5 +221,114 @@ export function formatAddress(original) {
}
/**
* 更完善的注册资本格式化函数
* @param {string|number} value 注册资本值
* @returns {string} 格式化后的注册资本字符串
*/
export function formatRegisteredCapital(value) {
if (value === null || value === undefined) {
return '';
}
// 如果输入是数字,转换为字符串
if (typeof value === 'number') {
value = value.toString();
}
// 确保是字符串类型
if (typeof value !== 'string') {
return String(value);
}
// 去除首尾空格
value = value.trim();
// 空字符串直接返回
if (value === '') {
return value;
}
// 特殊情况:如果是"-"或其他占位符,直接返回
if (value === '-' || value === '--' || value === 'N/A' || value === 'null' || value === 'undefined') {
return value;
}
// 判断是否已经包含单位
// 定义常见单位列表
const units = [
'万元', '万', 'w', 'W',
'元', '¥',
'亿', '亿元',
'美元', '美金', 'usd', 'USD',
'人民币', 'RMB', 'CNY',
'欧元', 'EUR', 'euro',
'日元', 'JPY', 'yen',
'港元', '港币', 'HKD',
'英镑', 'GBP', 'pound'
];
// 检查是否已包含单位(不区分大小写)
const lowerValue = value.toLowerCase();
for (const unit of units) {
if (lowerValue.endsWith(unit.toLowerCase()) ||
lowerValue.includes(unit.toLowerCase() + ' ') ||
lowerValue.includes(' ' + unit.toLowerCase())) {
return value; // 已包含单位,直接返回
}
}
// 检查常见的外币符号
const currencySymbols = ['¥', '¥', '$', '€', '£', '¥'];
for (const symbol of currencySymbols) {
if (value.includes(symbol)) {
return value; // 包含货币符号,直接返回
}
}
// 尝试提取纯数字部分
// 移除所有非数字字符(除了小数点、逗号和负号)
const numericString = value.replace(/[^0-9.,-]/g, '');
// 检查是否包含有效数字
if (numericString && /^-?\d[\d,]*\.?\d*$/.test(numericString)) {
// 移除逗号并转换为数字
const numericValue = parseFloat(numericString.replace(/,/g, ''));
// 根据数值大小选择合适的单位
if (!isNaN(numericValue)) {
// 如果数字大于等于10000万(即1亿),可以考虑使用"亿元"
if (numericValue >= 100000000) {
const billionValue = (numericValue / 100000000).toFixed(2);
// 去除末尾的.00
const formatted = billionValue.replace(/\.00$/, '');
return formatted + '亿元';
}
// 如果数字大于等于1000,使用"万元"
else if (numericValue >= 1000) {
const tenThousandValue = (numericValue / 10000).toFixed(2);
const formatted = tenThousandValue.replace(/\.00$/, '');
return formatted + '万元';
}
// 否则直接添加"万元"
else {
// 如果是整数,不显示小数位
if (Number.isInteger(numericValue)) {
return numericValue + '万元';
} else {
return numericValue.toFixed(2).replace(/\.00$/, '') + '万元';
}
}
}
}
// 如果无法解析为数字,但看起来像是金额(包含数字)
if (/\d/.test(value)) {
return value + '万元';
}
// 其他情况返回原值
return value;
}
......@@ -2,7 +2,7 @@
* 标签相关处理工具方法
*/
import { LABELUPDATEROAD } from "../config/enum/labelEnum";
import { LABELTYPE, LABELUPDATEROAD } from "../config/enum/labelEnum";
import * as labelData from "../data/label";
......@@ -151,6 +151,7 @@ export async function generateEnterpriseLabels(enterpriseData, activeLabels = nu
if (labelInfo && labelInfo.state === false) {
enterpriseLabels.push({
labelId: labelIdStr,
labelType: LABELTYPE.基础标签,
state: true
});
}
......@@ -166,6 +167,7 @@ export async function generateEnterpriseLabels(enterpriseData, activeLabels = nu
if (labelInfo && labelInfo.state === false && !labelExists(natureLabelId, enterpriseLabels)) {
enterpriseLabels.push({
labelId: natureLabelId,
labelType: LABELTYPE.企业性质,
state: true
});
}
......@@ -179,6 +181,7 @@ export async function generateEnterpriseLabels(enterpriseData, activeLabels = nu
if (labelInfo && labelInfo.state === false && !labelExists(propertyLabelId, enterpriseLabels)) {
enterpriseLabels.push({
labelId: propertyLabelId,
labelType: LABELTYPE.所属物业,
state: true
});
}
......@@ -192,6 +195,7 @@ export async function generateEnterpriseLabels(enterpriseData, activeLabels = nu
if (labelInfo && labelInfo.state === false && !labelExists(yearLabelId, enterpriseLabels)) {
enterpriseLabels.push({
labelId: yearLabelId,
labelType: LABELTYPE.入驻年份,
state: true
});
}
......@@ -234,3 +238,78 @@ export async function updateEnterpriseLabels(enterpriseData) {
return await generateEnterpriseLabels(enterpriseData, activeLabels);
}
/**
* 转换前端传入的labels数据为数据库存储格式(基于标签表查询)
* @param {Array<string>} labelIds 前端传入的标签ID数组,如:["4", "6", "601", "2025", "el_35ee4ddafbf7eaf9191071b893adb806"]
* @returns {Promise<Array<Object>>} 数据库存储格式的标签数组
*/
export async function convertLabelsToDbFormat(labelIds) {
if (!labelIds || !Array.isArray(labelIds) || labelIds.length === 0) {
return [];
}
try {
// 批量查询标签信息,提高性能
const labelInfos = await labelData.selectLabelList({
id: { $in: labelIds }
});
// 创建标签ID到标签信息的映射
const labelInfoMap = new Map();
labelInfos.forEach(info => {
labelInfoMap.set(info.id, info);
});
const dbLabels = [];
for (const labelId of labelIds) {
if (!labelId || typeof labelId !== 'string') {
continue;
}
// 从查询结果中获取标签信息
const labelInfo = labelInfoMap.get(labelId);
let labelType = 0;
if (labelInfo) {
// 如果标签表中有定义,使用定义中的类型
labelType = labelInfo.labelType || 0;
} else {
// 如果标签表中没有定义,根据ID格式推断类型
// 1. 入驻年份标签(2023-2028年的纯数字)
if (/^\d{4}$/.test(labelId)) {
const year = parseInt(labelId);
if (year >= 2023 && year <= 2028) {
labelType = 2; // 假设2表示入驻年份标签类型
} else {
// 其他纯数字标签,可能是系统标签
labelType = 1; // 假设1表示系统标签类型
}
}
// 2. 自定义标签(以el_开头)
else if (labelId.startsWith('el_')) {
labelType = 5; // 假设5表示自定义标签类型
}
// 3. 其他情况
else {
labelType = 0; // 未知类型
}
}
dbLabels.push({
labelId: labelId,
labelType: labelType,
state: true // 默认启用状态
});
}
return dbLabels;
} catch (error) {
console.error('转换标签格式时出错:', error);
}
}
......@@ -3,6 +3,8 @@
*/
import moment = require("moment");
import { findEnterpriseListByParam } from "../data/enterprise";
import { findManageByParam } from "../data/manage";
/**
* 匹配新旧对象变化
......@@ -67,4 +69,39 @@ export function checkDataHaveNull(data:object, sensitive:boolean) {
}
}
return success;
}
\ No newline at end of file
}
/**
* 获取所有企业库已有企业Map
* @returns
*/
export async function getEnterpriseMap() {
let enterpriseDbList = await findEnterpriseListByParam({});
let enterpriseMap = {};
enterpriseDbList.forEach( info => {
enterpriseMap[info.uscc] = info.name;
})
return enterpriseMap;
}
/**
* 获取经营数据是否有相同记录
* @param uscc
* @param year
* @param period
* @returns
*/
export async function getManageData(uscc, year, period) {
let manageDbInfo = await findManageByParam({uscc, year, period});
let isAdd = true;
/**如果有数据代表重复 */
if (manageDbInfo) {
isAdd = false
}
return isAdd
}
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