fix: 修复充值审批后资金账户余额未更新的问题

主要修改:
1. FundService.java - 所有账户更新都改用 LambdaUpdateWrapper 显式更新
   - 充值审批通过:显式更新 balance, totalDeposit, updateTime
   - 提现审批通过:显式更新 frozen, totalWithdraw, updateTime
   - 提现审批驳回:显式更新 balance, frozen, updateTime
   - 取消订单:显式更新 balance, frozen, updateTime
2. 添加更新后立即验证机制
3. 添加详细的日志输出
4. 添加诊断文档

关键改进:
- 使用 LambdaUpdateWrapper.set() 显式指定所有要更新的字段
- 更新后立即查询数据库验证
- 失败时抛出异常回滚事务
- 添加完整的日志追踪
This commit is contained in:
2026-03-24 11:29:23 +08:00
parent 4f17e7ea8a
commit 06f546f534
3 changed files with 329 additions and 41 deletions

View File

@@ -0,0 +1,73 @@
# 充值审批流程诊断报告
## 🔍 问题描述
用户反馈: 审批通过后订单状态变为"已完成",但用户资金账户余额没有增加。
## 诊断发现
### 代码分析
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. 根据结果调整修复方案