20261008
This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
'use strict';
|
||||
const dayjs = require("dayjs");
|
||||
const OpenSdk = require('../../../../util/base').default;
|
||||
const notaryPay = require('./util/notaryPay');
|
||||
|
||||
const sdk = new OpenSdk({
|
||||
appId: '8a81c1db8fc5238d01910b9e312d0692',
|
||||
appKey: 'a15ceac60f5b464eb758c4fe7800ee9f'
|
||||
});
|
||||
|
||||
const REFUND_MID = '898450100002303';
|
||||
const REFUND_TID = 'G5SBN2XJ';
|
||||
const REFUND_INST_MID = 'WGDEFAULT';
|
||||
const REFUND_SUB_MID = '898450100004218';
|
||||
const REFUND_SUB_MID_MAIN = '898450100004711';
|
||||
const PLATFORM_RATE_DICT_ID = 'd84694f2696818f20c28f55f36764783';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/payRefuse 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, refuseReason} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const payRecord = await vk.baseDao.updateAndReturn({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
_id: data.id,
|
||||
},
|
||||
dataJson: {
|
||||
buyerRefuse: true,
|
||||
refuseReason,
|
||||
transferStatus: 2,
|
||||
transferRefuseAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss")
|
||||
}
|
||||
})
|
||||
|
||||
const order = await vk.baseDao.findById({
|
||||
dbName: 'jjx-order',
|
||||
id: payRecord.orderId
|
||||
})
|
||||
|
||||
const isNotaryPay = !!order && Number(order.type) > 3 && Number(order.signMethod) === 0;
|
||||
|
||||
if (isNotaryPay && payRecord.isNotaryApply) {
|
||||
res.refund = {
|
||||
skipped: true,
|
||||
reason: '公证付款申请驳回不触发退款'
|
||||
};
|
||||
await notaryPay.addMessage(vk, {
|
||||
uid: payRecord.sellerUid,
|
||||
title: '付款单被驳回',
|
||||
content: `订单${order && order.orderNo ? order.orderNo : payRecord.orderId}的${payRecord.type || ''}付款单已被买家驳回,原因:${refuseReason || '未填写'}`,
|
||||
type: 'order-pay-refuse',
|
||||
pk: payRecord.orderId
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
if (['预付款', '货到付款'].includes(payRecord.type) && !isNotaryPay) {
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
payStatus: 0
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const hasPay = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: payRecord.orderId,
|
||||
buyerRefuse: false,
|
||||
sellerConfirm: true
|
||||
}
|
||||
})
|
||||
const hasExpress = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: payRecord.orderId,
|
||||
isExpress: true,
|
||||
hasPaid: true,
|
||||
}
|
||||
})
|
||||
|
||||
// orderStatus 0待支付 1已支付待发货 2已发货待收货 3已收货待完成 4已完成
|
||||
// 发货单已支付的不能再次发货
|
||||
let orderStatus = 0
|
||||
// 未发货且没有支付单
|
||||
if (!hasExpress && !hasPay) orderStatus = 0
|
||||
// 未发货且有支付单
|
||||
if (!hasExpress && !!hasPay) orderStatus = 1
|
||||
// 已发货且已确认支付
|
||||
if (!!hasExpress) orderStatus = 2
|
||||
|
||||
res.hasExpress = hasExpress
|
||||
res.hasPay = hasPay
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
orderStatus
|
||||
}
|
||||
});
|
||||
|
||||
const hasManualVoucher = Array.isArray(payRecord.paidVoucher) ? payRecord.paidVoucher.length > 0 : !!payRecord.paidVoucher;
|
||||
const refundAmount = Math.round(Number(payRecord.amount || 0) * 100);
|
||||
const shouldCallRefund = !!payRecord.hasPaid && !hasManualVoucher && !!payRecord.orderNo && refundAmount > 0 && !isNotaryPay;
|
||||
|
||||
if (shouldCallRefund) {
|
||||
const refundOrderId = vk.pubfn.createOrderNo("39XU", 24);
|
||||
const refundData = {
|
||||
queryUrl: 'https://api-mop.chinaums.com/v1/netpay/refund',
|
||||
timestamp: dayjs().format('YYYYMMDDHHmmss'),
|
||||
nonce: `refund_${Date.now()}`,
|
||||
content: {
|
||||
requestTimestamp: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
||||
merOrderId: payRecord.orderNo,
|
||||
instMid: REFUND_INST_MID,
|
||||
mid: REFUND_MID,
|
||||
tid: REFUND_TID,
|
||||
refundAmount,
|
||||
refundOrderId,
|
||||
refundDesc: refuseReason || '买家驳回支付单退款'
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const platformRateData = await vk.baseDao.findById({
|
||||
dbName: 'jjx-dict',
|
||||
id: PLATFORM_RATE_DICT_ID
|
||||
});
|
||||
const platformRate = Number(platformRateData && platformRateData.content);
|
||||
if (!Number.isNaN(platformRate) && platformRate >= 0 && platformRate <= 100) {
|
||||
const subAmount = parseInt(refundAmount * ((100 - platformRate) / 100), 10);
|
||||
const subAmountMain = refundAmount - subAmount;
|
||||
refundData.content.platformAmount = 0;
|
||||
refundData.content.subOrders = [
|
||||
{
|
||||
mid: REFUND_SUB_MID,
|
||||
totalAmount: String(subAmount),
|
||||
},
|
||||
{
|
||||
mid: REFUND_SUB_MID_MAIN,
|
||||
totalAmount: String(subAmountMain),
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
const refundRawResult = await sdk.exec(refundData);
|
||||
const refundResult = typeof refundRawResult === "string" ? JSON.parse(refundRawResult) : refundRawResult;
|
||||
const refundSuccess = refundResult && refundResult.errCode === 'SUCCESS';
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundApplyAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundApplyPayload: refundData.content,
|
||||
refundApplyResult: refundResult,
|
||||
refundApplySuccess: refundSuccess
|
||||
}
|
||||
});
|
||||
|
||||
res.refund = {
|
||||
success: refundSuccess,
|
||||
result: refundResult
|
||||
};
|
||||
} catch (err) {
|
||||
const errMsg = err && err.message ? err.message : JSON.stringify(err);
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundApplyAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundApplyPayload: refundData.content,
|
||||
refundApplySuccess: false,
|
||||
refundApplyError: errMsg
|
||||
}
|
||||
});
|
||||
|
||||
res.refund = {
|
||||
success: false,
|
||||
error: errMsg
|
||||
};
|
||||
}
|
||||
} else {
|
||||
res.refund = {
|
||||
skipped: true,
|
||||
reason: '当前支付单未命中线上退款条件'
|
||||
};
|
||||
}
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user