Commit bdeeeda7 by lixinming

逻辑优化和注释

parent b15f8d54
/** /**
* 孵化器任务相关逻辑 * 孵化器任务相关逻辑
* 作者: 李 * 作者: 李欣鸣
* 任务相关逻辑 包括任务的增删改查 管理后台的任务列表逻辑 * 任务相关逻辑 包括任务的增删改查 管理后台的任务列表逻辑
* * 需求说明 1.任务一个月只下一次 不填次月失效
* 2.任务提交之后不可以修改
* 3.月度出租率的任务为必填 其他两个可以为空
* 4.完成的任务将不再列表中显示
* 5.每月1日0时0分,将任务下发至孵化器表中未被禁用的孵化器中
* 实现 1.每个月月初系统生成任务列表在task表中 由isSubmit字段控制是否提交
* 2.任务对应的数据存在各表中 当提交任务时 将draftLock 字段置为true
* 3.任务相关的id统一使用 /tools/system 中的 getTaskId() 获取
*/ */
import moment = require("moment"); import moment = require("moment");
...@@ -10,7 +17,7 @@ import { TASKTYPEENUM } from "../../config/enum"; ...@@ -10,7 +17,7 @@ import { TASKTYPEENUM } from "../../config/enum";
import { ERRORENUM } from "../../config/errorEnum"; import { ERRORENUM } from "../../config/errorEnum";
import { findEnterpriseListByTaskId, updateEnterpriseDraftLock } from "../../data/enterprise/enterprise"; import { findEnterpriseListByTaskId, updateEnterpriseDraftLock } from "../../data/enterprise/enterprise";
import { findFinancingListByTaskId, updateFinancingDraftLock } from "../../data/enterprise/financing"; import { findFinancingListByTaskId, updateFinancingDraftLock } from "../../data/enterprise/financing";
import { findAllFuHuaQi } from "../../data/fuHuaQi/fuhuaqi"; import { findAllNotDisabledFuHuaQi } from "../../data/fuHuaQi/fuhuaqi";
import * as monthTableData from "../../data/fuHuaQi/monthTable"; import * as monthTableData from "../../data/fuHuaQi/monthTable";
import * as taskData from "../../data/fuHuaQi/task"; import * as taskData from "../../data/fuHuaQi/task";
import { BizError } from "../../util/bizError"; import { BizError } from "../../util/bizError";
...@@ -19,40 +26,49 @@ import { getTaskId, getTimeKey } from "../../tools/system"; ...@@ -19,40 +26,49 @@ import { getTaskId, getTimeKey } from "../../tools/system";
/** /**
* 获取孵化器的任务列表 * 孵化器的任务列表
* 小程序端 * 小程序端
* @param uscc 孵化器统一信用 * @param uscc 孵化器统一信用
* @returns [{type:1, title:'', enterpriseList:[] }] * @returns [{type:1, title:'', enterpriseList:[] }]
*/ */
export async function fuHuaQiTaskList(uscc:string) { export async function fuHuaQiTaskList(uscc:string) {
let result = []; /**得到这个月的任务map taskMap格式为{type:{isSubmit}} */
const TaskId = getTaskId(uscc); const TaskId = getTaskId(uscc);
let taskMap = await taskData.findFuHuaQiTaskByTaskId(TaskId); let taskMap = await taskData.findFuHuaQiTaskByTaskId(TaskId);
// let taskTypeMapConf = {}; let result = [];
for (let key in TASKTYPEENUM) { for (let key in TASKTYPEENUM) {
let k:any = key; let anyKey:any = key;
if (isNaN(k)) { /** 当key是枚举的键的时候 进入到逻辑 */
const Value = k; if (isNaN(anyKey)) {
const KeyStr = TASKTYPEENUM[key] const ValueStr = TASKTYPEENUM[key];//字符型的枚举值 也就是 "1"或者"2"或者"3"
let keyNumber = parseInt(KeyStr); const ValueNumber = parseInt(ValueStr);//number型的枚举值 也就是 1或者2或者3
let onceObj = { key:keyNumber, title:Value, enterpriseList:[]}; let onceObj = {
key:ValueNumber,
let onceTaskInfo = taskMap[KeyStr]; title:anyKey, //标题
enterpriseList:[] //相关的列表 这里不应该用这个字段名称 当时不能修改前端 沿用了这个字段名称
if (!onceTaskInfo.isSubmit) { //没有提交任务 };
/**没有提交任务 则获取本月提交的任务相关信息 */
if (!taskMap[ValueStr].isSubmit) {
let dataList = []; let dataList = [];
switch(keyNumber) { switch(ValueNumber) {
case TASKTYPEENUM.孵化器月度填报: dataList = await monthTableData.findmonthTableListByTaskId(TaskId); break; case TASKTYPEENUM.孵化器月度填报:
case TASKTYPEENUM.新注册或迁入企业登记: /** 这里加限制 在月度任务中 isUpdate=true代表已经修改 isUpdate=false表示没有这个任务 详细说明看./month.ts注释*/
dataList = await monthTableData.findmonthTableListByTaskId(TaskId);
break;
case TASKTYPEENUM.新注册或迁入企业登记:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findEnterpriseListByTaskId(TaskId); dataList = await findEnterpriseListByTaskId(TaskId);
dataList.forEach(item => { dataList.forEach(item => {
item.uscc = item.draftId;//这里转换一下,为了不改前端代码 使用uscc这个名称,但是实际是draftId item.uscc = item.draftId;//这里转换一下,为了不改前端代码 使用uscc这个名称,但是实际是draftId
}); });
break; break;
case TASKTYPEENUM.融资企业填报: dataList = await findFinancingListByTaskId(TaskId); break; case TASKTYPEENUM.融资企业填报:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findFinancingListByTaskId(TaskId);
break;
} }
dataList.forEach(info => { dataList.forEach(info => {
...@@ -78,12 +94,14 @@ export async function fuHuaQiTaskList(uscc:string) { ...@@ -78,12 +94,14 @@ export async function fuHuaQiTaskList(uscc:string) {
export async function checkTask(uscc:string, taskType:number) { export async function checkTask(uscc:string, taskType:number) {
const TaskId = getTaskId(uscc); const TaskId = getTaskId(uscc);
let taskInfo = await taskData.findEnterpriseByTaskIdAndType(TaskId, taskType); let taskInfo = await taskData.findEnterpriseByTaskIdAndType(TaskId, taskType);
/**提交限制 */
if (!taskInfo) throw new BizError(ERRORENUM.任务不存在, uscc, TaskId); if (!taskInfo) throw new BizError(ERRORENUM.任务不存在, uscc, TaskId);
if ( taskInfo.isSubmit ) throw new BizError(ERRORENUM.不能重复提交任务, uscc, taskType); if ( taskInfo.isSubmit ) throw new BizError(ERRORENUM.不能重复提交任务, uscc, taskType);
switch (taskType) { switch (taskType) {
case TASKTYPEENUM.孵化器月度填报: case TASKTYPEENUM.孵化器月度填报:
/**月度报表每个月初和任务数据一起初始化 所以只需要修改状态 */
let monthTableInfo = await monthTableData.findMonthTableByTaskId(TaskId); let monthTableInfo = await monthTableData.findMonthTableByTaskId(TaskId);
if (!monthTableInfo.isUpdate) throw new BizError(ERRORENUM.该报表需要填写本月内容后提交, uscc, taskType); if (!monthTableInfo.isUpdate) throw new BizError(ERRORENUM.该报表需要填写本月内容后提交, uscc, taskType);
if ( monthTableInfo.draftLock ) throw new BizError(ERRORENUM.不能重复提交任务, uscc, taskType, '月度表lock = true'); if ( monthTableInfo.draftLock ) throw new BizError(ERRORENUM.不能重复提交任务, uscc, taskType, '月度表lock = true');
...@@ -92,14 +110,16 @@ export async function checkTask(uscc:string, taskType:number) { ...@@ -92,14 +110,16 @@ export async function checkTask(uscc:string, taskType:number) {
await monthTableInfo.save(); await monthTableInfo.save();
break; break;
case TASKTYPEENUM.新注册或迁入企业登记: case TASKTYPEENUM.新注册或迁入企业登记:
/**将录入的企业数据 draftLock 改为 true 表示不再是草稿状态 */
await updateEnterpriseDraftLock(TaskId); await updateEnterpriseDraftLock(TaskId);
break; break;
case TASKTYPEENUM.融资企业填报: case TASKTYPEENUM.融资企业填报:
/**将录入的融资数据 draftLock 改为 true 表示不再是草稿状态 */
await updateFinancingDraftLock(TaskId); await updateFinancingDraftLock(TaskId);
break; break;
} }
//添加一条任务 /** 修改任务状态标识 和相关信息 */
taskInfo.isSubmit = true; taskInfo.isSubmit = true;
taskInfo.submitTime = new Date().valueOf(); taskInfo.submitTime = new Date().valueOf();
...@@ -112,18 +132,16 @@ export async function checkTask(uscc:string, taskType:number) { ...@@ -112,18 +132,16 @@ export async function checkTask(uscc:string, taskType:number) {
/** /**
* 发放任务 * 发放任务
* 系统自发 * 系统自发
* 需求说明: * 下发任务的同时初始化月度报表数据
* 每月1日0时0分,将任务下发至孵化器表中未被禁用的孵化器中
*
*/ */
export async function provideTask() { export async function provideTask() {
const TimeKey = getTimeKey(); const TimeKey = getTimeKey();
let taskCount = await taskData.findTaskCountByKey(TimeKey); let taskCount = await taskData.findTaskCountByKey(TimeKey);
if (taskCount) {}//todo 重复创建了任务 if (taskCount) {
new BizError(ERRORENUM.系统错误, '重复创建了任务');
let fuHuaQiList = await findAllFuHuaQi(); return;
}
const Month = new Date().getMonth() + 1;
let addList = [];//任务列表 let addList = [];//任务列表
let monthList = [];//月度填报列表 let monthList = [];//月度填报列表
...@@ -131,48 +149,25 @@ export async function provideTask() { ...@@ -131,48 +149,25 @@ export async function provideTask() {
const YearNumber = new Date().getFullYear(); const YearNumber = new Date().getFullYear();
const MonthTableName = `${MonthNumber}月孵化器月度填报`; const MonthTableName = `${MonthNumber}月孵化器月度填报`;
let fuHuaQiList = await findAllNotDisabledFuHuaQi();
fuHuaQiList.forEach(info => { fuHuaQiList.forEach(info => {
let { uscc } = info; let { uscc } = info;
let taskId = getTaskId(uscc); let taskId = getTaskId(uscc);
addList.push({ addList.push( { key:TimeKey, type:TASKTYPEENUM.孵化器月度填报, taskId, fuHuaQiUscc:uscc, isSubmit:false},
key:TimeKey, { key:TimeKey, type:TASKTYPEENUM.新注册或迁入企业登记, taskId, fuHuaQiUscc:uscc, isSubmit:false },
type:TASKTYPEENUM.孵化器月度填报, { key:TimeKey, type:TASKTYPEENUM.融资企业填报, taskId, fuHuaQiUscc:uscc, isSubmit:false});
taskId, /**任务报表的初始状态为 草稿(draftLock=fals) 未被编辑(isUpdate=false) */
fuHuaQiUscc:uscc, monthList.push({ taskId, name:MonthTableName, fuHuaQiUscc:uscc, month:MonthNumber, year:YearNumber, draftLock:false, isUpdate:false });
isSubmit:false
},{
key:TimeKey,
type:TASKTYPEENUM.新注册或迁入企业登记,
taskId,
fuHuaQiUscc:uscc,
isSubmit:false
},{
key:TimeKey,
type:TASKTYPEENUM.融资企业填报,
taskId,
fuHuaQiUscc:uscc,
isSubmit:false
});
monthList.push({
taskId,
name:MonthTableName,
fuHuaQiUscc:uscc,
month:MonthNumber,
year:YearNumber,
draftLock:false
});
}); });
try { try {
/**初始化 任务 */
await taskData.createTaskToList(addList); await taskData.createTaskToList(addList);
/**初始化 月度填报表 */
/**添加月度填报表 */
await monthTableData.createMonthTableToList(monthList); await monthTableData.createMonthTableToList(monthList);
logHandle(`添加了${addList.length}`); logHandle(`添加了${addList.length}`);
} catch (err) { } catch (err) {
//todo添加异常了 new BizError(ERRORENUM.系统错误, '添加任务和月度报表的时候 出现了异常 请检查数据库 ', err);
} }
} }
...@@ -19,6 +19,16 @@ export const BaseParamUpdateConfig = { ...@@ -19,6 +19,16 @@ export const BaseParamUpdateConfig = {
acreagePersonalUse:{type:"Number", notMustHave:true},//孵化器自用面积(㎡) acreagePersonalUse:{type:"Number", notMustHave:true},//孵化器自用面积(㎡)
hatchingGround:{type:"[Object]", notMustHave:true},//经备案孵化场地 hatchingGround:{type:"[Object]", notMustHave:true},//经备案孵化场地
}; };
/**
* 使用端: 小程序端【孵化器入口】
* 场景: 验证经备案孵化场地
* 备注: 当填了案孵化场地数据 验证经备案孵化场地
*/
export const BaseParamUpdateHatchingGroundConfig = {
personInChargeAdd:{type:"String"},//孵化场地地址
siteAcreage:{type:"Number"},//孵化场地面积(㎡)
leasePrice:{type:"Number"},//孵化场地出租单价
};
/** /**
...@@ -43,6 +53,21 @@ export const OrganizationParamUpdateConfig = { ...@@ -43,6 +53,21 @@ export const OrganizationParamUpdateConfig = {
personInChargePhone:{type:"String", notMustHave:true},// {key:"负责人联系电话"}, personInChargePhone:{type:"String", notMustHave:true},// {key:"负责人联系电话"},
operationModelDes:{type:"String", notMustHave:true},//{key:"运营模式描述"}, operationModelDes:{type:"String", notMustHave:true},//{key:"运营模式描述"},
}; };
/**
* 使用端: 小程序端【孵化器入口】
* 场景: 机构信息中的创始团队
* 备注: 更新机构信息时 当选择了创始团队
*/
export const OrganizationParamFoundingTeamUpdateConfig = {
type:{type:"Number"},//人才类型
memberName:{type:"String"},//成员姓名
memberSex:{type:"Number"},//成员性别
memberAge:{type:"Number"},//成员年龄
memberDEGREE:{type:"Number"},//成员最高学历
memberSchool:{type:"String"},//毕业学校
des:{type:"String"},//履历描述
};
/** /**
...@@ -164,7 +189,15 @@ export const FinancingParamUpdateConfig = { ...@@ -164,7 +189,15 @@ export const FinancingParamUpdateConfig = {
fuHuaQiInvestmentStyle:{type:"Number", notMustHave:true },//孵化器投资方式 fuHuaQiInvestmentStyle:{type:"Number", notMustHave:true },//孵化器投资方式
financingRounds:{type:"Number"},//融资轮次 financingRounds:{type:"Number"},//融资轮次
}; };
/**
* 使用端: 小程序端【孵化器入口】
* 场景: 创建融资企业登记选择了孵化器投资
* 备注:
*/
export const FinancingParamSubConfig = {
fuHuaQiInvestmentAmount:{type:"Number"},
fuHuaQiInvestmentStyle:{type:"Number"}
}
/** /**
* 使用端: 管理后台 * 使用端: 管理后台
......
...@@ -23,6 +23,9 @@ export enum ERRORENUM { ...@@ -23,6 +23,9 @@ export enum ERRORENUM {
该孵化器账号信息已存在, 该孵化器账号信息已存在,
密码不一致, 密码不一致,
密码只能由618位字符和数字组成, 密码只能由618位字符和数字组成,
统一社会信用代码不合法,
统一社会信用代码重复,
系统错误
} }
export enum ERRORCODEENUM { export enum ERRORCODEENUM {
......
...@@ -61,6 +61,7 @@ export async function findEnterpriseByUscc(uscc:string) { ...@@ -61,6 +61,7 @@ export async function findEnterpriseByUscc(uscc:string) {
return await enterpriseModel.selectOnceData({uscc}); return await enterpriseModel.selectOnceData({uscc});
} }
/** /**
* 通过草稿箱id获取企业信息 * 通过草稿箱id获取企业信息
* 支持.save方法保存对象修改 * 支持.save方法保存对象修改
...@@ -73,12 +74,24 @@ export async function findEnterpriseByDraftId(draftId:string) { ...@@ -73,12 +74,24 @@ export async function findEnterpriseByDraftId(draftId:string) {
/** /**
* 根据参数查询单个企业信息
* @param param
* @returns
*/
export async function selectOneEnterpriseByParam(param:object) {
return await enterpriseModel.findOne(param);
}
/**
* 通过taskId 获取此次任务添加的企业列表 * 通过taskId 获取此次任务添加的企业列表
* @param taskId 任务id 格式遵循tool中getTaskId * @param taskId 任务id 格式遵循tool中getTaskId
* @returns [{}] * 限制返回 draftId name isCreate uscc 字段
* @returns [{draftId}]
*/ */
export async function findEnterpriseListByTaskId(taskId:string) { export async function findEnterpriseListByTaskId(taskId:string) {
return await enterpriseModel.find({taskId, draftLock:false}); return await enterpriseModel.find({taskId, draftLock:false}, 'draftId name isCreate uscc');
} }
...@@ -181,12 +194,15 @@ export async function findEnterpriseInfoByName(name:string) { ...@@ -181,12 +194,15 @@ export async function findEnterpriseInfoByName(name:string) {
/** /**
* 获取孵化器下的所有企业信息 * 获取孵化器下的所有已经提交的企业信息
* 限制返回 name
logonAdd
operatingAdd
* @param fuHuaQiUscc 孵化器统一信用代码 * @param fuHuaQiUscc 孵化器统一信用代码
* @returns [] * @returns []
*/ */
export async function findEnterpriseListByFuHuaQiUsccName(fuHuaQiUscc:string) { export async function findSubmittedEnterpriseListByFuHuaQiUscc(fuHuaQiUscc:string) {
return await enterpriseModel.find({fuHuaQiUscc, draftLock:true}); return await enterpriseModel.find({fuHuaQiUscc, draftLock:true}, 'name logonAdd operatingAdd');
} }
...@@ -194,7 +210,7 @@ export async function findEnterpriseListByFuHuaQiUsccName(fuHuaQiUscc:string) { ...@@ -194,7 +210,7 @@ export async function findEnterpriseListByFuHuaQiUsccName(fuHuaQiUscc:string) {
* 查询所有已绑定过的孵化器id * 查询所有已绑定过的孵化器id
* @returns [孵化器id] * @returns [孵化器id]
*/ */
export async function findAllBindFuHuaQi() { export async function findAllBindFuHuaQiUsccList() {
return await enterpriseModel.distinct('fuHuaQiUscc'); return await enterpriseModel.distinct('fuHuaQiUscc');
} }
......
...@@ -98,15 +98,6 @@ export async function findFuHuaQiByName(name:string) { ...@@ -98,15 +98,6 @@ export async function findFuHuaQiByName(name:string) {
return await fuHuaQiModel.findOne({name}); return await fuHuaQiModel.findOne({name});
} }
/**
* 通过信用代码获取孵化器信息
* @param uscc 信用代码
* @returns 信用代码为uscc的孵化器信息
*/
export async function findFuHuaQiByUscc(uscc:string) {
return await fuHuaQiModel.findOne({uscc});
}
/** /**
* 通过token获取孵化器信息 弃用 * 通过token获取孵化器信息 弃用
...@@ -212,8 +203,14 @@ export async function findAllFuHuaQiOperationUsccMap() { ...@@ -212,8 +203,14 @@ export async function findAllFuHuaQiOperationUsccMap() {
} }
export async function findAllFuHuaQi() { /**
return await fuHuaQiModel.find({userState:false}); * 查询所有非禁用状态下的孵化器
* 限制返回字段 uscc
* operationName
* @returns []
*/
export async function findAllNotDisabledFuHuaQi() {
return await fuHuaQiModel.find({userState:false}, 'uscc operationName');
} }
......
...@@ -44,13 +44,13 @@ export async function save(throwError=false) { ...@@ -44,13 +44,13 @@ export async function save(throwError=false) {
/** /**
* 通过任务id 查询孵化器任务 * 通过任务id 查询孵化器任务
* @param taskId 任务id * @param taskId 任务id
* @returns {1:{}, 2:{}} * @returns {} 格式: key=type value={isSubmit}
*/ */
export async function findFuHuaQiTaskByTaskId(taskId:string) { export async function findFuHuaQiTaskByTaskId(taskId:string) {
let findList = await fuHuaQiTaskModel.find({taskId}).exec() || []; let findList = await fuHuaQiTaskModel.find({taskId}).exec() || [];
let taskMap = {}; let taskMap = {};
findList.forEach(item => { findList.forEach(item => {
taskMap[item.type] = item; taskMap[item.type] = {isSubmit:item.isSubmit};
}); });
return taskMap; return taskMap;
} }
......
...@@ -84,7 +84,7 @@ async function updateMoveInEnterprise(req, res) { ...@@ -84,7 +84,7 @@ async function updateMoveInEnterprise(req, res) {
* @param res * @param res
*/ */
async function selectEnterpriseInfo(req, res) { async function selectEnterpriseInfo(req, res) {
/*这里改成了用DraftId,为了不改前端 依然使用uscc这个参数*/ /*这里改成了用DraftId,为了不改前端 依然使用uscc这个参数名称*/
let reqConf = {uscc: 'String' }; let reqConf = {uscc: 'String' };
let { uscc } = eccReqMustHaveParam(reqConf, req.body); let { uscc } = eccReqMustHaveParam(reqConf, req.body);
...@@ -99,7 +99,7 @@ async function updateMoveInEnterprise(req, res) { ...@@ -99,7 +99,7 @@ async function updateMoveInEnterprise(req, res) {
* @param res * @param res
*/ */
async function delEnterpriseInfo(req, res) { async function delEnterpriseInfo(req, res) {
/*这里改成了用DraftId,为了不改前端 依然使用uscc这个参数*/ /*这里改成了用DraftId,为了不改前端 依然使用uscc这个参数名称*/
let reqConf = {uscc: 'String' }; let reqConf = {uscc: 'String' };
let { uscc } = eccReqMustHaveParam(reqConf, req.body); let { uscc } = eccReqMustHaveParam(reqConf, req.body);
......
...@@ -62,4 +62,17 @@ export function md5PwdStr(pwd:string) { ...@@ -62,4 +62,17 @@ export function md5PwdStr(pwd:string) {
*/ */
export function getToken(uscc:string) { export function getToken(uscc:string) {
return md5(`${uscc}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`); return md5(`${uscc}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`);
}
/**
* 校验uscc是否合法
* @param uscc
* @returns true/false
*/
export function eccUscc(uscc:string) {
let isSuccess = false;
if (uscc.search(/^[A-Za-z0-9]{16}$/) > -1) isSuccess = true;
else if (uscc.search(/^[A-Za-z0-9]{16}$/) > -1) isSuccess = true;
return isSuccess;
} }
\ No newline at end of file
...@@ -3,23 +3,27 @@ ...@@ -3,23 +3,27 @@
* *
*/ */
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "./bizError";
/** /**
* 校验value是否符合传入的枚举 * 校验value是否符合传入的枚举
* @param enumConf 目标枚举 * @param enumConf 目标枚举
* @param value 目标值 * @param value 目标值
* @returns true/false 是否通过校验 * 无返回 有异常直接报错
*/ */
export function checkEnumValue(enumConf, value:any) { export function eccEnumValue(name:string, key:string, enumConf, value:any) {
if ( typeof value == 'number' ) { let eccSuccess = true;
return enumConf[value] ? true : false; if ( typeof value == 'number' && !enumConf[value] ) {
eccSuccess = false;
} else {
value.forEach(item => {
if ( !enumConf[item] ) eccSuccess = false;
});
} }
let checkSuccess = true;
value.forEach(item => { if (!eccSuccess) throw new BizError(ERRORENUM.表单校验失败, `${name} 下的 ${key} 字段值为 ${value} 不满足枚举范围`);
if ( !enumConf[item] ) checkSuccess = false;
});
return checkSuccess;
} }
......
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