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 出库批次属性监控中的关键数据流:

EDI 报文层级结构与 DESADV 批次属性数据流 物理层:EDI 传输协议(AS2、SFTP、OFTP) 语法层:EDIFACT / ANSI X12 标准(段、数据元、分隔符) 报文层:DESADV(发货通知)、INVOIC(发票)、ORDERS(订单) 业务数据层:批次号、生产日期、有效期、序列号、数量 异常检测关键点(WMS 出库批次属性) ① DESADV 批次号 vs WMS 出库批次号是否一致 ② 有效期格式是否符合标准(YYYYMMDD) ③ 序列号是否在 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 报文异常检测规则时,建议按以下优先级处理:
  1. DESADV 报文:作为出库批次属性的直接载体,应配置最严格的校验规则(批次号、有效期、序列号、数量四维校验)。
  2. ORDERS 报文:作为出库依据,应校验出库批次是否满足订单要求(如指定批次或日期范围)。
  3. 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)用于处理重复业务实体,解析时需注意层级关联,避免批次属性错位。