# 工单生成订单功能实现进度 ## 最新状态 (2026-01-08) ### 🔥 重大架构调整:样品生成工单不再创建订单 **问题**: 样品生成工单时自动创建订单,导致订单列表混乱 **解决**: 破坏原有数据关系,工单独立存在,只通过"生成订单"功能关联订单 **影响**: - ✅ 订单列表更清晰,只显示手动创建的订单 - ✅ 工单可以灵活组合成订单 - ⚠️ `test_work_order.test_order_id` 改为可空 - ⚠️ 新建工单的 `test_order_id = NULL` **详细说明**: 见 `样品生成工单不创建订单修复说明.md` --- ## 历史状态 ### ✅ 已完成 1. **数据库迁移** - 添加 `test_work_order.order_id` 字段(INTEGER) - 添加 `test_order.work_order_ids` 字段(TEXT) - 迁移脚本已在数据库服务器上成功执行 2. **订单页面改造(只读模式)** - 隐藏新增/修改/删除/生成工单按钮 - 保留查看和导出按钮 - 添加"关联工单"列显示工单数量 3. **工单页面功能** - 添加多选复选框 - 添加"生成订单"按钮 - 实现订单生成对话框 - 验证工单属于同一订单 - 检查工单是否已关联订单 4. **后端API实现** - Controller: `generate_order_from_work_orders` - Service: `generate_order_from_work_orders_services` - DAO: `get_work_orders_by_ids`, `update_work_orders_order_id` - 完整的错误处理和日志记录 5. **前端API集成** - `generateOrderFromWorkOrders` API调用 - 成功提示消息 - 保持在当前页面(不跳转) 6. **关键Bug修复** - ✅ 修复重复的 `@classmethod` 装饰器 - ✅ 修复字段命名(snake_case) - ✅ 修复 `add_test_order_dao` 的 `exclude_unset=True` - ✅ 修复订单列表排序(最新在前) - ✅ **修复订单查询问题:将 INNER JOIN 改为 LEFT JOIN** - 问题:使用 INNER JOIN 连接 Creator 和 Updater 用户表 - 如果用户ID不存在,查询会过滤掉订单 - 解决:改用 LEFT JOIN (outerjoin) 允许用户信息为空 - ✅ **修复订单详情样品查询问题** - 问题:从工单生成的订单,样品的 test_order_id 指向原始订单 - 解决:通过工单的 order_id 查询样品 - 修改了 DAO、Service、Controller 和前端查询逻辑 - ✅ **修复工单列表显示已汇总工单的问题** - 问题:已汇总到新订单的工单仍在工单列表中显示 - 解决:添加过滤条件,只显示 `order_id` 为 NULL 的工单 - 已汇总的工单在新订单详情页查看 ### 🔧 最新修复 (工单列表过滤) **问题**: 从工单生成订单后,这些工单仍然在工单列表中显示,造成混乱 **解决方案**: - 在工单列表查询中添加过滤条件:`TestWorkOrder.order_id.is_(None)` - 只显示还没有汇总到新订单的工单(`order_id` 为 NULL) - 已汇总的工单可以在新订单的详情页中查看 **修改文件**: - `test_work_order_dao.py`: 添加过滤条件 **问题**: 从工单生成的订单,点击查看详情时看不到对应的样品列表 **根本原因**: - 样品的 `test_order_id` 仍然指向原始订单 - 需要通过工单的 `order_id` 来查询样品 **解决方案**: 1. **后端修改**: - `test_eut_dao.py`: 添加 `order_id_from_work_order` 参数 - 当指定该参数时,通过 `test_work_order.order_id` 查询样品 - `test_eut_service.py`: 传递新参数 - `test_eut_controller.py`: 接收新参数 2. **前端修改**: - `test_order/index.vue`: 修改 `eut_getList` 方法 - 检查订单是否有关联工单(`workOrderCount > 0`) - 如果有,传递 `orderIdFromWorkOrder` 参数 - 如果没有,使用原有的 `testOrderId` 参数 ### 📋 验证步骤 1. 重启后端服务 2. 查看工单列表 3. **已汇总的工单(order_id 不为空)不应该显示** 4. 在订单列表中点击从工单生成的订单(ID 36-39) 5. 查看订单详情 6. **应该能看到对应的样品列表** ### 📁 相关文件 - `ruoyi-fastapi-backend/module_admin/system/dao/test_order_dao.py` ✅ 已修复 - `ruoyi-fastapi-backend/module_admin/system/dao/test_eut_dao.py` ✅ 已修复 - `ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py` ✅ 已修复 - `ruoyi-fastapi-backend/module_admin/system/service/test_eut_service.py` ✅ 已修复 - `ruoyi-fastapi-backend/module_admin/system/controller/test_eut_controller.py` ✅ 已修复 - `ruoyi-fastapi-frontend/src/views/system/test_order/index.vue` ✅ 已修复 - `订单详情样品查询修复说明.md` - 详细说明文档 - `工单列表过滤已汇总工单修复说明.md` - 详细说明文档 ## 业务流程 **新流程**: 样品 → 工单(独立) → 订单(手动生成) - 样品生成工单时**不再创建订单** - 工单独立存在,`test_order_id = NULL` - 工单页面选择多个工单生成订单 - 订单页面只能查看和导出,不能编辑 - 订单详情显示关联工单对应的样品列表 - 订单列表显示关联的工单数量 **数据关系**: - 新建工单: `test_order_id = NULL`, `order_id = NULL` - 已汇总工单: `test_order_id = NULL`, `order_id = 订单ID` --- ## 已完成任务详细记录 (Tasks 1-9) ### Task 1: 数据库迁移 ✅ - 创建了 `add_order_workorder_relation.sql` 迁移脚本 - 添加 `test_order.work_order_ids` 字段(TEXT类型,JSON数组) - 添加 `test_work_order.order_id` 字段(INTEGER类型) - 添加索引 `idx_test_work_order_order_id` - **修正**:表名从 `work_order` 改为 `test_work_order` ### Task 2: 订单页面改为只读模式 ✅ - 隐藏了"新增"、"修改"、"删除"、"生成工单"按钮 - 保留了"查看"、"导出"功能 - 添加了 `handleView()` 方法用于查看订单详情 ### Task 3: 订单页面添加关联工单显示 ✅ - 在订单列表添加了"关联工单"列,显示工单数量 - 订单详情页显示产品列表(原有功能,一个产品对应一个工单) - 订单列表查询自动统计工单数量(使用子查询) ### Task 4: 后端添加订单查询关联工单接口 ⚠️ - 创建了 `GET /system/test_order/{order_id}/work_orders` 接口 - 实现了 Service 层和 DAO 层方法 - **注意**:此接口暂时不需要在前端使用,因为订单详情显示的是产品列表 ### Task 5-7: 工单页面添加生成订单功能 ✅ - 添加了"生成订单"按钮(未选中工单时禁用) - 实现了多选功能,记录选中的工单列表 - 创建了订单生成对话框 - 显示选中的工单列表 - 验证工单是否属于同一订单 - 检查工单是否已关联订单并给出警告 ### Task 8: 后端实现从工单生成订单接口 ✅ - 创建了 `POST /system/test_work_order/generate_order` 接口 - Controller层:接收请求并调用Service - Service层:`generate_order_from_work_orders_services` 方法 - 验证工单有效性 - 验证工单属于同一订单 - 创建新订单记录 - 更新工单的order_id字段 - DAO层: - `get_work_orders_by_ids`:根据ID列表获取工单 - `update_work_orders_order_id`:更新工单的order_id - 数据模型:在 `TestWorkOrder` 添加 `order_id` 字段 ### Task 9: 前端处理订单生成响应 ✅ - 接收后端返回的订单ID - 显示成功提示 - 保持在当前页面(不跳转) - 刷新工单列表 - 处理错误情况并显示错误信息 ## 注意事项 - 数据库迁移脚本已在服务器上执行 - 订单详情页显示的是产品列表,不是工单列表(一个产品对应一个工单) - 订单列表的"关联工单"列显示工单数量,用于快速了解订单规模 - 工单状态:0=未开始, 1=进行中, 2=已完成 - **重要**:订单查询使用 LEFT JOIN 避免因用户信息缺失导致订单不显示 ## 业务逻辑说明 - 一个订单包含多个产品(样品) - 每个产品生成一个工单 - 订单详情查看产品列表即可了解所有工单情况