# 生产主计划(MPS)- 前端联调方案 ## 涉及页面 - 销售订单列表页(新增"是否需要生产"列) - 销售订单详情页(新增"是否需要生产"开关) - 生产主计划列表页(新增) - 生产主计划详情页(新增) - 生产主计划新增页(新增,支持手动创建) ## 业务流程与数据带入 ### 1. 手动创建 MPS ``` 生产主计划新增页 ↓ 填写:产品、数量、客户、需求日期等 ↓ 提交创建 MPS(编码自动生成) ↓ MPS 状态为草稿 ``` **自动生成编码格式**:`MPS + yyyyMMdd + 001`(如 MPS20240701001) ### 2. 销售订单审核通过 -> 自动创建 MPS ``` 销售订单审核通过 ↓ BPM 监听器触发 ↓ 遍历销售订单明细,对于 need_production=1 的明细 ↓ 调用 MesProMpsApi.createMps() 创建 MPS ↓ 更新销售订单明细的 mps_id 字段 ``` **数据带入:** - MPS.sale_order_id ← 销售订单.id - MPS.sale_order_no ← 销售订单.no - MPS.sale_order_item_id ← 销售订单明细.id - MPS.product_id ← 销售订单明细.productId - MPS.quantity ← 销售订单明细.count - MPS.client_id ← 销售订单.customerId - MPS.request_date ← 销售订单.orderTime ### 2. MPS 下发 -> 生成生产订单 ``` MPS 单条下发 ↓ 创建生产工单(类型=自行生产,来源类型=客户订单) ↓ 工单自动确认为已确认状态 ↓ 更新 MPS 状态为已下发,关联工单 ID ``` ### 3. MPS 合并下发 ``` 选择多条相同产品的 MPS ↓ 校验:相同产品、草稿状态 ↓ 计算合并数量 = SUM(quantity) ↓ 创建一条生产工单(数量为合并数量) ↓ 更新所有 MPS 状态为已下发,关联同一工单 ↓ 记录合并明细到 mes_pro_mps_merge_item ``` ## API ### MPS 相关接口 | 方法 | 路径 | 说明 | |------|------|------| | POST | /mes/pro-mps/create | 创建 MPS | | PUT | /mes/pro-mps/update | 更新 MPS | | DELETE | /mes/pro-mps/delete | 删除 MPS | | GET | /mes/pro-mps/get | 获取 MPS 详情 | | GET | /mes/pro-mps/page | 分页查询 MPS | | POST | /mes/pro-mps/issue | 下发单条 MPS | | POST | /mes/pro-mps/merge-issue | 合并下发多条 MPS | | POST | /mes/pro-mps/cancel | 取消 MPS | | GET | /mes/pro-mps/export-excel | 导出 MPS | ### 销售订单接口变更 | 方法 | 路径 | 变更说明 | |------|------|----------| | GET | /erp/sale-order/get | 响应新增 needProduction、mpsId 字段 | | GET | /erp/sale-order/page | 响应新增 needProduction 字段 | | POST | /erp/sale-order/create | 请求新增 needProduction 字段 | | PUT | /erp/sale-order/update | 请求新增 needProduction 字段 | ## 请求参数 ### MPS 创建请求 ```json { "productId": 300, "quantity": 100.00, "unitMeasureId": 1, "clientId": 400, "requestDate": "2024-01-01T00:00:00", "remark": "备注" } ``` **说明**: - `code` 字段可选,不填则自动生成 - `saleOrderId`、`saleOrderNo`、`saleOrderItemId` 可选,手动创建时不填 ``` ### MPS 下发请求 ``` POST /mes/pro-mps/issue?id=123 ``` ### MPS 合并下发请求 ```json // POST /mes/pro-mps/merge-issue [123, 124, 125] ``` ## 响应字段 ### MPS 详情响应 | 字段 | 类型 | 说明 | |------|------|------| | id | Long | MPS 编号 | | code | String | MPS 编码 | | status | Integer | 状态(0=草稿 1=已下发 2=已完成 3=已取消) | | saleOrderId | Long | 销售订单ID | | saleOrderNo | String | 销售订单号 | | saleOrderItemId | Long | 销售订单明细ID | | productId | Long | 产品ID | | productCode | String | 产品编码 | | productName | String | 产品名称 | | productSpecification | String | 规格型号 | | unitMeasureName | String | 单位 | | quantity | BigDecimal | 计划生产数量 | | quantityProduced | BigDecimal | 已生产数量 | | clientId | Long | 客户ID | | clientCode | String | 客户编码 | | clientName | String | 客户名称 | | requestDate | DateTime | 需求日期 | | issueDate | DateTime | 下发日期 | | finishDate | DateTime | 完成日期 | | workOrderId | Long | 生产工单ID | | workOrderCode | String | 生产工单编码 | | mergeFlag | Integer | 是否合并下发 | | mergeBatchNo | String | 合并批次号 | | remark | String | 备注 | | createTime | DateTime | 创建时间 | ### 响应示例 ```json { "code": 0, "data": { "id": 1024, "code": "MPS-001", "status": 0, "saleOrderId": 100, "saleOrderNo": "SO-001", "productId": 300, "productCode": "P-001", "productName": "产品A", "quantity": 100.00, "quantityProduced": 0, "clientId": 400, "clientName": "客户A", "requestDate": "2024-01-01T00:00:00", "mergeFlag": 0, "createTime": "2024-01-01T10:00:00" }, "msg": "操作成功" } ``` ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | MPS 编码 | 列表、详情 | 主键标识 | | 状态 | 列表、详情 | 草稿(蓝)、已下发(绿)、已完成(紫)、已取消(红) | | 销售订单号 | 列表、详情 | 关联来源 | | 产品编码/名称 | 列表、详情 | 生产对象 | | 计划数量 | 列表、详情 | 核心数据 | | 已生产数量 | 详情 | 进度跟踪 | | 客户名称 | 列表、详情 | 需求方 | | 需求日期 | 列表、详情 | 交期要求 | | 生产工单编码 | 列表、详情 | 下发后显示,可点击跳转 | ## 业务规则说明 | 场景 | 规则 | |------|------| | 创建 MPS | 仅草稿状态可编辑、删除 | | 下发 MPS | 仅草稿状态可下发,下发后生成生产工单并自动确认 | | 合并下发 | 至少选择 2 条,必须相同产品,必须都是草稿状态 | | 取消 MPS | 仅已下发状态可取消 | | 完成 MPS | 由生产工单完成时自动触发 | ## 注意事项 1. **销售订单审批流程**:销售订单审核通过后会自动创建 MPS,无需前端手动触发 2. **MPS 与销售订单关联**:通过 saleOrderItemId 字段关联,可追溯来源 3. **合并下发限制**:只能合并相同产品的 MPS,不同产品不能合并 4. **状态不可逆**:下发后无法回到草稿状态,只能取消或完成 5. **生产进度同步**:MPS 的已生产数量由生产工单报工时自动更新