主要修复: 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 调试工具
331 lines
8.1 KiB
Markdown
331 lines
8.1 KiB
Markdown
# 订单审批状态不更新 - 完整诊断和修复报告
|
|
|
|
**诊断时间**: 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`
|
|
**新增配置**:
|
|
```yaml
|
|
mybatis-plus:
|
|
global-config:
|
|
db-config:
|
|
id-type: auto
|
|
update-strategy: not_null
|
|
insert-strategy: not_null
|
|
```
|
|
|
|
### 3. ✅ 详细日志配置已添加
|
|
**文件**: `src/main/resources/application-dev.yml`
|
|
**新增配置**:
|
|
```yaml
|
|
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` 注解
|
|
- 事务可能在某些情况下回滚
|
|
|
|
**验证方法**:
|
|
```bash
|
|
# 查看日志中的事务相关信息
|
|
grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log
|
|
```
|
|
|
|
**修复方案**:
|
|
```java
|
|
@SpringBootApplication
|
|
@EnableTransactionManagement
|
|
public class SpcCloudApplication {
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### 假设 2: 数据库连接或权限问题 ⭐⭐⭐⭐
|
|
**可能性**: 高
|
|
**原因**:
|
|
- 数据库用户权限不足
|
|
- 连接池配置问题
|
|
- 数据库触发器干扰
|
|
|
|
**验证方法**:
|
|
```sql
|
|
-- 直接查询数据库验证
|
|
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`
|
|
|
|
```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: 本地测试验证
|
|
```bash
|
|
# 编译
|
|
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: 执行测试脚本
|
|
```bash
|
|
# 运行自动化测试
|
|
./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`)
|
|
- [ ] 服务启动成功
|
|
- [ ] 管理员登录成功
|
|
- [ ] 获取待审批订单成功
|
|
- [ ] 执行审批操作成功
|
|
- [ ] 日志显示"状态验证通过 ✓"
|
|
- [ ] 数据库中订单状态已更新
|
|
- [ ] 用户余额/冻结已更新
|
|
|
|
### 生产测试
|
|
- [ ] 部署到生产环境
|
|
- [ ] 执行真实审批操作
|
|
- [ ] 验证订单状态变化
|
|
- [ ] 验证资金账户变化
|
|
- [ ] 检查日志无异常
|
|
|
|
---
|
|
|
|
## 🚀 部署指令
|
|
|
|
### 本地环境
|
|
```bash
|
|
# 编译
|
|
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
|
|
```
|
|
|
|
### 生产环境
|
|
```bash
|
|
# 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. **完整的审批日志**
|
|
```bash
|
|
grep -A30 "FundService.approve" /var/log/monisuo/app.log
|
|
```
|
|
|
|
2. **数据库查询结果**
|
|
```sql
|
|
SELECT * FROM order_fund WHERE order_no='订单号' ORDER BY update_time DESC LIMIT 1;
|
|
```
|
|
|
|
3. **事务日志**
|
|
```bash
|
|
grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log | tail -20
|
|
```
|
|
|
|
4. **SQL 执行日志**
|
|
```bash
|
|
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
|
|
**下一步**: 修改主应用类并测试
|