From 5419b15bf1f61ba3dbaf56964318fd7844fdf25e Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 5 Jan 2026 19:38:37 -0800 Subject: [PATCH] =?UTF-8?q?fix(mobile-app):=20=E5=B7=B2=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=B9=E4=B8=BA=E4=BB=8E=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1API=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 wallet-service 的 getLedgerStatistics() 获取 REWARD_SETTLED 类型的总金额 - 与流水明细中的结算记录统计来自同一数据源,确保数据一致性 - 添加调试日志对比 summary 和流水统计的数据 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude/settings.local.json | 3 ++- .../presentation/pages/profile_page.dart | 26 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 91c3a7da..0d73ed7b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -591,7 +591,8 @@ "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(wallet-service\\): 添加内部转账入账修复脚本\n\n新增一次性修复脚本用于补录因接收方钱包未创建导致入账失败的内部转账。\n\n脚本特性:\n- DRY_RUN 模式:默认只检查不执行,需手动改为 false 才真正修复\n- 完整验证:订单状态、类型、接收方信息、txHash\n- 幂等性检查:确认接收方没有 TRANSFER_IN 流水\n- 转出方验证:确认转出方有 TRANSFER_OUT 流水(已扣款)\n- 乐观锁:使用 version 字段防止并发修改\n- 审计追踪:payloadJson.dataFix=true 标记修复操作\n- 详细日志:每步操作都有时间戳和日志级别\n\n使用方法:\n1. 在 wallet-service 容器内执行 DRY_RUN 检查\n2. 确认无误后将 DRY_RUN 改为 false 再次执行\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(mobile-app\\): 添加待办操作轮询机制\n\n解决老版本 App 升级后不重启导致无法激活待办事项的问题。\n\n- 新增 PendingActionPollingService 定时轮询服务(每4秒检查)\n- App启动时无待办则启动轮询,有待办则直接进入待办页面\n- 轮询检测到待办后自动停止并跳转,防止重入问题\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(mobile-app\\): 用户资料页添加\"同伴认种\"标题和快捷标签\n\n- 在统计卡片上方添加\"同伴认种\"标题(紫色)\n- 在统计卡片下方添加\"引荐\"、\"同伴\"、\"本人\"快捷标签\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", - "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(mobile-app\\): 用户资料页术语修改\n\n- 直推 → 引荐\n- 伞下 → 同伴\n- 个人认种 → 本人认种\n- 团队认种 → 同伴认种\n- 推荐人 → 引荐人\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")" + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(mobile-app\\): 用户资料页术语修改\n\n- 直推 → 引荐\n- 伞下 → 同伴\n- 个人认种 → 本人认种\n- 团队认种 → 同伴认种\n- 推荐人 → 引荐人\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(mobile-app\\): 已结算数据改为从流水统计API获取\n\n- 从 wallet-service 的 getLedgerStatistics\\(\\) 获取 REWARD_SETTLED 类型的总金额\n- 与流水明细中的结算记录统计来自同一数据源,确保数据一致性\n- 添加调试日志对比 summary 和流水统计的数据\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")" ], "deny": [], "ask": [] diff --git a/frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart b/frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart index 1ba1c693..af678e9a 100644 --- a/frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart +++ b/frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart @@ -14,6 +14,7 @@ import '../../../../core/di/injection_container.dart'; import '../../../../core/storage/storage_keys.dart'; import '../../../../core/services/referral_service.dart'; import '../../../../core/services/reward_service.dart'; +import '../../../../core/services/wallet_service.dart'; import '../../../../core/services/notification_service.dart'; import '../../../../core/providers/notification_badge_provider.dart'; import '../../../../core/utils/date_utils.dart'; @@ -706,28 +707,42 @@ class _ProfilePageState extends ConsumerState { }); } - debugPrint('[ProfilePage] 获取 rewardServiceProvider...'); + debugPrint('[ProfilePage] 获取 rewardServiceProvider 和 walletServiceProvider...'); final rewardService = ref.read(rewardServiceProvider); + final walletService = ref.read(walletServiceProvider); - // 并行加载汇总数据、待领取列表、可结算列表、已过期列表 - debugPrint('[ProfilePage] 调用 getMyRewardSummary()、getPendingRewards()、getSettleableRewards()、getExpiredRewards()...'); + // 并行加载汇总数据、待领取列表、可结算列表、已过期列表、流水统计 + debugPrint('[ProfilePage] 调用 getMyRewardSummary()、getPendingRewards()、getSettleableRewards()、getExpiredRewards()、getLedgerStatistics()...'); final results = await Future.wait([ rewardService.getMyRewardSummary(), rewardService.getPendingRewards(), rewardService.getSettleableRewards(), rewardService.getExpiredRewards(), + walletService.getLedgerStatistics(), ]); final summary = results[0] as RewardSummary; final pendingRewards = results[1] as List; final settleableRewards = results[2] as List; final expiredRewards = results[3] as List; + final ledgerStats = results[4] as LedgerStatistics; + + // 从流水统计中获取 REWARD_SETTLED 类型的总金额作为"已结算"数据 + // 这比 summary.settledTotalUsdt 更准确,因为直接来自交易流水 + double settledFromLedger = 0.0; + for (final entry in ledgerStats.byEntryType) { + if (entry.entryType == 'REWARD_SETTLED') { + settledFromLedger = entry.totalAmount; + break; + } + } debugPrint('[ProfilePage] -------- 收益数据加载成功 --------'); debugPrint('[ProfilePage] 待领取 USDT: ${summary.pendingUsdt}'); debugPrint('[ProfilePage] 待领取 贡献值: ${summary.pendingHashpower}'); debugPrint('[ProfilePage] 可结算 USDT: ${summary.settleableUsdt}'); - debugPrint('[ProfilePage] 已结算 USDT: ${summary.settledTotalUsdt}'); + debugPrint('[ProfilePage] 已结算 USDT (summary): ${summary.settledTotalUsdt}'); + debugPrint('[ProfilePage] 已结算 USDT (流水统计): $settledFromLedger'); debugPrint('[ProfilePage] 已过期 USDT: ${summary.expiredTotalUsdt}'); debugPrint('[ProfilePage] 已过期 贡献值: ${summary.expiredTotalHashpower}'); debugPrint('[ProfilePage] 过期时间: ${summary.pendingExpireAt}'); @@ -742,7 +757,8 @@ class _ProfilePageState extends ConsumerState { _pendingUsdt = summary.pendingUsdt; _pendingPower = summary.pendingHashpower; _settleableUsdt = summary.settleableUsdt; - _settledUsdt = summary.settledTotalUsdt; + // 使用流水统计的数据,更准确 + _settledUsdt = settledFromLedger; _expiredUsdt = summary.expiredTotalUsdt; _expiredPower = summary.expiredTotalHashpower; _remainingSeconds = summary.pendingRemainingSeconds;