基本完成,修复细节

This commit is contained in:
xuqiuyun
2025-10-29 17:33:32 +08:00
parent 6c86963418
commit d1d0b62184
37 changed files with 5133 additions and 236 deletions

View File

@@ -0,0 +1,232 @@
# Delivery 触发器修复指南
## 🎯 问题确认
通过数据库诊断,确认了问题的根源:
### 诊断结果
1.`member_driver` 表中 **car_number 字段不存在**(已被删除)
2.`member_driver`**没有触发器**
3.**delivery 表有 2 个触发器引用了已删除的 car_number 字段**
### 触发器信息
```
触发器名称: trg_delivery_fill_from_driver
关联表: delivery
触发事件: INSERT, UPDATE
创建时间: 2025-10-14 15:36:26 和 15:37:58
```
## 🔍 问题分析
### 为什么会报错?
当执行 `DeliveryMapper.insert` 时:
1. MyBatis 执行 INSERT SQL 插入 delivery 表
2. **数据库触发器自动触发**
3. 触发器尝试查询 `member_driver.car_number` 字段
4. 由于字段已被删除,报错:`Unknown column 'md.car_number' in 'field list'`
### 触发器的原始用途
这些触发器的设计初衷是:
- 当插入或更新 delivery 记录时
- 自动从 member_driver 表获取司机的车辆信息(包括 car_number
- 自动填充到 delivery 表
### 为什么现在不需要触发器?
因为架构已改变:
- **旧架构**: 司机和车辆绑定在 member_driver 表(一对一)
- **新架构**: 司机和车辆分离,车辆由 vehicle 表独立管理(多对多)
- **新实现**: 在 `DeliveryServiceImpl.createDelivery()` 中手动查询 vehicle 表获取车辆信息
## 🔧 解决方案
### 方案 1: 删除触发器(推荐)✅
**优点**:
- 彻底解决问题
- 与新架构一致
- 代码已经实现了相同功能
**缺点**:
- 需要确保业务逻辑在代码层面完整
### 方案 2: 修改触发器(不推荐)
修改触发器以适应新表结构,但这会增加维护复杂度。
## 📋 执行步骤
### 步骤 1: 查看触发器完整定义(可选)
如果你想查看触发器的完整 SQL 定义:
```sql
SHOW CREATE TRIGGER trg_delivery_fill_from_driver;
```
**建议**: 复制输出并保存,以防将来需要参考。
### 步骤 2: 删除触发器
连接到数据库:
```bash
mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade
```
执行删除:
```sql
USE cattletrade;
-- 删除触发器
DROP TRIGGER IF EXISTS trg_delivery_fill_from_driver;
-- 验证删除
SHOW TRIGGERS WHERE `Table` = 'delivery';
```
或者直接执行脚本:
```bash
mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade < C:/cattleTransport/tradeCattle/fix_delivery_triggers.sql
```
### 步骤 3: 验证没有其他触发器引用 car_number
```sql
SELECT
TRIGGER_NAME,
EVENT_MANIPULATION,
EVENT_OBJECT_TABLE
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA = 'cattletrade'
AND ACTION_STATEMENT LIKE '%car_number%';
```
应该返回 **0 行**
### 步骤 4: 重启后端服务
```powershell
# 1. 停止当前服务(在服务运行的终端按 Ctrl+C
# 2. 清理编译缓存
cd C:\cattleTransport\tradeCattle
Remove-Item -Recurse -Force target -ErrorAction SilentlyContinue
# 3. 重新启动服务
cd aiotagro-cattle-trade
mvn spring-boot:run
```
### 步骤 5: 测试功能
1. 打开前端页面
2. 尝试创建新的运送清单
3. 填写表单并提交
4. **预期结果**: 成功创建,不再报 `Unknown column 'md.car_number'` 错误
## ✅ 验证清单
完成后,确认以下几点:
- [ ] 数据库中 `member_driver` 表没有 `car_number` 字段
- [ ] 数据库中 `delivery` 表没有触发器引用 `car_number`
- [ ] 后端服务已重启
- [ ] 创建运送清单功能正常
- [ ] 车辆信息从 `vehicle` 表正确获取
- [ ] 司机信息从 `member_driver` 表正确获取
## 🎯 预期效果
### 修复前
```
错误: Unknown column 'md.car_number' in 'field list'
原因: delivery 表触发器查询已删除的字段
```
### 修复后
```
✅ 运送清单创建成功
✅ 车辆信息从 vehicle 表获取
✅ 司机信息从 member_driver 表获取
✅ 数据正确保存到 delivery 表
```
## 📊 数据流对比
### 旧流程(有触发器)
```
1. 代码: INSERT INTO delivery
2. 触发器: 自动查询 member_driver.car_number
3. 触发器: 自动填充 delivery.license_plate
```
### 新流程(无触发器)
```
1. 代码: 根据 plateNumber 查询 vehicle 表
2. 代码: 根据 driverId 查询 member_driver 表
3. 代码: 手动设置 delivery.license_plate
4. 代码: INSERT INTO delivery
```
## ⚠️ 注意事项
1. **生产环境警告**:
- 这是生产数据库,删除触发器前请确保已备份
- 建议在非高峰时段操作
2. **功能完整性**:
- 代码中已经实现了触发器的功能
- DeliveryServiceImpl.createDelivery() 会手动查询 vehicle 表
3. **回滚方案**:
- 如果删除触发器后发现问题,可以从备份恢复
- 建议先保存 `SHOW CREATE TRIGGER` 的输出
## 🔍 故障排查
### 如果删除触发器后仍然报错
1. **清除所有缓存**
```powershell
Remove-Item -Recurse -Force tradeCattle\target
Remove-Item -Recurse -Force tradeCattle\.idea
```
2. **检查是否有其他引用**
```sql
-- 检查存储过程
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'cattletrade'
AND ROUTINE_DEFINITION LIKE '%car_number%';
-- 检查视图
SELECT TABLE_NAME, VIEW_DEFINITION
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'cattletrade'
AND VIEW_DEFINITION LIKE '%car_number%';
```
3. **重启数据库连接**
- 完全停止后端服务
- 等待 30 秒
- 重新启动
## 📞 支持
如果遇到问题,请提供:
1. `SHOW CREATE TRIGGER` 的完整输出
2. 删除触发器后的验证结果
3. 后端服务重启后的日志
4. 创建运送清单时的错误信息(如果还有)
---
**文档版本**: 1.0
**创建日期**: 2025-10-29
**最后更新**: 2025-10-29
**状态**: ✅ 问题已确认,解决方案已就绪