# 工艺流程工序"产出产品"支持多选 - 前后端改动总结 ## 状态:已完成 前端和后端改动均已实施,编译验证通过。 ## 涉及页面 - 生产管控 → 产品设计 → 工艺流程 → 工序编辑弹窗(工艺路线工序) - 生产管控 → 生产工单 → 工序编辑弹窗(工单工序) - 生产管控 → 生产工单 → 工序列表展示 ## API 变更 ### 请求参数变更 **`MesProRouteProcessSaveReqVO`(工艺路线工序保存):** | 字段 | 旧类型 | 新类型 | 说明 | |------|--------|--------|------| | `outputItemId` | `Long` | **已删除** | 替换为 `outputItemIds` | | `outputItemIds` | - | `List` | **新增**,产出产品物料编号列表 | **`MesProWorkOrderProcessSaveReqVO`(工单工序保存):** | 字段 | 旧类型 | 新类型 | 说明 | |------|--------|--------|------| | `outputItemId` | `Long` | **已删除** | 替换为 `outputItemIds` | | `outputItemIds` | - | `List` | **新增**,产出产品物料编号列表 | ### 响应字段变更 **`MesProRouteProcessRespVO`(工艺路线工序响应):** | 字段 | 类型 | 说明 | |------|------|------| | `outputItemId` | `Long` | **保留**(向后兼容),取第一个产出产品 | | `outputItemCode` | `String` | **保留**,第一个产出产品编码 | | `outputItemName` | `String` | **保留**,第一个产出产品名称 | | `outputItemIds` | `List` | **新增**,所有产出产品编号列表 | | `outputItemNames` | `String` | **新增**,所有产出产品名称(逗号拼接) | **`MesProWorkOrderProcessRespVO`(工单工序响应):** 同上,字段一致。 ### 列表接口 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/pro/route-process/list-by-route?routeId={id}` | 工艺路线工序列表 | | GET | `/mes/pro/route-process/list-by-product?productId={id}` | 按产品获取工序列表(含投料BOM) | | GET | `/mes/pro/work-order-process/list-by-work-order-id?workOrderId={id}` | 工单工序列表 | | GET | `/mes/pro/work-order-process/list-by-product-id?productId={id}` | 按产品获取工序列表(工单预填用) | | POST | `/mes/pro/route-process/create` | 创建工艺路线工序 | | PUT | `/mes/pro/route-process/update` | 更新工艺路线工序 | | POST | `/mes/pro/work-order-process/create` | 创建工单工序 | | PUT | `/mes/pro/work-order-process/update` | 更新工单工序 | | POST | `/mes/pro/work-order-process/batch-save` | 批量保存工单工序 | ## 前端修改点 ### 1. MdItemSelect 组件(`src/views/mes/md/item/components/select.vue`) 新增 `multiple` prop: | Prop | 类型 | 默认值 | 说明 | |------|------|--------|------| | `multiple` | `boolean` | `false` | 是否多选模式 | 多选模式行为: - `modelValue` 类型为 `number[]` - 展示名称逗号拼接(取物料 `name` 拼接) - 弹窗以 `multiple: true` 打开 - 选中值以数组形式 emit 单选模式行为不变。 ### 2. API 类型定义 **`src/api/mes/pro/route/process/index.ts`:** `RouteProcess` 接口新增: ```typescript outputItemIds?: number[]; // 产出产品编号列表 outputItemNames?: string; // 产出产品名称(逗号拼接) ``` **`src/api/mes/pro/workorder/process/index.ts`:** `WorkOrderProcess` 接口新增同上两个字段。 ### 3. 工艺路线工序表单 **`src/views/mes/process-design/route/data.ts`:** 产出产品字段 schema 修改: - `fieldName` 从 `"outputItemId"` 改为 `"outputItemIds"` - `componentProps` 增加 `multiple: true` **`src/views/mes/process-design/route/modules/process-list.vue`:** 列表/表格中产出产品列展示改为 `outputItemNames`(逗号分隔的名称)。 ### 4. 工单工序表单 **`src/views/mes/pro/workorder/modules/process-form.vue`:** 产出产品字段改为多选组件,`fieldName` 改为 `"outputItemIds"`。 **`src/views/mes/pro/workorder/data.ts`:** 表格列中产出产品列展示改为 `outputItemNames`。 **`src/views/mes/pro/workorder/modules/process-list.vue`:** 工艺路线→工单工序映射时,透传多值 `outputItemIds`/`outputItemNames`。 ## 数据带入说明 ### 工艺流程新增工序 1. 用户在表单中多选产出产品 → `outputItemIds: [101, 102]` 2. 保存时 POST body 传 `{ ..., outputItemIds: [101, 102] }` 3. 后端将 `[101, 102]` 转为 `"101,102"` 存入 DB 4. 列表查询时后端返回 `outputItemIds: [101, 102]`, `outputItemNames: "产品A, 产品B"` ### 工单从工艺路线带入 调用 `GET /mes/pro/work-order-process/list-by-product-id?productId={id}` 获取工序列表时: - 响应中 `outputItemIds` 和 `outputItemNames` 已由后端解析好 - 前端直接回显到表单即可 ### 工单工序批量保存 请求 `POST /mes/pro/work-order-process/batch-save`: - 每个工序项传 `outputItemIds: [101, 102]` - 后端合并处理 ## 注意事项 - 旧数据兼容:DB 中旧值 `"101"`(单值字符串)解析后自动转为 `["101"]`,不影响列表展示 - 下游取第一个:排产任务创建时取 `outputItemIds` 第一个值作为任务物料,多产出场景下用户需确认第一个产出产品是正确的 - 投料 BOM 展开:仍然按第一个产出产品 ID 匹配工序配方,如果后续需要支持多个产出产品的 BOM 展开,需另外改造 - 前端 MdItemSelect 的 `multiple` prop 默认为 `false`,确保其他使用此组件的地方不受影响