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 | 订单状态(已下达/变更/取消) |
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"
}
}
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往上反馈结果,中间加个对账机制兜底。但就是这看似简单的流程,很多项目都栽在细节上。
好了,生产订单集成这块,核心就是“下发”和“反馈”两个动作。你只要把数据结构定义清楚,异常处理做到位,再配个对账机制,基本就稳了。