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