fix(wallet): settleUserPendingRewards 补创建 REWARD_TO_SETTLEABLE 流水
转换 PENDING→SETTLEABLE 时,为每笔奖励创建带来源信息的 REWARD_TO_SETTLEABLE 流水,解决"分享收益"筛选缺失问题。 统计排除逻辑同步更新,通过 convertedFromPending 标记避免双重计算。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
fda79304c6
commit
28cf0b7769
|
|
@ -2450,6 +2450,33 @@ export class WalletApplicationService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4. 为每笔 pending reward 创建 REWARD_TO_SETTLEABLE 流水(保留来源信息,供"分享收益"筛选)
|
||||||
|
// 注意:payloadJson.convertedFromPending = true 用于统计时排除(避免与 REWARD_PENDING 双重计算)
|
||||||
|
for (const reward of pendingRewards) {
|
||||||
|
if (reward.usdtAmount.value <= 0) continue;
|
||||||
|
// 查找原始 REWARD_PENDING 流水,获取来源信息
|
||||||
|
const originalEntry = await tx.ledgerEntry.findFirst({
|
||||||
|
where: {
|
||||||
|
accountSequence,
|
||||||
|
entryType: LedgerEntryType.REWARD_PENDING,
|
||||||
|
refOrderId: reward.sourceOrderId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const originalPayload = (originalEntry?.payloadJson as Record<string, unknown>) || {};
|
||||||
|
await tx.ledgerEntry.create({
|
||||||
|
data: {
|
||||||
|
accountSequence,
|
||||||
|
userId: walletRecord.userId,
|
||||||
|
entryType: LedgerEntryType.REWARD_TO_SETTLEABLE,
|
||||||
|
amount: reward.usdtAmount.value,
|
||||||
|
assetType: 'USDT',
|
||||||
|
refOrderId: reward.sourceOrderId,
|
||||||
|
memo: originalEntry?.memo?.replace('待领取', '可结算') || `[预种] ${reward.allocationType} | 可结算`,
|
||||||
|
payloadJson: { ...originalPayload, convertedFromPending: true },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.log(`[settleUserPendingRewards] Transaction committed: ${pendingRewards.length} rewards settled for ${accountSequence}`);
|
this.logger.log(`[settleUserPendingRewards] Transaction committed: ${pendingRewards.length} rewards settled for ${accountSequence}`);
|
||||||
} else {
|
} else {
|
||||||
this.logger.warn(`[settleUserPendingRewards] Wallet not found for ${accountSequence}, skipping wallet update`);
|
this.logger.warn(`[settleUserPendingRewards] Wallet not found for ${accountSequence}, skipping wallet update`);
|
||||||
|
|
@ -2698,9 +2725,12 @@ export class WalletApplicationService {
|
||||||
|
|
||||||
// 只计算非临时性流水的收支统计
|
// 只计算非临时性流水的收支统计
|
||||||
// 兼容历史数据:老的批量转换记录 entry_type 仍为 REWARD_TO_SETTLEABLE,
|
// 兼容历史数据:老的批量转换记录 entry_type 仍为 REWARD_TO_SETTLEABLE,
|
||||||
// 通过 memo 中 "pending rewards settled" 识别并排除
|
// 通过 memo 中 "pending rewards settled" 或 payloadJson.convertedFromPending 识别并排除
|
||||||
const isExcluded = excludeFromStats.has(entry.entryType) ||
|
const isExcluded = excludeFromStats.has(entry.entryType) ||
|
||||||
(entry.entryType === 'REWARD_TO_SETTLEABLE' && entry.memo?.includes('pending rewards settled'));
|
(entry.entryType === 'REWARD_TO_SETTLEABLE' && (
|
||||||
|
entry.memo?.includes('pending rewards settled') ||
|
||||||
|
(entry.payloadJson as Record<string, unknown>)?.convertedFromPending === true
|
||||||
|
));
|
||||||
if (!isExcluded) {
|
if (!isExcluded) {
|
||||||
if (amount > 0) {
|
if (amount > 0) {
|
||||||
totalIncome += amount;
|
totalIncome += amount;
|
||||||
|
|
@ -2797,7 +2827,10 @@ export class WalletApplicationService {
|
||||||
|
|
||||||
// 只计算非临时性流水的收支统计(兼容历史批量转换数据)
|
// 只计算非临时性流水的收支统计(兼容历史批量转换数据)
|
||||||
const isExcluded = excludeFromStats.has(entry.entryType) ||
|
const isExcluded = excludeFromStats.has(entry.entryType) ||
|
||||||
(entry.entryType === 'REWARD_TO_SETTLEABLE' && entry.memo?.includes('pending rewards settled'));
|
(entry.entryType === 'REWARD_TO_SETTLEABLE' && (
|
||||||
|
entry.memo?.includes('pending rewards settled') ||
|
||||||
|
(entry.payloadJson as Record<string, unknown>)?.convertedFromPending === true
|
||||||
|
));
|
||||||
if (!isExcluded) {
|
if (!isExcluded) {
|
||||||
if (amount > 0) {
|
if (amount > 0) {
|
||||||
existing.income += amount;
|
existing.income += amount;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue