feat(mobile): 流水明细中 REWARD_PENDING 标注"已转可结算"

用户购买预种后 hasPlanted=true,所有 PENDING 奖励转为 SETTLED,
此时流水中历史的 REWARD_PENDING 条目追加"(已转可结算)"标注,
避免用户误以为还有未领取的奖励。仅在 pendingUsdt=0 时显示。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-01 09:15:18 -08:00
parent d849ca7bc2
commit b13d873f64
2 changed files with 20 additions and 2 deletions

View File

@ -1507,6 +1507,18 @@ class LedgerEntry {
return allocationTypeName ?? entryTypeName;
}
/// [2026-03-01]
/// REWARD_PENDING "(已转可结算)"
String displayNameWithStatus({bool userHasNoPending = false}) {
final baseName = allocationTypeName ?? entryTypeName;
if (entryType == 'REWARD_PENDING' && userHasNoPending) {
return '$baseName (已转可结算)';
}
return baseName;
}
///
bool get isIncome => amount > 0;
}

View File

@ -37,6 +37,9 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
int _currentPage = 1;
static const int _pageSize = 20;
// [2026-03-01] REWARD_PENDING
bool _userHasNoPending = false;
//
final List<Map<String, String>> _entryTypes = [
{'value': '', 'label': '全部'},
@ -76,7 +79,7 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
try {
final walletService = ref.read(walletServiceProvider);
//
//
final results = await Future.wait([
walletService.getLedgerStatistics(),
walletService.getLedgerTrend(days: 30),
@ -85,10 +88,12 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
pageSize: _pageSize,
entryType: _selectedEntryType,
),
walletService.getMyWallet(), // [2026-03-01] pendingUsdt
]);
if (mounted) {
final ledgerData = results[2] as PaginatedLedger;
final walletInfo = results[3] as WalletResponse;
//
debugPrint('[LedgerDetailPage] ======== 加载流水数据 ========');
@ -103,6 +108,7 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
_statistics = results[0] as LedgerStatistics;
_trend = results[1] as LedgerTrend;
_ledger = ledgerData;
_userHasNoPending = walletInfo.rewards.pendingUsdt <= 0;
_isLoading = false;
});
}
@ -989,7 +995,7 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
entry.displayName,
entry.displayNameWithStatus(userHasNoPending: _userHasNoPending),
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,