139 lines
5.0 KiB
JavaScript
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
|
|
});
|
|
}
|
|
}
|
|
};
|