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

5.5 KiB
Raw Blame History

审批订单问题排查报告

问题描述

管理员审批充值订单后:

  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. 重新编译项目

cd ~/Desktop/projects/monisuo
mvn clean package -DskipTests

2. 重启后端服务

# 停止旧服务(如果正在运行)
# kill -9 $(ps aux | grep monisuo-1.0.jar | grep -v grep | awk '{print $2}')

# 启动新服务(确保能看到控制台日志)
java -jar target/monisuo-1.0.jar

3. 运行测试脚本

快速测试

./quick_test.sh

完整测试

./test_approve_order.sh

4. 检查日志输出

在运行测试脚本时,观察后端控制台的日志输出,查看:

  • 参数是否正确接收
  • 订单是否成功查询
  • 资金账户是否成功查询
  • 数据库更新操作的返回值应该是1
  • 验证查询的结果

可能的问题和解决方案

问题1: 日志没有输出

原因: System.out.println 可能被重定向或过滤 解决: 检查日志配置,或者查看应用日志文件

问题2: updateById 返回 0

原因:

  • 数据库连接失败
  • 订单ID不存在
  • 乐观锁冲突

解决:

  • 检查数据库连接配置
  • 查看详细日志中的订单ID
  • 检查是否有并发更新

问题3: 状态更新了但前端没刷新

原因: 前端缓存问题 解决:

  • 前端已经配置了 queryClient.invalidateQueries()
  • 检查前端网络请求是否成功
  • 手动刷新页面

问题4: 事务未提交

原因: @Transactional 注解配置问题 解决:

  • 检查 Spring 事务管理器配置
  • 查看是否有异常导致事务回滚
  • 检查数据库连接池配置

数据库验证

1. 查询订单状态

SELECT id, order_no, user_id, type, status, amount, 
       approve_admin_id, approve_time, admin_remark
FROM order_fund 
WHERE order_no = '订单号';

2. 查询用户资金账户

SELECT id, user_id, balance, frozen, total_deposit, total_withdraw
FROM account_fund
WHERE user_id = 用户ID;

3. 查询资金流水

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. 报告结果: 将测试结果和日志输出发送给开发者

联系信息

如有问题,请提供:

  • 测试脚本的输出
  • 后端控制台的完整日志
  • 数据库查询结果