ITPub博客

首页 > 数据库 > MySQL > MES与WMS库存同步:接口设计与对账表怎么做

MES与WMS库存同步:接口设计与对账表怎么做

原创 MySQL 作者:制造业数字化观察 时间:2026-11-02 12:35:31 0 删除 编辑

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. 双方的物料编码、单位、库位编码对照表经过仓库和生产共同确认。

FAQ

问:已经有ERP接口了,MES和WMS之间还需要直接对接吗?

答:如果线边物料需要按批次、库位实时管理,建议直接对接;绕道ERP中转会增加延迟,而且ERP通常不管理线边库位这一级。

问:发件箱表会不会越来越大?

答:已成功发送的消息可以按月归档或清理,但建议保留一段时间以便对账时调取原始报文,保留期与对账周期相匹配。

问:对账多久做一次合适?

答:日终对账是常见起点;线边周转快、物料价值高的场景可以增加班末对账,前提是双方能在同一时点生成快照。

问:WMS不支持幂等怎么办?

答:可以在中间加一层接口服务,由它维护收件箱表做去重,再调用WMS的原始接口;同时推动WMS侧按业务单号做重复校验。

问:差异处理应该由谁负责?

答:建议按差异类型划分:单据缺失由接口运维排查,数量差异由仓库和线边物料员共同确认,余额差异由库存负责人审批调整。

更新于2026年11月

本文为作者原创,转载请注明出处与作者。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70051529/viewspace-3187328/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
关注离散制造MES、WMS、条码追溯与设备数据采集的实施经验分享。

注册时间:2026-10-24

  • 博文量
    7
  • 访问量
    4262