# 工单循环创建问题分析 ## 问题描述 从工单生成订单时,系统可能会为新订单自动创建新的工单分组,导致混乱的循环关系。 ## 问题场景 ### 正常流程 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. 清理已经产生的重复数据