编辑 | blame | 历史 | 原始文档

工单中心 - 前端联调方案

涉及页面

  • 工单中心(新页面,整合工单列表、排产、报工)
  • 生产任务列表(保留,用于高级管理)
  • 报工列表(保留,用于报工记录查询)

业务流程与数据带入

流程1:工单创建 → 确认 → 排产

1. 创建工单
   - 选择产品 → 自动加载产品默认工艺路线(若有)
   - 填写数量、需求日期
   - 保存后生成工单BOM(从产品BOM自动带入)

2. 确认工单
   - 可选择/修改工艺路线
   - 确认后工单状态变为「已确认」
   - 工单可开始排产

3. 一键排产
   - 点击「一键排产」→ 弹窗选择工艺路线 → 预览任务列表 → 确认生成
   - 自动按工艺路线工序列表生成任务
   - 自动分配工作站(按工艺路线工序配置)
   - 自动创建工单工序记录

流程2:任务报工

1. 从工单中心报工
   - 点击工单 → 展开工序进度 → 选择工序 → 查看任务列表
   - 点击任务行的「报工」按钮 → 弹出报工表单
   - 表单自动带入:任务编码、工作站、计划数量、已报工数量

2. 从任务列表报工
   - 选中任务 → 点击「报工」→ 弹出报工表单
   - 数据同上自动带入

3. 报工提交后
   - 任务状态自动流转(草稿 → 生产中 → 已完成)
   - 工单进度自动更新(关键工序报工累加工单已生产数量)
   - 工单可自动完成(若已生产 >= 计划)

API

工单相关

方法 路径 说明
POST /mes/pro-work-order/create 创建工单
PUT /mes/pro-work-order/update 更新工单
POST /mes/pro-work-order/confirm 确认工单
GET /mes/pro-work-order/get 获取工单详情
GET /mes/pro-work-order/page 分页查询工单
GET /mes/pro-work-order/progress/{id} 新增:获取工单进度详情
POST /mes/pro-work-order/check-auto-finish/{id} 新增:检查并自动完成工单

任务相关

方法 路径 说明
POST /mes/pro-task/create 创建任务
PUT /mes/pro-task/update 更新任务
DELETE /mes/pro-task/delete 删除任务
GET /mes/pro-task/page 分页查询任务
POST /mes/pro-task/auto-generate 新增:一键排产
POST /mes/pro-task/auto-generate/preview 新增:一键排产预览

报工相关

方法 路径 说明
POST /mes/pro-feedback/create 创建报工
PUT /mes/pro-feedback/update 更新报工
POST /mes/pro-feedback/submit 提交报工
POST /mes/pro-feedback/approve 审批报工
POST /mes/pro-feedback/batch-create 新增:批量报工
POST /mes/pro-feedback/quick-create 新增:快速报工(保存并提交)

接口详情

1. 获取工单进度详情

GET /mes/pro-work-order/progress/{id}

响应字段:

字段 类型 说明
workOrderId Long 工单ID
workOrderCode String 工单编码
quantity Decimal 生产数量
quantityScheduled Decimal 已排产数量
quantityProduced Decimal 已生产数量
progressPercent Decimal 总进度百分比
processList Array 工序进度列表
processList[].processId Long 工序ID
processList[].processCode String 工序编码
processList[].processName String 工序名称
processList[].keyFlag Boolean 是否关键工序
processList[].plannedQuantity Decimal 计划数量(关键工序)
processList[].producedQuantity Decimal 已生产数量
processList[].progressPercent Decimal 进度百分比
processList[].status Integer 工序状态(0=未开始, 1=进行中, 2=已完成)
processList[].taskList Array 任务列表
taskList[].taskId Long 任务ID
taskList[].taskCode String 任务编码
taskList[].workstationName String 工作站名称
taskList[].quantity Decimal 排产数量
taskList[].producedQuantity Decimal 已生产数量
taskList[].progressPercent Decimal 进度百分比
taskList[].status Integer 任务状态

响应示例:

