Files
monisuo/APPROVAL_COMPREHENSIVE_FIX.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

8.1 KiB

订单审批状态不更新 - 完整诊断和修复报告

诊断时间: 2026-03-24 09:30 问题状态: 🔍 完整诊断完成 修复状态: 已应用多项修复


🎯 问题描述

用户反馈: 管理员审批通过后,订单状态仍然没有变化 已修复: MetaObjectHandler 已添加,但问题依然存在 当前状态: 需要系统性诊断和修复


🔍 已完成的诊断和修复

1. MetaObjectHandler 已添加

文件: src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java 状态: 已创建并配置 作用: 自动填充 createTimeupdateTime 字段

2. MyBatis Plus 配置已完善

文件: src/main/resources/application-dev.yml 新增配置:

mybatis-plus:
  global-config:
    db-config:
      id-type: auto
      update-strategy: not_null
      insert-strategy: not_null

3. 详细日志配置已添加

文件: src/main/resources/application-dev.yml 新增配置:

logging:
  level:
    com.it.rattan.monisuo: DEBUG
    com.it.rattan.monisuo.mapper: DEBUG
    org.springframework.jdbc: DEBUG
    org.springframework.transaction: DEBUG
    org.mybatis: DEBUG

4. FundService.approve() 已优化

状态: 已使用 LambdaUpdateWrapper 显式更新 特点:

  • 详细的日志输出
  • 使用 LambdaUpdateWrapper 强制更新所有字段
  • 更新后立即验证
  • 完整的错误处理

5. 前端 vconsole 已添加

文件: monisuo-admin/src/main.ts 状态: 已添加 vconsole 支持 效果: 开发环境下可以查看控制台日志


🔬 可能的根本原因分析

假设 1: 事务未正确提交

可能性: 非常高 原因:

  • Spring Boot 的自动事务配置可能不完整
  • 主应用类缺少 @EnableTransactionManagement 注解
  • 事务可能在某些情况下回滚

验证方法:

# 查看日志中的事务相关信息
grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log

修复方案:

@SpringBootApplication
@EnableTransactionManagement
public class SpcCloudApplication {
    // ...
}

假设 2: 数据库连接或权限问题

可能性: 高 原因:

  • 数据库用户权限不足
  • 连接池配置问题
  • 数据库触发器干扰

验证方法:

-- 直接查询数据库验证
SELECT id, order_no, status, approve_admin_id, approve_time, update_time
FROM order_fund
WHERE order_no = 'F20260324001343000000';

假设 3: MyBatis Plus 更新策略问题

可能性: 中等 原因:

  • update-strategy: not_null 可能导致某些字段不更新
  • 字段值为 null 时被跳过

已修复: 已使用 LambdaUpdateWrapper.set() 显式设置所有字段

假设 4: 前端调用参数错误

可能性: 低 原因:

  • 前端传递的 status 值不正确
  • 参数格式问题

验证方法: 使用 vconsole 查看前端发送的请求


🛠️ 推荐的修复步骤

步骤 1: 添加显式事务管理

修改文件: src/main/java/com/it/rattan/SpcCloudApplication.java

package com.it.rattan;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement; // 新增

@SpringBootApplication
@ServletComponentScan(basePackages ={"com.it.rattan"})
@ComponentScan(basePackages ={"com.it.rattan"})
@EnableTransactionManagement // 新增
public class SpcCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpcCloudApplication.class, args);
    }
}

步骤 2: 本地测试验证

# 编译
cd ~/Desktop/projects/monisuo
mvn clean package -DskipTests

# 停止旧服务
pkill -f "monisuo-1.0.jar"

# 启动新服务(带详细日志)
java -jar target/monisuo-1.0.jar --server.port=5010

# 查看日志
tail -f logs/app.log | grep -A20 "FundService.approve"

步骤 3: 执行测试脚本

# 运行自动化测试
./test_approval.sh

步骤 4: 检查日志输出

关键日志标识:

