4、生产订单集成:ERP下发生产订单到MES、MES反馈订单状态与报工数据到ERP的接口设计

生产订单集成,说白了就是ERP和MES之间的“订单握手”。ERP说“我要生产这批货”,MES说“收到,我干完了告诉你”。这个环节要是没做好,整个车间就像断了线的风筝——ERP不知道现场干到哪了,MES也不知道下一步该干啥。

我个人习惯把这种集成拆成两个方向来看:下行接口(ERP→MES)和上行接口(MES→ERP)。咱们一个一个聊。

4.1 下行接口:ERP下发生产订单到MES

ERP创建或修改生产订单后,需要实时或准实时地推送给MES。MES拿到订单后,才能开始排产、派工、领料。

4.1.1 接口触发时机

  • 订单创建:ERP里新建了一张生产订单,状态为“已下达”。
  • 订单变更:数量、交期、BOM或工艺路线改了。
  • 订单取消:订单被关闭或删除。

我在项目中遇到过一种情况:ERP半夜批量下发订单,MES这边还在做日结,结果接口拥堵了。后来我们加了个“定时批量拉取”的机制,错峰处理,问题就解决了。

4.1.2 接口数据结构

我一般建议至少包含以下字段:

字段名 类型 说明
OrderNo String 生产订单号(ERP主键)
MaterialCode String 物料编码
PlannedQty Decimal 计划生产数量
StartDate DateTime 计划开工日期
DueDate DateTime 计划完工日期
BomVersion String BOM版本号
RoutVersion String 工艺路线版本号
Status String 订单状态(已下达/变更/取消)
我的小技巧:接口里最好带上BOM和工艺路线的版本号。MES拿到后可以跟本地缓存比对,版本变了就重新加载,不变就跳过。这样能省不少流量。

4.1.3 接口协议示例(RESTful)

POST /api/mes/production-order/sync
Content-Type: application/json

{
  "orderNo": "PO202405001",
  "materialCode": "M-10086",
  "plannedQty": 500,
  "startDate": "2024-05-10 08:00:00",
  "dueDate": "2024-05-15 18:00:00",
  "bomVersion": "V2.1",
  "routVersion": "V1.3",
  "status": "RELEASED"
}

MES收到后,返回一个确认消息:

{
  "code": 0,
  "message": "订单接收成功",
  "data": {
    "orderNo": "PO202405001",
    "mesOrderId": "MES-202405001"
  }
}
注意:接口必须支持幂等性。ERP可能因为网络重试而重复发送同一个订单,MES要根据OrderNo做去重处理。我曾经见过一个项目,因为没做幂等,MES里同一个订单被创建了三次,排产排得一团糟。

4.2 上行接口:MES反馈订单状态与报工数据到ERP

MES干完活,得告诉ERP。ERP需要这些数据来算成本、更新库存、做财务结算。说白了,ERP的“眼睛”就是MES反馈回来的数据。

4.2.1 反馈的内容

  • 订单状态变更:开工、暂停、完工、关闭。
  • 报工数据:合格数量、不合格数量、工时、设备运行时间。
  • 物料消耗:实际领料量、退料量。
  • 异常信息:质量异常、设备故障、缺料等。

4.2.2 接口数据结构

我习惯把状态反馈和报工数据分开,因为它们的触发频率不一样。状态变更可能一天几次,报工可能每道工序都要报。

状态反馈接口

字段名 类型 说明
OrderNo String 生产订单号
Status String 当前状态(STARTED/PAUSED/COMPLETED/CLOSED)
OperTime DateTime 状态变更时间
Remark String 备注(可选)

报工数据接口

字段名 类型 说明
OrderNo String 生产订单号
OperationCode String 工序编码
WorkerId String 操作工ID
GoodQty Decimal 合格数量
ScrapQty Decimal 报废数量
ReworkQty Decimal 返工数量
LaborHours Decimal 工时(小时)
MachineHours Decimal 设备运行时间(小时)
ReportTime DateTime 报工时间

4.2.3 接口协议示例

POST /api/erp/production-order/report
Content-Type: application/json

{
  "orderNo": "PO202405001",
  "operationCode": "OP-10",
  "workerId": "W-9527",
  "goodQty": 480,
  "scrapQty": 10,
  "reworkQty": 10,
  "laborHours": 8.5,
  "machineHours": 8.0,
  "reportTime": "2024-05-15 17:30:00"
}

ERP收到后,返回确认:

{
  "code": 0,
  "message": "报工数据接收成功",
  "data": {
    "reportId": "RPT-20240515-001"
  }
}

核心原则:MES反馈的数据必须是“已确认”的,不能是“暂存”的。否则ERP那边算成本会算错。我见过一个工厂,MES把暂存数据也推上去了,结果ERP的财务月结做了三遍才平账。

4.3 接口设计的关键考量

嗯,这里要注意几个点,都是我在实际项目中踩过的坑。

4.3.1 数据一致性

ERP和MES是两个独立的系统,数据同步难免有延迟。我的做法是:以ERP为源头(订单主数据),以MES为执行记录(报工数据)。两边对不上的时候,用对账机制来修复。

4.3.2 异常处理

接口调用失败怎么办?我建议用异步重试+死信队列。比如MES推送报工数据给ERP,ERP返回超时,MES就重试3次。3次都失败,数据进死信队列,人工介入处理。

4.3.3 接口安全

别裸奔。至少加个Token认证,或者用IP白名单。我见过一个项目,接口没做鉴权,结果有人用Postman乱发数据,MES里多了几百条假订单。

4.4 核心逻辑流程图

下面这张图,是我自己画的一个生产订单集成流程。你看一眼,基本就明白整个数据流转了。

ERP系统 MES系统 创建/变更生产订单 (状态:已下达) 接收订单 (排产、派工) 下发订单 订单执行 (开工/完工/报工) 接收状态/报工 (更新成本、库存) 反馈数据 定时对账:确保数据一致

你看,流程其实不复杂。ERP往下发订单,MES往上反馈结果,中间加个对账机制兜底。但就是这看似简单的流程,很多项目都栽在细节上。

避坑指南:我曾经在一个项目里,MES反馈报工数据时,把“合格数量”和“报废数量”搞反了。ERP那边成本算出来是负数,财务直接炸了。后来我们在接口里加了个校验规则:合格数量+报废数量+返工数量必须等于报工总数,否则拒绝接收。从此天下太平。

好了,生产订单集成这块,核心就是“下发”和“反馈”两个动作。你只要把数据结构定义清楚,异常处理做到位,再配个对账机制,基本就稳了。

专注资料整理