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

260 lines
7.4 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.

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