7.8 KiB
7.8 KiB
工单生成订单功能实现进度
最新状态 (2026-01-08)
🔥 重大架构调整:样品生成工单不再创建订单
问题: 样品生成工单时自动创建订单,导致订单列表混乱 解决: 破坏原有数据关系,工单独立存在,只通过"生成订单"功能关联订单 影响:
- ✅ 订单列表更清晰,只显示手动创建的订单
- ✅ 工单可以灵活组合成订单
- ⚠️
test_work_order.test_order_id改为可空 - ⚠️ 新建工单的
test_order_id = NULL
详细说明: 见 样品生成工单不创建订单修复说明.md
历史状态
✅ 已完成
-
数据库迁移
- 添加
test_work_order.order_id字段(INTEGER) - 添加
test_order.work_order_ids字段(TEXT) - 迁移脚本已在数据库服务器上成功执行
- 添加
-
订单页面改造(只读模式)
- 隐藏新增/修改/删除/生成工单按钮
- 保留查看和导出按钮
- 添加"关联工单"列显示工单数量
-
工单页面功能
- 添加多选复选框
- 添加"生成订单"按钮
- 实现订单生成对话框
- 验证工单属于同一订单
- 检查工单是否已关联订单
-
后端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 - 完整的错误处理和日志记录
- Controller:
-
前端API集成
generateOrderFromWorkOrdersAPI调用- 成功提示消息
- 保持在当前页面(不跳转)
-
关键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来查询样品
解决方案:
-
后端修改:
test_eut_dao.py: 添加order_id_from_work_order参数- 当指定该参数时,通过
test_work_order.order_id查询样品 test_eut_service.py: 传递新参数test_eut_controller.py: 接收新参数
-
前端修改:
test_order/index.vue: 修改eut_getList方法- 检查订单是否有关联工单(
workOrderCount > 0) - 如果有,传递
orderIdFromWorkOrder参数 - 如果没有,使用原有的
testOrderId参数
📋 验证步骤
- 重启后端服务
- 查看工单列表
- 已汇总的工单(order_id 不为空)不应该显示
- 在订单列表中点击从工单生成的订单(ID 36-39)
- 查看订单详情
- 应该能看到对应的样品列表
📁 相关文件
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 避免因用户信息缺失导致订单不显示
业务逻辑说明
- 一个订单包含多个产品(样品)
- 每个产品生成一个工单
- 订单详情查看产品列表即可了解所有工单情况