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

192 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 工单生成订单功能实现进度
## 最新状态 (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 避免因用户信息缺失导致订单不显示
## 业务逻辑说明
- 一个订单包含多个产品(样品)
- 每个产品生成一个工单
- 订单详情查看产品列表即可了解所有工单情况