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

74 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 充值审批流程诊断报告
## 🔍 问题描述
用户反馈: 审批通过后订单状态变为"已完成",但用户资金账户余额没有增加。
## 诊断发现
### 代码分析
1. **账户余额更新**: 使用 LambdaUpdateWrapper 显式更新 ✅
2. **流水记录创建**: 跻加了详细的日志输出 ✅
3. **AssetService.createFlow**: 代码逻辑正确 ✅
### 可能的问题点
1. **事务未提交**: 虽然使用了 @Transactional 但事务可能未正确提交
2. **并发问题**: 查询和更新之间可能有其他事务修改了数据
3. **缓存问题**: MyBatis 可能缓存了旧数据
4. **日志未查看**: 需要查看实际的 SQL 执行日志
## 🧪 诊断步骤
### 1. 查看审批日志
```bash
# 查找最近的审批日志
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. 直接查询数据库
```sql
-- 查询最近的充值订单
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() 方法最后添加:
```java
// 在方法最后验证最终结果
AccountFund finalFund = accountFundMapper.selectById(fund.getId());
System.out.println("[最终验证] 账户余额: " + finalFund.getBalance());
if (!finalFund.getBalance().equals(newBalance)) {
throw new RuntimeException("账户余额更新失败!");
}
```
### 方案 2: 使用数据库锁
```java
// 在查询账户时加锁
SELECT * FROM account_fund WHERE id = ? FOR UPDATE
```
### 方案 3: 检查事务配置
确保 Spring 事务管理正确配置:
## 📋 下一步
1. 启动服务
2. 执行审批操作
3. 查看日志输出
4. 查询数据库验证
5. 根据结果调整修复方案