# 工单批次列表功能实现说明 ## 问题描述 - 工单管理页面应该显示**批次列表**,而不是工单列表 - 点击某个批次,才进入该批次的工单详情列表 - "进行中"是指该批次中有工单在进行中 - "已完成"是指该批次中所有工单都已完成 ## 解决方案 ### 1. 数据库层(DAO) **文件**: `ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py` **新增方法**: `get_batch_list` **功能**: 按 `batch_id` 分组聚合工单数据,返回批次列表 **SQL 逻辑**: ```sql SELECT batch_id, batch_name, MIN(create_time) AS create_time, COUNT(id) AS work_order_count, MIN(creator) AS creator, creator_name, -- 统计各状态工单数量 SUM(CASE WHEN test_step = 0 THEN 1 ELSE 0 END) AS pending_count, SUM(CASE WHEN test_step = 1 THEN 1 ELSE 0 END) AS testing_count, SUM(CASE WHEN test_step = 2 THEN 1 ELSE 0 END) AS review1_count, SUM(CASE WHEN test_step = 3 THEN 1 ELSE 0 END) AS review2_count, SUM(CASE WHEN test_step = 4 THEN 1 ELSE 0 END) AS review3_count, SUM(CASE WHEN test_step = 5 THEN 1 ELSE 0 END) AS completed_count, -- 批次状态 CASE WHEN SUM(CASE WHEN test_step = 5 THEN 1 ELSE 0 END) = COUNT(id) THEN 5 -- 全部完成 WHEN SUM(CASE WHEN test_step > 0 THEN 1 ELSE 0 END) > 0 THEN 1 -- 有工单在进行中 ELSE 0 -- 全部待领取 END AS batch_status FROM test_work_order LEFT JOIN sys_user ON test_work_order.creator = sys_user.user_id WHERE order_id IS NULL AND batch_id IS NOT NULL GROUP BY batch_id, batch_name, sys_user.nick_name ORDER BY batch_id DESC ``` **过滤逻辑**: - `test_step = 0` (待领取): 批次中所有工单都是待领取状态 - `test_step = 1-4` (进行中): 批次中至少有一个工单在该步骤 - `test_step = 5` (已完成): 批次中所有工单都已完成 ### 2. 服务层(Service) **文件**: `ruoyi-fastapi-backend/module_admin/system/service/test_work_order_service.py` **新增方法**: `get_batch_list_services` **功能**: 调用 DAO 层的 `get_batch_list` 方法 ### 3. 控制器层(Controller) **文件**: `ruoyi-fastapi-backend/module_admin/system/controller/test_work_order_controller.py` **新增 API 端点**: `GET /system/test_work_order/batch/list` **功能**: 返回批次列表数据 **响应格式**: ```json { "code": 200, "data": { "rows": [ { "batchId": 1767886248798, "batchName": "批次-20260108233048", "createTime": "2026-01-08 23:30:48", "workOrderCount": 10, "creator": 1, "creatorName": "管理员", "pendingCount": 0, "testingCount": 5, "review1Count": 3, "review2Count": 2, "review3Count": 0, "completedCount": 0, "batchStatus": 1 } ], "total": 5, "pageNum": 1, "pageSize": 10 } } ``` **字段说明**: - `batchId`: 批次ID(时间戳) - `batchName`: 批次名称 - `createTime`: 批次创建时间(最早的工单创建时间) - `workOrderCount`: 该批次的工单总数 - `creator`: 创建人ID - `creatorName`: 创建人姓名 - `pendingCount`: 待领取工单数量 - `testingCount`: 测试中工单数量 - `review1Count`: 一审中工单数量 - `review2Count`: 二审中工单数量 - `review3Count`: 三审中工单数量 - `completedCount`: 已完成工单数量 - `batchStatus`: 批次状态(0=待领取, 1=进行中, 5=已完成) ### 4. 前端修改(需要) **文件**: `ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue` **需要修改**: 1. API 调用改为 `/system/test_work_order/batch/list` 2. 表格列改为显示批次信息 3. 点击批次行时,跳转到工单详情页面(传递 `batchId` 参数) **前端 API 文件**: `ruoyi-fastapi-frontend/src/api/system/test_work_order.js` **需要添加**: ```javascript // 查询工单批次列表 export function listTest_work_order_batch(query) { return request({ url: '/system/test_work_order/batch/list', method: 'get', params: query }) } ``` **前端表格列**: ```vue ``` **点击查看工单**: ```javascript viewBatchDetail(row) { // 跳转到工单详情页面,传递 batchId this.$router.push({ path: '/system/test_work_order/detail', query: { batchId: row.batchId } }) } ``` ## 数据流程 ### 1. 样品生成工单 ``` 样品 → 生成工单 → 设置 batch_id(时间戳)和 batch_name ``` ### 2. 批次列表查询 ``` 前端点击"进行中" → API: /system/test_work_order/batch/list?testStep=1 → 后端按 batch_id 分组聚合 → 返回批次列表(包含统计信息) ``` ### 3. 查看批次详情 ``` 前端点击"查看工单" → API: /system/test_work_order/list?batchId=1767886248798 → 后端查询该批次的所有工单 → 返回工单列表 ``` ## 批次状态判断逻辑 ### 待领取(test_step = 0) - 批次中**所有工单**都是 `test_step = 0` - SQL: `SUM(CASE WHEN test_step = 0 THEN 1 ELSE 0 END) = COUNT(id)` ### 进行中(test_step = 1-4) - 批次中**至少有一个工单**在该步骤 - SQL: `SUM(CASE WHEN test_step = 1 THEN 1 ELSE 0 END) > 0` ### 已完成(test_step = 5) - 批次中**所有工单**都是 `test_step = 5` - SQL: `SUM(CASE WHEN test_step = 5 THEN 1 ELSE 0 END) = COUNT(id)` ## 验证步骤 ### 1. 重启后端服务 ```bash cd ruoyi-fastapi-backend python main.py ``` ### 2. 测试批次列表 API ```bash # 获取所有批次 curl http://localhost:9099/system/test_work_order/batch/list # 获取进行中的批次 curl http://localhost:9099/system/test_work_order/batch/list?testStep=1 # 获取已完成的批次 curl http://localhost:9099/system/test_work_order/batch/list?testStep=5 ``` ### 3. 检查响应数据 确认返回的数据包含: - `batchId`: 批次ID - `batchName`: 批次名称 - `workOrderCount`: 工单数量 - `testingCount`, `completedCount` 等统计信息 ### 4. 前端修改 修改前端代码,调用新的批次列表 API ## 优势 ### 1. 不需要批次表 - 批次信息直接从 `test_work_order` 表聚合 - 减少数据冗余 - 简化数据维护 ### 2. 实时统计 - 批次状态实时计算 - 工单数量实时统计 - 无需额外更新批次表 ### 3. 灵活过滤 - 可以按测试步骤过滤批次 - 可以按创建人过滤批次 - 可以按时间范围过滤批次 ## 完成时间 2026-01-09 01:00