编辑 | blame | 历史 | 原始文档

采购入库流程优化 - 前端联调方案

业务流程概述

优化后的采购入库流程:

ERP采购订单 -> MES到货通知 -> MES采购入库 -> BPM审批 -> 入库成功

核心改进:**每一步自动带入上游数据,物料统一使用MDM模块数据,减少手动输入**。


涉及页面

  • 到货通知列表页(/mes/wm/arrival-notice
  • 到货通知新增/编辑弹窗
  • 采购入库列表页(/mes/wm/item-receipt
  • 采购入库新增/编辑弹窗
  • 采购订单选择器弹窗(新增组件)
  • 到货通知选择器弹窗(新增组件)

数据带入规则

1. 采购订单 -> 到货通知

目标字段 数据来源 自动带入 说明
供应商 采购订单.supplierId 自动填充,不可修改
采购订单编码 采购订单.no 显示用,不可修改
采购订单ID 采购订单.id 关联字段

2. 采购订单行 -> 到货通知行

目标字段 数据来源 自动带入 说明
采购订单行ID 采购订单行.id 关联字段,用于追溯
物料编码 ERP产品编码映射MDM物料 ⚠️ 需用户选择映射关系
到货数量 订购数量 - 已入库数量 可修改
是否需检验 默认false 可修改

3. 到货通知 -> 采购入库

目标字段 数据来源 自动带入 说明
供应商 到货通知.vendorId 自动填充,不可修改
到货通知编码 到货通知.code 显示用
采购订单编码 到货通知.purchaseOrderCode 显示用

4. 到货通知行 -> 采购入库行

目标字段 数据来源 自动带入 说明
物料ID 到货通知行.itemId 不可修改
到货通知行ID 到货通知行.id 关联字段
采购订单行ID 到货通知行.purchaseOrderItemId 关联字段
入库数量 到货通知行.qualifiedQuantity 可修改
批次信息 自动生成 根据批次规则

新增 API 接口

到货通知模块

方法 路径 说明
POST /mes/wm/arrival-notice/generate-from-purchase-order?purchaseOrderId={id} 根据采购订单生成到货通知单

请求参数:

参数 类型 必填 说明
purchaseOrderId Long ERP采购订单编号

响应: { "code": 200, "data": 123, "msg": "操作成功" } (data为生成的到货通知单编号)

采购入库模块

方法 路径 说明
POST /mes/wm/item-receipt/generate-from-arrival-notice?arrivalNoticeId={id} 根据到货通知单生成采购入库单
PUT /mes/wm/item-receipt/submit-approval?id={id}&processDefinitionKey={key} 提交采购入库单审批

请求参数(generate-from-arrival-notice):

参数 类型 必填 说明
arrivalNoticeId Long 到货通知单编号

请求参数(submit-approval):

参数 类型 必填 说明
id Long 采购入库单编号
processDefinitionKey String BPM流程定义Key

前端实现要点

1. 到货通知页面改造

1.1 新增"从采购订单生成"按钮

<el-button type="primary" @click="handleGenerateFromPO">
  从采购订单生成
</el-button>

1.2 采购订单选择器弹窗

  • 调用 ERP 接口获取已审核状态的采购订单列表
  • 显示字段:订单号、供应商名称、订单日期、总金额
  • 选择后调用 /mes/wm/arrival-notice/generate-from-purchase-order 接口

1.3 数据获取时机

用户点击"从采购订单生成" 
  -> 弹出采购订单选择器 
  -> 选择订单 
  -> 调用 generate-from-purchase-order API 
  -> 跳转到到货通知编辑页(ID为返回值)
  -> 显示已带入的数据

1.4 字段显示规则

  • 自动带入的字段显示为**禁用状态**(灰色背景)
  • 物料选择器仍保留,允许用户补充物料映射关系

2. 采购入库页面改造

2.1 新增"从到货通知生成"按钮

<el-button type="primary" @click="handleGenerateFromAN">
  从到货通知生成
</el-button>

2.2 到货通知选择器弹窗

  • 调用 MES 接口获取状态为"待入库"的到货通知单列表
  • 显示字段:通知单号、供应商名称、到货日期、状态
  • 选择后调用 /mes/wm/item-receipt/generate-from-arrival-notice 接口

2.3 数据获取时机

用户点击"从到货通知生成" 
  -> 弹出到货通知选择器 
  -> 选择通知单 
  -> 调用 generate-from-arrival-notice API 
  -> 跳转到采购入库编辑页(ID为返回值)
  -> 显示已带入的数据

2.4 BPM审批流程

  • 状态为"草稿"时显示"提交审批"按钮
  • 点击后弹出流程选择器(复用现有BPM流程选择组件)
  • 选择流程后调用 submit-approval API
  • 状态变为"审批中",禁止编辑

3. 状态流转图

到货通知状态

草稿(0) --提交--> 待质检(2) --IQC完成--> 待入库(3) --入库完成--> 已完成(4)
              \
               -> 待入库(3) [无需检验]

采购入库状态(新增BPM审批)

草稿(0) --提交审批--> 审批中(2) --审批通过--> 待上架(3) --上架--> 待入库(4) --入库--> 已完成(5)
                        \
                         -> 审批拒绝 -> 草稿(0) [可重新提交]

注意事项

数据带入强调

  1. 物料信息必须从MDM模块获取,不允许手动输入物料编码/名称
  2. 采购订单行关联:到货通知行必须关联采购订单行,确保数据可追溯
  3. 入库数量校验:入库数量不能超过到货通知行的合格数量

前端校验规则

  1. 从采购订单生成到货通知时,校验采购订单状态必须为"已审核"
  2. 从到货通知生成采购入库时,校验到货通知状态必须为"待入库"
  3. 提交审批时,校验入库单状态必须为"草稿",且至少有一条入库行

错误处理

错误码 说明 前端提示
1040705007 采购订单不存在 "所选采购订单不存在,请刷新后重试"
1040705008 采购订单无明细数据 "该采购订单没有明细数据"
WM_ARRIVAL_NOTICE_NO_LINE 到货通知无行数据 "该到货通知没有明细数据"

后端修改文件清单

数据库变更

  • sql/mysql/mes_purchase_receipt_enhance.sql

ERP API 扩展

  • yudao-module-erp-api/.../ErpPurchaseOrderApi.java
  • yudao-module-erp-api/.../ErpPurchaseOrderItemRespDTO.java
  • yudao-module-erp/.../ErpPurchaseOrderApiImpl.java

MES DO/VO 修改

  • MesWmArrivalNoticeDO.java - 新增 purchaseOrderCode
  • MesWmArrivalNoticeLineDO.java - 新增 purchaseOrderItemId
  • MesWmItemReceiptDO.java - 新增 processInstanceId
  • MesWmItemReceiptLineDO.java - 新增 purchaseOrderItemId
  • 对应的 SaveReqVO 和 RespVO

MES Service 新增方法

  • MesWmArrivalNoticeService.generateArrivalNoticeFromPurchaseOrder()
  • MesWmItemReceiptService.generateItemReceiptFromArrivalNotice()
  • MesWmItemReceiptService.submitItemReceiptApproval()
  • MesWmItemReceiptService.updateItemReceiptAuditStatus()

MES Controller 新增接口

  • POST /mes/wm/arrival-notice/generate-from-purchase-order
  • POST /mes/wm/item-receipt/generate-from-arrival-notice
  • PUT /mes/wm/item-receipt/submit-approval

BPM 监听器

  • MesWmItemReceiptStatusListener.java