Commit 94a62cc6 by lixinming

no message

parent dc8b3b4b
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"request": "^2.88.0", "request": "^2.88.0",
"sequelize": "^6.35.2", "sequelize": "^6.35.2",
"svg-captcha": "^1.3.12", "svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562", "tencentcloud-sdk-nodejs": "^4.0.821",
"wechatpay-node-v3": "^2.2.0", "wechatpay-node-v3": "^2.2.0",
"ws": "^5.2.2", "ws": "^5.2.2",
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
...@@ -46,7 +46,5 @@ ...@@ -46,7 +46,5 @@
], ],
"outputPath": "dist" "outputPath": "dist"
}, },
"devDependencies": { "devDependencies": {}
"province-city-china": "^8.5.7"
}
} }
...@@ -31,11 +31,13 @@ const pay = new WxPay({ ...@@ -31,11 +31,13 @@ const pay = new WxPay({
* @returns * @returns
*/ */
export async function placeAnOrder({id}) { export async function placeAnOrder({id}) {
let orderInfo = await findOnce(TABLEENUM.订单表, {id}, ["id", "loginId", "userId", "memberCategory", "money", "orderCycleStart", "orderCycleEnd","weChartState", "state", "weChartCreatePayMs"]); let orderInfo = await findOnce(TABLEENUM.订单表, {id}, ["id", "loginId", "userId", "memberCategory", "money", "orderCycleStart", "orderCycleEnd","weChartState", "state", "weChartCreatePayMs", "weChartPayUrl", "weChartPR"]);
if (!orderInfo || !orderInfo.id) throw new BizError(ERRORENUM.订单不存在); if (!orderInfo || !orderInfo.id) throw new BizError(ERRORENUM.订单不存在);
if (orderInfo.state == ORDERSTATE.已支付) throw new BizError(ERRORENUM.该订单已支付); if (orderInfo.state == ORDERSTATE.已支付) throw new BizError(ERRORENUM.该订单已支付);
if (orderInfo.weChartCreatePayMs && orderInfo.weChartState == WEICHARTPAYSTATE.未支付) { if (orderInfo.weChartCreatePayMs && orderInfo.weChartState == WEICHARTPAYSTATE.未支付) {
if (new Date(orderInfo.weChartCreatePayMs).valueOf() < (new Date().valueOf() + (15 * 60 * 1000)) ) throw new BizError(ERRORENUM.该订单正在支付); if (new Date(orderInfo.weChartCreatePayMs).valueOf() < (new Date().valueOf() + (15 * 60 * 1000)) ) {
return {code_url:orderInfo.weChartPayUrl, weChartPR:orderInfo.weChartPR};
}
} }
/**生成 out_trade_no */ /**生成 out_trade_no */
...@@ -56,13 +58,14 @@ export async function placeAnOrder({id}) { ...@@ -56,13 +58,14 @@ export async function placeAnOrder({id}) {
}; };
const result = await pay.transactions_native(Param); const result = await pay.transactions_native(Param);
if (result.status != 200) throw new BizError(ERRORENUM.调起微信支付失败); if (result.status != 200) throw new BizError(ERRORENUM.调起微信支付失败);
let code_url = result.data.code_url;
let updateInfo = { let updateInfo = {
weChartCreatePayMs:new Date().valueOf(), weChartCreatePayMs:new Date().valueOf(),
weChartPR:out_trade_no, paymentMethod:PAYMENTTYPE.微信支付, weChartState:WEICHARTPAYSTATE.未支付 weChartPR:out_trade_no, paymentMethod:PAYMENTTYPE.微信支付, weChartState:WEICHARTPAYSTATE.未支付,
weChartPayUrl:code_url
}; };
await updateOneData(TABLEENUM.订单表, {id}, updateInfo ); await updateOneData(TABLEENUM.订单表, {id}, updateInfo );
return {code_url:result.code_url, weChartPR:out_trade_no}; return {code_url, weChartPR:out_trade_no};
} }
async function close(id:string) { async function close(id:string) {
......
...@@ -9,7 +9,7 @@ import { addManyData } from "../../data/add"; ...@@ -9,7 +9,7 @@ import { addManyData } from "../../data/add";
import { TABLEENUM } from "../../data/models/model"; import { TABLEENUM } from "../../data/models/model";
import { find, findCount, findOnce, findOnceToSort, findToPage } from "../../data/select"; import { find, findCount, findOnce, findOnceToSort, findToPage } from "../../data/select";
import { updateOneData } from "../../data/update"; import { updateOneData } from "../../data/update";
import { generateSystemId, getAreaCode, getMenberNum, successResult } from "../../tools/system"; import { generateSystemId, getMenberNum, successResult } from "../../tools/system";
import { BizError } from "../../util/bizError"; import { BizError } from "../../util/bizError";
import { extractData } from "../../util/piecemeal"; import { extractData } from "../../util/piecemeal";
import { changeEnumValue } from "../../util/verificationEnum"; import { changeEnumValue } from "../../util/verificationEnum";
...@@ -92,10 +92,9 @@ export async function adopt({id, session}) { ...@@ -92,10 +92,9 @@ export async function adopt({id, session}) {
let thisDate = new Date(); let thisDate = new Date();
const NowMs = thisDate.valueOf(); const NowMs = thisDate.valueOf();
let menberTypeStr = "";
if(userInfo.memberType == MEMBERTYPE.个人会员) menberTypeStr = "GR"; let userCount = await findCount(TABLEENUM.用户表, {isAdmin:0, memberType:userInfo.memberType, userRegisterState:USERREGISTERSTATE.通过});
if(userInfo.memberType == MEMBERTYPE.单位会员) menberTypeStr = "DW"; let memberNum = getMenberNum(thisDate, userInfo.sheng, userCount, userInfo.memberType);
let memberNum = getMenberNum(TABLEENUM.用户表, thisDate, userInfo.sheng, menberTypeStr);
let updateInfo:any = { let updateInfo:any = {
auditTime:NowMs, auditTime:NowMs,
......
...@@ -11,11 +11,12 @@ import { deleteManyData } from "../../data/delete"; ...@@ -11,11 +11,12 @@ import { deleteManyData } from "../../data/delete";
import { TABLEENUM } from "../../data/models/model"; import { TABLEENUM } from "../../data/models/model";
import { find, findOnce } from "../../data/select"; import { find, findOnce } from "../../data/select";
import { updateOneData } from "../../data/update"; import { updateOneData } from "../../data/update";
import { generateSystemId, successResult } from "../../tools/system"; import { generateSystemId, getEdition, successResult } from "../../tools/system";
import { BizError } from "../../util/bizError"; import { BizError } from "../../util/bizError";
import { extractData } from "../../util/piecemeal"; import { extractData } from "../../util/piecemeal";
import { eccEnumValue } from "../../util/verificationEnum"; import { eccEnumValue } from "../../util/verificationEnum";
import { eccFormParam } from "../../util/verificationParam"; import { eccFormParam } from "../../util/verificationParam";
import { getCityNameByCode } from "../../config/cityConfig";
/** /**
...@@ -239,10 +240,14 @@ export async function getSheng ({userId}) { ...@@ -239,10 +240,14 @@ export async function getSheng ({userId}) {
* @returns * @returns
*/ */
export async function getCertificate({userId}) { export async function getCertificate({userId}) {
let userInfo = await findOnce(TABLEENUM.用户表, {userId}, ["userId", "memberType", "userRegisterState", "paymentStatus", "individualMemberType", "unitMemberType"]); const Files = ["userId", "memberType", "userRegisterState", "paymentStatus", "individualMemberType", "unitMemberType",
"sheng", "documentId", "memberNum", "lifespanStartTime", "lifespanEndTime", "shi","qu","addres", "unitName", "session"];
let userInfo = await findOnce(TABLEENUM.用户表, {userId}, Files);
if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.目标数据不存在); if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
let certificate = false; let certificate = false;
let cefaInfo = {};
let msg = '会员注册尚未审核通过,无法下载证书';
//判断是否审批通过 //判断是否审批通过
if (userInfo.userRegisterState == USERREGISTERSTATE.通过) { if (userInfo.userRegisterState == USERREGISTERSTATE.通过) {
if(userInfo.memberType == MEMBERTYPE.个人会员) { if(userInfo.memberType == MEMBERTYPE.个人会员) {
...@@ -250,6 +255,18 @@ export async function getSheng ({userId}) { ...@@ -250,6 +255,18 @@ export async function getSheng ({userId}) {
if (userInfo.individualMemberType == INDIVIDUALMEMBERTYPE.个人会员 && userInfo.paymentStatus != PAYMENTSTATUS.未支付) certificate = true; if (userInfo.individualMemberType == INDIVIDUALMEMBERTYPE.个人会员 && userInfo.paymentStatus != PAYMENTSTATUS.未支付) certificate = true;
//个人会员专家无需支付可下载 //个人会员专家无需支付可下载
if (userInfo.individualMemberType == INDIVIDUALMEMBERTYPE.个人会员专家) certificate = true; if (userInfo.individualMemberType == INDIVIDUALMEMBERTYPE.个人会员专家) certificate = true;
if (certificate) {
cefaInfo = {
area:getCityNameByCode(userInfo.sheng),
documentId:userInfo.documentId,
memberNum:userInfo.memberNum,
session:getEdition(Math.floor(userInfo.session/100), userInfo.session%100 ),
lifespanTime:`${moment(userInfo.lifespanStartTime).format("YYYY年MM月DD日")}${moment(userInfo.lifespanEndTime).format("YYYY年MM月DD日")}`
}
msg = ``;
} else {
msg = `会员注册尚未缴费,无法下载证书`;
}
} else if(userInfo.memberType == MEMBERTYPE.单位会员) { } else if(userInfo.memberType == MEMBERTYPE.单位会员) {
//院校无需支付可下载 //院校无需支付可下载
if (userInfo.unitMemberType == UNITMEMBERTYPE.院校) certificate = true; if (userInfo.unitMemberType == UNITMEMBERTYPE.院校) certificate = true;
...@@ -257,10 +274,22 @@ export async function getSheng ({userId}) { ...@@ -257,10 +274,22 @@ export async function getSheng ({userId}) {
if (userInfo.unitMemberType == UNITMEMBERTYPE.机构 || userInfo.unitMemberType == UNITMEMBERTYPE.其他 && userInfo.paymentStatus != PAYMENTSTATUS.未支付) { if (userInfo.unitMemberType == UNITMEMBERTYPE.机构 || userInfo.unitMemberType == UNITMEMBERTYPE.其他 && userInfo.paymentStatus != PAYMENTSTATUS.未支付) {
certificate = true; certificate = true;
} }
if (certificate) {
cefaInfo = {
unitName:userInfo.unitName,
addres:`${getCityNameByCode(userInfo.sheng)}${getCityNameByCode(userInfo.shi)}${getCityNameByCode(userInfo.qu)}${userInfo.addres}`,
memberNum:userInfo.memberNum,
session:getEdition(Math.floor(userInfo.session/100), userInfo.session%100 ),
lifespanTime:`${moment(userInfo.lifespanStartTime).format("YYYY年MM月DD日")}${moment(userInfo.lifespanEndTime).format("YYYY年MM月DD日")}`
}
msg = ``;
} else {
msg = `会员注册尚未缴费,无法下载证书`;
}
} }
} }
return {certificate}; return {certificate, cefaInfo, msg};
} }
......
...@@ -188,7 +188,7 @@ export async function paidList({unitName, paymentType, costType, pageNumber }) { ...@@ -188,7 +188,7 @@ export async function paidList({unitName, paymentType, costType, pageNumber }) {
let dataList = []; let dataList = [];
let itemFile = ["id", "unitName", "money", "paymentNum"]; let itemFile = ["id", "unitName", "money", "paymentNum", "userId"];
for ( let i = 0; i < dbList.length; i++) { for ( let i = 0; i < dbList.length; i++) {
let info = dbList[i]; let info = dbList[i];
let itemData:any = extractData(info, itemFile); let itemData:any = extractData(info, itemFile);
......
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
* 用户逻辑 * 用户逻辑
*/ */
import { ADMINTYPE, DOCUMENTTYPE, MEMBERLEVEL, MEMBERSTATE, MEMBERTYPE, NATION, PROFCATEGORY, SEX, STATE, USERREGISTERSTATE } from "../../config/enum"; import { ADMINTYPE, CODETYPE, MEMBERSTATE, STATE, USERREGISTERSTATE } from "../../config/enum";
import { ERRORCODEENUM, ERRORENUM } from "../../config/errorEnum"; import { ERRORENUM } from "../../config/errorEnum";
import { addOneData } from "../../data/add"; import { addOneData } from "../../data/add";
import { TABLEENUM } from "../../data/models/model"; import { TABLEENUM } from "../../data/models/model";
import { findOnce } from "../../data/select"; import { findCount, findOnce, findOnceToSort } from "../../data/select";
import { updateOneData } from "../../data/update"; import { updateOneData } from "../../data/update";
import { generateToken, generateUserId, successResult } from "../../tools/system"; import { generateSMSCode, generateToken, getTodayMs, successResult } from "../../tools/system";
import { BizError } from "../../util/bizError"; import { BizError } from "../../util/bizError";
import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum"; import { changeEnumValue } from "../../util/verificationEnum";
...@@ -24,6 +24,14 @@ export async function login({loginId, pwd}) { ...@@ -24,6 +24,14 @@ export async function login({loginId, pwd}) {
let userInfo = await findOnce(TABLEENUM.用户表, selectParam); let userInfo = await findOnce(TABLEENUM.用户表, selectParam);
if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.账号或密码错误); if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.账号或密码错误);
if (userInfo.isInput && !userInfo.inputUserChangePwd) {
return {
isInput:userInfo.isInput,
phone:userInfo.phone
}
}
if (userInfo.pwd != pwd ) throw new BizError(ERRORENUM.账号或密码错误); if (userInfo.pwd != pwd ) throw new BizError(ERRORENUM.账号或密码错误);
let token = ""; let token = "";
...@@ -45,10 +53,12 @@ export async function login({loginId, pwd}) { ...@@ -45,10 +53,12 @@ export async function login({loginId, pwd}) {
adminLv:userInfo.adminLv, adminLv:userInfo.adminLv,
timeMs:Now, timeMs:Now,
isPass:userInfo.userRegisterState == USERREGISTERSTATE.通过, isPass:userInfo.userRegisterState == USERREGISTERSTATE.通过,
memberType:userInfo.memberType memberType:userInfo.memberType,
isInput:(userInfo.isInput && !userInfo.inputUserChangePwd),
phone:userInfo.phone
}; };
return {dataInfo} return {dataInfo};
} }
...@@ -65,4 +75,54 @@ export async function logout({userId}) { ...@@ -65,4 +75,54 @@ export async function logout({userId}) {
} }
/**
* 修改密码
* @param param0
* @returns
*/
export async function changePwd({phone, pwd, confirmation, code}) {
if (pwd.search(/^[A-Za-z0-9]{6,18}$/) < 0) throw new BizError(ERRORENUM.密码只能由618位字符和数字组成);
if (pwd != confirmation) throw new BizError(ERRORENUM.两次密码不一致);
let userInfo = await findOnce(TABLEENUM.用户表, {phone}, ["userId"]);
if (!userInfo || !userInfo.userId) throw new BizError(ERRORENUM.手机号不正确);
// let pwdStr = generatePwd(userInfo.userId, pwd); todo
let pwdStr = pwd;
let updateInfo:any = {pwd:pwdStr};
if (userInfo.isInput && !userInfo.inputUserChangePwd) {
updateInfo.inputUserChangePwd = true;
}
await updateOneData(TABLEENUM.用户表, {userId:userInfo.userId}, updateInfo);
return successResult();
}
/**
* 修改密码【短信验证码】 success
* @param userId
* @param phone
* @returns
*/
export async function memberChangePwdSendCode({phone}) {
const NowMs = new Date().valueOf();
let codeSelectParam = { phone, isUse:false, type:CODETYPE.修改密码, sendMs:{"$gt":getTodayMs()} }
let lastCodeInfo = await findOnceToSort(TABLEENUM.验证码表, codeSelectParam, {sendMs:-1});
let codeNum = lastCodeInfo.codeNum;
if (codeNum) {
if ( (lastCodeInfo.sendMs + (60*1000)) > NowMs ) throw new BizError(ERRORENUM.频繁操作请稍后再试);
/**校验今日同类型验证码次数 */
let todayNotUseCount = await findCount(TABLEENUM.验证码表, codeSelectParam);
if (todayNotUseCount >= 4) throw new BizError(ERRORENUM.发送验证码次数超限制, `${phone} 注册验证码超过限制3`);
}
const Code = generateSMSCode();//生成短信验证码
/**发送短信模块 */
let addInfo = {codeNum:Code, phone, sendMs:NowMs, type:CODETYPE.修改密码, isUse:false};
await addOneData(TABLEENUM.验证码表, addInfo);
return {code:Code};
}
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
*/ */
import moment = require("moment"); import moment = require("moment");
import { ARTICLEPOSITION, BANNERPOSITION, BRANCHPOSITION, CODPARTICIPANT, DANGJIANVIDEO, DONGTAIZIXUNSUBTYPE, IMGEDITFUNENUM, PARTYBUILDSUBTYPEENUM, PARTYBUILDTYPEENUM, STATE, TONGZHIGONGGAO } from "../config/enum"; import { ARTICLEPOSITION, BANNERPOSITION, BRANCHPOSITION, CODPARTICIPANT, DANGJIANVIDEO, DONGTAIZIXUNSUBTYPE, IMGEDITFUNENUM, MEMBERSTATE, MEMBERTYPE, PARTYBUILDSUBTYPEENUM, PARTYBUILDTYPEENUM, STATE, TONGZHIGONGGAO } from "../config/enum";
import { TABLEENUM } from "../data/models/model"; import { TABLEENUM } from "../data/models/model";
import { find, findCount, findOnce, findToPage, findToSortToPage } from "../data/select"; import { find, findCount, findOnce, findToPage, findToSortToPage } from "../data/select";
import { extractData } from "../util/piecemeal"; import { extractData } from "../util/piecemeal";
...@@ -656,3 +656,15 @@ export async function xueXiYuanDiShiPinType() { ...@@ -656,3 +656,15 @@ export async function xueXiYuanDiShiPinType() {
return {dataList}; return {dataList};
} }
export async function zhengShuChaXun({memberType, name, carId }) {
eccEnumValue("证书查询", "会员类型", MEMBERTYPE, memberType);
let selectParam = {};
if (memberType == MEMBERTYPE.个人会员) selectParam = {name, documentId:carId};
else selectParam = {unitName:name, uscc:carId}
let userInfo = await findOnce(TABLEENUM.用户表, selectParam, ["userId", "lifespanEndTime"]);
if (!userInfo || !userInfo.userId) return {success:false, msg:"无法查询到该信息,请联系学会工作人员"};
if ( new Date().valueOf() > userInfo.lifespanEndTime ){
return {success:true, msg:`会员到期,请续会员`};
}
return {success:true, msg:`证书有效期至${moment(userInfo.lifespanEndTime).format("YYYY年MM月DD日")}`};
}
\ No newline at end of file
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* 分支机构-机构管理-内容管理-委员名单 * 分支机构-机构管理-内容管理-委员名单
*/ */
import { BRANCHPOSITION } from "../../../config/enum";
import { ERRORENUM } from "../../../config/errorEnum"; import { ERRORENUM } from "../../../config/errorEnum";
import { addOneData } from "../../../data/add"; import { addOneData } from "../../../data/add";
import { deleteOneData } from "../../../data/delete"; import { deleteOneData } from "../../../data/delete";
...@@ -11,6 +12,7 @@ import { updateOneData } from "../../../data/update"; ...@@ -11,6 +12,7 @@ import { updateOneData } from "../../../data/update";
import { generateSystemId, successResult } from "../../../tools/system"; import { generateSystemId, successResult } from "../../../tools/system";
import { BizError } from "../../../util/bizError"; import { BizError } from "../../../util/bizError";
import { extractData } from "../../../util/piecemeal"; import { extractData } from "../../../util/piecemeal";
import { changeEnumValue } from "../../../util/verificationEnum";
/** /**
...@@ -56,14 +58,13 @@ export async function del({userId, id}) { ...@@ -56,14 +58,13 @@ export async function del({userId, id}) {
export async function list({userId, agencyId, pageNumber}) { export async function list({userId, agencyId, pageNumber}) {
let jiGouNameMap = await getJiGouMap();
let dbList = await findToPage(TABLEENUM.委员名单, {agencyId}, ["id", "name", "branchDuties", "unit", "unitDuties"], pageNumber); let dbList = await findToPage(TABLEENUM.委员名单, {agencyId}, ["id", "name", "branchDuties", "unit", "unitDuties"], pageNumber);
let dataCount = await findCount(TABLEENUM.委员名单, {agencyId}); let dataCount = await findCount(TABLEENUM.委员名单, {agencyId});
let dataList = []; let dataList = [];
dbList.forEach(info => { dbList.forEach(info => {
let item:any = extractData(info, ["id", "name", "branchDuties", "unit", "unitDuties"]); let item:any = extractData(info, ["id", "name", "branchDuties", "unit", "unitDuties"]);
item.jiGouName = jiGouNameMap[info.agencyId]; item.branchDuties = changeEnumValue(BRANCHPOSITION, item.branchDuties);
dataList.push(item); dataList.push(item);
}); });
......
...@@ -89,13 +89,14 @@ export async function list({pageNumber}) { ...@@ -89,13 +89,14 @@ export async function list({pageNumber}) {
* 预览 * 预览
* @param id * @param id
*/ */
export async function preview(secureArgs:any) { export async function preview({}) {
/**获取上下3位的排名列表 */ /**获取上下3位的排名列表 */
let dbList = await find(TABLEENUM.学会领导, {}); let dbList = await find(TABLEENUM.学会领导, {});
let dataList = []; let dataList = [];
dbList.forEach(info => { dbList.forEach(info => {
let item = extractData(info, ["id", "rank", "name", "position", "imgUrl", "miniImgUrl", "desc"]); let item:any = extractData(info, ["id", "rank", "name", "position", "imgUrl", "miniImgUrl", "desc"]);
item.position = changeEnumValue(XUEHUILINGDAOZHIWEI, item.position);
dataList.push(item); dataList.push(item);
}); });
......
...@@ -130,10 +130,10 @@ export async function memberRegister2({form, id}) { ...@@ -130,10 +130,10 @@ export async function memberRegister2({form, id}) {
} }
/**比对验证码 */ /**比对验证码 */
let codeInfo = await findOnceToSort(TABLEENUM.验证码表, {phone, isUse:false, type:CODETYPE.用户注册, sendMs:{"$gt":sysTools.getTodayMs() }}, {sendMs:-1}); // let codeInfo = await findOnceToSort(TABLEENUM.验证码表, {phone, isUse:false, type:CODETYPE.用户注册, sendMs:{"$gt":sysTools.getTodayMs() }}, {sendMs:-1});
if (!codeInfo) throw new BizError(ERRORENUM.code无效, `${phone}在注册时,code表中不存在该手机号的验证码`); // if (!codeInfo) throw new BizError(ERRORENUM.code无效, `${phone}在注册时,code表中不存在该手机号的验证码`);
if (codeInfo.codeNum != codeNum) throw new BizError(ERRORENUM.验证码错误, `${phone}不存在${codeNum}`); // if (codeInfo.codeNum != codeNum) throw new BizError(ERRORENUM.验证码错误, `${phone}不存在${codeNum}`);
if (( codeInfo.sendMs + (30 * 60 *1000) ) < NowMs ) throw new BizError(ERRORENUM.验证码过期); // if (( codeInfo.sendMs + (30 * 60 *1000) ) < NowMs ) throw new BizError(ERRORENUM.验证码过期);
/**初始化账号信息 */ /**初始化账号信息 */
let userId = sysTools.generateUserId(); let userId = sysTools.generateUserId();
...@@ -274,7 +274,7 @@ export async function memberRegisterSendCode({phone}) { ...@@ -274,7 +274,7 @@ export async function memberRegisterSendCode({phone}) {
const NowMs = new Date().valueOf(); const NowMs = new Date().valueOf();
let codeSelectParam = { phone, isUse:false, type:CODETYPE.用户注册, sendMs:{"$gt":sysTools.getTodayMs()} } let codeSelectParam = { phone, isUse:false, type:CODETYPE.用户注册, sendMs:{"$gt":sysTools.getTodayMs()} }
let lastCodeInfo = await findOnceToSort(TABLEENUM.验证码表, codeSelectParam, {sendMs:-1}); let lastCodeInfo = await findOnceToSort(TABLEENUM.验证码表, codeSelectParam, {sendMs:-1});
let codeNum = lastCodeInfo?.codeNum; let codeNum = lastCodeInfo.codeNum;
if (codeNum) { if (codeNum) {
if ( (lastCodeInfo.sendMs + (60*1000)) > NowMs ) throw new BizError(ERRORENUM.频繁操作请稍后再试); if ( (lastCodeInfo.sendMs + (60*1000)) > NowMs ) throw new BizError(ERRORENUM.频繁操作请稍后再试);
/**校验今日同类型验证码次数 */ /**校验今日同类型验证码次数 */
...@@ -283,6 +283,9 @@ export async function memberRegisterSendCode({phone}) { ...@@ -283,6 +283,9 @@ export async function memberRegisterSendCode({phone}) {
} }
const Code = sysTools.generateSMSCode();//生成短信验证码 const Code = sysTools.generateSMSCode();//生成短信验证码
/**发送短信模块 */
let addInfo = {codeNum:Code, phone, sendMs:NowMs, type:CODETYPE.用户注册, isUse:false}; let addInfo = {codeNum:Code, phone, sendMs:NowMs, type:CODETYPE.用户注册, isUse:false};
await addOneData(TABLEENUM.验证码表, addInfo); await addOneData(TABLEENUM.验证码表, addInfo);
......
import moment = require("moment"); import moment = require("moment");
import { ARTICLEPOSITION, MEMBERLEVEL, MEMBERTYPE, PARTYBUILDSUBTYPEENUM, PARTYBUILDTYPEENUM, STATE, USERREGISTERSTATE } from "../config/enum"; import { ARTICLEPOSITION, MEMBERLEVEL, MEMBERTYPE, PARTYBUILDSUBTYPEENUM, PARTYBUILDTYPEENUM, PAYMENTSTATUS, STATE, USERREGISTERSTATE } from "../config/enum";
import { TABLEENUM } from "../data/models/model"; import { TABLEENUM } from "../data/models/model";
import { find, findCount, findOnce } from "../data/select"; import { find, findCount, findOnce } from "../data/select";
import { createOrder } from "./member/order"; import { createOrder } from "./member/order";
import { updateOneData } from "../data/update";
/** /**
* 初始化任务 * 初始化任务
...@@ -10,7 +11,7 @@ import { createOrder } from "./member/order"; ...@@ -10,7 +11,7 @@ import { createOrder } from "./member/order";
export async function initSystemTask() { export async function initSystemTask() {
/**初始文字管理名称 */ /**初始文字管理名称 */
await initWenZangQueue(); await initWenZangQueue();
/**孵化器月度任务 */
await createUserOrder(); await createUserOrder();
setInterval(async function () { setInterval(async function () {
await createUserOrder(); await createUserOrder();
...@@ -41,6 +42,7 @@ export async function createUserOrder() { ...@@ -41,6 +42,7 @@ export async function createUserOrder() {
/**创建一条新的订单 */ /**创建一条新的订单 */
let subType = memberType == MEMBERTYPE.个人会员 ? individualMemberType : unitMemberType; let subType = memberType == MEMBERTYPE.个人会员 ? individualMemberType : unitMemberType;
await createOrder(userId, loginId, phone, unitName, lifespanEndTime, memberLevel, memberType, subType, false); await createOrder(userId, loginId, phone, unitName, lifespanEndTime, memberLevel, memberType, subType, false);
await updateOneData(TABLEENUM.用户表, {userId}, {paymentStatus:PAYMENTSTATUS.未支付});
addCount += 1; addCount += 1;
} }
} }
......
...@@ -405,7 +405,8 @@ export enum ORDERSTATE { ...@@ -405,7 +405,8 @@ export enum ORDERSTATE {
* 验证码类型 * 验证码类型
*/ */
export enum CODETYPE { export enum CODETYPE {
用户注册 = 1 用户注册 = 1,
修改密码
} }
......
...@@ -46,7 +46,8 @@ export enum ERRORENUM { ...@@ -46,7 +46,8 @@ export enum ERRORENUM {
微信支付回调错误, 微信支付回调错误,
支付失败, 支付失败,
地址数据错误, 地址数据错误,
该账号已被冻结 该账号已被冻结,
手机号不正确
} }
export enum ERRORCODEENUM { export enum ERRORCODEENUM {
......
...@@ -336,7 +336,7 @@ const ModelArray = [ ...@@ -336,7 +336,7 @@ const ModelArray = [
askForTime:'Number',//申请时间 注册流程发起时间 askForTime:'Number',//申请时间 注册流程发起时间
auditTime:'Number',//审核时间 会员审核列表审核时间 auditTime:'Number',//审核时间 会员审核列表审核时间
joinTime:'Number',//入会时间 审核通过时间 joinTime:'Number',//入会时间 审核通过时间
memberNum:{type:'String', index:true},//会员编号 memberNum:{type:'String'},//会员编号
memberType:{type:'Number'},//会员类型 枚举MEMBERTYPE memberType:{type:'Number'},//会员类型 枚举MEMBERTYPE
lifespanStartTime:{type:'Number'},//会员有效期开始时间 时间戳 每次缴费成功更新 lifespanStartTime:{type:'Number'},//会员有效期开始时间 时间戳 每次缴费成功更新
lifespanEndTime:{type:'Number', index:true},//会员有效期结束时间 时间戳 每次缴费成功更新 lifespanEndTime:{type:'Number', index:true},//会员有效期结束时间 时间戳 每次缴费成功更新
...@@ -344,7 +344,9 @@ const ModelArray = [ ...@@ -344,7 +344,9 @@ const ModelArray = [
tokenMs:{type:'Number', default:0},//token过期时间 tokenMs:{type:'Number', default:0},//token过期时间
lastLoginMs:'Number',//上次登陆时间 lastLoginMs:'Number',//上次登陆时间
session:'Number',//届次 session:'Number',//届次
paymentStatus:'Number',//支付状态 PAYMENTSTATUS paymentStatus:'Number',//支付状态 PAYMENTSTATUS
isInput:{type:'Boolean', default:false},//是否是导入用户
inputUserChangePwd:{type:'Boolean', default:false},//导入账号修改密码
/**管理员字段 */ /**管理员字段 */
adminType:{type:'Number'},//管理员类别 ADMINTYPE adminType:{type:'Number'},//管理员类别 ADMINTYPE
adminLv:"[Number]",//管理员等级 多选 ADMINLV adminLv:"[Number]",//管理员等级 多选 ADMINLV
...@@ -366,9 +368,9 @@ const ModelArray = [ ...@@ -366,9 +368,9 @@ const ModelArray = [
phone:{type:'String', index:true},//联系电话(登陆手机号)可用作登陆 phone:{type:'String', index:true},//联系电话(登陆手机号)可用作登陆
mail:{type:'String', index:true},//邮箱 mail:{type:'String', index:true},//邮箱
/**第二步流程表单(个人)【基础信息】 */ /**第二步流程表单(个人)【基础信息】 */
name:{type:'String'},//真实姓名 name:{type:'String', index:true},//真实姓名
sex:'Number',//性别 枚举 sex:'Number',//性别 枚举
documentId:'String',//证件号码 身份证 documentId:{type:'String', index:true},//证件号码 身份证
documentType:'Number',//证件类型 枚举DOCUMENTTYPE documentType:'Number',//证件类型 枚举DOCUMENTTYPE
birth:'Number',//出生年月 时间戳 birth:'Number',//出生年月 时间戳
nation:'Number',//民族 枚举 nation:'Number',//民族 枚举
...@@ -394,8 +396,8 @@ const ModelArray = [ ...@@ -394,8 +396,8 @@ const ModelArray = [
professionalCERTUrl:'String',//工作证明图片地址 professionalCERTUrl:'String',//工作证明图片地址
auxiliaryMaterial:{type:'[String]', default:[]},//其他辅助材料 auxiliaryMaterial:{type:'[String]', default:[]},//其他辅助材料
/**第二步流程表单(单位)【基础信息】 */ /**第二步流程表单(单位)【基础信息】 */
unitName:'String',//单位名称 unitName:{type:'String', index:true},//单位名称
uscc:'String',//统一信用代码 uscc:{type:'String', index:true},//统一信用代码
legalPerson:'String',//法人代表 legalPerson:'String',//法人代表
legalPersonPhone:'String',//法人代表联系电话 legalPersonPhone:'String',//法人代表联系电话
legalPersonMail:'String',//法人邮箱 legalPersonMail:'String',//法人邮箱
...@@ -455,6 +457,7 @@ const ModelArray = [ ...@@ -455,6 +457,7 @@ const ModelArray = [
weChartPR:{type:'String', default:""},//微信订单号 微信支付用 weChartPR:{type:'String', default:""},//微信订单号 微信支付用
weChartState:{type:'Number', default:WEICHARTPAYSTATE.未提交},//微信支付状态 WEICHARTPAYSTATE weChartState:{type:'Number', default:WEICHARTPAYSTATE.未提交},//微信支付状态 WEICHARTPAYSTATE
weChartCreatePayMs:{type:'Number'},//微信创建订单时间 weChartCreatePayMs:{type:'Number'},//微信创建订单时间
weChartPayUrl:'String',//微信创建订单时支付链接
// membershipFeesType:'Number',//会费类别 枚举 // membershipFeesType:'Number',//会费类别 枚举
invoiceAdd:'String',//发票图片地址 invoiceAdd:'String',//发票图片地址
isFirst:{type:'Boolean', default:true},//首次订单 isFirst:{type:'Boolean', default:true},//首次订单
......
...@@ -158,9 +158,7 @@ export const Config = { ...@@ -158,9 +158,7 @@ export const Config = {
notMiddleware:true, notMiddleware:true,
subUrl:'/memberdb/registersendcode', subUrl:'/memberdb/registersendcode',
param:[ param:[
{key:"loginId", type:"String", desc:"用户名"}, {key:"phone", type:"String", desc:"联系人手机号"}
{key:"phone", type:"String", desc:"联系人手机号"},
{key:"codeType", type:"Number", desc:"验证码类型枚举"}
], ],
bindBiz:registerBiz.memberRegisterSendCode bindBiz:registerBiz.memberRegisterSendCode
}, },
...@@ -227,6 +225,26 @@ export const Config = { ...@@ -227,6 +225,26 @@ export const Config = {
], ],
bindBiz:userBiz.logout bindBiz:userBiz.logout
}, },
{
apiName:"修改密码",
subUrl:'/changepwd',
notMiddleware:true,
param:[
{key:"phone", type:"String", desc:"绑定手机号"},
{key:"pwd", type:"String", desc:"密码"},
{key:"confirmation", type:"String", desc:"二次确认密码"},
{key:"code", type:"String", desc:"验证码"}
],
bindBiz:userBiz.changePwd
},{
apiName:"修改密码用短信验证码",
subUrl:'/getchangepwdcode',
notMiddleware:true,
param:[
{key:"phone", type:"String", desc:"绑定手机号"}
],
bindBiz:userBiz.memberChangePwdSendCode
}
], ],
"会员库":[ "会员库":[
{ {
......
...@@ -225,4 +225,17 @@ export const Config = { ...@@ -225,4 +225,17 @@ export const Config = {
} }
], ],
"会员服务":[
{
apiName:"证书查询",
subUrl:'/zhengshuchaxun',
param:[
{key:"memberType", type:"Number", desc:"会员类型"},
{key:"name", type:"String", desc:"个人会员姓名 or 单位会员名称"},
{key:"carId", type:"String", desc:"个人会员身份证号码 or 单位会员统一信用代码"}
],
bindBiz:officialWebsiteBiz.zhengShuChaXun
},
]
} }
\ No newline at end of file
...@@ -23,12 +23,12 @@ const Look = false;//true更新文档 ...@@ -23,12 +23,12 @@ const Look = false;//true更新文档
export async function setRouter(httpServer){ export async function setRouter(httpServer){
if (Look) { if (Look) {
await getDoc(); await getDoc();
await initDoc(portalRouter.FirstName, portalRouter.Config, portalRouter.FirstRouter);//网站编辑 // await initDoc(portalRouter.FirstName, portalRouter.Config, portalRouter.FirstRouter);//网站编辑
await initDoc(publicRouter.FirstName, publicRouter.Config, publicRouter.FirstRouter);//公用组件 // await initDoc(publicRouter.FirstName, publicRouter.Config, publicRouter.FirstRouter);//公用组件
await initDoc(memberRouter.FirstName, memberRouter.Config, memberRouter.FirstRouter);//用户路由 await initDoc(memberRouter.FirstName, memberRouter.Config, memberRouter.FirstRouter);//用户路由
await initDoc(officalWebsiteRouter.FirstName, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter);//官网路由 // await initDoc(officalWebsiteRouter.FirstName, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter);//官网路由
await initDoc(orderRouter.FirstName, orderRouter.Config, orderRouter.FirstRouter);//会费相关 // await initDoc(orderRouter.FirstName, orderRouter.Config, orderRouter.FirstRouter);//会费相关
await initDoc(costRouter.FirstName, costRouter.Config, costRouter.FirstRouter);//支付 // await initDoc(costRouter.FirstName, costRouter.Config, costRouter.FirstRouter);//支付
} }
analysisRouter(httpServer, portalRouter.Config, portalRouter.FirstRouter, false);//网站编辑 analysisRouter(httpServer, portalRouter.Config, portalRouter.FirstRouter, false);//网站编辑
analysisRouter(httpServer, publicRouter.Config, publicRouter.FirstRouter, false);//公用组件 analysisRouter(httpServer, publicRouter.Config, publicRouter.FirstRouter, false);//公用组件
...@@ -92,7 +92,7 @@ function routerFun(apiName, defaultParam, subUrl, param, bindBiz, notMiddleware) ...@@ -92,7 +92,7 @@ function routerFun(apiName, defaultParam, subUrl, param, bindBiz, notMiddleware)
export async function setAdditionalRouter(httpServer) { export async function setAdditionalRouter(httpServer) {
httpServer.post('/pay/wechart/callback', asyncHandler(async (req, res) => { httpServer.post('/pay/wechart/callback', asyncHandler(async (req, res) => {
await payCallback(req.body); let result = await payCallback(req.body);
res.success({}); res.success(result);
})); }));
} }
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
import moment = require("moment"); import moment = require("moment");
import { wenZhangQueue } from "../biz/task"; import { wenZhangQueue } from "../biz/task";
import { MEMBERTYPE } from "../config/enum";
const md5 = require("md5"); const md5 = require("md5");
const provinces = require('province-city-china/dist/data.json');
/** /**
* 返回编辑正确的结果 * 返回编辑正确的结果
...@@ -140,21 +140,6 @@ export function changeArticleName(idList) { ...@@ -140,21 +140,6 @@ export function changeArticleName(idList) {
/** /**
* 获取行政区域代码
* @param areaName
*/
export function getAreaCode(areaName) {
let areaCode;
provinces.forEach( info => {
let {code, name, province} = info; //城市代码、城市名称、省/直辖市/特别行政区代码
if (name == areaName) areaCode = province
})
return areaCode;
}
/**
* 获取会员编号 * 获取会员编号
* @param db * @param db
* @param memberTypeStr * @param memberTypeStr
...@@ -165,26 +150,29 @@ export function getAreaCode(areaName) { ...@@ -165,26 +150,29 @@ export function getAreaCode(areaName) {
* 单位会员:以审核时间算正式入会时间 * 单位会员:以审核时间算正式入会时间
* 例 CEFA-20230620-11-00001GR * 例 CEFA-20230620-11-00001GR
*/ */
export async function getMenberNum(db, joinTime, sheng, memberTypeStr) { export function getMenberNum( joinTime, sheng, userCount, memberType) {
//定义编号前缀 //定义编号前缀
const prefix = 'CEFA'; const JoinTimeStr = moment(joinTime).format("YYYYMMDD");
const Province = parseInt(`${parseInt(sheng)/10000}`);
//获取流水号计数器
const counterCollection = db.collection('serialNumberCounter'); let numStr = '';
for (let i = `${userCount}`.length; i < 5;i++) {
// 尝试找到并更新计数器 numStr+='0';
let result = await counterCollection.findOneAndUpdate( }
{ _id: 'memberCounter' }, numStr += (userCount+1);
{ $inc: { count: 1 } },
{ upsert: true, returnDocument: 'after' } let memberTypeStr = "";
); if(memberType == MEMBERTYPE.个人会员) memberTypeStr = "GR";
// 生成5位流水号(这里简单地将计数器值转为字符串并填充0至5位) if(memberType == MEMBERTYPE.单位会员) memberTypeStr = "DW";
let serialNumber = (result.value.count + '').padStart(5, '0'); return `CEFA-${JoinTimeStr}-${Province}-${numStr}-${memberTypeStr}`;
let areaCode = getAreaCode(sheng);
let memberNum = `${prefix}-${moment(joinTime).format("YYYYMMDD")}-${areaCode}-${serialNumber}${memberTypeStr}`
return memberNum;
} }
/**
* 生成密码
* @param userId
* @returns
*/
export function generatePwd(userId:string, pwd:string) {
return md5(`${userId}${pwd}`);
}
\ 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