# 生产领料/退料关联 Task - 前端联调方案 ## 涉及页面 - 生产领料出库单列表页 / 新增编辑页 / 行管理页 - 生产退料单列表页 / 新增编辑页 / 行管理页 - 生产任务列表页(选择 task 用) ## 业务流程与数据带入 ### 领料流程 1. **新增领料出库单**:选择 Task → 工单(workOrderId)、工作站(workstationId) 从 Task 自动带入 2. **新增领料出库单行**:行可选填 taskId,默认取主表的 taskId 3. **完成领料出库**:系统自动创建任务投料记录(mes_pro_task_issue),issuedQuantity = availableQuantity = 行数量 4. **取消领料出库**:系统自动删除通过该领料单创建的任务投料记录 ### 退料流程 1. **新增退料单**:选择 Task → 工单(workOrderId)、工作站(workstationId) 从 Task 自动带入 2. **新增退料单行**:行可选填 taskId,默认取主表的 taskId 3. **完成退料**:系统自动扣减任务投料记录的 issuedQuantity 和 availableQuantity 4. **取消退料**:无额外操作(退料未完成时不影响投料记录) ### 领料 → 退料闭环 ``` 领料完成 → task_issue: issued=100, available=100, used=0 退料完成 → task_issue: issued=80, available=80, used=0 (退了20) ``` --- ## 一、领料出库单 API | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/wm/product-issue/create | 创建领料出库单 | | PUT | /mes/wm/product-issue/update | 修改领料出库单 | | GET | /mes/wm/product-issue/get | 获得领料出库单 | | GET | /mes/wm/product-issue/page | 获得领料出库单分页 | | PUT | /mes/wm/product-issue/submit | 提交领料出库单 | | PUT | /mes/wm/product-issue/stock | 执行拣货 | | PUT | /mes/wm/product-issue/finish | 完成领料出库(自动创建投料记录) | | PUT | /mes/wm/product-issue/cancel | 取消领料出库(自动删除投料记录) | | POST | /mes/wm/product-issue-line/create | 创建领料出库单行 | | PUT | /mes/wm/product-issue-line/update | 修改领料出库单行 | ### 创建/修改领料出库单 - 请求参数变更 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | taskId | Long | **是(新增必填)** | 生产任务 ID,以 task 为主 | | workOrderId | Long | **否(原必填改为选填)** | 生产工单 ID,从 task 自动带入 | | workstationId | Long | 否 | 工作站 ID,从 task 自动带入 | | requiredTime | LocalDateTime | 是 | 需求时间 | **请求示例:** ```json { "code": "ISSUE20260716001", "name": "生产领料", "taskId": 1, "requiredTime": "2026-07-16 10:00:00", "remark": "" } ``` **响应:** `{ "code": 0, "data": 1 }` ### 领料出库单 - 响应字段新增 | 字段 | 类型 | 说明 | |------|------|------| | taskId | Long | 生产任务 ID | | taskCode | String | **新增** 生产任务编码 | | taskName | String | **新增** 生产任务名称 | | requiredTime | LocalDateTime | 需求时间 | **响应示例:** ```json { "code": 0, "data": { "id": 1, "code": "ISSUE20260716001", "name": "生产领料", "taskId": 1, "taskCode": "TASK001", "taskName": "注塑任务", "workOrderId": 10, "workOrderCode": "WO001", "workstationId": 5, "workstationName": "装配工作站", "clientCode": "C001", "clientName": "某某客户", "issueDate": null, "requiredTime": "2026-07-16 10:00:00", "status": 0, "remark": "", "createTime": "2026-07-16 10:00:00" } } ``` ### 领料出库单行 - 请求/响应字段新增 | 字段 | 类型 | 请求 | 响应 | 说明 | |------|------|------|------|------| | taskId | Long | 选填 | - | 生产任务 ID,默认取主表的 taskId | | taskCode | String | - | 新增 | 生产任务编码 | | taskName | String | - | 新增 | 生产任务名称 | --- ## 二、退料单 API | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/wm/return-issue/create | 创建退料单 | | PUT | /mes/wm/return-issue/update | 修改退料单 | | GET | /mes/wm/return-issue/get | 获得退料单 | | GET | /mes/wm/return-issue/page | 获得退料单分页 | | PUT | /mes/wm/return-issue/submit | 提交退料单 | | PUT | /mes/wm/return-issue/stock | 入库上架 | | PUT | /mes/wm/return-issue/finish | 完成退料(自动扣减投料记录可用量) | | PUT | /mes/wm/return-issue/cancel | 取消退料 | | POST | /mes/wm/return-issue-line/create | 创建退料单行 | | PUT | /mes/wm/return-issue-line/update | 修改退料单行 | ### 创建/修改退料单 - 请求参数变更 | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | taskId | Long | **是(新增必填)** | 生产任务 ID,以 task 为主 | | workOrderId | Long | **否(原必填改为选填)** | 生产工单 ID,从 task 自动带入 | | workstationId | Long | 否 | 工作站 ID,从 task 自动带入 | **请求示例:** ```json { "code": "RI20260716001", "name": "生产退料", "taskId": 1, "type": 1, "remark": "" } ``` **响应:** `{ "code": 0, "data": 1 }` ### 退料单 - 响应字段新增 | 字段 | 类型 | 说明 | |------|------|------| | taskId | Long | **新增** 生产任务 ID | | taskCode | String | **新增** 生产任务编码 | | taskName | String | **新增** 生产任务名称 | **响应示例:** ```json { "code": 0, "data": { "id": 1, "code": "RI20260716001", "name": "生产退料", "taskId": 1, "taskCode": "TASK001", "taskName": "注塑任务", "workOrderId": 10, "workOrderCode": "WO001", "workstationId": 5, "workstationName": "装配工作站", "type": 1, "returnDate": null, "status": 0, "remark": "", "createTime": "2026-07-16 10:00:00" } } ``` ### 退料单行 - 请求/响应字段新增 | 字段 | 类型 | 请求 | 响应 | 说明 | |------|------|------|------|------| | taskId | Long | 选填 | - | 生产任务 ID,默认取主表的 taskId | | taskCode | String | - | 新增 | 生产任务编码 | | taskName | String | - | 新增 | 生产任务名称 | ### 退料单分页 - 请求参数新增 | 参数 | 类型 | 说明 | |------|------|------| | taskId | Long | **新增** 按生产任务 ID 过滤 | --- ## 字段展示规则 ### 领料出库单 | 字段 | 展示位置 | 说明 | |------|----------|------| | taskId | 新增/编辑表单 | 必填,选择 Task 下拉框 | | taskCode | 列表、详情 | 从 Task 自动带入展示 | | taskName | 列表、详情 | 从 Task 自动带入展示 | | workOrderId | 新增/编辑表单 | 选填,选择 Task 后自动填入,可手动修改 | | workOrderCode | 列表、详情 | 从工单自动带入展示 | | workstationId | 新增/编辑表单 | 选填,选择 Task 后自动填入,可手动修改 | | workstationName | 列表、详情 | 从工作站自动带入展示 | | requiredTime | 新增/编辑表单、详情 | 必填,需求时间 | | 行级 taskId | 行新增/编辑表单 | 选填,默认取主表 taskId | ### 退料单 | 字段 | 展示位置 | 说明 | |------|----------|------| | taskId | 新增/编辑表单 | 必填,选择 Task 下拉框 | | taskCode | 列表、详情 | 从 Task 自动带入展示 | | taskName | 列表、详情 | 从 Task 自动带入展示 | | workOrderId | 新增/编辑表单 | 选填,选择 Task 后自动填入,可手动修改 | | workOrderCode | 列表、详情 | 从工单自动带入展示 | | workstationId | 新增/编辑表单 | 选填,选择 Task 后自动填入,可手动修改 | | workstationName | 列表、详情 | 从工作站自动带入展示 | | 行级 taskId | 行新增/编辑表单 | 选填,默认取主表 taskId | --- ## 业务规则说明 | 场景 | 规则 | |------|------| | 新增领料/退料单 | taskId 必填;选择 task 后自动带入 workOrderId 和 workstationId | | 修改领料/退料单 | taskId 必填;同新增规则 | | 领料出库完成 | 系统自动按行创建 mes_pro_task_issue 投料记录,sourceDocType=PRODUCT_ISSUE | | 取消领料出库 | 系统自动删除通过该领料单创建的投料记录 | | 退料完成 | 系统自动扣减对应 task_issue 的 issuedQuantity 和 availableQuantity | | 行级 taskId | 行的 taskId 优先于主表的 taskId;如果行为空则取主表的 | | 投料记录匹配 | 退料扣减时,按 taskId + itemId + sourceDocType=PRODUCT_ISSUE 匹配投料记录 | --- ## 注意事项 - **以 task 为主**:创建领料/退料单时,必须先选择 task,工单和工作站从 task 自动带入 - **workOrderId 不再是必填**:前端表单中 workOrderId 改为选填,选择 task 后自动填入 - **行级 taskId**:行表新增 taskId 字段,前端行编辑时可选择不同的 task(默认取主表的) - **投料记录自动管理**:领料完成自动创建投料记录,退料完成自动扣减投料可用量,前端无需额外操作 - **分页查询支持 taskId**:领料出库单和退料单分页接口均支持按 taskId 过滤查询 - **领料取消**:取消领料时,只有通过该领料单创建的投料记录会被删除(按 sourceDocType + sourceDocId 匹配) - **退料扣减**:退料扣减投料记录时,issuedQuantity 和 availableQuantity 最低为 0,不会出现负数