ETest-Vue-FastAPI/工单生成订单功能实现进度.md

7.8 KiB
Raw Permalink Blame History

工单生成订单功能实现进度

最新状态 (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_daoexclude_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 避免因用户信息缺失导致订单不显示

业务逻辑说明

  • 一个订单包含多个产品(样品)
  • 每个产品生成一个工单
  • 订单详情查看产品列表即可了解所有工单情况