Files
monisuo/DIAGNOSTIC_APPROVAL_FLOW.md
sion 06f546f534 fix: 修复充值审批后资金账户余额未更新的问题
主要修改:
1. FundService.java - 所有账户更新都改用 LambdaUpdateWrapper 显式更新
   - 充值审批通过:显式更新 balance, totalDeposit, updateTime
   - 提现审批通过:显式更新 frozen, totalWithdraw, updateTime
   - 提现审批驳回:显式更新 balance, frozen, updateTime
   - 取消订单:显式更新 balance, frozen, updateTime
2. 添加更新后立即验证机制
3. 添加详细的日志输出
4. 添加诊断文档

关键改进:
- 使用 LambdaUpdateWrapper.set() 显式指定所有要更新的字段
- 更新后立即查询数据库验证
- 失败时抛出异常回滚事务
- 添加完整的日志追踪
2026-03-24 11:29:23 +08:00

2.6 KiB
Raw Blame History

充值审批流程诊断报告

🔍 问题描述

用户反馈: 审批通过后订单状态变为"已完成",但用户资金账户余额没有增加。

诊断发现

代码分析

  1. 账户余额更新: 使用 LambdaUpdateWrapper 显式更新
  2. 流水记录创建: 跻加了详细的日志输出
  3. AssetService.createFlow: 代码逻辑正确

可能的问题点

  1. 事务未提交: 虽然使用了 @Transactional 但事务可能未正确提交
  2. 并发问题: 查询和更新之间可能有其他事务修改了数据
  3. 缓存问题: MyBatis 可能缓存了旧数据
  4. 日志未查看: 需要查看实际的 SQL 执行日志

🧪 诊断步骤

1. 查看审批日志

# 查找最近的审批日志
grep -A50 "充值审批成功\|账户更新结果" logs/spring.log | tail -20
# 查找 SQL UPDATE 语句
grep "UPDATE account_fund" logs/spring.log | tail -10
# 查找事务相关日志
grep -i "transaction\|commit\|rollback" logs/spring.log | tail -10

2. 直接查询数据库

-- 查询最近的充值订单
SELECT id, order_no, user_id, amount, status, approve_time
FROM order_fund
WHERE type = 1 AND status = 3
ORDER BY approve_time DESC
LIMIT 5;
-- 查询对应的用户资金账户
SELECT af.id, af.user_id, af.balance, af.total_deposit, af.update_time
FROM account_fund af
WHERE af.user_id IN (SELECT user_id FROM order_fund WHERE type = 1 AND status = 3 ORDER BY approve_time DESC LIMIT 5)
ORDER BY af.update_time DESC;
-- 查询资金流水记录
SELECT af.id, af.user_id, af.amount, af.balance_before, af.balance_after, af.flow_type, af.create_time
FROM account_flow af
WHERE af.flow_type = 1
ORDER BY af.create_time DESC
LIMIT 10;

3. 验证逻辑

  • 订单状态 = 3
  • 账户余额增加?
  • 流水记录存在?
  • 流水记录中的 balanceAfter = 实际余额?

🔧 可能的修复方案

方案 1: 添加事务同步验证

在 FundService.approve() 方法最后添加:

// 在方法最后验证最终结果
AccountFund finalFund = accountFundMapper.selectById(fund.getId());
System.out.println("[最终验证] 账户余额: " + finalFund.getBalance());
if (!finalFund.getBalance().equals(newBalance)) {
    throw new RuntimeException("账户余额更新失败!");
}

方案 2: 使用数据库锁

// 在查询账户时加锁
SELECT * FROM account_fund WHERE id = ? FOR UPDATE

方案 3: 检查事务配置

确保 Spring 事务管理正确配置:

📋 下一步

  1. 启动服务
  2. 执行审批操作
  3. 查看日志输出
  4. 查询数据库验证
  5. 根据结果调整修复方案