3. EDI 报文基础:标准、结构与常见类型
EDI(电子数据交换)是 WMS 与上下游系统(ERP、客户、供应商)进行自动化数据交换的核心技术。在 WMS 出库批次属性监控场景中,EDI 报文承载了发货通知、库存转移、订单确认等关键信息。理解 EDI 的标准、报文结构及常见报文类型,是构建异常检测规则的前提。
3.1 EDI 标准:EDIFACT 与 ANSI X12
全球主流的 EDI 标准主要有两种:UN/EDIFACT(国际标准,欧洲/亚洲广泛使用)和 ANSI ASC X12(北美标准,美国/加拿大广泛使用)。两者在语法规则、段定义和报文结构上存在差异,但核心逻辑一致。
| 对比维度 | UN/EDIFACT | ANSI X12 |
|---|---|---|
| 制定组织 | 联合国欧洲经济委员会(UN/ECE) | 美国国家标准协会(ANSI) |
| 报文标识 | 6 字母代码(如 DESADV、INVOIC) | 3 位数字代码(如 856、810、850) |
| 段终止符 | 单引号(') | 波浪号(~) |
| 数据元分隔符 | 加号(+) | 星号(*) |
| 复合数据元分隔符 | 冒号(:) | 冒号(:) |
| 典型报文 | DESADV(发货通知)、INVOIC(发票)、ORDERS(订单) | 856(发货通知)、810(发票)、850(采购订单) |
实战提示:在 WMS 出库批次属性监控中,DESADV(发货通知)是最关键的报文。它包含了出库货物的批次号、生产日期、有效期、序列号等批次属性。如果 DESADV 报文中的批次属性与 WMS 出库记录不一致,将直接导致客户拒收或合规风险。
3.2 报文结构:段、数据元、复合数据元
EDI 报文采用层级结构组织数据,从大到小依次为:报文(Message)→ 段组(Segment Group)→ 段(Segment)→ 复合数据元(Composite Data Element)→ 数据元(Data Element)。
- 段(Segment):报文的基本组成单元,由段标识符(3 字母代码)和若干数据元组成。例如
LIN+1++1234567890:EN表示行项目段。 - 数据元(Data Element):最小的不可分割的数据单元,有固定长度或可变长度。例如批次号、数量、日期。
- 复合数据元(Composite Data Element):由多个简单数据元组合而成,用冒号分隔。例如
1234567890:EN表示“产品代码:代码标识符”。
EDIFACT 报文结构示例(DESADV 片段):
UNH+1+DESADV:D:96A:UN' ; 报文头
BGM+351+SHIP12345+9' ; 发货通知编号
DTM+137:20250315:102' ; 发货日期
NAD+BY+::CUST001' ; 买方信息
LIN+1++BATCH-1001:BP' ; 行项目 + 批次号
QTY+12:500:KGM' ; 数量 500 KG
DTM+36:20250601:102' ; 有效期
RFF+ON:PO-2025-001' ; 关联订单号
UNT+8+1' ; 报文尾
常见异常点:在 WMS 出库批次属性监控中,
LIN 段中的批次号(如 BATCH-1001)与 DTM+36 中的有效期必须与 WMS 出库记录完全匹配。任何不一致(如批次号拼写错误、有效期格式错误)都应触发告警。
3.3 常见报文类型:DESADV、INVOIC、ORDERS
在 WMS 出库场景中,以下三种报文类型最为常见:
| 报文类型 | EDIFACT 代码 | X12 代码 | 主要用途 | 与批次属性的关系 |
|---|---|---|---|---|
| 发货通知 | DESADV | 856 | 通知收货方即将发货的货物明细,包括批次、数量、包装信息 | 直接包含批次号、生产日期、有效期、序列号 |
| 发票 | INVOIC | 810 | 发送给客户的账单,包含价格、税额、折扣 | 通常不包含批次属性,但需与 DESADV 数量一致 |
| 采购订单 | ORDERS | 850 | 客户向供应商下达的订单,包含物料、数量、交货日期 | 可能包含批次要求(如指定批次),用于校验出库合规性 |
3.4 EDI 报文结构示意图
下图展示了 EDI 报文从物理层到业务层的层级关系,以及 DESADV 报文在 WMS 出库批次属性监控中的关键数据流:
3.5 常见报文类型对比:DESADV vs INVOIC vs ORDERS
在 WMS 出库批次属性监控中,三种报文类型承担不同角色,异常检测规则也各有侧重:
| 报文类型 | 核心数据元 | 批次属性关联 | 典型异常场景 |
|---|---|---|---|
| DESADV | LIN(行项目)、QTY(数量)、DTM(日期/时间)、RFF(参考号)、PCI(包装标识) | 强关联:批次号、生产日期、有效期、序列号、包装等级 | 批次号不存在、有效期已过期、序列号重复、数量与 WMS 出库不一致 |
| INVOIC | LIN(行项目)、QTY(数量)、MOA(金额)、TAX(税)、PRI(价格) | 弱关联:通常不包含批次属性,但需校验数量与 DESADV 一致 | 发票数量 > 发货数量、价格与合同不符、缺少税信息 |
| ORDERS | LIN(行项目)、QTY(数量)、DTM(日期/时间)、NAD(地址)、RFF(参考号) | 中关联:可能包含批次要求(如指定批次号或生产日期范围) | 订单要求批次 A 但出库批次 B、交货日期早于生产日期、数量超订单上限 |
实战建议:在构建 EDI 报文异常检测规则时,建议按以下优先级处理:
- DESADV 报文:作为出库批次属性的直接载体,应配置最严格的校验规则(批次号、有效期、序列号、数量四维校验)。
- ORDERS 报文:作为出库依据,应校验出库批次是否满足订单要求(如指定批次或日期范围)。
- INVOIC 报文:作为财务对账依据,主要校验数量一致性,避免多开或少开。
3.6 报文结构解析:段组与循环
在复杂 EDI 报文中,段可以组成段组(Segment Group),用于表示重复的业务实体(如多个行项目、多个包装层级)。段组以 SG 开头,后跟数字编号。
以 DESADV 报文为例,常见的段组结构如下:
UNH+1+DESADV:D:96A:UN' ; 报文头
BGM+351+SHIP12345+9' ; 发货通知编号
DTM+137:20250315:102' ; 发货日期
NAD+BY+::CUST001' ; 买方信息
SG1 ; 段组 1:行项目循环
LIN+1++BATCH-1001:BP' ; 行项目 1
QTY+12:500:KGM' ; 数量
DTM+36:20250601:102' ; 有效期
SG2 ; 段组 2:包装层级循环
PCI+33E' ; 包装标识
GIN+AT+BOX001' ; 序列号(箱号)
QTY+12:20:KGM' ; 箱内数量
SG2+ ; 段组 2 结束
SG1+ ; 段组 1 结束
UNT+12+1' ; 报文尾
解析技巧:在 Python 中解析 EDI 报文时,建议使用
pyx12 或 python-edifact 库。对于段组循环,可以使用递归或栈结构来维护当前层级,确保批次属性与正确的行项目关联。
3.7 本章小结
- EDI 标准主要有 EDIFACT 和 ANSI X12 两种,WMS 出库场景中 DESADV 是最关键的报文类型。
- 报文结构采用 段 → 复合数据元 → 数据元 的层级组织,批次属性通常出现在
LIN、DTM、GIN等段中。 - 常见报文类型 DESADV、INVOIC、ORDERS 在批次属性监控中承担不同角色,需配置差异化的校验规则。
- 段组(Segment Group)用于处理重复业务实体,解析时需注意层级关联,避免批次属性错位。