157 lines
4.2 KiB
Markdown
157 lines
4.2 KiB
Markdown
|
|
# 订单审批状态不更新 - 系统性诊断计划
|
||
|
|
|
||
|
|
**诊断时间**: 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: 添加事务显式配置
|
||
|
|
```java
|
||
|
|
@SpringBootApplication
|
||
|
|
@EnableTransactionManagement
|
||
|
|
public class SpcCloudApplication {
|
||
|
|
// ...
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 策略 B: 修改 approve 方法,使用显式更新
|
||
|
|
```java
|
||
|
|
@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: 添加数据库级别的调试日志
|
||
|
|
```yaml
|
||
|
|
logging:
|
||
|
|
level:
|
||
|
|
com.it.rattan.monisuo.mapper: DEBUG
|
||
|
|
org.springframework.transaction: DEBUG
|
||
|
|
```
|
||
|
|
|
||
|
|
### 策略 D: 验证数据库更新
|
||
|
|
在 approve 方法中添加:
|
||
|
|
```java
|
||
|
|
// 更新后立即查询验证
|
||
|
|
OrderFund updated = orderFundMapper.selectById(order.getId());
|
||
|
|
System.out.println("更新后状态: " + updated.getStatus());
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📝 执行步骤
|
||
|
|
|
||
|
|
### 步骤 1: 添加调试日志配置
|
||
|
|
文件: `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
|
||
|
|
```
|
||
|
|
|
||
|
|
### 步骤 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 分钟
|
||
|
|
**风险评估**: 中等(可能涉及事务配置)
|