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

7.4 KiB
Raw Permalink Blame History

工单批次列表功能实现说明

问题描述

  • 工单管理页面应该显示批次列表,而不是工单列表
  • 点击某个批次,才进入该批次的工单详情列表
  • "进行中"是指该批次中有工单在进行中
  • "已完成"是指该批次中所有工单都已完成

解决方案

1. 数据库层DAO

文件: ruoyi-fastapi-backend/module_admin/system/dao/test_work_order_dao.py

新增方法: get_batch_list

功能: 按 batch_id 分组聚合工单数据,返回批次列表

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

功能: 返回批次列表数据

响应格式:

{
  "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

需要添加:

// 查询工单批次列表
export function listTest_work_order_batch(query) {
  return request({
    url: '/system/test_work_order/batch/list',
    method: 'get',
    params: query
  })
}

前端表格列:

<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>

点击查看工单:

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. 重启后端服务

cd ruoyi-fastapi-backend
python main.py

2. 测试批次列表 API

# 获取所有批次
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