Commit 05371125 by lixinming

no message

parent 0957c317
......@@ -2,7 +2,7 @@
* 收费
*/
import { ORDERSTATE, PAYMENTTYPE, WEICHARTPAYSTATE } from "../../config/enum";
import { INDIVIDUALMEMBERTYPE, MEMBERLEVEL, MEMBERTYPE, ORDERSTATE, PAYMENTTYPE, WEICHARTPAYSTATE } from "../../config/enum";
import { TABLEENUM } from "../../data/models/model";
import { findOnce } from "../../data/select";
import { eccEnumValue } from "../../util/verificationEnum";
......@@ -14,6 +14,7 @@ import { ERRORENUM } from "../../config/errorEnum";
import { generateWXOrderId, successResult } from "../../tools/system";
import { updateOneData } from "../../data/update";
import moment = require("moment");
import { createOrder } from "./order";
const AppId = 'wx96c0cf11b3babcf6';
const MchId = '1614605859';
......@@ -32,7 +33,7 @@ const pay = new WxPay({
* @returns
*/
export async function placeAnOrder({id}) {
let orderInfo = await findOnce(TABLEENUM.订单表, {id}, ["id", "loginId", "userId", "memberCategory", "money", "orderCycleStart", "orderCycleEnd"]);
let orderInfo = await findOnce(TABLEENUM.订单表, {id}, ["id", "loginId", "userId", "memberCategory", "money", "orderCycleStart", "orderCycleEnd","weChartState"]);
if (!orderInfo || !orderInfo.id) throw new BizError(ERRORENUM.订单不存在);
if (orderInfo.state == ORDERSTATE.已支付) throw new BizError(ERRORENUM.该订单已支付);
if (orderInfo.weChartState != WEICHARTPAYSTATE.未提交 ) throw new BizError(ERRORENUM.该订单正在支付);
......@@ -41,7 +42,6 @@ export async function placeAnOrder({id}) {
let out_trade_no = generateWXOrderId(orderInfo.memberCategory, orderInfo.userId);
let desc = `${orderInfo.loginId}_${moment(orderInfo.orderCycleStart).format("YYYY-MM-DD")}${moment(orderInfo.orderCycleEnd).format("YYYY-MM-DD")}`;
await updateOneData(TABLEENUM.订单表, {id}, {weChartPR:out_trade_no, paymentMethod:PAYMENTTYPE.微信支付, weChartState:WEICHARTPAYSTATE.未支付 });
/**请求参数 */
const Param = {
appid: AppId,
......@@ -50,12 +50,14 @@ export async function placeAnOrder({id}) {
out_trade_no,//订单号
amount:{//金额
// total:orderInfo.money
total:0.01
total:1//单位分 金额要乘100
},
notify_url:'http://7ggz2y.natappfree.cc/pay/wechart/callback',//订单回调
notify_url:'https://yydata.mynatapp.cc/pay/wechart/callback',//订单回调
};
const result = await pay.transactions_native(Param);
if (result.status != 200) throw new BizError(ERRORENUM.调起微信支付失败);
await updateOneData(TABLEENUM.订单表, {id}, {weChartPR:out_trade_no, paymentMethod:PAYMENTTYPE.微信支付, weChartState:WEICHARTPAYSTATE.未支付 });
return {code_url:result.code_url, weChartPR:out_trade_no};
}
......
......@@ -2,7 +2,7 @@
* 订单相关 success
*/
import moment = require("moment");
import { AUDITINGCLIENT, COSTTYPE, INDIVIDUALMEMBERTYPE, INVOICESTATUS, ISPAYENUM, MEMBERLEVEL, MEMBERTYPE, OPERATIONREHAVIOR, ORDERSTATE, PAYMENTSTATUS, PAYMENTTYPE, RECEIPTCONFIRMATION, STATE, UNITMEMBERTYPE } from "../../config/enum";
import { AUDITINGCLIENT, COSTTYPE, INDIVIDUALMEMBERTYPE, INVOICESTATUS, ISPAYENUM, MEMBERLEVEL, MEMBERTYPE, MYORDERLISTPAYSTATE, MYORDERLISTSTATE, OPERATIONREHAVIOR, ORDERSTATE, PAYMENTSTATUS, PAYMENTTYPE, RECEIPTCONFIRMATION, STATE, UNITMEMBERTYPE } from "../../config/enum";
import { generateOrderId, successResult } from "../../tools/system";
import { changeEnumValue, eccEnumValue } from "../../util/verificationEnum";
import { addOneData } from "../../data/add";
......@@ -320,38 +320,51 @@ export async function orderList({userId, type}) {
if (type == ORDERSTATE.已支付) findParam.state = ORDERSTATE.已支付;
else if (type == ORDERSTATE.未支付) findParam.state = ORDERSTATE.未支付;
const SelectFile = ["orderCycleStart", "orderCycleEnd", "money", "state", "id", "advanceInvoice", "invoiceStatus"];
const SelectFile = ["orderCycleStart", "orderCycleEnd", "money", "state", "id", "advanceInvoice", "invoiceStatus", "unitName", "confirmReceipt"];
let dbList = await find(TABLEENUM.订单表, findParam, SelectFile);
/**查询证明函需要字段会员等级 */
let myOldInfo = await findOnce(TABLEENUM.用户表, {userId}, ["memberLevel"]);
let myOldInfo = await findOnce(TABLEENUM.用户表, {userId}, ["memberLevel", "userId"]);
if (!myOldInfo || !myOldInfo.userId) throw new BizError(ERRORENUM.目标数据不存在);
//证明函返回数据配置
const proofLetterFiles = ["unitName", "orderCycleStart", "orderCycleEnd", "money"];
let memberLevel = changeEnumValue(MEMBERLEVEL, myOldInfo.memberLevel);
let dataList = [];
dbList.forEach(info => {
let {orderCycleStart, orderCycleEnd, money, state, id} = info;
let moneyStr = state == ORDERSTATE.已支付 ? "已缴金额" : "待缴金额";
let {orderCycleStart, orderCycleEnd, money, state, id, unitName, confirmReceipt} = info;
let payState;
if (state == ORDERSTATE.已支付) {
if (!confirmReceipt) {/**首次支付 待确认未审核*/
payState = MYORDERLISTPAYSTATE.财务查账中;
} else if (confirmReceipt == RECEIPTCONFIRMATION.待确认) {
payState = MYORDERLISTPAYSTATE.财务查账中;
} else if (confirmReceipt == RECEIPTCONFIRMATION.收款确认) {
payState = MYORDERLISTPAYSTATE.已缴费
} else {
payState = MYORDERLISTPAYSTATE.缴费失败
}
} else {
payState = MYORDERLISTPAYSTATE.待缴费
}
let invoiceStr = "";
if (info.invoiceStatus == INVOICESTATUS.已开发票) invoiceStr = "下载发票";
if (info.invoiceStatus != INVOICESTATUS.已开发票 && info.advanceInvoice) invoiceStr = "申请进度";
if (info.invoiceStatus != INVOICESTATUS.已开发票 && !info.advanceInvoice) invoiceStr = "申请发票";
let invoiceState;
if (info.invoiceStatus == INVOICESTATUS.已开发票) invoiceState = MYORDERLISTSTATE.下载发票;
if (info.invoiceStatus != INVOICESTATUS.已开发票 && info.advanceInvoice) invoiceState = MYORDERLISTSTATE.申请进度;
if (info.invoiceStatus != INVOICESTATUS.已开发票 && !info.advanceInvoice) invoiceState = MYORDERLISTSTATE.申请发票;
let item = {
cycle:`${moment(orderCycleStart).format("YYYY-MM-DD")}${moment(orderCycleEnd).format("YYYY-MM-DD")}`,
money:`${moneyStr}:${money}`,
money:money,
id,
invoiceStatus:invoiceStr
invoiceStatus:invoiceState,
invoiceStatusStr:changeEnumValue(MYORDERLISTSTATE , invoiceState),
unitName,
orderCycleStart:moment(orderCycleStart).format("YYYY"),
orderCycleEnd:moment(orderCycleEnd).format("YYYY"),
memberLevel,
payState,
payStateStr:changeEnumValue(MYORDERLISTPAYSTATE, payState)
};
/**处理证明函返回数据字段 */
let proofLetterInfo:any = extractData(info, proofLetterFiles);
proofLetterInfo.memberLevel = changeEnumValue(MEMBERLEVEL, myOldInfo.memberLevel);
proofLetterInfo.orderCycleStart = moment(proofLetterInfo.orderCycleStart).format("YYYY");
proofLetterInfo.orderCycleEnd = moment(proofLetterInfo.orderCycleEnd).format("YYYY");
dataList.push({list:item, proofLetterInfo});
dataList.push(item);
});
return {dataList}
......@@ -436,11 +449,15 @@ export async function getInvoiceStatus({id}) {
* 上传转账截图
* @param param0
*/
export async function upTransferImg({id, weChartPR, offlinePaymentUrl}) {
export async function upTransferImg({id, paymentNum, offlinePaymentUrl}) {
let oldInfo = await findOnce(TABLEENUM.订单表, {id});
if (!oldInfo || !oldInfo.id) throw new BizError(ERRORENUM.目标数据不存在);
await updateOneData(TABLEENUM.订单表, {id}, {weChartPR, offlinePaymentUrl});
let updateInfo:any = {paymentNum, offlinePaymentUrl, state:ORDERSTATE.已支付, paymentMethod:PAYMENTTYPE.银行转账};
if (!oldInfo.isFirst) {
updateInfo.confirmReceipt = RECEIPTCONFIRMATION.待确认;
}
await updateOneData(TABLEENUM.订单表, {id}, updateInfo);
return successResult();
}
......
......@@ -561,3 +561,23 @@ export enum EDUCATION {
大专 = 1,
本科,
}
/**
* 前端使用
*/
export enum MYORDERLISTSTATE {
申请发票 = 1,
申请进度,
下载发票
}
/**
* 前端使用
*/
export enum MYORDERLISTPAYSTATE {
待缴费 = 1,
已缴费,
财务查账中,
缴费失败
}
\ No newline at end of file
......@@ -53,7 +53,7 @@
},
*/
import { INVOICESTATUS, MEMBERSTATE, RECEIPTCONFIRMATION, REGISTERFLOW, STATE, USERREGISTERSTATE } from "../../config/enum";
import { INVOICESTATUS, MEMBERSTATE, RECEIPTCONFIRMATION, REGISTERFLOW, STATE, USERREGISTERSTATE, WEICHARTPAYSTATE } from "../../config/enum";
......@@ -449,14 +449,14 @@ const ModelArray = [
offlinePaymentUrl:{type:'String', default:""},//转账图片
memberCategory:'Number',//会员类别 枚举 MEMBERTYPE
weChartPR:{type:'String', default:""},//微信订单号 微信支付用
weChartState:'Number',//微信支付状态 WEICHARTPAYSTATE
weChartState:{type:'Number', default:WEICHARTPAYSTATE.未提交},//微信支付状态 WEICHARTPAYSTATE
// membershipFeesType:'Number',//会费类别 枚举
invoiceAdd:'String',//发票图片地址
isFirst:{type:'Boolean', default:true},//首次订单
state:'Number',//状态 是否支付 枚举 ORDERSTATE
paymentMethod:'Number',//付款方式 枚举 PAYMENTTYPE
firstPayExamine:{type:'Boolean', default:false},//首次订单的审批开关【待支付页审批开关】
confirmReceipt:{type:'Number', default:RECEIPTCONFIRMATION.待确认},//收款确认【财务核对页收款确认】
confirmReceipt:{type:'Number', default:0},//收款确认【财务核对页收款确认】 RECEIPTCONFIRMATION
invoiceStatus:{type:'Number', default:INVOICESTATUS.不具备开票条件, index:true},//发票状态 枚举 INVOICESTATUS 【待开发票页上传发票之后更新状态】
advanceInvoice:{type:'Boolean', default:false},//是否提交开票 【个人列表页提交开发票按钮】
newUnitName:'String',//单位名称,新发票抬头【变更发票抬头使用】
......
import { createOrder } from "./biz/member/order";
import { INDIVIDUALMEMBERTYPE, MEMBERLEVEL, MEMBERTYPE } from "./config/enum";
import { initConfig, systemConfig} from "./config/serverConfig";
import { initDataBaseModel } from "./data/db/db";
import { httpServer } from "./net/http_server";
......@@ -8,6 +10,7 @@ async function lanuch() {
/**初始化数据库 */
await initDataBaseModel();
/**创建http服务 */
// await createOrder("xxsdfasdfasfdasd_test", "测试单位名称", new Date().valueOf(), MEMBERLEVEL.普通会员, MEMBERTYPE.个人会员 ,INDIVIDUALMEMBERTYPE.个人会员, false);
httpServer.createServer(systemConfig.port);
// await smsTask();
......
......@@ -6,37 +6,22 @@ import { updateOneData } from "../data/update";
import { BizError } from "../util/bizError";
/**
* 中间件 校验孵化器token
* 中间件
* @param req
* @param res
* @param next
* @returns
*/
export async function checkFuHuaQiToken(req, res, next) {
export async function checkUser(req, res, next) {
if (!req.headers) req.headers = {};
const reqToken = req.headers.token;
const userId = req.headers.userid || "";
if (!reqToken || !userId ) return next(new BizError(ERRORENUM.身份验证失败, `userId:${userId} token:${reqToken}`));
let userInfo = await findOnce(TABLEENUM.用户表, {userId});
if (!userInfo || !userInfo.userId) return next(new BizError(ERRORENUM.身份验证失败));
if (userInfo.token != reqToken) return next(new BizError(ERRORENUM.身份验证过期));
let checkToken = '';
//30分钟更新token
if ( (userInfo.tokenMs - new Date().valueOf()) >= (30 * 60 * 1000) ) {
return next(new BizError(ERRORENUM.身份验证过期));
} else {
checkToken = reqToken;
await updateOneData(TABLEENUM.用户表, {userId:userInfo.userId}, { tokenMs:new Date().valueOf()});
}
req.headers.userId = userId;
req.headers.userInfo = {
userId,
isAdmin:userInfo.isAdmin
userId
}
next();
}
......
......@@ -72,7 +72,6 @@ export const Config = {
apiName:"会员缴费列表",
subUrl:'/order/memberpayment',
param:[
{key:"userId", type:"String", desc:"用户id"},
{key:"type", type:"Number", desc:"缴费状态", isNull:true}
],
bindBiz:orderBiz.orderList
......
......@@ -16,8 +16,9 @@ import * as officalWebsiteRouter from "./officalWebsite/router";
import * as orderRouter from "./order/router";
import * as asyncHandler from 'express-async-handler';
import { payCallback } from "../biz/member/cost";
import { checkUser } from "../middleware/user";
const Look = true;//true更新文档
const Look = false;//true更新文档
export async function setRouter(httpServer){
if (Look) {
......@@ -29,60 +30,65 @@ export async function setRouter(httpServer){
await initDoc(orderRouter.FirstName, orderRouter.Config, orderRouter.FirstRouter);//会费相关
await initDoc(costRouter.FirstName, costRouter.Config, costRouter.FirstRouter);//支付
}
await analysisRouter(httpServer, portalRouter.Config, portalRouter.FirstRouter);//网站编辑
await analysisRouter(httpServer, publicRouter.Config, publicRouter.FirstRouter);//公用组件
await analysisRouter(httpServer, memberRouter.Config, memberRouter.FirstRouter);//用户路由
await analysisRouter(httpServer, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter);//官网路由
await analysisRouter(httpServer, orderRouter.Config, orderRouter.FirstRouter);//会费相关
await analysisRouter(httpServer, costRouter.Config, costRouter.FirstRouter);//支付
await analysisRouter(httpServer, portalRouter.Config, portalRouter.FirstRouter, false);//网站编辑
await analysisRouter(httpServer, publicRouter.Config, publicRouter.FirstRouter, false);//公用组件
await analysisRouter(httpServer, memberRouter.Config, memberRouter.FirstRouter, false);//用户路由
await analysisRouter(httpServer, officalWebsiteRouter.Config, officalWebsiteRouter.FirstRouter, false);//官网路由
await analysisRouter(httpServer, orderRouter.Config, orderRouter.FirstRouter, true);//会费相关
await analysisRouter(httpServer, costRouter.Config, costRouter.FirstRouter, true);//支付
}
async function analysisRouter(httpServer, config, firstRouter) {
async function analysisRouter(httpServer, config, firstRouter, haveMiddleware) {
for (let modelKey in config) {
config[modelKey].forEach(info => {
let {apiName, defaultParam, subUrl, param, bindBiz} = info;
httpServer.post(firstRouter+subUrl, asyncHandler( async (req, res) => {
let chackObjectList = [];
let checkStringMap = {};
let stringNotMustHaveKeys = [];
let funcParam:any = {};
funcParam.userId = req.headers.userId;
for (let i = 0; i < param.length; i++) {
let info:any = param[i];
let {key, type} = param[i];
if (info.isNull) stringNotMustHaveKeys.push(key);
if (type == 'Object') {
chackObjectList.push(param[i]);
checkStringMap[key] = type;
}
else checkStringMap[key] = type;
}
/**校验参数 */
if (chackObjectList.length) {
chackObjectList.forEach(item => {
if (!req.body[item.key]) throw new BizError(ERRORENUM.参数错误, `缺少参数${item.key}`);
eccFormParam(apiName, item.sub, req.body[item.key]);
funcParam[item.key] = req.body[item.key];
});
}
if (Object.keys(checkStringMap).length) {
let eccResult = eccReqParamater(apiName, checkStringMap, req.body, stringNotMustHaveKeys);
for (let key in eccResult) {
funcParam[key] = eccResult[key];
}
}
if (defaultParam) funcParam["defaultParam"] = defaultParam;
let result = await bindBiz(funcParam);
res.success(result);
}));
if (haveMiddleware) httpServer.post(firstRouter+subUrl, checkUser , allRouter(apiName, defaultParam, subUrl, param, bindBiz));
else httpServer.post(firstRouter+subUrl , allRouter(apiName, defaultParam, subUrl, param, bindBiz));
});
}
}
function allRouter(apiName, defaultParam, subUrl, param, bindBiz) {
return async function (req, res) {
let chackObjectList = [];
let checkStringMap = {};
let stringNotMustHaveKeys = [];
let funcParam:any = {};
funcParam.userId = req.headers.userId;
for (let i = 0; i < param.length; i++) {
let info:any = param[i];
let {key, type} = param[i];
if (info.isNull) stringNotMustHaveKeys.push(key);
if (type == 'Object') {
chackObjectList.push(param[i]);
checkStringMap[key] = type;
}
else checkStringMap[key] = type;
}
/**校验参数 */
if (chackObjectList.length) {
chackObjectList.forEach(item => {
if (!req.body[item.key]) throw new BizError(ERRORENUM.参数错误, `缺少参数${item.key}`);
eccFormParam(apiName, item.sub, req.body[item.key]);
funcParam[item.key] = req.body[item.key];
});
}
if (Object.keys(checkStringMap).length) {
let eccResult = eccReqParamater(apiName, checkStringMap, req.body, stringNotMustHaveKeys);
for (let key in eccResult) {
funcParam[key] = eccResult[key];
}
}
if (defaultParam) funcParam["defaultParam"] = defaultParam;
let result = await bindBiz(funcParam);
res.success(result);
}
}
export async function setAdditionalRouter(httpServer) {
httpServer.post('/pay/wechart/callback', asyncHandler(async (req, res) => {
await payCallback(req.body);
......
......@@ -85,6 +85,6 @@ export function getTodayMs() {
export function generateWXOrderId(memberType, userId) {
let thisDate = new Date();
return `${memberType}_${thisDate.getFullYear()}_${md5(`${userId}${Math.random() * 100}${thisDate.valueOf()}${Math.floor(Math.random() * 1000)}`)}`
return `${md5(`${memberType}${userId}${Math.random() * 100}${thisDate.valueOf()}${Math.floor(Math.random() * 1000)}`)}`
}
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