Commit ea34afcf by lixinming

修bug 2.0功能

parent b7e6c76a
......@@ -1088,6 +1088,11 @@
"resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
},
"qcloudsms_js": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/qcloudsms_js/-/qcloudsms_js-0.1.1.tgz",
"integrity": "sha512-ewdlD32XF0BkV5sGNCFHCR9FSf6fi6PijJGX1YkowFziycYUyoCThDWKM0aeZG6kSQ1y8qHHBYFhAl7JTSlhuQ=="
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
......
......@@ -19,6 +19,7 @@
"mysql": "^2.18.1",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"qcloudsms_js": "^0.1.1",
"qs": "^6.11.0",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
......
......@@ -7,8 +7,22 @@
<dataBase>baseDB</dataBase>
<wtimeoutMS>30000</wtimeoutMS>
</mongodb>
<!-- 小程序的secret 和 appid -->
<secret>5907d55efdd2f6b3e11e719b8d781111</secret>
<appId>wxbfc5695971b3e395</appId>
<!-- 获取小程序的openId地址 -->
<getOpenIdUrl>https://api.weixin.qq.com/sns/jscode2session</getOpenIdUrl>
<!-- 短信相关配置 -->
<sms>
<sdkAppId>1400799515</sdkAppId>
<appKey>a36634bd106ee72eeea4a4bb4e62a03b</appKey>
<smsSign>张江科创服务中心</smsSign>
<!-- 修改密码的模板id -->
<changePwd>1729284</changePwd>
<!-- 填报提示 -->
<pointOut>1729286</pointOut>
<!-- 初始化账号提示 -->
<initPointOut>1729288</initPointOut>
</sms>
</config>
\ No newline at end of file
......@@ -13,6 +13,8 @@ import moment = require("moment");
import * as monthTableData from "../../../data/fuHuaQi/monthTable";
import * as taskData from "../../../data/fuHuaQi/task";
import { logHandle } from "../../../util/log";
import * as scoreData from "../../../data/fuHuaQi/score";
import { starCount } from "../../mobileFuHuaQi/fuHuaQi/score";
/**
* 获取孵化器基本信息列表
......@@ -274,6 +276,8 @@ export async function addUser(param) {
await fuhuaqiData.createFuHuaQiUser(param);
await scoreData.createFuHuaQiScore(param.uscc, 404);
let addList = [];//任务列表
let monthList = [];//月度填报列表
......@@ -335,3 +339,46 @@ export async function fuHuaQiUserList(operationName:string, page:number) {
return {count, dataList};
}
/**
* 查询孵化器评分排名
* @param time
* @param name
* @param pange
*/
export async function fuHuaQiScore(time:number, name:string, page:number) {
let nameMap = await fuhuaqiData.findAllFuHuaQiOperationNameMap();
let param:any = {};
if (name) {
param.uscc = "-1";
for (let key in nameMap) {
if (nameMap[key] == name) param.uscc = key;
}
}
let resultList = [];
if (!time) {
let scoreDataList = await scoreData.findScoreDataByParam({});
let rankList = [];
scoreDataList.forEach((info) => {
let name = nameMap[info.uscc]
if (!name) return;
let score = info.startScore+info.myDataScore+info.baseDataScore+info.myEnterpriseScore+info.taskScore;
let star = starCount(score);
rankList.push({ name, star, score });
});
rankList.sort((a, b) => { return a.score - b.score} );
rankList.forEach((info, index) => {
info.rank = index + 1;
});
resultList = rankList.splice((page-1 * 10), 10);
} else {
}
}
......@@ -86,8 +86,8 @@ export async function initScoreData() {
await updateScore(uscc, SCOREWAYS.我的信息, false);
await updateScore(uscc, SCOREWAYS.我的数据, false);
}
/**初始化任务得分 */
let taskList = await taskData.findTaskListByParam({});
for (let i =0; i < taskList.length; i++) {
let {fuHuaQiUscc, isSubmit, type} = taskList[i];
......
......@@ -65,6 +65,11 @@ export async function updateRegisterEnterprise(uscc:string, param) {
let selectInfo = await enterpriseData.selectOneEnterpriseByParam({uscc:param.uscc, draftId:{"$ne":param.draftId} });
if (selectInfo && selectInfo.uscc) throw new BizError(ERRORENUM.统一社会信用代码重复, `${param.uscc}已经在库中存在 不可以修改为这个统一信用代码`);
/**如果是本月提交的,可以修改,如果不是,则不可以修改 */
if ( sysTools.getThisMonthMs() > dataBaseInfo.createTime) {
throw new BizError(ERRORENUM.不能修改过期任务数据, `修改新注册企业的表单 ${uscc} 违法操作`);
}
/**修改字段 */
let changeList = checkChange(param, dataBaseInfo);
if ( !changeList.length ) throw new BizError(ERRORENUM.数据无更新, `${param.uscc}数据无更新`);
......@@ -128,6 +133,11 @@ export async function updateMoveInEnterprise(uscc:string, param) {
let selectInfo = await enterpriseData.selectOneEnterpriseByParam({uscc:param.uscc, draftId:{"$ne":param.draftId} });
if (selectInfo && selectInfo.uscc) throw new BizError(ERRORENUM.统一社会信用代码重复, `${param.uscc}已经在库中存在 不可以修改为这个统一信用代码`);
/**如果是本月提交的,可以修改,如果不是,则不可以修改 */
if ( sysTools.getThisMonthMs() > dataBaseInfo.createTime) {
throw new BizError(ERRORENUM.不能修改过期任务数据, `修改新注册企业的表单 ${uscc} 违法操作`);
}
/**修改数据 */
let changeList = checkChange(param, dataBaseInfo);
if ( !changeList.length ) throw new BizError(ERRORENUM.数据无更新, `${param.uscc}数据无更新`);
......@@ -193,7 +203,7 @@ export async function myEnterprise(uscc:string, state:number, name:string, page:
let result:any = {};
let selectParam:any = { fuHuaQiUscc:uscc};
if (name) selectParam.name = name;
if (name) selectParam.name = {"$regex":`${name}`};
if (state == configEnum.INSIDESTATE.全部) {
selectParam.state = {"$lt":4};
} else selectParam.state = state;
......@@ -444,4 +454,4 @@ export async function replenishMyEnterpriseCreateInfo(fuHuaQiUscc:string, param)
await enterpriseData.replenishData(fuHuaQiUscc, param);
return {isSuccess:true};
}
\ No newline at end of file
}
......@@ -161,11 +161,13 @@ export async function getFuHuaQiEnterpriseForSelect(uscc:string) {
/**拼接返回 */
let dataList = [];
enterpriseList.forEach( info => {
dataList.push({
name:info.name,
logonAdd:info.logonAdd,
operatingAdd:info.operatingAdd
});
if (info.state != configEnum.FUHUASTATE.迁出) {
dataList.push({
name:info.name,
logonAdd:info.logonAdd,
operatingAdd:info.operatingAdd
});
}
});
return dataList;
......
......@@ -5,7 +5,7 @@
*
*/
import * as eccFormParamConfig from "../../../config/eccFormParamConfig";
import { findEnterpriseCountByFuHuaQiUscc, groupFindEnterpriseCount } from "../../../data/enterprise/enterprise";
import { findEnterpriseCount, findEnterpriseCountByFuHuaQiUscc, groupFindEnterpriseCount } from "../../../data/enterprise/enterprise";
import * as fuhuaqiData from "../../../data/fuHuaQi/fuhuaqi";
import * as splitResultConfig from "../../../config/splitResultConfig";
import * as configEnum from "../../../config/enum";
......@@ -51,11 +51,14 @@ export async function homeData(uscc:string) {
export async function selectFuHuaQiBaseData(uscc:string) {
/** 这里中间件已经验证过uscc的可靠性了,不需要做多余的验证*/
let dataBaseInfo = await fuhuaqiData.findFuHuaQiByUSCC(uscc);
/** 虚拟 */
let virtualEnterpriseNum = await findEnterpriseCount({fuHuaQiUscc:uscc, state:configEnum.FUHUASTATE.虚拟孵化, draftLock:true}) || 0;
/**截取返回 */
let data:any = extractData(splitResultConfig.FuHuaQiBaseDataConfig, dataBaseInfo, false);
data.enterpriseTotal = await findEnterpriseCountByFuHuaQiUscc(uscc); //企业总数
data.numOfEntities = data.enterpriseTotal - dataBaseInfo.virtualEnterpriseNum; //实体企业总数 = 虚拟企业总数 - 虚拟企业数量
data.numOfEntities = data.enterpriseTotal - virtualEnterpriseNum; //实体企业总数 = 虚拟企业总数 - 虚拟企业数量
data.numOfEntities = data.numOfEntities > 0 ? data.numOfEntities : 0;
data.virtualEnterpriseNum = virtualEnterpriseNum;
return data;
}
......@@ -99,6 +102,7 @@ export async function updateFuHuaQiBaseData(uscc:string, param) {
let changeList = checkChange(param, baseDataInfo);
for (let i = 0; i < changeList.length; i++) {
let key = changeList[i];
if (key == "virtualEnterpriseNum") continue;
baseDataInfo[key] = param[key];
}
baseDataInfo["hatchingGround"] = param.hatchingGround;
......
......@@ -18,7 +18,7 @@ import * as sysTools from "../../../tools/system";
import { findAllFuHuaQiOperationNameMap } from "../../../data/fuHuaQi/fuhuaqi";
import * as splitResultConfig from "../../../config/splitResultConfig";
import { OUTPUTTYPE } from "../../../config/enum";
import moment = require("moment");
/**
* 新添加孵化器月度填报
......@@ -56,9 +56,15 @@ export async function updateReport(uscc:string, occupancyRate:number) {
const TaskId = sysTools.getTaskId(uscc);
let dataBaseInfo = await monthData.findMonthTableByTaskId(TaskId);
if (!dataBaseInfo || !dataBaseInfo.taskId) throw new BizError(ERRORENUM.未找到数据, `未找到${uscc}的月度报表` );
if ( !dataBaseInfo.isUpdate ) throw new BizError(ERRORENUM.未找到数据, `${uscc}还没有创建数据就修改了${occupancyRate}`);
if ( dataBaseInfo.draftLock ) throw new BizError(ERRORENUM.该任务已提交, `${uscc}已经提交了月度报表又 修改 数据${occupancyRate}`);
const thisTaskMonth = moment().subtract(1, 'months').month() + 1;//数据填报月份
const YearNumber =moment().subtract(1, 'months').year();//数据填报年份
if (dataBaseInfo.month != thisTaskMonth || dataBaseInfo.year != YearNumber) {
if (!dataBaseInfo || !dataBaseInfo.taskId) throw new BizError(ERRORENUM.未找到数据, `未找到${uscc}的月度报表` );
if ( !dataBaseInfo.isUpdate ) throw new BizError(ERRORENUM.未找到数据, `${uscc}还没有创建数据就修改了${occupancyRate}`);
if ( dataBaseInfo.draftLock ) throw new BizError(ERRORENUM.该任务已提交, `${uscc}已经提交了月度报表又 修改 数据${occupancyRate}`);
}
dataBaseInfo.occupancyRate = occupancyRate;
await dataBaseInfo.save();
......@@ -99,9 +105,12 @@ export async function getMonthByUscc(uscc:string) {
const TaskId = sysTools.getTaskId(uscc);
let dataBaseInfo = await monthData.findMonthTableByTaskId(TaskId);
if ( !dataBaseInfo.isUpdate ) throw new BizError(ERRORENUM.未找到数据, `未找到${uscc}的月度报表` );
if ( dataBaseInfo.draftLock ) throw new BizError(ERRORENUM.该任务已提交, `${uscc}已经提交了月度报表又 回显 数据`);
const thisTaskMonth = moment().subtract(1, 'months').month() + 1;//数据填报月份
const YearNumber =moment().subtract(1, 'months').year();//数据填报年份
if (dataBaseInfo.month != thisTaskMonth || dataBaseInfo.year != YearNumber) {
if ( !dataBaseInfo.isUpdate ) throw new BizError(ERRORENUM.未找到数据, `未找到${uscc}的月度报表` );
if ( dataBaseInfo.draftLock ) throw new BizError(ERRORENUM.该任务已提交, `${uscc}已经提交了月度报表又 回显 数据`);
}
let data = extractData(splitResultConfig.MonthConfig, dataBaseInfo, false);
return { data };
......
......@@ -19,8 +19,8 @@ export async function getFuHuaQiScore(uscc:string) {
/**得分信息 */
let scoreInfo = await scoreData.findFuHuaQiScoreInfo(uscc);
let { startScore, lastYearStar, myDataScore, baseDataScore, myEnterpriseScore, taskScore, lastScore } = scoreInfo;
let count = Math.ceil(startScore +lastYearStar +myDataScore +baseDataScore +myEnterpriseScore +taskScore);
let { startScore, myDataScore, baseDataScore, myEnterpriseScore, taskScore, lastScore } = scoreInfo;
let count = Math.ceil(startScore +myDataScore +baseDataScore +myEnterpriseScore +taskScore);
let oldStar = starCount(lastScore);
let newStar = starCount(count);
......@@ -42,7 +42,7 @@ export async function getFuHuaQiScore(uscc:string) {
* @param socre 分数
* @returns 星数
*/
function starCount(socre:number) {
export function starCount(socre:number) {
let star = 1;
for (let i = 0; i < StarConfig.length; i++) {
let {name, value, starNum} = StarConfig[i];
......@@ -69,7 +69,7 @@ export async function updateScore(uscc:string, type:number, isSubmitTask:boolean
let fuHuaQiInfo = await findFuHuaQiByUSCC(uscc);
let newScore = 0;//新分数
let oldScore = 0;//老分数
let countScore = scoreInfo.startScore +scoreInfo.lastYearStar +scoreInfo.myDataScore +scoreInfo.baseDataScore +scoreInfo.myEnterpriseScore +scoreInfo.taskScore;
let countScore = scoreInfo.startScore +scoreInfo.myDataScore +scoreInfo.baseDataScore +scoreInfo.myEnterpriseScore +scoreInfo.taskScore;
switch (type) {
case SCOREWAYS.任务得分:
/**单个任务得分 */
......
......@@ -22,7 +22,7 @@ import * as monthTableData from "../../../data/fuHuaQi/monthTable";
import * as taskData from "../../../data/fuHuaQi/task";
import { BizError } from "../../../util/bizError";
import { logHandle } from "../../../util/log";
import { getLastMonthTimeKey, getTaskId, getTaskIdByTime, getTimeKey } from "../../../tools/system";
import { getLastMonthTimeKey, getTaskId, getTaskIdByTime, getThisMonthMs, getTimeKey } from "../../../tools/system";
import * as scoreBiz from "../fuHuaQi/score";
......@@ -63,14 +63,14 @@ export async function fuHuaQiTaskList(uscc:string) {
break;
case TASKTYPEENUM.新注册或迁入企业登记:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findEnterpriseListByTaskId(TaskId);
dataList = await findEnterpriseListByTaskId(TaskId, false);
dataList.forEach(item => {
item.uscc = item.draftId;//这里转换一下,为了不改前端代码 使用uscc这个名称,但是实际是draftId
});
break;
case TASKTYPEENUM.融资企业填报:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findFinancingListByTaskId(TaskId);
dataList = await findFinancingListByTaskId(TaskId, false);
break;
}
......@@ -111,6 +111,7 @@ export async function fuHuaQiCompletedList(uscc:string, selectTime:number) {
let onceObj:any = {
key:ValueNumber,
title:anyKey, //标题
editable,
enterpriseList:[] //相关的列表 这里不应该用这个字段名称 当时不能修改前端 沿用了这个字段名称
};
......@@ -129,14 +130,14 @@ export async function fuHuaQiCompletedList(uscc:string, selectTime:number) {
break;
case TASKTYPEENUM.新注册或迁入企业登记:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findEnterpriseListByTaskId(TaskId);
dataList = await findEnterpriseListByTaskId(TaskId, true);
dataList.forEach(item => {
item.uscc = item.draftId;//这里转换一下,为了不改前端代码 使用uscc这个名称,但是实际是draftId
});
break;
case TASKTYPEENUM.融资企业填报:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findFinancingListByTaskId(TaskId);
dataList = await findFinancingListByTaskId(TaskId, true);
break;
}
......@@ -163,7 +164,7 @@ export async function fuHuaQiCompletedList(uscc:string, selectTime:number) {
export async function fuHuaQiPastdueList(uscc:string, selectTime:number) {
/**得到查询月的任务map taskMap格式为{type:{isSubmit}} */
const TaskId = getTaskIdByTime(uscc, selectTime);
if (selectTime >= getThisMonthMs() ) return {taskList:[]};
let taskMap = await taskData.findFuHuaQiTaskByTaskId(TaskId);
let result = [];
......@@ -185,30 +186,6 @@ export async function fuHuaQiPastdueList(uscc:string, selectTime:number) {
/**未提交的数据 */
if (!taskMap[ValueStr].isSubmit) {
onceObj.month = taskMap[ValueStr].month + '月';
let dataList = [];
switch(ValueNumber) {
case TASKTYPEENUM.孵化器月度填报:
/** 这里加限制 在月度任务中 isUpdate=true代表已经修改 isUpdate=false表示没有这个任务 详细说明看./month.ts注释*/
dataList = await monthTableData.findmonthTableListByTaskId(TaskId);
break;
case TASKTYPEENUM.新注册或迁入企业登记:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findEnterpriseListByTaskId(TaskId);
dataList.forEach(item => {
item.uscc = item.draftId;//这里转换一下,为了不改前端代码 使用uscc这个名称,但是实际是draftId
});
break;
case TASKTYPEENUM.融资企业填报:
/**限制 draftLock = false 即草稿数据 这里可以不用这个限制 */
dataList = await findFinancingListByTaskId(TaskId);
break;
}
dataList.forEach(info => {
let addInfo:any = { name:info.name };
onceObj.enterpriseList.push(addInfo);
});
result.push(onceObj);
}
}
......
......@@ -9,10 +9,13 @@
import { ERRORCODEENUM, ERRORENUM } from "../../../config/errorEnum";
import * as fuhuaqiData from "../../../data/fuHuaQi/fuhuaqi"
import * as codeData from "../../../data/fuHuaQi/code"
import { BizError } from "../../../util/bizError";
import * as sysTools from "../../../tools/system";
import { get } from "../../../util/request";
import { systemConfig } from "../../../config/serverConfig";
import { CODETYPE } from "../../../config/enum";
import { sendChangePwdCode } from "../../sms";
/**
......@@ -23,6 +26,7 @@ import { systemConfig } from "../../../config/serverConfig";
* @returns fuhuaqiUserInfo:{uscc, name} 登录后的信息
*/
export async function login(uscc:string, pwd:string) {
if (!sysTools.eccUscc(uscc)) throw new BizError(ERRORENUM.统一社会信用代码不合法, '孵化器登录时');
let fuhuaqiInfo = await fuhuaqiData.findFuHuaQiByUSCC(uscc);
if(!fuhuaqiInfo) throw new BizError(ERRORENUM.账号不存在);
......@@ -71,7 +75,7 @@ export async function firstLoginChangePwd(uscc:string, pwd:string, confirmPwd:st
/**
* 重置密码
* 修改密码
* 小程序端 2.0
* @param uscc 信用代码
* @param pwd 原密码 md5之后的
......@@ -241,4 +245,85 @@ async function getOpenId(code:string) {
if (!weixinRes.openid) throw new BizError(ERRORENUM.绑定失败, code);
return weixinRes.openid;
}
/**
* 发送修改密码的短信验证码
* @param uscc 孵化器统一信用代码
*/
export async function changePwdSendCode(uscc:string, phone:string) {
if (!sysTools.eccUscc(uscc)) throw new BizError(ERRORENUM.统一社会信用代码不合法, '重置密码时');
let fuHuaQiInfo = await fuhuaqiData.findFuHuaQiByUSCC(uscc);
if (!fuHuaQiInfo) throw new BizError(ERRORENUM.账号不存在, `发送验证码时 uscc:${uscc}`);
if (!fuHuaQiInfo.personInChargePhone) throw new BizError(ERRORENUM.没有联系人, '修改密码发验证码时');
if ( phone != fuHuaQiInfo.personInChargePhone) throw new BizError(ERRORENUM.号码与主体不一致, '修改密码发验证码时');
let todayMs = sysTools.getTodayMs();
let todayCodeList = await codeData.findTodayCodeByUscc(uscc, todayMs);
if (todayCodeList.length >= 4) throw new BizError(ERRORENUM.发送验证码次数超限制, `${uscc} 修改密码发送验证码次数超限制4`);
let sendMs = todayMs;
todayCodeList.forEach(info => {
sendMs = Math.max(sendMs, info.sendMs);
});
let now = new Date().valueOf();
if ((now - sendMs) <= (60 * 1000) ) throw new BizError(ERRORENUM.发送验证码频率过快, `${uscc}`);
let codeId = sysTools.getSMSCodeId(uscc, todayCodeList.length);
let code = sysTools.getSMSCode();
await sendChangePwdCode(phone, code);
now = new Date().valueOf();
await codeData.createCode(uscc, codeId, code, CODETYPE.修改密码, now);
return {
isSuccess:true,
sendMs:now
};
}
/**
* 重置密码
* @param phone
* @param uscc
* @param code
* @param pwd
* @param confirmPwd
*/
export async function resettingPwd(phone:string, uscc:string, code:string, pwd:string, confirmPwd:string) {
if (!sysTools.eccUscc(uscc)) throw new BizError(ERRORENUM.统一社会信用代码不合法, '重置密码时');
let fuHuaQiInfo = await fuhuaqiData.findFuHuaQiByUSCC(uscc);
if (!fuHuaQiInfo) throw new BizError(ERRORENUM.账号不存在, `重置密码时 uscc:${uscc}`);
if ( phone != fuHuaQiInfo.personInChargePhone) throw new BizError(ERRORENUM.号码与主体不一致, '修改密码发验证码时');
if (pwd != confirmPwd) throw new BizError(ERRORENUM.密码不一致);
if (pwd.search(/^[A-Za-z0-9]{6,18}$/) < 0) throw new BizError(ERRORENUM.密码只能由618位字符和数字组成);
let todayMs = sysTools.getTodayMs();
let codeList = await codeData.findTodayCodeByUscc(uscc, todayMs);
let now = new Date().valueOf();
let codeId = '';
let msg = ERRORENUM.验证码错误;
codeList.forEach(info => {
if (info.code == code) {
if (info.isUse) msg = ERRORENUM.验证码失效;
else if ( (now - info.sendMs) > (30 * 60 * 1000) ) msg = ERRORENUM.验证码过期
else codeId = info.id;
}
});
if (!codeId) throw new BizError(msg, `uscc:${uscc}重置密码的code:${code}`);
await codeData.updateCodeState(codeId);
fuHuaQiInfo.pwd = sysTools.getPwdMd5(uscc, sysTools.md5PwdStr(pwd));
await fuHuaQiInfo.save();
return {isSuccess:true};
}
\ No newline at end of file
/**
* 短信主要逻辑
*/
const QcloudSms = require("qcloudsms_js");
import { SMSTYPE } from "../config/enum";
import { systemConfig } from "../config/serverConfig";
/**实例化 QcloudSms */
var qcloudsms;
export function initSMS() {
qcloudsms = QcloudSms(systemConfig.smsSDKId, systemConfig.smsAppKey);
}
/**
* 给特定账号发送信息
* @param phone 需要发送的电话数组
* @param type 类别
* @param params 参数数组
*/
function sendMsmToPhoneNumber(phone, type:number, params) {
var ssender = qcloudsms.SmsSingleSender();
let templateId = -1;
if (type == SMSTYPE.修改密码) templateId = systemConfig.smsModelChangePwd;
else if (type == SMSTYPE.信息填报提醒) templateId = systemConfig.smsModelPointOut;
else if (type == SMSTYPE.创建孵化器提醒) templateId = systemConfig.smsModelInitPointOut;
return new Promise( (resolve, reject) => {
ssender.sendWithParam("86", phone, templateId, params, systemConfig.smsSign, "", "", function (err, res, resData) {
let isError = false;
let msg = "";
if (err) {
msg = err;
isError = true;
} else {
console.log("request data: ", res.req);
console.log("response data: ", resData);
//todo
if (resData.errmsg != 'OK') {
isError = true;
msg = resData.errmsg;
}
}
resolve({isError, msg});
});
})
}
/**
* 发送修改密码的短信验证码
* @param phone
* @param code
*/
export async function sendChangePwdCode(phone:string, code:string) {
let sendPhoneList = [phone];
let params = [code];
let sendRes:any = await sendMsmToPhoneNumber(sendPhoneList, SMSTYPE.修改密码, params);
return sendRes.isError;
}
/**
* 发送任务提醒
* @param phoneList 发送的对象列表
* @param month 月份数
* @returns
*/
export async function sendTaskPointOut(phoneList, month:number) {
let sendRes:any = await sendMsmToPhoneNumber(phoneList, SMSTYPE.修改密码, [month]);
return sendRes.isError;
}
/**
* 创建孵化器发送初始密码消息
* @param phone 发送的对象号码
* @returns
*/
export async function sendInitPointOut(phone:string) {
let sendPhoneList = [phone];
let sendRes:any = await sendMsmToPhoneNumber(sendPhoneList, SMSTYPE.修改密码, []);
return sendRes.isError;
}
......@@ -13,7 +13,7 @@
* 备注:
*/
export const BaseParamUpdateConfig = {
virtualEnterpriseNum:{type:"Number", notMustHave:true},//虚拟企业数量
virtualEnterpriseNum:{type:"Number"},//虚拟企业数量
incubatedAcreage:{type:"Number", notMustHave:true},//在孵面积(㎡)
acreageTotal:{type:"Number", notMustHave:true},//孵化器总面积(㎡)
acreagePersonalUse:{type:"Number", notMustHave:true},//孵化器自用面积(㎡)
......@@ -49,8 +49,8 @@ export const OrganizationParamUpdateConfig = {
foundingTeam:{type:"[Object]", notMustHave:true},// {key:"创始团队"},//新加
liaison:{type:"String", notMustHave:true},// {key:"联系人"},
liaisonPhone:{type:"String", notMustHave:true},// {key:"联系电话"},
personInCharge:{type:"String", notMustHave:true},// {key:"负责人"},
personInChargePhone:{type:"String", notMustHave:true},// {key:"负责人联系电话"},
// personInCharge:{type:"String", notMustHave:true},// {key:"负责人"}, 2.0去掉了
// personInChargePhone:{type:"String", notMustHave:true},// {key:"负责人联系电话"}, 2.0去掉了
operationModelDes:{type:"String", notMustHave:true},//{key:"运营模式描述"},
foundingTeamType:{type:"Number", notMustHave:true},//{key:"团队类型"}
};
......
......@@ -225,3 +225,21 @@ export enum CHANGEMODE {
增加 = 1,
减少
}
/**
* 验证码类型
*/
export enum CODETYPE {
修改密码 = 1,
}
/**
* 短信类型
*/
export enum SMSTYPE {
修改密码 = 1,
信息填报提醒,
创建孵化器提醒
}
\ No newline at end of file
......@@ -34,7 +34,15 @@ export enum ERRORENUM {
频繁操作请稍后再试,
高风险等级用户,
系统繁忙,
绑定失败
绑定失败,
发送验证码次数超限制,
发送验证码频率过快,
没有联系人,
号码与主体不一致,
验证码错误,
验证码失效,
验证码过期,
不能修改过期任务数据,
}
export enum ERRORCODEENUM {
......
......@@ -16,7 +16,7 @@ export async function initConfig() {
if (!configInfo || !configInfo.config) throw new BizError('xml中无配置');
else {
let {port, mongodb, secret, getOpenIdUrl, appId } = configInfo.config;
let {port, mongodb, secret, getOpenIdUrl, appId, sms } = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.secret = secret[0];
......@@ -29,11 +29,22 @@ export async function initConfig() {
const MongoDataBase = mongodb[0].dataBase[0];
const MongoWtimeoutMS = mongodb[0].wtimeoutMS[0];
systemConfig.mongodbStr = analysisMongoConnectStr( MongoPath, MongoPort, MongoDataBase, MongoW, MongoWtimeoutMS);
let smsInfo = sms[0];
systemConfig.smsSign = smsInfo.smsSign[0];
systemConfig.smsSDKId = smsInfo.sdkAppId[0];
systemConfig.smsAppKey = smsInfo.appKey[0];
systemConfig.smsModelChangePwd = smsInfo.changePwd[0];
systemConfig.smsModelPointOut = smsInfo.pointOut[0];
systemConfig.smsModelInitPointOut = smsInfo.initPointOut[0];
}
console.log("config init success");
} catch(err) {
console.log('ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确');
console.log(err);
throw new BizError("服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确");
}
}
......
......@@ -218,8 +218,8 @@ export const OrganizationBaseDataConfig = {
foundingTeamType:{key:"创始团队类型"},//新加
liaison:{key:"联系人"},
liaisonPhone:{key:"联系电话"},
personInCharge:{key:"负责人"},
personInChargePhone:{key:"负责人联系电话"},
// personInCharge:{key:"负责人"}, 2.0去掉了
// personInChargePhone:{key:"负责人联系电话"}, 2.0去掉了
operationModelDes:{key:"运营模式描述"}
// hatchingGround:{key:"经备案孵化场地"}
}
......
/**
* 系统配置类
*
*
*/
export class ServerConfig {
/**系统配置 */
port:number;
mongodbStr:string;
secret:string;
/**小程序相关配置 */
getOpenIdUrl:string;
appId:string;
/**短信相关配置 */
smsSDKId:number;
smsAppKey:string;
smsSign:string;
smsModelChangePwd:number;
smsModelPointOut:number;
smsModelInitPointOut:number;
}
\ No newline at end of file
......@@ -97,8 +97,8 @@ export async function selectOneEnterpriseByParam(param:object) {
* 限制返回 draftId name isCreate uscc 字段
* @returns [{draftId}]
*/
export async function findEnterpriseListByTaskId(taskId:string) {
return await enterpriseModel.find({taskId, draftLock:false}, 'draftId name isCreate uscc');
export async function findEnterpriseListByTaskId(taskId:string, draftLock:boolean) {
return await enterpriseModel.find({taskId, draftLock}, 'draftId name isCreate uscc');
}
......@@ -208,7 +208,7 @@ export async function findEnterpriseInfoByName(name:string) {
* @returns []
*/
export async function findSubmittedEnterpriseListByFuHuaQiUscc(fuHuaQiUscc:string) {
return await enterpriseModel.find({fuHuaQiUscc, draftLock:true}, 'name logonAdd operatingAdd');
return await enterpriseModel.find({fuHuaQiUscc, draftLock:true }, 'name logonAdd operatingAdd state');
}
......
......@@ -66,8 +66,8 @@ export async function findFinancingInfoByTaskIdAndSucc(taskId:string, uscc:strin
* @param taskId 任务id 格式遵循tool中getTaskId
* @returns [{}]
*/
export async function findFinancingListByTaskId(taskId:string) {
return await financingModel.find({taskId, draftLock:false});
export async function findFinancingListByTaskId(taskId:string, draftLock:boolean) {
return await financingModel.find({taskId, draftLock});
}
......
/**
* 孵化器验证码 表
* 用于管理 孵化器 所用的验证码
*
*/
import {Schema} from 'mongoose';
import { baseDB } from '../../db/mongo/dbInit';
const codeSchema = new Schema({
id:{type:String},
code:String,
sendMs:Number,//下发时间时间戳
uscc:{type:String, index:true},//统一信用代码
type:Number,//验证码类型 遵循 CODETYPE
isUse:{type:Boolean, default:false},//是否使用 默认false
});
var codeModel;
export function initModel(){
codeModel = baseDB.model('fuhuaqicode', codeSchema);
codeModel.selectOnceData = async function (paramater:object) {
let selectInfo = await codeModel.findOne(paramater).exec();
if (selectInfo) {
if (!selectInfo.runSave) {
selectInfo.runSave = selectInfo.save;
selectInfo.save = save.bind(selectInfo)
}
}
return selectInfo;
}
}
export async function save(throwError=false) {
if (!this.isModified()) return;
await this.runSave({validateBeforeSave:false}).catch(err=>{
console.log(err);
});
}
/**
* 获取今日目标孵化器下发的code
* @param uscc
* @returns []
*/
export async function findTodayCodeByUscc(uscc:string, todayMs:number) {
let findParam = {uscc, sendMs:{"$gt":todayMs} }
let res = await codeModel.find(findParam);
return res || [];
}
/**
* 修改状态
* @param uscc
* @returns []
*/
export async function updateCodeState(codeId:string) {
await codeModel.update({codeId}, {$set:{isUse:true}});
}
/**
* 创建code
* @param uscc 孵化器统一信用代码
* @param id code的id
* @param code code码
* @param type 类型
* @returns
*/
export async function createCode(uscc:string, id:string, code:string, type:number, sendMs:number) {
let addInfo = {
id,
code,
sendMs,
uscc,
type,
isUse:false
};
return await codeModel.create(addInfo);
}
\ No newline at end of file
......@@ -52,8 +52,8 @@ export async function findFuHuaQiScoreInfo(uscc:string) {
* 创建分数信息
* @param uscc 孵化器统一信用代码
*/
export async function createFuHuaQiScore(uscc:string) {
return await fuHuaQiScoreModel.create({uscc, updateTime:new Date().valueOf() });
export async function createFuHuaQiScore(uscc:string, lastScore:number) {
return await fuHuaQiScoreModel.create({uscc, updateTime:new Date().valueOf(), lastScore });
}
......@@ -61,3 +61,7 @@ export async function initFuHuaQiScore(array) {
return await fuHuaQiScoreModel.insertMany(array);
}
export async function findScoreDataByParam(param) {
return await fuHuaQiScoreModel.find(param);
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import * as monthTableModel from "../../data/fuHuaQi/monthTable";
import * as guanweihuiModel from "../../data/guanWeiHui/guanweihui";
import * as scoreModel from "../../data/fuHuaQi/score";
import * as scoreLogModel from "../../data/fuHuaQi/scoreLog";
import * as codeModel from "../../data/fuHuaQi/code";
export async function initTable() {
taskinModel.initModel();
......@@ -16,4 +17,5 @@ export async function initTable() {
guanweihuiModel.initModel();
scoreModel.initModel();
scoreLogModel.initModel();
codeModel.initModel();
}
\ No newline at end of file
import { initSMS } from "./biz/sms";
import { initSystemTask } from "./biz/systemTask";
import { initConfig, systemConfig} from "./config/serverConfig";
import { initDB } from "./db/mongo/dbInit";
import { httpServer } from "./net/http_server";
import { initBasicData } from "./tools/dataInit";
async function lanuch() {
await initConfig();//初始化配置解析
/**初始化配置解析 */
await initConfig();
/**初始化数据库 */
await initDB();
/**初始化底表数据 */
await initBasicData();
/**初始化系统任务 */
await initSystemTask();
/**腾讯云短信 */
await initSMS();
/**创建http服务 */
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
......
/**
* 分数路由
*/
import * as asyncHandler from 'express-async-handler';
import * as fuHuaQiAdminBiz from '../../biz/admin/fuHuaQi/fuHuaQi';
import { checkGuanWeiHuiToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/admin//baselist',checkGuanWeiHuiToken, asyncHandler(fuHuaQiBaseList));
}
/**
* 孵化器基本信息列表
* @param req
* @param res
*/
async function fuHuaQiBaseList(req, res) {
}
......@@ -12,7 +12,8 @@ export function setRouter(httpServer) {
httpServer.post('/fuhuaqi/financing/update', checkFuHuaQiToken, asyncHandler(updateFinancingInfo));
httpServer.post('/fuhuaqi/financing/select', checkFuHuaQiToken, asyncHandler(selectEnterpriseFinancingInfo));
httpServer.post('/fuhuaqi/financing/delete', checkFuHuaQiToken, asyncHandler(delEnterpriseFinancingInfo));
httpServer.post('/admin/financing/namelist', checkFuHuaQiToken, asyncHandler(getFinancingInfoByName)); // todo 路由名称不对
/** */
httpServer.post('/fuhuaqi/financing/enterprisenamelist', checkFuHuaQiToken, asyncHandler(getFinancingInfoByName)); // todo 路由名称不对
}
......
......@@ -22,8 +22,8 @@ export function setRouter(httpServer) {
/** 任务 */
httpServer.post('/fuhuaqi/task/list', checkFuHuaQiToken, asyncHandler(taskList));//待办任务
httpServer.post('/fuhuaqi/task/submit', checkFuHuaQiToken, asyncHandler(submitTask));//提交待办任务
httpServer.post('/fuhuaqi/task/completedlist', checkFuHuaQiToken, asyncHandler(completedList));//todo 已办任务
httpServer.post('/fuhuaqi/task/pastduelist', checkFuHuaQiToken, asyncHandler(pastDueList));//todo 已办任务
httpServer.post('/fuhuaqi/task/completedlist', checkFuHuaQiToken, asyncHandler(completedList));//已办任务
httpServer.post('/fuhuaqi/task/pastduelist', checkFuHuaQiToken, asyncHandler(pastDueList));//已办任务
}
......
......@@ -15,11 +15,39 @@ export function setRouter(httpServer) {
httpServer.post('/fuhuaqi/binduser', checkFuHuaQiToken, asyncHandler(bindUser));
httpServer.post('/fuhuaqi/bindlist', checkFuHuaQiToken, asyncHandler(bindList));
httpServer.post('/fuhuaqi/changeuser', checkFuHuaQiToken, asyncHandler(changeUser));
httpServer.post('/fuhuaqi/forgotpwd', asyncHandler(forgotPwd));
/**发送短信验证码 */
httpServer.post('/fuhuaqi/changepwd/sendcode', asyncHandler(sendCode));
}
/**
* 忘记密码 重置密码
* @param req
* @param res
*/
async function forgotPwd(req, res) {
let reqConf = {phone:'String', uscc:'String', code:'String', pwd:'String', confirmPwd:'String'};
let {phone, uscc, code, pwd, confirmPwd} = eccReqParamater(reqConf, req.body);
let result = await userBiz.resettingPwd(phone, uscc, code, pwd, confirmPwd);
res.success(result);
}
/**
* 发送短信验证码
* @param req
* @param res
*/
async function sendCode(req, res) {
let reqConf = {phone:'String', uscc:'String'};
let {phone, uscc} = eccReqParamater(reqConf, req.body);
let result = await userBiz.changePwdSendCode(uscc, phone);
res.success(result);
}
/**
* 孵化器登录
* @param req
* @param res
......
......@@ -123,4 +123,47 @@ export function eccUscc(uscc:string) {
*/
export function getBindId(uscc:string, bindUscc:string) {
return md5(`${uscc}${bindUscc}${Math.ceil(Math.random() *100)}`);
}
\ No newline at end of file
}
/**
* 获取今天开始时刻的时间戳 0时0分
* @returns
*/
export function getTodayMs() {
let t =`${ moment().format("YYYY-MM-DD")} 00:00:00`;
return new Date(t).valueOf();
}
/**
* 获取这个月的开始时刻的时间戳 0时0分
* @returns
*/
export function getThisMonthMs() {
let t =`${ moment().format("YYYY-MM")}-01 00:00:00`;
return new Date(t).valueOf();
}
/**
* 获取code的id
* @param uscc 发送人的uscc
* @param todaySendCount 今日发送次数
* @returns ''
*/
export function getSMSCodeId(uscc:string, todaySendCount:number) {
return md5(`${uscc}${todaySendCount}${new Date().valueOf()}`);
}
/**
* 获取一个随机6位数的验证码
* @returns
*/
export function getSMSCode() {
let code = ``;
for (let i =0; i < 6; i++) {
code += Math.floor(Math.random() * 10)
}
return code;
}
\ No newline at end of file
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