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
@@ -213,6 +213,64 @@ function getActionStatusTextByStatus(status) {
return statusMap[Number(status)] || '';
}
async function applyMerchantBalanceDelta({
vk,
transaction,
merchantId,
delta,
lastLogId = '',
updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
}) {
const accNo = String(merchantId || '').trim();
if (!accNo) {
throw new Error('提现账号不能为空');
}
const changeAmount = normalizeAmount(delta);
const balanceRecord = await ensureBalanceRecord({ transaction, vk });
const balanceInfoMap = buildBalanceInfoMap(balanceRecord.balanceInfo || {});
const currentMerchantInfo = balanceInfoMap[accNo] || {
accNo,
merchantName: getMerchantLabel(accNo),
balance: 0,
updateTime: ''
};
const currentMerchantBalance = normalizeAmount(currentMerchantInfo.balance || 0);
const nextMerchantBalance = normalizeAmount(currentMerchantBalance + changeAmount);
if (nextMerchantBalance < 0) {
throw new Error('余额不足');
}
const nextBalanceInfoMap = {
...balanceInfoMap,
[accNo]: {
accNo,
merchantName: currentMerchantInfo.merchantName || getMerchantLabel(accNo),
balance: nextMerchantBalance,
updateTime
}
};
const nextTotalBalance = normalizeAmount(Number(balanceRecord.balance || 0) + changeAmount);
const dataJson = {
balance: nextTotalBalance,
balanceInfo: nextBalanceInfoMap,
updateTime
};
if (lastLogId) {
dataJson.lastLogId = lastLogId;
}
await vk.baseDao.updateById({
db: transaction,
dbName: 'jjx-balance',
id: balanceRecord._id,
dataJson
});
return {
balance: nextTotalBalance,
merchantBalance: nextMerchantBalance,
updateTime,
balanceInfoMap: nextBalanceInfoMap
};
}
async function syncMerchantBalance({
vk,
accNo,
@@ -323,6 +381,49 @@ async function checkBalanceAvailable({ transaction, vk, changeAmount, excludeLog
};
}
/**
* 统计指定商户处理中的提现金额(status=1)
*/
async function getPendingWithdrawAmount({ transaction, vk, merchantId }) {
const accNo = String(merchantId || '').trim();
if (!accNo) {
return 0;
}
const res = await vk.baseDao.select({
db: transaction,
dbName: 'jjx-balance-log',
whereJson: {
merchantId: accNo,
type: 'expense',
source: 'withdraw',
status: 1
},
pageIndex: 1,
pageSize: 1000,
getCount: false
});
const rows = (res && res.rows) || [];
return normalizeAmount(rows.reduce((sum, item) => sum + Number(item.amount || 0), 0));
}
/**
* 可提现余额 = 当前余额 - 处理中提现金额
*/
async function getAvailableWithdrawBalance({ transaction, vk, merchantId, merchantBalance }) {
const pendingAmount = await getPendingWithdrawAmount({
transaction,
vk,
merchantId
});
const balance = normalizeAmount(merchantBalance);
const availableBalance = normalizeAmount(Math.max(0, balance - pendingAmount));
return {
balance,
pendingAmount,
availableBalance
};
}
async function updateBalanceWithDelta({ transaction, vk, delta, lastLogId = '' }) {
const balanceInfo = await ensureBalanceRecord({ transaction, vk });
const nextBalance = Number((Number(balanceInfo.balance || 0) + Number(delta || 0)).toFixed(2));
@@ -372,10 +473,13 @@ module.exports = {
parseOrderSet,
getActionStatus,
getActionStatusTextByStatus,
applyMerchantBalanceDelta,
syncMerchantBalance,
ensureBalanceRecord,
recalculateBalance,
checkBalanceAvailable,
getPendingWithdrawAmount,
getAvailableWithdrawBalance,
updateBalanceWithDelta,
rollbackTransaction
};