260 lines
7.4 KiB
Markdown
260 lines
7.4 KiB
Markdown
# 工单批次列表功能实现说明
|
||
|
||
## 问题描述
|
||
- 工单管理页面应该显示**批次列表**,而不是工单列表
|
||
- 点击某个批次,才进入该批次的工单详情列表
|
||
- "进行中"是指该批次中有工单在进行中
|
||
- "已完成"是指该批次中所有工单都已完成
|
||
|
||
## 解决方案
|
||
|
||
### 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
|
||
<el-table-column label="批次名称" align="center" prop="batchName" />
|
||
<el-table-column label="工单数量" align="center" prop="workOrderCount" />
|
||
<el-table-column label="创建人" align="center" prop="creatorName" />
|
||
<el-table-column label="创建时间" align="center" prop="createTime" />
|
||
<el-table-column label="待领取" align="center" prop="pendingCount" />
|
||
<el-table-column label="测试中" align="center" prop="testingCount" />
|
||
<el-table-column label="一审中" align="center" prop="review1Count" />
|
||
<el-table-column label="二审中" align="center" prop="review2Count" />
|
||
<el-table-column label="三审中" align="center" prop="review3Count" />
|
||
<el-table-column label="已完成" align="center" prop="completedCount" />
|
||
<el-table-column label="批次状态" align="center" prop="batchStatus">
|
||
<template slot-scope="scope">
|
||
<dict-tag :options="dict.type.sys_test_step" :value="scope.row.batchStatus"/>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="操作" align="center">
|
||
<template slot-scope="scope">
|
||
<el-button
|
||
type="text"
|
||
@click="viewBatchDetail(scope.row)"
|
||
>查看工单</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
```
|
||
|
||
**点击查看工单**:
|
||
```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
|