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
|