首页 > 数据库 > MySQL > MES与WMS库存同步:接口设计与对账表怎么做
MES与WMS之间的库存同步,可靠做法是“发件箱表+幂等收件表+日终对账表”:业务数据和待发送的消息在同一个本地事务里落库,接收方按消息号去重,每天再按单据、数量、余额三个层次对一次账。实时接口负责快,对账负责准,两者缺一不可,只有接口没有对账的系统,账实差异迟早会出现且无法定位。
“双箱三对”是指:发送方用发件箱表保证消息不丢,接收方用收件箱表保证消息不重,日终再做单据对、数量对、余额对三层核对。它把“接口偶尔失败”这件无法避免的事,变成可发现、可重放、可解释的事。
MES与WMS之间的库存交互集中在线边仓这一段:叫料、发料、退料、完工入库和库存快照五类,边界要先划清。
| 接口 | 方向 | 触发时机 | 关键字段 |
|---|---|---|---|
| 叫料单 | MES→WMS | 工单开工前或线边库存低于下限 | 叫料单号、工单号、物料编码、需求数量、需求时间、线边库位 |
| 发料确认 | WMS→MES | 仓库拣货出库并扫码交接后 | 出库单号、叫料单号、物料批次、实发数量、交接时间 |
| 线边退料 | MES→WMS | 工单完工或换型后余料退回 | 退料单号、工单号、物料批次、退料数量、退料原因 |
| 完工入库 | MES→WMS | 包装完成、报工确认后 | 入库申请号、工单号、成品编码、批次或箱码、数量 |
| 库存快照 | 双向 | 每日固定时点 | 快照时间、库位、物料编码、批次、数量 |
与ERP接口关注的是订单、BOM和财务过账不同,MES与WMS接口关注的是实物在仓库与线边之间的移动,颗粒度要细到批次和库位。
同步机制落在五张表上:两张负责传输,三张负责对账。
| 表名 | 关键字段 | 用途 |
|---|---|---|
| sync_outbox | msg_id(主键)、biz_type、biz_no、payload、status、retry_count、next_retry_at、created_at | 发件箱:业务提交时同事务写入,后台任务轮询发送 |
| sync_inbox | msg_id(主键)、biz_type、biz_no、received_at、process_status、error_msg | 收件箱:按消息号去重,记录处理结果 |
| line_stock_move | move_id、biz_no、material_code、lot_no、location、qty_delta、move_time | 线边库存流水,每条移动对应一张单据 |
| recon_snapshot | recon_date、side(MES/WMS)、location、material_code、lot_no、qty | 双方同一时点的库存快照 |
| recon_diff | recon_date、diff_level、biz_no、material_code、lot_no、mes_qty、wms_qty、reason、handled_by | 对账差异明细与处理结论 |
在实时接口、定时批量和消息队列三种方式之间,多数车间可以先用“发件箱+接口调用”,等系统规模扩大再引入消息中间件,发件箱表的设计不需要改。
| 方式 | 及时性 | 可靠性要点 | 适合 |
|---|---|---|---|
| 同步接口直接调用 | 高 | 对方不可用时业务操作会失败或卡住 | 不推荐单独使用 |
| 发件箱+后台推送 | 较高 | 本地事务保证不丢,失败可重试 | 多数MES与WMS对接 |
| 定时批量文件或中间表 | 较低 | 简单,但延迟大、冲突难定位 | 老系统改造、只能读写中间库 |
| 消息队列 | 高 | 仍需发件箱防丢、收件箱防重 | 多系统、多工厂 |
关键只有两点:发送方的业务写入和消息写入必须在同一事务里;接收方必须先按消息号插入收件箱,插入成功才处理业务。
-- 发送方(MES):报工完工与入库申请消息同事务落库
START TRANSACTION;
UPDATE work_order SET finished_qty = finished_qty + 100 WHERE wo_no = 'WO示例01';
INSERT INTO sync_outbox (msg_id, biz_type, biz_no, payload, status, retry_count, next_retry_at, created_at)
VALUES ('MSG-示例-0001', 'FG_INBOUND', 'IN示例01',
'{"wo":"WO示例01","item":"FG示例","qty":100,"box":["BX01","BX02"]}',
'NEW', 0, NOW(), NOW());
COMMIT;
-- 接收方(WMS):先去重,再处理
INSERT IGNORE INTO sync_inbox (msg_id, biz_type, biz_no, received_at, process_status)
VALUES ('MSG-示例-0001', 'FG_INBOUND', 'IN示例01', NOW(), 'RECEIVED');
-- 影响行数为0:说明已收过,直接返回成功,不重复入库
-- 影响行数为1:执行入库逻辑,完成后把 process_status 更新为 DONE
推送任务按 status 和 next_retry_at 取待发消息,失败时 retry_count 加一并按递增间隔重排;超过重试上限的消息转为人工处理状态,而不是被静默丢弃。消息号由发送方生成并在重试时保持不变,这是幂等成立的前提。
对账按“单据→数量→余额”三层递进:先确认双方单据一一对应,再确认每张单据的数量一致,再确认同一时点的库存余额一致。
-- 层次一:单据对(MES有、WMS没有) -- wms_inbox_copy 为每日从WMS收件箱同步过来的只读副本 SELECT o.biz_no FROM sync_outbox o LEFT JOIN wms_inbox_copy w ON w.biz_no = o.biz_no WHERE o.created_at >= '2026-11-01' AND o.created_at < '2026-11-02' AND w.biz_no IS NULL; -- 层次三:余额对(同一时点快照) SELECT m.location, m.material_code, m.lot_no, m.qty AS mes_qty, w.qty AS wms_qty FROM recon_snapshot m JOIN recon_snapshot w ON w.recon_date = m.recon_date AND w.side = 'WMS' AND w.location = m.location AND w.material_code = m.material_code AND w.lot_no = m.lot_no WHERE m.recon_date = '2026-11-01' AND m.side = 'MES' AND m.qty <> w.qty;
上面的余额对只列出双方都有记录但数量不同的行;单边存在的批次要再用外连接各查一次。差异写入 recon_diff 时必须带 reason,常见原因有在途未确认、扫码漏扫、手工调整未同步和单位换算不一致,处理人确认后才能关闭。
步骤一,和仓库、生产一起画出线边仓的实物流向,确定五类单据的边界和责任方。
步骤二,统一主数据:物料编码、计量单位、库位编码、批次规则在两边保持一致。
步骤三,建发件箱、收件箱和线边流水表,改造业务操作为同事务写消息。
步骤四,开发推送与重试任务,定义重试上限和人工处理入口。
步骤五,约定每日快照时点,开发三层对账脚本和差异处理页面。
步骤六,并行运行一段时间,每天处理差异,直到差异原因都能被解释。
1. 先调用对方接口再提交本地事务,接口成功而本地回滚,两边数据从此不一致。
2. 重试时重新生成消息号,接收方无法去重,同一批成品被重复入库。
3. 双方快照时点不同,在途单据被误判为差异,对账结果失去参考价值。
4. MES按“件”、WMS按“箱”记数,接口里没有统一换算,数量总对不上。
5. 失败消息超过重试次数后被直接删除,差异出现时找不到原始报文。
6. 退料接口只传物料不传批次,批次库存在WMS里变成“无批次”余额。
7. 线边库存允许在两个系统里分别手工调整,差异原因无法追溯。
早班开工前,MES根据工单生成叫料单写入发件箱,推送给WMS。仓库按批次拣货,交接时扫码确认,WMS回传发料确认,MES的线边库存增加对应批次。生产中途网络中断约二十分钟,期间完工的两箱成品入库消息留在发件箱里,网络恢复后自动重发;WMS发现其中一条消息号已经收过,直接返回成功,没有重复入库。第二天的日终对账显示一个物料的线边余额相差一个包装量,查明是换型时余料退回未扫码,补录退料单后差异关闭。
1. 人为中断网络后恢复,发件箱中的消息全部补发成功,且没有重复入库。
2. 用同一消息号重复推送,接收方只处理一次。
3. 超过重试上限的消息出现在人工处理列表中,原始报文可查看。
4. 三层对账脚本能分别列出单据缺失、数量不一致和余额不一致的明细。
5. 每条差异都有原因和处理人,关闭前不能删除。
6. 双方的物料编码、单位、库位编码对照表经过仓库和生产共同确认。
问:已经有ERP接口了,MES和WMS之间还需要直接对接吗?
答:如果线边物料需要按批次、库位实时管理,建议直接对接;绕道ERP中转会增加延迟,而且ERP通常不管理线边库位这一级。
问:发件箱表会不会越来越大?
答:已成功发送的消息可以按月归档或清理,但建议保留一段时间以便对账时调取原始报文,保留期与对账周期相匹配。
问:对账多久做一次合适?
答:日终对账是常见起点;线边周转快、物料价值高的场景可以增加班末对账,前提是双方能在同一时点生成快照。
问:WMS不支持幂等怎么办?
答:可以在中间加一层接口服务,由它维护收件箱表做去重,再调用WMS的原始接口;同时推动WMS侧按业务单号做重复校验。
问:差异处理应该由谁负责?
答:建议按差异类型划分:单据缺失由接口运维排查,数量差异由仓库和线边物料员共同确认,余额差异由库存负责人审批调整。
更新于2026年11月
本文为作者原创,转载请注明出处与作者。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70051529/viewspace-3187328/ ,如需转载,请注明出处,否则将追究法律责任。