# 生产工单工序报工仓库 - 前端联调方案 ## 涉及页面 - 生产工单 - 新增/编辑弹窗 - 工序列表(process-list.vue) - 生产工单 - 工序新增/编辑弹窗(process-form.vue) - 工艺路线 - 产品页签(工艺路线产品报工仓库配置,作为工序默认值来源) ## 业务流程与数据带入 1. 工艺路线产品配置报工仓库(`mes_pro_route_product` 的 `warehouseId/locationId/areaId`),该配置是工序的**默认值来源**。 2. 生产订单下单(新建工单)时,工序列表从工艺路线带入,工序的报工仓库/库区/库位默认取工艺路线产品的配置。 3. 下单时可对每道工序单独修改报工仓库/库区/库位,修改结果随工单工序一起保存(工单工序为快照,不受后续工艺路线修改影响)。 4. 生产报工审批通过后,产出物料按以下优先级决定入库位置: - ① 工单工序上配置的报工仓库/库区/库位; - ② 工艺路线产品上配置的报工仓库/库区/库位; - ③ 虚拟线边仓(历史数据兜底)。 5. 工单已存在但工序未配置仓库(本次改造前的历史工单)时,自动走 ②、③,无需补数据。 ## API | 方法 | 路径 | 说明 | |------|------|------| | GET | /mes/pro/route-process/list-by-product | 按产品获取工艺路线工序列表(新增:默认报工仓库) | | GET | /mes/pro/work-order-process/list-by-product-id | 按产品获取工单工序预填列表(新增:默认报工仓库) | | GET | /mes/pro/work-order-process/list-by-work-order-id | 获取工单工序列表(新增:报工仓库及名称) | | GET | /mes/pro/work-order-process/get | 获取工单工序详情(新增:报工仓库及名称) | | POST | /mes/pro/work-order-process/batch-save | 批量保存工单工序(请求新增仓库字段) | | POST/PUT | /mes/pro/work-order-process/create、/update | 单条新增/修改(请求新增仓库字段) | **请求参数(batch-save / create / update):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | warehouseId | Long | 否 | 报工仓库编号,不填则按工艺路线产品兜底 | | locationId | Long | 否 | 报工库区编号,需与 warehouseId 匹配 | | areaId | Long | 否 | 报工库位编号,需与 locationId 匹配 | > 仓库/库区/库位三者同时填写时,后端校验层级归属关系;只填部分时,报工产出按工艺路线产品兜底。 **响应字段新增(list-by-product、list-by-work-order-id、get 等工序查询接口):** | 字段 | 类型 | 说明 | |------|------|------| | warehouseId | Long | 报工仓库编号 | | warehouseName | String | 报工仓库名称 | | locationId | Long | 报工库区编号 | | locationName | String | 报工库区名称 | | areaId | Long | 报工库位编号 | | areaName | String | 报工库位名称 | **响应示例:** ```json { "code": 0, "data": [ { "processId": 1, "processName": "焊接", "sort": 1, "warehouseId": 5, "warehouseName": "半成品仓", "locationId": 12, "locationName": "通用库区", "areaId": 31, "areaName": "默认库位" } ] } ``` ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | warehouseName | 工单工序列表「报工仓库」列 | 有库位时拼接显示「仓库/库区/库位」,未配置显示「-」 | | warehouseId | 工序新增/编辑弹窗 | 下拉单选,选项来自仓库精简列表,允许清空 | | locationId | 工序新增/编辑弹窗 | 下拉单选,依赖 warehouseId,仓库变更时清空 | | areaId | 工序新增/编辑弹窗 | 下拉单选,依赖 locationId,库区变更时清空 | ## 产出物料过滤 同一工艺路线可以关联多个产品(工艺路线产品)。下单/排产按产品获取工艺路线工序时,工序的产出物料会自动过滤,只保留「通用产出」和「当前产品专属产出」,其它产品的专属产出不会带入。 产出归属在工艺路线工序弹窗中配置:产出物料可归属到某个产品(专属),也可留空表示多产品通用(适合同线共用的半成品)。详见 `docs/route_process_output_attribution.md`。 示例:路线同时关联「油浸式配电变压器」和「光伏固定支架」,包装入库工序分别为两个产品配置专属产出。下单「光伏固定支架」时,该工序只带入「光伏固定支架」;若该工序还有一个「通用」半成品产出,也会一并带入。 > 工艺路线配置页(按 routeId 查询)不受影响,仍展示全部已配置的产出物料及其归属。 工单工序新增/编辑弹窗中的「产出物料」选择器同样按此规则收敛:候选范围 = 该产品工艺路线中带入的产出(通用 + 本产品专属)+ 该工序已有产出 + 工单产品本身。产品未关联工艺路线时不做限制,保持原有可选范围。 ## 业务规则说明 | 场景 | 规则 | |------|------| | 新建工单带入工序 | 仓库/库区/库位默认取工艺路线产品的报工仓库配置,可逐工序修改 | | 修改工序仓库 | 修改后随工序保存到工单工序快照,报工按快照执行 | | 工艺路线后续修改 | 不影响已创建的工单工序快照 | | 工序未配置仓库 | 报工产出回退到工艺路线产品配置,再回退虚拟线边仓 | | 仓库层级不匹配 | 后端校验 `warehouse → location → area` 归属关系,不匹配时报错 | | 倒冲扣料 | 仍固定从虚拟线边仓扣料,与产出仓库无关 | ## 注意事项 - 工序仓库三级字段为可选:历史工单工序没有仓库数据时,报工自动回退,不会报错。 - 前置仓库、库区、库位下拉数据分别来自 `/mes/wm/warehouse/simple-list`、`/mes/wm/warehouse-location/simple-list?warehouseId=`、`/mes/wm/warehouse-area/simple-list?locationId=`。 - 只清空仓库而不清空库区/库位会产生脏数据,前端在上级字段变更时需级联清空下级字段。 - 产出仓库改为实际仓库后,虚拟线边仓的库存不再随产出增加(倒冲扣料仍从虚拟仓扣减),属于预期行为。