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