Files
jjx-web/uniCloud-tcb/cloudfunctions/router/service/admin/finance/balance/sys/withdraw.js
T

139 lines
5.0 KiB
JavaScript

'use strict';
const dayjs = require('dayjs');
const balanceUtil = require('./util.js');
const merchantMap = balanceUtil.MERCHANT_MAP;
module.exports = {
/**
* 提现
* @url admin/finance/balance/sys/withdraw 前端调用的url参数地址
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk } = util;
const transaction = await vk.baseDao.startTransaction();
try {
const merchantId = String(data.merchantId || '').trim();
if (!merchantMap[merchantId]) {
throw new Error('提现商户不正确');
}
const amount = balanceUtil.normalizeAmount(data.amount);
if (amount <= 0) {
throw new Error('提现金额必须大于0');
}
const balanceRecord = await balanceUtil.ensureBalanceRecord({
transaction,
vk
});
const balanceInfoMap = balanceUtil.buildBalanceInfoMap(balanceRecord.balanceInfo || {});
const merchantBalanceInfo = balanceInfoMap[merchantId] || {
accNo: merchantId,
merchantName: merchantMap[merchantId],
balance: 0,
updateTime: ''
};
const merchantBalance = balanceUtil.normalizeAmount(merchantBalanceInfo.balance || 0);
if (merchantBalance <= 0) {
throw new Error('当前企业余额小于等于0,无法提现');
}
if (amount > merchantBalance) {
throw new Error('提现金额不能大于当前企业余额');
}
const description = String(data.description || '').trim() || `余额提现-${merchantMap[merchantId]}`;
const requestRes = await vk.request({
method: "POST",
url: 'http://jjx-union-pay.gxwebsoft.com/api/union-pay-jjx/transByAmount',
header: {
"content-type": "application/json; charset=utf-8",
},
data: {
accNo: merchantId,
amount
},
timeout: 60000
});
console.log('requestRes', requestRes)
const code = Number(requestRes && requestRes.code);
const success = requestRes && (
code === 0 ||
code === 200 ||
requestRes.success === true ||
(typeof requestRes.code === 'undefined' && !requestRes.msg && !requestRes.message)
);
if (!success) {
throw new Error(
(requestRes && (requestRes.msg || requestRes.message)) ||
(requestRes && requestRes.content && (requestRes.content.msg || requestRes.content.message)) ||
'提现失败'
);
}
const logData = {
description,
amount,
type: 'expense',
logTime: Date.now(),
operatorId: userInfo && userInfo.uid ? userInfo.uid : '',
source: 'withdraw',
merchantId,
merchantName: merchantMap[merchantId],
srcReqId: requestRes.srcReqId,
status: 1
};
const changeAmount = balanceUtil.buildBalanceChange(logData);
await balanceUtil.checkBalanceAvailable({
transaction,
vk,
changeAmount
});
const addRes = await vk.baseDao.add({
db: transaction,
dbName: 'jjx-balance-log',
dataJson: logData
});
const updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
const nextMerchantBalance = Number((merchantBalance + changeAmount).toFixed(2));
const nextBalance = Number((Number(balanceRecord.balance || 0) + changeAmount).toFixed(2));
await vk.baseDao.updateById({
db: transaction,
dbName: 'jjx-balance',
id: balanceRecord._id,
dataJson: {
balance: nextBalance,
lastLogId: addRes.id,
updateTime,
balanceInfo: {
...balanceInfoMap,
[merchantId]: {
accNo: merchantId,
merchantName: merchantMap[merchantId],
balance: nextMerchantBalance,
updateTime
}
}
}
});
await transaction.commit();
return {
code: 0,
msg: '',
data: {
balance: nextBalance,
merchantBalance: nextMerchantBalance
}
};
} catch (err) {
return await balanceUtil.rollbackTransaction({
transaction,
err
});
}
}
};