Files
monisuo/APPROVAL_DEBUG_REPORT.md
sion 4f17e7ea8a fix: 修复订单审批状态不更新的问题
主要修复:
1. 添加 MetaObjectHandler 自动填充时间字段
2. 启用 @EnableTransactionManagement 显式事务管理
3. 使用 LambdaUpdateWrapper 强制更新订单状态
4. 完善 MyBatis Plus 配置和字段更新策略
5. 添加详细的调试日志配置
6. 前端集成 vconsole 调试工具

关键修改文件:
- SpcCloudApplication.java: 添加 @EnableTransactionManagement
- FundService.java: 使用 LambdaUpdateWrapper 显式更新
- MyBatisPlusMetaObjectHandler.java: 自动填充时间字段
- application-dev.yml: 完善配置和日志
- monisuo-admin: 添加 vconsole 调试工具
2026-03-24 09:41:23 +08:00

201 lines
5.5 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. ❌ 订单状态完全没有变化
2. ❌ 用户资金账户余额没有增加
## 已完成的修复
### 1. 添加详细的调试日志
#### AdminController.java
`approveOrder()` 方法中添加了详细日志:
- ✅ 接收到的完整参数
- ✅ 参数解析结果
- ✅ 参数校验结果
- ✅ FundService 调用前后日志
- ✅ 异常捕获和打印
#### FundService.java
`approve()` 方法中添加了详细日志:
- ✅ 步骤1: 查询订单(包含订单详细信息)
- ✅ 步骤2: 查询资金账户(包含账户详细信息)
- ✅ 步骤3: 确定最终状态
- ✅ 步骤4: 处理审批逻辑(充值/提现,通过/驳回)
- ✅ 步骤5: 更新订单状态
- ✅ 步骤6: 验证更新结果
- ✅ 每个数据库操作的返回值
### 2. 日志输出示例
审批通过时,控制台会输出类似以下日志:
```
==================== 审批订单开始 ====================
[AdminController] 接收到的完整参数: {orderNo=xxx, status=2, ...}
[AdminController] 解析后的参数:
- orderNo: xxx
- status: 2
- rejectReason: null
- adminRemark: 测试审批
[AdminController] 开始调用 fundService.approve()...
[FundService.approve] 开始处理审批
[FundService.approve] 参数: orderNo=xxx, status=2, adminId=1, adminName=管理员
[FundService.approve] 步骤1: 查询订单...
[FundService.approve] 订单查询成功:
- 订单ID: 123
- 订单号: xxx
- 用户ID: 456
- 用户名: testuser
- 订单类型: 充值
- 当前状态: 2
- 金额: 100.00
[FundService.approve] 步骤2: 查询资金账户...
[FundService.approve] 资金账户查询成功:
- 账户ID: 789
- 用户ID: 456
- 余额: 500.00
- 冻结: 0.00
[FundService.approve] 步骤3: 确定最终状态: 3 (审批通过)
[FundService.approve] 步骤4: 处理审批通过逻辑...
[FundService.approve] 处理充值通过...
- 审批前余额: 500.00
- 准备更新账户余额: 600.00
- 账户更新结果: 1 (1=成功, 0=失败)
- 审批后余额: 600.00
[FundService.approve] 创建资金流水记录...
- 流水记录创建成功
[充值审批成功] 订单号: xxx, 用户ID: 456, 充值金额: 100.00 USDT
[FundService.approve] 步骤5: 更新订单状态...
- 当前状态: 2
- 目标状态: 3
- 准备执行数据库更新...
- 订单更新结果: 1 (1=成功, 0=失败)
[FundService.approve] 步骤6: 验证更新结果...
- 验证查询结果: ID=123, 状态=3
- 状态验证通过 ✓
[审批完成] 订单号: xxx, 订单类型: 充值, 审批结果: 通过, 最终状态: 3, 审批人: 管理员
[FundService.approve] 处理完成
==================== 审批订单结束 ====================
```
## 测试步骤
### 1. 重新编译项目
```bash
cd ~/Desktop/projects/monisuo
mvn clean package -DskipTests
```
### 2. 重启后端服务
```bash
# 停止旧服务(如果正在运行)
# kill -9 $(ps aux | grep monisuo-1.0.jar | grep -v grep | awk '{print $2}')
# 启动新服务(确保能看到控制台日志)
java -jar target/monisuo-1.0.jar
```
### 3. 运行测试脚本
#### 快速测试
```bash
./quick_test.sh
```
#### 完整测试
```bash
./test_approve_order.sh
```
### 4. 检查日志输出
在运行测试脚本时,观察后端控制台的日志输出,查看:
- ✅ 参数是否正确接收
- ✅ 订单是否成功查询
- ✅ 资金账户是否成功查询
- ✅ 数据库更新操作的返回值应该是1
- ✅ 验证查询的结果
## 可能的问题和解决方案
### 问题1: 日志没有输出
**原因**: System.out.println 可能被重定向或过滤
**解决**: 检查日志配置,或者查看应用日志文件
### 问题2: updateById 返回 0
**原因**:
- 数据库连接失败
- 订单ID不存在
- 乐观锁冲突
**解决**:
- 检查数据库连接配置
- 查看详细日志中的订单ID
- 检查是否有并发更新
### 问题3: 状态更新了但前端没刷新
**原因**: 前端缓存问题
**解决**:
- 前端已经配置了 queryClient.invalidateQueries()
- 检查前端网络请求是否成功
- 手动刷新页面
### 问题4: 事务未提交
**原因**: @Transactional 注解配置问题
**解决**:
- 检查 Spring 事务管理器配置
- 查看是否有异常导致事务回滚
- 检查数据库连接池配置
## 数据库验证
### 1. 查询订单状态
```sql
SELECT id, order_no, user_id, type, status, amount,
approve_admin_id, approve_time, admin_remark
FROM order_fund
WHERE order_no = '订单号';
```
### 2. 查询用户资金账户
```sql
SELECT id, user_id, balance, frozen, total_deposit, total_withdraw
FROM account_fund
WHERE user_id = ID;
```
### 3. 查询资金流水
```sql
SELECT * FROM account_flow
WHERE user_id = ID
ORDER BY create_time DESC
LIMIT 10;
```
## 状态映射规则
### 充值订单
- 前端传 `status=2` (通过) → 后端最终状态 `3` (已完成)
- 前端传 `status=3` (驳回) → 后端最终状态 `4` (已驳回)
### 提现订单
- 前端传 `status=2` (通过) → 后端最终状态 `2` (已完成)
- 前端传 `status=3` (驳回) → 后端最终状态 `3` (已驳回)
## 下一步
1. **运行测试**: 执行 `./quick_test.sh` 并观察日志
2. **检查数据库**: 使用 SQL 验证数据是否真的更新
3. **查看前端**: 检查前端是否正确显示最新状态
4. **报告结果**: 将测试结果和日志输出发送给开发者
## 联系信息
如有问题,请提供:
- 测试脚本的输出
- 后端控制台的完整日志
- 数据库查询结果