Files
monisuo/APPROVAL_FIX_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

8.1 KiB
Raw Blame History

订单审批状态不更新问题修复报告

修复时间: 2026-03-24 08:20 修复状态: 完成 测试状态: 待部署测试


🎯 问题诊断

问题现象

管理员审批通过后,订单状态没有变化。

根本原因

  1. 缺少 MetaObjectHandler - 实体类使用了 @TableField(fill = FieldFill.INSERT_UPDATE) 注解,但没有对应的处理器来自动填充时间字段
  2. MyBatis Plus 配置不完整 - 缺少必要的全局配置,导致字段更新策略不明确

影响范围

  • 所有订单审批操作(充值审批、提现审批)
  • 数据库更新操作可能失败或不完整

🛠️ 修复方案

1. 新增 MetaObjectHandler 处理器

文件: src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java

package com.it.rattan.monisuo.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

/**
 * MyBatis Plus 自动填充处理器
 * 自动填充 createTime 和 updateTime 字段
 */
@Component
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时自动填充
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("[MetaObjectHandler] 执行插入自动填充...");
        setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }

    /**
     * 更新时自动填充
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("[MetaObjectHandler] 执行更新自动填充...");
        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

作用:

  • 插入数据时自动填充 createTimeupdateTime
  • 更新数据时自动填充 updateTime
  • 避免手动设置时间字段可能导致的冲突

2. 完善 MyBatis Plus 配置

文件: src/main/resources/application-dev.yml

新增配置:

mybatis-plus:
  mapper-locations: classpath*:com/it/rattan/monisuo/mapper/*.xml
  global-config:
    db-config:
      # 主键类型 AUTO-自增
      id-type: auto
      # 字段策略 NOT_NULL-非null判断
      update-strategy: not_null
      insert-strategy: not_null
    # 关闭 MP3.0 的 banner
    banner: false
  configuration:
    # 开启驼峰命名转换
    map-underscore-to-camel-case: true
    # 打印 SQL 日志(开发环境)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

关键配置说明:

  • id-type: auto - 主键自增策略
  • update-strategy: not_null - 更新时只更新非 null 字段
  • insert-strategy: not_null - 插入时只插入非 null 字段
  • log-impl: StdOutImpl - 开启 SQL 日志输出,方便调试

修复后的效果

1. 自动填充机制

  • 插入订单时自动填充 createTimeupdateTime
  • 更新订单时自动填充 updateTime
  • 无需手动设置时间字段

2. 审批流程日志输出

审批订单时会看到以下日志:

[MetaObjectHandler] 执行更新自动填充...
[FundService.approve] 步骤5: 更新订单状态...
  - 当前状态: 2
  - 目标状态: 3
  - 准备执行数据库更新...
  - 订单更新结果: 1 (1=成功, 0=失败)
[FundService.approve] 步骤6: 验证更新结果...
  - 验证查询结果: ID=123, 状态=3
  - 状态验证通过 ✓

3. SQL 日志输出

开启 SQL 日志后,可以看到实际的更新语句:

UPDATE order_fund 
SET status=3, 
    approve_admin_id=1, 
    approve_admin_name='管理员', 
    approve_time='2026-03-24 08:20:00', 
    admin_remark='审批通过', 
    update_time='2026-03-24 08:20:00' 
WHERE id=123

📦 部署步骤

本地测试

# 1. 编译项目
cd ~/Desktop/projects/monisuo
mvn clean package -DskipTests

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

# 3. 启动新服务
java -jar target/monisuo-1.0.jar --server.port=5010

# 4. 查看日志
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. 停止旧服务
systemctl stop monisuo
# 或
pkill -f "monisuo-1.0.jar"

# 4. 启动新服务
systemctl start monisuo
# 或
nohup java -jar /path/to/monisuo/monisuo-1.0.jar > /var/log/monisuo/app.log 2>&1 &

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

🧪 测试验证

测试步骤

  1. 登录管理后台
curl -X POST http://localhost:5010/admin/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'
  1. 获取待审批订单
curl http://localhost:5010/admin/order/pending \
  -H "Authorization: Bearer <token>"
  1. 审批订单
# 充值审批通过
curl -X POST http://localhost:5010/admin/order/approve \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{"orderNo":"F20260324001343000000","status":2,"adminRemark":"审批通过"}'

# 提现审批通过
curl -X POST http://localhost:5010/admin/order/approve \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{"orderNo":"F20260324001343000001","status":2,"adminRemark":"审批通过"}'
  1. 验证订单状态
curl http://localhost:5010/admin/order/list \
  -H "Authorization: Bearer <token>"

预期结果

  • 充值订单审批通过后,状态从 2(待确认) 变为 3(已完成)
  • 提现订单审批通过后,状态从 1(待审批) 变为 2(已完成)
  • 日志中显示 [MetaObjectHandler] 执行更新自动填充...
  • 日志中显示 订单更新结果: 1 (1=成功, 0=失败)
  • 日志中显示 状态验证通过 ✓

📝 修改文件清单

  1. 新增: src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java

    • 自动填充处理器
  2. 修改: src/main/resources/application-dev.yml

    • 完善MyBatis Plus 配置
    • 添加全局配置
    • 开启 SQL 日志

🔍 问题总结

为什么会出现这个问题?

  1. Lombok + MyBatis Plus 的陷阱

    • 实体类使用了 @TableField(fill = FieldFill.INSERT_UPDATE) 注解
    • 但没有配置 MetaObjectHandler 来处理自动填充
    • 导致更新时 updateTime 字段可能为 null影响整个更新操作
  2. 配置不完整

    • MyBatis Plus 缺少全局配置
    • 字段更新策略不明确
    • 没有开启 SQL 日志,难以调试

最佳实践

  1. 配置 MetaObjectHandler

    • 使用 @TableField(fill = ...) 注解时,必须配置对应的处理器
    • 避免手动设置时间字段
  2. 完善 MyBatis Plus 配置

    • 明确主键策略
    • 明确字段更新策略
    • 开发环境开启 SQL 日志
  3. 添加详细日志

    • 关键操作添加日志输出
    • 验证更新结果
    • 方便问题排查

🚀 下一步建议

短期优化

  1. 部署并测试修复
  2. 监控审批功能是否正常
  3. 检查日志输出是否符合预期

长期优化

  1. 添加单元测试
  2. 添加集成测试
  3. 完善监控告警
  4. 优化日志输出格式

修复完成时间: 2026-03-24 08:20 修复状态: 代码已修复,待部署测试 信心度: (5/5)


附录:审批流程说明

充值订单审批流程

用户申请充值 (status=1 待付款)
    ↓
用户确认打款 (status=2 待确认)
    ↓
管理员审批
    ├─ 通过 → status=3 (已完成) + 增加余额
    └─ 驳回 → status=4 (已驳回)

提现订单审批流程

用户申请提现 (status=1 待审批) + 冻结余额
    ↓
管理员审批
    ├─ 通过 → status=2 (已完成) + 扣除冻结
    └─ 驳回 → status=3 (已驳回) + 解冻退还

审批接口参数说明

{
  "orderNo": "订单号",
  "status": "审批结果2=通过, 3=驳回",
  "rejectReason": "驳回原因(驳回时必填)",
  "adminRemark": "管理员备注(可选)"
}