{
  "code": 0,
  "data": {
    "workOrderId": 1001,
    "workOrderCode": "WO202401150001",
    "quantity": 100,
    "quantityScheduled": 100,
    "quantityProduced": 80,
    "progressPercent": 80,
    "processList": [
      {
        "processId": 1,
        "processCode": "P001",
        "processName": "下料",
        "keyFlag": false,
        "plannedQuantity": null,
        "producedQuantity": 100,
        "progressPercent": 100,
        "status": 2,
        "taskList": [
          {
            "taskId": 101,
            "taskCode": "T202401150001",
            "workstationName": "下料区-A01",
            "quantity": 100,
            "producedQuantity": 100,
            "progressPercent": 100,
            "status": 3
          }
        ]
      },
      {
        "processId": 2,
        "processCode": "P002",
        "processName": "机加工",
        "keyFlag": true,
        "plannedQuantity": 100,
        "producedQuantity": 80,
        "progressPercent": 80,
        "status": 1,
        "taskList": [
          {
            "taskId": 102,
            "taskCode": "T202401150002",
            "workstationName": "CNC-01",
            "quantity": 60,
            "producedQuantity": 60,
            "progressPercent": 100,
            "status": 3
          },
          {
            "taskId": 103,
            "taskCode": "T202401150003",
            "workstationName": "CNC-02",
            "quantity": 40,
            "producedQuantity": 20,
            "progressPercent": 50,
            "status": 1
          }
        ]
      }
    ]
  }
}

2. 一键排产预览

POST /mes/pro-task/auto-generate/preview

请求参数:

参数 类型 必填 说明
workOrderId Long 工单ID
routeId Long 工艺路线ID(不传则使用工单关联的工艺路线)

响应字段:

字段 类型 说明
workOrderId Long 工单ID
routeId Long 工艺路线ID
routeName String 工艺路线名称
taskList Array 预生成任务列表
taskList[].processId Long 工序ID
taskList[].processName String 工序名称
taskList[].sort Integer 工序顺序
taskList[].suggestWorkstationId Long 建议工作站ID
taskList[].suggestWorkstationName String 建议工作站名称
taskList[].quantity Decimal 排产数量
taskList[].keyFlag Boolean 是否关键工序

响应示例:

{
  "code": 0,
  "data": {
    "workOrderId": 1001,
    "routeId": 101,
    "routeName": "产品A-标准工艺",
    "taskList": [
      {
        "processId": 1,
        "processName": "下料",
        "sort": 1,
        "suggestWorkstationId": 201,
        "suggestWorkstationName": "下料区-A01",
        "quantity": 100,
        "keyFlag": false
      },
      {
        "processId": 2,
        "processName": "机加工",
        "sort": 2,
        "suggestWorkstationId": 202,
        "suggestWorkstationName": "CNC-01",
        "quantity": 100,
        "keyFlag": true
      }
    ]
  }
}

3. 一键排产执行

POST /mes/pro-task/auto-generate

请求参数:

参数 类型 必填 说明
workOrderId Long 工单ID
routeId Long 工艺路线ID
autoAssignWorkstation Boolean 是否自动分配工作站(默认true)
autoCalculateTime Boolean 是否自动计算生产时间(默认true)

响应字段:

字段 类型 说明
taskIds Array<Long> 生成的任务ID列表

响应示例:

{
  "code": 0,
  "data": {
    "taskIds": [101, 102, 103, 104, 105]
  }
}

4. 快速报工

POST /mes/pro-feedback/quick-create

说明:创建报工单并直接提交(跳过草稿状态),适用于快速报工场景

请求参数:

参数 类型 必填 说明
taskId Long 任务ID
feedbackQuantity Decimal 本次报工数量
qualifiedQuantity Decimal 合格品数量(非质检工序必填)
unqualifiedQuantity Decimal 不良品数量
remark String 备注

响应字段:

字段 类型 说明
feedbackId Long 报工单ID
taskStatus Integer 任务状态(报工后可能变化)
workOrderStatus Integer 工单状态(可能自动完成)

响应示例:

{
  "code": 0,
  "data": {
    "feedbackId": 201,
    "taskStatus": 1,
    "workOrderStatus": 1
  }
}

5. 批量报工

POST /mes/pro-feedback/batch-create

请求参数:

参数 类型 必填 说明
taskIds Array<Long> 任务ID列表
feedbackQuantity Decimal 本次报工数量(应用到所有任务)
qualifiedQuantity Decimal 合格品数量(非质检工序必填)
unqualifiedQuantity Decimal 不良品数量
remark String 备注

响应字段:

