fix(mobile-app): 已结算数据改为从流水统计API获取

- 从 wallet-service 的 getLedgerStatistics() 获取 REWARD_SETTLED 类型的总金额
- 与流水明细中的结算记录统计来自同一数据源,确保数据一致性
- 添加调试日志对比 summary 和流水统计的数据

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-05 19:38:37 -08:00
parent 81ad8adf93
commit 5419b15bf1
2 changed files with 23 additions and 6 deletions

View File

@ -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 <noreply@anthropic.com>\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 <noreply@anthropic.com>\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 <noreply@anthropic.com>\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 <noreply@anthropic.com>\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 <noreply@anthropic.com>\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 <noreply@anthropic.com>\nEOF\n\\)\")"
],
"deny": [],
"ask": []

View File

@ -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<ProfilePage> {
});
}
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<PendingRewardItem>;
final settleableRewards = results[2] as List<SettleableRewardItem>;
final expiredRewards = results[3] as List<ExpiredRewardItem>;
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<ProfilePage> {
_pendingUsdt = summary.pendingUsdt;
_pendingPower = summary.pendingHashpower;
_settleableUsdt = summary.settleableUsdt;
_settledUsdt = summary.settledTotalUsdt;
// 使
_settledUsdt = settledFromLedger;
_expiredUsdt = summary.expiredTotalUsdt;
_expiredPower = summary.expiredTotalHashpower;
_remainingSeconds = summary.pendingRemainingSeconds;