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:
73
DIAGNOSTIC_APPROVAL_FLOW.md
Normal file
73
DIAGNOSTIC_APPROVAL_FLOW.md
Normal 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. 根据结果调整修复方案
|
||||
Reference in New Issue
Block a user