101 lines
3.1 KiB
Markdown
101 lines
3.1 KiB
Markdown
# 工单循环创建问题分析
|
||
|
||
## 问题描述
|
||
从工单生成订单时,系统可能会为新订单自动创建新的工单分组,导致混乱的循环关系。
|
||
|
||
## 问题场景
|
||
|
||
### 正常流程
|
||
1. 原始订单23 → 有样品 → 生成工单661-670
|
||
2. 从工单661-670生成新订单36
|
||
3. 工单661-670的 `order_id` 更新为36
|
||
|
||
### 问题流程(如果存在)
|
||
1. 原始订单23 → 有样品 → 生成工单661-670
|
||
2. 从工单661-670生成新订单36
|
||
3. 工单661-670的 `order_id` 更新为36
|
||
4. **系统自动为订单36创建新的工单分组**(这是问题所在)
|
||
5. 新工单的 `test_order_id` = 36
|
||
6. 造成混乱:订单36既有通过 `order_id` 关联的工单,又有通过 `test_order_id` 关联的工单
|
||
|
||
## 数据关系说明
|
||
|
||
### test_work_order 表的两个订单字段
|
||
- `test_order_id`: 工单所属的**原始订单**(样品所属的订单)
|
||
- `order_id`: 工单关联的**生成订单**(从工单生成的订单)
|
||
|
||
### 正确的数据关系
|
||
对于从工单生成的订单36:
|
||
- 工单661-670:
|
||
- `test_order_id` = 23(原始订单)
|
||
- `order_id` = 36(生成的订单)
|
||
- 订单36不应该有 `test_order_id = 36` 的工单
|
||
|
||
## 排查步骤
|
||
|
||
### 1. 检查数据库
|
||
运行 `check_duplicate_workorders.sql` 脚本,查看:
|
||
- 订单36-39是否有 `test_order_id = 36-39` 的工单
|
||
- 如果有,说明系统自动创建了新工单
|
||
|
||
### 2. 检查代码
|
||
已检查的位置(未发现自动创建逻辑):
|
||
- ✅ `test_order_service.py` 的 `add_test_order_services` - 没有自动创建工单
|
||
- ✅ `test_work_order_service.py` 的 `generate_order_from_work_orders_services` - 没有自动创建工单
|
||
- ✅ 前端 `test_work_order/index.vue` 的 `confirmGenerateOrder` - 没有额外调用
|
||
|
||
### 3. 可能的原因
|
||
- 数据库触发器(Trigger)
|
||
- 应用层的事件监听器
|
||
- 其他后台任务或定时任务
|
||
- 前端的其他页面逻辑
|
||
|
||
## 解决方案
|
||
|
||
### 方案1:清理重复工单(如果已经产生)
|
||
```sql
|
||
-- 删除为订单36-39自动创建的工单(test_order_id = 36-39)
|
||
DELETE FROM test_work_order
|
||
WHERE test_order_id IN (36, 37, 38, 39)
|
||
AND order_id IS NULL;
|
||
```
|
||
|
||
### 方案2:防止自动创建
|
||
如果找到了自动创建的逻辑,需要:
|
||
1. 添加判断:检查订单是否是从工单生成的
|
||
2. 如果是从工单生成的,跳过自动创建工单的逻辑
|
||
|
||
### 方案3:修改业务逻辑
|
||
明确区分两种订单类型:
|
||
- **原始订单**:有样品,需要生成工单
|
||
- **汇总订单**:从工单生成,不需要再生成工单
|
||
|
||
## 验证方法
|
||
|
||
### 1. 查看数据库
|
||
```sql
|
||
-- 查看订单36的所有工单
|
||
SELECT
|
||
id,
|
||
name,
|
||
test_order_id,
|
||
order_id,
|
||
test_eut_id
|
||
FROM test_work_order
|
||
WHERE test_order_id = 36 OR order_id = 36;
|
||
```
|
||
|
||
### 2. 预期结果
|
||
- 应该只有 `order_id = 36` 的工单(661-670)
|
||
- 不应该有 `test_order_id = 36` 的工单
|
||
|
||
### 3. 如果有问题
|
||
- 会看到 `test_order_id = 36` 的新工单
|
||
- 这些工单是自动创建的,需要找到创建的源头
|
||
|
||
## 下一步
|
||
1. 运行 `check_duplicate_workorders.sql` 查看数据
|
||
2. 确认是否存在重复工单
|
||
3. 如果存在,找到创建的源头并修复
|
||
4. 清理已经产生的重复数据
|