# 工单中心 - 前端联调方案 ## 涉及页面 - 工单中心(新页面,整合工单列表、排产、报工) - 生产任务列表(保留,用于高级管理) - 报工列表(保留,用于报工记录查询) ## 业务流程与数据带入 ### 流程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 | 任务状态 | **响应示例:** ```json { "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 | 是否关键工序 | **响应示例:** ```json { "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\ | 生成的任务ID列表 | **响应示例:** ```json { "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 | 工单状态(可能自动完成) | **响应示例:** ```json { "code": 0, "data": { "feedbackId": 201, "taskStatus": 1, "workOrderStatus": 1 } } ``` ### 5. 批量报工 **POST** `/mes/pro-feedback/batch-create` **请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | taskIds | Array\ | 是 | 任务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 | 错误信息(失败时有值) | **响应示例:** ```json { "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. **工单创建时工艺路线选择** - 选择产品后自动查询产品关联的工艺路线 - 如果只有一个工艺路线,自动选中 - 如果有多个,下拉供用户选择 - 如果没有,提示用户先配置工艺路线 2. **一键排产** - 工单必须为「已确认」状态 - 同一工序可多次排产(拆分任务) - 排产时校验:已排产数量 + 本次排产数量 <= 工单数量 3. **快速报工** - 从任务列表进入时,任务信息自动带入,不可修改 - 非质检工序:需要填写合格品/不良品数量 - 质检工序:只需填写报工数量,等待质检结果 4. **批量报工** - 选中多个任务时,必须是同一工序 - 报工数量相同应用到所有选中任务 - 部分成功部分失败时,返回详细结果 5. **进度实时性** - 报工审批通过后,任务进度、工序进度、工单进度都需要实时更新 - 建议使用 WebSocket 或轮询机制更新进度条 --- ## 前端组件建议 ### 进度条组件 ```typescript // 使用示例 ``` ### 工单卡片组件 ```typescript // 使用示例 ``` ### 快速报工表单组件 ```typescript // 使用示例 ```