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

192 lines
7.8 KiB
Markdown
Raw Normal View 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_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 避免因用户信息缺失导致订单不显示
## 业务逻辑说明
- 一个订单包含多个产品(样品)
- 每个产品生成一个工单
- 订单详情查看产品列表即可了解所有工单情况