fix: 提现排除处理中金额,选择报价改为重点提示

可提现额度扣除处理中提现,避免重复提现超总额;收到报价选择供应商时展示重点提示而非服务费提示。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-11 00:47:54 +08:00
parent ca7d179d1b
commit b341d6ad97
5 changed files with 258 additions and 93 deletions
@@ -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) {