fix(mobile): 预种可结算列表以wallet实际金额为准,避免已结算条目残留

planting-service 的分配记录不跟踪 wallet 端的结算状态,
原来的反向排除法(排除PENDING+EXPIRED)无法处理:
1. 已结算到余额(SETTLED→余额)的条目
2. hasPlanted=true 后直接进可结算、不经 pending_rewards 的条目

改为以 walletInfo.rewards.settleableUsdt 为权威来源:
- settleableUsdt=0 时直接跳过(已全部结算到余额)
- settleableUsdt>0 时按金额截断,确保展示总额不超过实际可结算

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-01 10:19:31 -08:00
parent eba125901c
commit 31e6f9e15a
1 changed files with 45 additions and 32 deletions

View File

@ -801,39 +801,52 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
// [2026-03-01] // [2026-03-01]
// pre-planting/my-rewards // pre-planting/my-rewards
// PENDING // PENDINGEXPIRED
// PENDING EXPIRED //
final pendingPplOrderIds = walletPendingRewards // wallet settleableUsdt
.where((r) => r.isPrePlanting) // settleableUsdt=0
.map((r) => r.sourceOrderId) // settleableUsdt>0 PENDING + EXPIRED
.toSet(); // wallet
final expiredPplOrderIds = expiredRewards final walletSettleableUsdt = walletInfo.rewards.settleableUsdt;
.where((r) => r.sourceOrderId.startsWith('PPL')) List<SettleableRewardItem> prePlantingSettleable = [];
.map((r) => r.sourceOrderId)
.toSet(); if (walletSettleableUsdt > 0) {
final excludedPplOrderIds = {...pendingPplOrderIds, ...expiredPplOrderIds}; final pendingPplOrderIds = walletPendingRewards
final prePlantingSettleable = prePlantingRewards.settleableRewards .where((r) => r.isPrePlanting)
.where((r) => !excludedPplOrderIds.contains(r.sourceOrderNo)) .map((r) => r.sourceOrderId)
.map((r) { .toSet();
final srcAcct = r.sourceAccountSequence; final expiredPplOrderIds = expiredRewards
final memoSuffix = (srcAcct != null && srcAcct.isNotEmpty) .where((r) => r.sourceOrderId.startsWith('PPL'))
? ':来自${srcAcct}的预种' .map((r) => r.sourceOrderId)
: ''; .toSet();
return SettleableRewardItem( final excludedPplOrderIds = {...pendingPplOrderIds, ...expiredPplOrderIds};
id: r.id,
rightType: r.rightType, double accumulatedUsdt = 0;
usdtAmount: r.usdtAmount, for (final r in prePlantingRewards.settleableRewards) {
hashpowerAmount: r.hashpowerAmount, if (excludedPplOrderIds.contains(r.sourceOrderNo)) continue;
createdAt: r.createdAt, if (accumulatedUsdt + r.usdtAmount > walletSettleableUsdt + 0.01) break;
claimedAt: null, accumulatedUsdt += r.usdtAmount;
sourceOrderNo: r.sourceOrderNo,
sourceAccountSequence: r.sourceAccountSequence, final srcAcct = r.sourceAccountSequence;
memo: '[预种] ${r.memo}$memoSuffix', final memoSuffix = (srcAcct != null && srcAcct.isNotEmpty)
); ? ':来自${srcAcct}的预种'
}) : '';
.toList(); prePlantingSettleable.add(SettleableRewardItem(
id: r.id,
rightType: r.rightType,
usdtAmount: r.usdtAmount,
hashpowerAmount: r.hashpowerAmount,
createdAt: r.createdAt,
claimedAt: null,
sourceOrderNo: r.sourceOrderNo,
sourceAccountSequence: r.sourceAccountSequence,
memo: '[预种] ${r.memo}$memoSuffix',
));
}
}
settleableRewards = [...settleableRewards, ...prePlantingSettleable]; settleableRewards = [...settleableRewards, ...prePlantingSettleable];
debugPrint('[ProfilePage] 预种可结算奖励: ${prePlantingSettleable.length} 条 (排除 ${pendingPplOrderIds.length} 条 PENDING, ${expiredPplOrderIds.length} 条 EXPIRED)'); debugPrint('[ProfilePage] 预种可结算奖励: ${prePlantingSettleable.length} 条 (walletSettleableUsdt=$walletSettleableUsdt)');
// [2026-03-01] // [2026-03-01]
// wallet-service pending_rewards + // wallet-service pending_rewards +