字段 类型 说明
successCount Integer 成功数量
failCount Integer 失败数量
results Array 详细结果列表
results[].taskId Long 任务ID
results[].success Boolean 是否成功
results[].feedbackId Long 报工单ID(成功时有值)
results[].errorMsg String 错误信息(失败时有值)

响应示例:

{
  "code": 0,
  "data": {
    "successCount": 2,
    "failCount": 1,
    "results": [
      { "taskId": 101, "success": true, "feedbackId": 201 },
      { "taskId": 102, "success": true, "feedbackId": 202 },
      { "taskId": 103, "success": false, "errorMsg": "任务已完成,不能报工" }
    ]
  }
}

字段展示规则

工单列表

字段 展示位置 说明
工单编码 列表、详情 可点击打开详情

| 产品编码/名称 | 列表、详情 | - |
| 生产数量 | 列表、详情 | - |
| 已排产数量 | 列表 | 进度条左侧显示 |
| 已生产数量 | 列表 | 进度条右侧显示 |
| 进度 | 列表 | 进度条展示百分比 |
| 状态 | 列表、详情 | 草稿/已确认/生产中/已完成/已取消 |
| 需求日期 | 列表、详情 | - |
| 客户名称 | 列表、详情 | - |
| 操作 | 列表 | 根据状态显示不同按钮 |

工序进度条

字段 展示位置 说明
工序名称 进度条节点 显示在节点上
进度百分比 进度条节点 显示在节点下方
状态标识 进度条节点 不同颜色区分:未开始(灰)/进行中(蓝)/已完成(绿)

任务列表

字段 展示位置 说明
任务编码 列表 可点击打开详情

| 工序名称 | 列表 | - |
| 工作站名称 | 列表 | - |
| 排产数量 | 列表 | - |
| 已生产数量 | 列表 | - |
| 进度 | 列表 | 进度条 |
| 状态 | 列表 | 草稿/生产中/部分完成/已完成/已取消 |
| 操作 | 列表 | 报工/编辑/删除 |


业务规则说明

状态与操作权限

工单状态 可执行操作
草稿 编辑、删除、确认
已确认 排产、取消
生产中 报工、完成(手动)
已完成 查看详情
已取消 查看详情
任务状态 可执行操作
草稿 编辑、删除、报工
生产中 报工
部分完成 报工
已完成 查看详情
已取消 查看详情

进度计算规则

进度类型 计算方式
任务进度 已生产数量 / 排产数量 × 100%
工序进度 工序下所有任务的已生产数量之和 / 计划数量 × 100%
工单进度 已生产数量 / 生产数量 × 100%(仅关键工序计入)

自动完成规则

条件 说明
任务自动完成 已生产数量 >= 排产数量
工单自动完成 已生产数量 >= 生产数量 且 autoFinishFlag = true

注意事项

  1. 工单创建时工艺路线选择
  • 选择产品后自动查询产品关联的工艺路线
  • 如果只有一个工艺路线,自动选中
  • 如果有多个,下拉供用户选择
  • 如果没有,提示用户先配置工艺路线
  1. 一键排产
  • 工单必须为「已确认」状态
  • 同一工序可多次排产(拆分任务)
  • 排产时校验:已排产数量 + 本次排产数量 <= 工单数量
  1. 快速报工
  • 从任务列表进入时,任务信息自动带入,不可修改
  • 非质检工序:需要填写合格品/不良品数量
  • 质检工序:只需填写报工数量,等待质检结果
  1. 批量报工
  • 选中多个任务时,必须是同一工序
  • 报工数量相同应用到所有选中任务
  • 部分成功部分失败时,返回详细结果
  1. 进度实时性
  • 报工审批通过后,任务进度、工序进度、工单进度都需要实时更新
  • 建议使用 WebSocket 或轮询机制更新进度条

前端组件建议

进度条组件

// 使用示例
<ProcessProgressBar
  :process-list="progressData.processList"
  :active-process-id="activeProcessId"
  @process-click="handleProcessClick"
/>

工单卡片组件

// 使用示例
<WorkOrderCard
  :work-order="row"
  :show-actions="true"
  @detail="handleDetail"
  @schedule="handleSchedule"
  @report="handleReport"
/>

快速报工表单组件

// 使用示例
<QuickFeedbackForm
  :task-id="selectedTask.id"
  :visible="showQuickFeedback"
  @success="handleFeedbackSuccess"
  @cancel="showQuickFeedback = false"
/>