fix: 提现排除处理中金额,选择报价改为重点提示
可提现额度扣除处理中提现,避免重复提现超总额;收到报价选择供应商时展示重点提示而非服务费提示。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
'use strict';
|
||||
const dayjs = require('dayjs');
|
||||
const balanceUtil = require('./util.js');
|
||||
const merchantMap = balanceUtil.MERCHANT_MAP;
|
||||
|
||||
@@ -34,11 +33,28 @@ module.exports = {
|
||||
updateTime: ''
|
||||
};
|
||||
const merchantBalance = balanceUtil.normalizeAmount(merchantBalanceInfo.balance || 0);
|
||||
if (merchantBalance <= 0) {
|
||||
throw new Error('当前企业余额小于等于0,无法提现');
|
||||
const {
|
||||
pendingAmount,
|
||||
availableBalance
|
||||
} = await balanceUtil.getAvailableWithdrawBalance({
|
||||
transaction,
|
||||
vk,
|
||||
merchantId,
|
||||
merchantBalance
|
||||
});
|
||||
if (availableBalance <= 0) {
|
||||
throw new Error(
|
||||
pendingAmount > 0
|
||||
? `可提现余额不足(处理中提现¥${pendingAmount.toFixed(2)}已占用)`
|
||||
: '当前企业余额小于等于0,无法提现'
|
||||
);
|
||||
}
|
||||
if (amount > merchantBalance) {
|
||||
throw new Error('提现金额不能大于当前企业余额');
|
||||
if (amount > availableBalance) {
|
||||
throw new Error(
|
||||
pendingAmount > 0
|
||||
? `提现金额不能大于可提现余额¥${availableBalance.toFixed(2)}(已排除处理中提现¥${pendingAmount.toFixed(2)})`
|
||||
: '提现金额不能大于当前企业余额'
|
||||
);
|
||||
}
|
||||
const description = String(data.description || '').trim() || `余额提现-${merchantMap[merchantId]}`;
|
||||
|
||||
@@ -80,52 +96,28 @@ module.exports = {
|
||||
merchantId,
|
||||
merchantName: merchantMap[merchantId],
|
||||
srcReqId: requestRes.srcReqId,
|
||||
status: 1
|
||||
status: 1,
|
||||
// 新逻辑:处理中不扣余额,成功后再扣;用于兼容旧数据(旧单默认已扣)
|
||||
balanceDeducted: false
|
||||
};
|
||||
const changeAmount = balanceUtil.buildBalanceChange(logData);
|
||||
|
||||
await balanceUtil.checkBalanceAvailable({
|
||||
transaction,
|
||||
vk,
|
||||
changeAmount
|
||||
});
|
||||
|
||||
const addRes = await vk.baseDao.add({
|
||||
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
|
||||
balance: merchantBalance,
|
||||
pendingAmount: balanceUtil.normalizeAmount(pendingAmount + amount),
|
||||
availableBalance: balanceUtil.normalizeAmount(Math.max(0, availableBalance - amount)),
|
||||
merchantBalance
|
||||
}
|
||||
};
|
||||
} catch (err) {
|
||||
|
||||
Reference in New Issue
Block a user