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

4.2 KiB

订单审批状态不更新 - 系统性诊断计划

诊断时间: 2026-03-24 09:20 问题状态: 🔍 深度诊断中


🎯 问题描述

现象: 管理员审批通过后,订单状态仍然没有变化 已修复: MetaObjectHandler 已添加,但问题依然存在 需要: 系统性检查整个审批流程的每个环节


🔍 诊断清单

1. Controller 层检查

  • AdminController.approveOrder() 参数接收是否正确
  • 返回值是否正确
  • 是否有异常被捕获但未正确处理

2. Service 层检查

  • FundService.approve() 方法事务是否正常
  • updateById() 是否真的执行成功
  • 是否有多个数据源或事务冲突
  • 异常处理是否正确

3. Mapper 层检查

  • OrderFundMapper 的 SQL 是否正确生成
  • 是否有自定义的 XML 映射覆盖默认行为
  • 字段映射是否正确

4. 实体类检查

  • OrderFund 的字段映射是否正确
  • 是否有字段被 @TableField(select=false) 忽略
  • status 字段是否在更新策略中

5. 数据库检查

  • update_time 字段是否存在
  • 字段类型是否匹配
  • 是否有触发器或存储过程干扰

6. 事务配置检查

  • 主应用类是否需要 @EnableTransactionManagement
  • 事务传播行为是否正确
  • 是否有嵌套事务问题

🛠️ 修复策略

策略 A: 添加事务显式配置

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

策略 B: 修改 approve 方法,使用显式更新

@Transactional(rollbackFor = Exception.class)
public void approve(...) {
    // 使用 LambdaUpdateWrapper 显式更新
    LambdaUpdateWrapper<OrderFund> wrapper = new LambdaUpdateWrapper<>();
    wrapper.eq(OrderFund::getId, order.getId())
           .set(OrderFund::getStatus, finalStatus)
           .set(OrderFund::getApproveAdminId, adminId)
           // ... 其他字段
    orderFundMapper.update(null, wrapper);
}

策略 C: 添加数据库级别的调试日志

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

策略 D: 验证数据库更新

在 approve 方法中添加:

// 更新后立即查询验证
OrderFund updated = orderFundMapper.selectById(order.getId());
System.out.println("更新后状态: " + updated.getStatus());

📝 执行步骤

步骤 1: 添加调试日志配置

文件: 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

步骤 2: 修改 approve 方法

  • 添加更详细的日志
  • 使用 LambdaUpdateWrapper 显式更新
  • 添加更新后验证

步骤 3: 测试验证

  • 本地启动服务
  • 执行审批操作
  • 查看完整日志链路
  • 验证数据库状态

🔬 可能的根本原因

假设 1: 事务未提交

原因: Spring Boot 自动配置的事务管理可能因为某些原因未生效 验证: 查看事务日志,检查是否真的提交 修复: 显式添加 @EnableTransactionManagement

假设 2: updateById() 更新了但条件不匹配

原因: MyBatis Plus 的 updateById 可能因为字段为 null 而跳过更新 验证: 查看 SQL 日志,确认 UPDATE 语句 修复: 使用 LambdaUpdateWrapper 显式设置所有字段

假设 3: 缓存或连接池问题

原因: 数据库连接池或 MyBatis 缓存导致读取到旧数据 验证: 直接查询数据库验证 修复: 清除缓存或禁用缓存

假设 4: 字段类型不匹配

原因: Java 的 Integer 和数据库的 tinyint 类型转换问题 验证: 查看实体类字段类型和数据库字段类型 修复: 确保类型一致


下一步行动

  1. 立即执行: 添加完整的调试日志配置
  2. 修改代码: 使用 LambdaUpdateWrapper 显式更新
  3. 本地测试: 启动服务并执行完整测试
  4. 分析日志: 查看完整的 SQL 执行链路
  5. 修复问题: 根据日志分析结果修复根本原因

预计完成时间: 30 分钟 风险评估: 中等(可能涉及事务配置)