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 调试工具
This commit is contained in:
200
APPROVAL_DEBUG_REPORT.md
Normal file
200
APPROVAL_DEBUG_REPORT.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# 审批订单问题排查报告
|
||||
|
||||
## 问题描述
|
||||
管理员审批充值订单后:
|
||||
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. **报告结果**: 将测试结果和日志输出发送给开发者
|
||||
|
||||
## 联系信息
|
||||
|
||||
如有问题,请提供:
|
||||
- 测试脚本的输出
|
||||
- 后端控制台的完整日志
|
||||
- 数据库查询结果
|
||||
Reference in New Issue
Block a user