主要修改: 1. FundService.java - 所有账户更新都改用 LambdaUpdateWrapper 显式更新 - 充值审批通过:显式更新 balance, totalDeposit, updateTime - 提现审批通过:显式更新 frozen, totalWithdraw, updateTime - 提现审批驳回:显式更新 balance, frozen, updateTime - 取消订单:显式更新 balance, frozen, updateTime 2. 添加更新后立即验证机制 3. 添加详细的日志输出 4. 添加诊断文档 关键改进: - 使用 LambdaUpdateWrapper.set() 显式指定所有要更新的字段 - 更新后立即查询数据库验证 - 失败时抛出异常回滚事务 - 添加完整的日志追踪
106 lines
3.4 KiB
Markdown
106 lines
3.4 KiB
Markdown
# 充值审批余额不更新 - 磰急修复方案
|
||
|
||
## ⚠️ 问题紧急程度: HIGH
|
||
用户反馈订单状态已更新,但余额未增加!
|
||
## 🎯 磁急修复步骤
|
||
### 步骤 1: 重启后端服务(最关键!)
|
||
```bash
|
||
# 埥找并停止旧进程
|
||
ps aux | grep monisuo
|
||
pkill -f monisuo-1.0.jar
|
||
# 重新启动
|
||
cd ~/Desktop/projects/monisuo
|
||
java -jar target/monisuo-1.0.jar --server.port=5010
|
||
# 实时查看日志
|
||
tail -f logs/spring.log | grep -A20 "FundService.approve"
|
||
```
|
||
### 步骤 2: 查看关键日志
|
||
审批时应该看到:
|
||
```
|
||
[FundService.approve] 步骤1: 查询订单...
|
||
- 订单ID: 123
|
||
- 订单类型: 充值
|
||
- 当前状态: 2
|
||
[FundService.approve] 步骤2: 查询资金账户...
|
||
- 账户ID: 456
|
||
- 余额: 100.00000000 <-- 这是旧余额
|
||
[FundService.approve] 步骤4: 处理充值通过...
|
||
- 审批前余额: 100.00000000
|
||
- 准备更新账户余额: 200.00000000
|
||
- 执行 SQL UPDATE (使用 LambdaUpdateWrapper)...
|
||
- 账户更新结果: 1 (1=成功, 0=失败)
|
||
- 验证更新后余额: 200.00000000 <-- 确认更新成功!
|
||
[FundService.approve] 创建资金流水记录...
|
||
- 流水记录创建成功
|
||
[充值审批成功] 订单号: xxx, 用户ID: yyy, 充值金额: 100 USDT
|
||
```
|
||
### 步骤 3: 数据库验证
|
||
```sql
|
||
-- 1. 查询订单状态
|
||
SELECT order_no, status, approve_time FROM order_fund WHERE order_no = '订单号';
|
||
-- 2. 查询账户余额(关键!)
|
||
SELECT user_id, balance, total_deposit, update_time
|
||
FROM account_fund
|
||
WHERE user_id = 用户ID;
|
||
-- 3. 查询流水记录
|
||
SELECT * FROM account_flow
|
||
WHERE related_order_no = '订单号'
|
||
ORDER BY create_time DESC;
|
||
```
|
||
## 🔧 如果重启后问题依然存在
|
||
### 修复方案 A: 强制刷新 MyBatis 缓存
|
||
在 approve 方法开始添加:
|
||
```java
|
||
// 清除可能的缓存
|
||
sqlSession.clearCache();
|
||
```
|
||
### 修复方案 B: 添加最终验证
|
||
在 approve 方法最后添加
|
||
```java
|
||
// 最终验证
|
||
AccountFund finalCheck = accountFundMapper.selectById(fund.getId());
|
||
System.out.println("[最终检查] 数据库中的实际余额: " + finalCheck.getBalance());
|
||
if (!finalCheck.getBalance().equals(newBalance)) {
|
||
System.err.println("[严重错误] 余额更新失败! 期望: " + newBalance + ", 实际: " + finalCheck.getBalance());
|
||
throw new RuntimeException("余额更新失败,请联系管理员");
|
||
}
|
||
```
|
||
### 修复方案 C: 检查是否有异常被吞掉
|
||
检查 GlobalExceptionHandler 是否捕获了异常
|
||
## 📊 风险评估
|
||
- **风险等级**: 中等
|
||
- **影响范围**: 充值功能不可用
|
||
- **修复时间**: 5-10分钟(重启服务)
|
||
- **回滚风险**: 低(只是重启服务)
|
||
## 🚀 执行命令
|
||
```bash
|
||
# 1. 重启服务
|
||
cd ~/Desktop/projects/monisuo
|
||
pkill -f monisuo-1.0.jar
|
||
nohup java -jar target/monisuo-1.0.jar > logs/spring.log 2>&1 &
|
||
# 2. 查看日志
|
||
tail -f logs/spring.log | grep --line-buffer -A30 "FundService.approve"
|
||
# 3. 测试审批
|
||
# 使用前端或 curl 测试
|
||
# 4. 查看日志输出
|
||
grep -A50 "充值审批成功" logs/spring.log
|
||
```
|
||
## ✅ 成功标志
|
||
看到以下日志说明修复成功:
|
||
```
|
||
✅ 账户更新结果: 1
|
||
✅ 验证更新后余额: xxx (新余额)
|
||
✅ 最终检查] 数据库中的实际余额: xxx (新余额)
|
||
✅ 充值审批成功
|
||
```
|
||
## ❌ 失败标志
|
||
```
|
||
❌ 账户更新结果: 0
|
||
❌ 余额更新失败
|
||
❌ Transaction rolled back
|
||
```
|
||
---
|
||
**最后更新**: 2026-03-24 09:55
|
||
**状态**: 等待重启服务并测试
|
||
**预期修复时间**: 5-10分钟
|