MES制造执行系统也有生产管理系统、车间管理系统这些叫法与ERP、WMS的接口出问题多数出在数据归属没定清楚跟协议选型关系不大。三条设计原则可以先记住主数据单向由ERP下发业务数据由执行系统回传每一笔写入都带幂等键。本地部署和云端部署在接口层面的差异只有三处网络路径、认证方式、断网时的兜底。这篇文章按接口设计的实际顺序展开先定数据归属再定交互模式然后落到表结构、报文和错误处理最后对比两种部署方式。一、先定数据归属再谈接口接口联调卡住时先回去看数据归属。谁是这个字段的源头决定了它往哪个方向流。数据域源头系统流向同步方式物料主数据、BOM、工艺路线ERPERP 到 MES、WMS单向推送供应商、客户主数据ERPERP 到 MES、WMS单向推送销售订单、生产订单ERPERP 到 MES单向推送工单、工序进度、报工MESMES 到 ERP事件回传领料、退料、报废MESMES 到 WMS、ERP事件回传库存收发存、库位、盘点WMSWMS 到 ERP、MES事件回传检验结果、不合格品处置MES 或 QMSMES 到 ERP、WMS事件回传成本归集与凭证ERP由 ERP 核算不回传这张表里源头那一列不能有例外。主数据双向同步是常见的错误来源两边都能改冲突就没有仲裁依据最后变成人工比对。二、主数据与业务数据为什么必须分开设计两类数据的特征完全不同用同一套通道和同一套校验规则两头都会别扭。对比项主数据业务数据变更频率低按周或按月高按单或按秒一致性要求强一致且要留变更痕迹允许最终一致校验方式严格 schema 校验字段缺失直接拒收宽松校验只校验必填字段与格式幂等要求按版本号覆盖按幂等键去重失败处理拒收并告警等人处理重试加死信队列传输时机变更即推送并支持全量对账事件驱动实时推送主数据推送要带版本号接收方按版本号判断是覆盖还是忽略。没有版本号一次乱序投递就能把新数据覆盖成旧数据。三、接口清单MES 与 ERP、MES 与 WMS 各传什么MES 与 ERP 之间方向接口触发时机ERP 到 MES物料主数据同步主数据新增或变更ERP 到 MESBOM 与工艺路线同步版本发布ERP 到 MES生产订单下发订单审核通过MES 到 ERP工单确认回执工单创建成功后MES 到 ERP完工汇报工单完工MES 到 ERP物料消耗与工时回传报工提交MES 到 ERP完工入库通知成品检验合格MES 与 WMS 之间方向接口触发时机MES 到 WMS领料需求工单开工齐套校验通过MES 到 WMS退料申请工单结案或有结余MES 到 WMS完工入库通知检验合格WMS 到 MES拣配完成回执实发完成含实际批次与实发数量WMS 到 MES可用量查询响应MES 发起查询WMS 到 WMS 对账盘点差异通知盘点审核完成注意拣配回执这一条回执里带的必须是实发数量与实际批次不是申请数量。很多项目在这一步用了申请单的数据做扣账结果账面按理论值走实物按实际值走账实差异从上线当天就开始累积。四、同步还是异步一条判断规则判断规则只有一条。上游需要知道下游是否接受以及执行结果用同步上游只需要通知发生了某个业务事实用异步。交互模式技术实现适用场景业务查询同步 HTTP查询库存可用量、校验物料是否存在业务指令同步 HTTP 或事务消息ERP 下发生产订单需要确认 MES 建单结果业务事件异步消息工单完工通知、设备状态变化、遥测数据长流程编排Saga 或补偿事务跨三个以上系统的业务流程有两个判断容易做反。一是 MES 完工通知 ERP 更新库存不需要 ERP 立即回应用普通异步消息二是 ERP 下发生产订单需要知道 MES 是否成功接收用同步或事务消息不能图省事丢进队列就算完。五、表结构以工单和库存事务为例工单是 MES 与 ERP 对齐的主对象业务主键要全系统不重复。-- 工单主表工单号全系统不重复供 MES 与 ERP 两侧对齐CREATETABLEmes_work_order(wo_idBIGINTNOTNULLAUTO_INCREMENTCOMMENT自增主键,wo_noVARCHAR(32)NOTNULLCOMMENT工单号MES生成全系统不重复,erp_order_noVARCHAR(32)NULLCOMMENT来源ERP生产订单号,item_codeVARCHAR(64)NOTNULLCOMMENT成品物料编码,plan_qtyDECIMAL(18,4)NOTNULLCOMMENT计划数量,finish_qtyDECIMAL(18,4)NOTNULLDEFAULT0COMMENT完工数量,wo_statusTINYINTNOTNULLDEFAULT0COMMENT0待开工 1进行中 2已完工 3已关闭,plan_startDATETIMENULLCOMMENT计划开工时间,plan_endDATETIMENULLCOMMENT计划完工时间,version_noINTNOTNULLDEFAULT1COMMENT乐观锁版本号,updated_atDATETIMENOTNULLCOMMENT最后更新时间,PRIMARYKEY(wo_id),UNIQUEKEYuk_wo_no(wo_no),KEYidx_erp_order(erp_order_no))COMMENTMES工单主表;库存事务表的设计关键在幂等键。把幂等键做成数据库层面的去重约束重复投递由数据库拦掉应用层不必先查后写。-- 库存事务流水每笔库存变化都由业务单据驱动CREATETABLEinv_transaction(tx_idBIGINTNOTNULLAUTO_INCREMENT,src_bill_typeVARCHAR(16)NOTNULLCOMMENT来源单据类型领料/退料/完工入库/盘点/调拨,src_bill_noVARCHAR(32)NOTNULLCOMMENT来源单据号,src_line_noINTNOTNULLCOMMENT来源单据行号,item_codeVARCHAR(64)NOTNULLCOMMENT物料编码,batch_noVARCHAR(64)NULLCOMMENT批次号无批次管理时为NULL,warehouse_codeVARCHAR(32)NOTNULLCOMMENT仓库编码,qty_changeDECIMAL(18,4)NOTNULLCOMMENT变动数量出库为负、入库为正,idempotent_keyVARCHAR(128)NOTNULLCOMMENT幂等键格式 src_bill_type:src_bill_no:src_line_no,occurred_atDATETIMENOTNULLCOMMENT业务发生时间取终端或设备本地时间,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(tx_id),UNIQUEKEYuk_idem(idempotent_key))COMMENT库存事务流水;occurred_at 与 created_at 要分开。业务发生时间由终端或设备提供入库时间由数据库产生。做班次统计和时序对账时用的是前者。六、报文设计字段要能自证{eventType:WORK_ORDER_COMPLETED,eventId:8f2c1a90-6b3e-4f7a-9c21-2d5b7e4a1c33,occurredAt:2026-10-09T14:32:0808:00,sourceSystem:MES,contractVersion:1.2,payload:{woNo:WO2026100900012,erpOrderNo:SO2026092800045,itemCode:PCB-A1200-V2,finishQty:480,unit:PCS,scrapQty:6,lines:[{lineNo:10,materialCode:CAP-100UF,batchNo:B20261005-03,qty:960},{lineNo:20,materialCode:RES-10K,batchNo:B20261006-01,qty:1440}]}}信封层有四个字段不能省。eventId 用于幂等occurredAt 记录业务发生时间要跟发送时间区分开sourceSystem 在多系统接入时用来定位来源contractVersion 让接收方能判断契约是否兼容。缺了 contractVersion字段含义变更就只能靠猜。七、幂等与错误处理defhandle_work_order_completed(msg):# 1. 先占幂等位重复消息直接返回成功不再往下走ifnotidem_store.try_acquire(msg[eventId]):return{code:0,msg:duplicate ignored}# 2. 契约版本不认识就进死信队列不猜字段含义ifmsg[contractVersion]notinSUPPORTED_VERSIONS:dlq.send(msg)return{code:4001,msg:unsupported contract version}# 3. 校验业务前置条件工单必须存在wodb.get_work_order(msg[payload][woNo])ifwoisNone:dlq.send(msg)return{code:4004,msg:work order not found}# 4. 业务写入与出站消息在同一事务提交避免账记了回执没发withdb.transaction():db.apply_completion(wo,msg[payload])db.write_outbox(ERP,build_receipt(msg))return{code:0,msg:ok}错误要分两类处理。超时、连接抖动这类可重试的指数退避重试三到五次校验失败、版本不匹配、业务前置条件不满足这类不可重试的直接进死信队列交人处理。两类混在一起重试只会把错误数据反复写进去。出站消息用发件箱模式写入同一事务是防止消息丢失的常见做法代价是多一张出站表和一个投递任务。八、本地部署与云端部署的接口差异对比项厂内本地部署云端部署网络路径厂区局域网内部调用延迟通常在毫秒级经公网或专线延迟受出口带宽影响与 ERP 的关系ERP 也在厂内时多为内网直连需要 VPN 或专线打通认证方式内网服务账号权限按网段收敛必须做鉴权OAuth 2.0 客户端凭证或签名硬件对接扫码枪、标签打印机、RFID 读写器走局域网硬件仍在厂内需边缘网关把数据送上云断网影响局域网中断时终端与服务器同时不可用车间与云断开时需本地缓存与断点补传运维与备份企业自行维护备份策略自己定服务商负责运维与备份升级统一安排数据边界数据不出厂需明确存放地、传输加密与审计日志有一个坑要单独说。本地部署的工厂容易认为内网不出厂就没有安全问题接口不加鉴权只要连上内网就能调。制造业内网横向渗透这些年并不少见内网接口一样要做服务账号隔离、最小权限和审计日志。九、落地顺序主数据治理排在接口开发前面顺序建议是顶层规划与边界划分主数据标准化治理集成通道搭建分系统对接场景闭环调试运维体系建设。跳过主数据治理直接开发接口后期至少增加 30% 的工作量用于数据纠错来源搜狐科技频道关于 MES 与 ERP、WMS 集成的公开分析2026 年。边界有没有划清可以看一份文档能不能写出来哪个字段谁是源头、变更怎么通知、异常谁负责、超时重试几次。写不出来说明边界还没定这时候开工多半要返工。十、常见问题点对点直连还是走集成中台两个系统对接点对点最快。三个系统以上建议收口到统一通道否则每加一个系统都要新增一批连接改一个字段要动多处。内网部署能用消息队列吗可以。厂内本地部署同样能搭消息中间件业务事件与设备遥测分不同主题互不阻塞。历史数据怎么迁先迁主数据再迁事务数据。事务数据按单据类型分批每批迁完做一次存量与流水对账账不平先停下查不要带着差异往下迁。接口联调要多久取决于现有 ERP 的开放能力和主数据质量。接口工作量建议在报价阶段就明确避免实施中途再加费用。
阅读完成 · 觉得有帮助?