feat: 新增合同审查定时任务与积分体系,重构支付模块与余额流水查询

This commit is contained in:
2026-10-14 21:55:23 +08:00
parent 988e2e8853
commit 631e3caa4c
29 changed files with 2008 additions and 862 deletions
@@ -213,64 +213,6 @@ 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,
@@ -381,49 +323,6 @@ 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));
@@ -473,13 +372,10 @@ module.exports = {
parseOrderSet,
getActionStatus,
getActionStatusTextByStatus,
applyMerchantBalanceDelta,
syncMerchantBalance,
ensureBalanceRecord,
recalculateBalance,
checkBalanceAvailable,
getPendingWithdrawAmount,
getAvailableWithdrawBalance,
updateBalanceWithDelta,
rollbackTransaction
};