[FundService.approve] 步骤1: 查询订单...
[FundService.approve] 步骤2: 查询资金账户...
[FundService.approve] 步骤3: 确定最终状态...
[FundService.approve] 步骤4: 处理审批通过逻辑...
[FundService.approve] 步骤5: 更新订单状态...
  - 订单更新结果: 1 (1=成功, 0=失败)
[FundService.approve] 步骤6: 验证更新结果...
  - 验证查询结果: ID=xxx, 状态=3
  - 状态验证通过 ✓

异常日志标识:

❌ 订单更新失败! updateById返回: 0
❌ 状态验证失败! 期望状态: 3, 实际状态: 2
❌ Transaction rolled back

📊 测试验证清单

本地测试

  • 编译成功 (mvn clean package -DskipTests)
  • 服务启动成功
  • 管理员登录成功
  • 获取待审批订单成功
  • 执行审批操作成功
  • 日志显示"状态验证通过 ✓"
  • 数据库中订单状态已更新
  • 用户余额/冻结已更新

生产测试

  • 部署到生产环境
  • 执行真实审批操作
  • 验证订单状态变化
  • 验证资金账户变化
  • 检查日志无异常

🚀 部署指令

本地环境

# 编译
cd ~/Desktop/projects/monisuo
mvn clean package -DskipTests

# 停止旧服务
pkill -f "monisuo-1.0.jar"

# 启动新服务
nohup java -jar target/monisuo-1.0.jar > logs/app.log 2>&1 &

# 查看日志
tail -f logs/app.log

生产环境

# 1. 上传 jar 包
scp target/monisuo-1.0.jar root@8.155.172.147:/path/to/monisuo/

# 2. SSH 登录
ssh root@8.155.172.147

# 3. 备份旧版本
cp /path/to/monisuo/monisuo-1.0.jar /path/to/monisuo/monisuo-1.0.jar.backup

# 4. 替换新版本
mv /path/to/monisuo/monisuo-1.0.jar.new /path/to/monisuo/monisuo-1.0.jar

# 5. 重启服务
systemctl restart monisuo
# 或
pkill -f "monisuo-1.0.jar"
nohup java -jar /path/to/monisuo/monisuo-1.0.jar > /var/log/monisuo/app.log 2>&1 &

# 6. 查看日志
tail -f /var/log/monisuo/app.log

🔧 前端 vconsole 使用说明

如何启用

文件: monisuo-admin/src/main.ts 状态: 已配置,开发环境自动启用

使用方法

  1. 启动前端开发服务器: cd monisuo-admin && pnpm dev
  2. 打开浏览器访问: http://localhost:5173
  3. 点击右下角的绿色 "+" 按钮
  4. 查看 Console 标签页中的日志

可以查看的内容

  • 所有 API 请求和响应
  • Console 日志输出
  • Network 请求详情
  • Element 元素信息
  • Storage 存储数据

📝 修改文件清单

后端修改

  1. 新增: MyBatisPlusMetaObjectHandler.java - 自动填充处理器
  2. 修改: application-dev.yml - MyBatis Plus 配置
  3. 修改: application-dev.yml - 日志配置
  4. 待修改: SpcCloudApplication.java - 添加 @EnableTransactionManagement
  5. 新增: test_approval.sh - 自动化测试脚本

前端修改

  1. 新增依赖: vconsole - 移动端调试工具
  2. 修改: main.ts - 集成 vconsole

⚠️ 重要提示

如果问题依然存在

请提供以下信息:

  1. 完整的审批日志
grep -A30 "FundService.approve" /var/log/monisuo/app.log
  1. 数据库查询结果
SELECT * FROM order_fund WHERE order_no='订单号' ORDER BY update_time DESC LIMIT 1;
  1. 事务日志
grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log | tail -20
  1. SQL 执行日志
grep "UPDATE order_fund" /var/log/monisuo/app.log | tail -5

临时解决方案

如果事务问题无法立即解决,可以尝试:

  1. 在 approve 方法上添加 @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
  2. 使用编程式事务管理
  3. 在 Controller 层添加 @Transactional 注解

最后更新: 2026-03-24 09:30 状态: 诊断完成,待添加 @EnableTransactionManagement 下一步: 修改主应用类并测试