主要修复: 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 调试工具
8.1 KiB
订单审批状态不更新 - 完整诊断和修复报告
诊断时间: 2026-03-24 09:30 问题状态: 🔍 完整诊断完成 修复状态: ✅ 已应用多项修复
🎯 问题描述
用户反馈: 管理员审批通过后,订单状态仍然没有变化 已修复: MetaObjectHandler 已添加,但问题依然存在 当前状态: 需要系统性诊断和修复
🔍 已完成的诊断和修复
1. ✅ MetaObjectHandler 已添加
文件: src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java
状态: 已创建并配置
作用: 自动填充 createTime 和 updateTime 字段
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
状态: 已配置,开发环境自动启用
使用方法
- 启动前端开发服务器:
cd monisuo-admin && pnpm dev - 打开浏览器访问:
http://localhost:5173 - 点击右下角的绿色 "+" 按钮
- 查看 Console 标签页中的日志
可以查看的内容
- 所有 API 请求和响应
- Console 日志输出
- Network 请求详情
- Element 元素信息
- Storage 存储数据
📝 修改文件清单
后端修改
- ✅ 新增:
MyBatisPlusMetaObjectHandler.java- 自动填充处理器 - ✅ 修改:
application-dev.yml- MyBatis Plus 配置 - ✅ 修改:
application-dev.yml- 日志配置 - ⏳ 待修改:
SpcCloudApplication.java- 添加 @EnableTransactionManagement - ✅ 新增:
test_approval.sh- 自动化测试脚本
前端修改
- ✅ 新增依赖:
vconsole- 移动端调试工具 - ✅ 修改:
main.ts- 集成 vconsole
⚠️ 重要提示
如果问题依然存在
请提供以下信息:
- 完整的审批日志
grep -A30 "FundService.approve" /var/log/monisuo/app.log
- 数据库查询结果
SELECT * FROM order_fund WHERE order_no='订单号' ORDER BY update_time DESC LIMIT 1;
- 事务日志
grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log | tail -20
- SQL 执行日志
grep "UPDATE order_fund" /var/log/monisuo/app.log | tail -5
临时解决方案
如果事务问题无法立即解决,可以尝试:
- 在 approve 方法上添加
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) - 使用编程式事务管理
- 在 Controller 层添加
@Transactional注解
最后更新: 2026-03-24 09:30 状态: ✅ 诊断完成,待添加 @EnableTransactionManagement 下一步: 修改主应用类并测试