ETest-Vue-FastAPI/工单批次列表功能实现说明.md

260 lines
7.4 KiB
Markdown
Raw Normal View History

# 工单批次列表功能实现说明
## 问题描述
- 工单管理页面应该显示**批次列表**,而不是工单列表
- 点击某个批次,才进入该批次的工单详情列表
- "进行中"是指该批次中有工单在进行中
- "已完成"是指该批次中所有工单都已完成
## 解决方案
### 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