在《STIHL EDI需求分析》一文中,着重分析了STIHL的需求,比如要求AS2传输,EDIFACT标准,涉及五种不同类型的业务文件。同时基于知行EDI平台,建立EDI工作流,解析与生成EDIFACT标准文件,同时实现和ERP系统集成。接下来介绍STIHL与供应商 DELFOR(交货计划)的业务需求和实现场景,以及解决方案的实现过程。
采购商接收由STIHL发送给供应商的DELFOR 报文,在STIHL EDI解决方案中提到,接收方向的工作流如下:
下面以自定义XML解决方案为例,演示DELFOR的解析步骤。
报文转换
将从STIHL收到的EDIFACT标准的DELFOR 转换为自定义XML,主要分为以下步骤:
- EDIFACT标准的DELFOR报文
Delivery schedule – DELFOR
下文摘出EDIFACT标准报文的核心部分,附上文字说明,先了解DELFOR会携带的核心业务信息。
BGM+241+DELFOR0000001+5+AB'
-241 = Delivery schedule
-交货计划编号:DELFOR0000001
-5 = Replaces previous delivery schedule
DTM+137:20151110:102'
-137 = Document/message date/time
-交货计划日期:20151110
DTM+157:20151110:102'
-157 = Validity start date
-有效起始日期:20151110
NAD+SE+Seller code::92++Seller Name+Seller address++postcode+country code'
-SE = Seller
-销售方编号:Seller code
-销售方姓名:Seller Name
-销售方地址:Seller address
-邮编:postcode
-国家代码:country code
NAD+BY+Buyer code::91++Buyer Name+Buyer Address++postcode+country code'
-BY = Buyer
-采购方编号:Buyer code
-采购方姓名:Buyer Name
-采购方地址:Buyer address
-邮编:postcode
-国家代码:country code
GIS+95'
-Header/detailed section separation
LIN+1++1234567:BP::92'
-BP = Buyer’s item/article number
-采购方物料编号:1234567
IMD+++::92:description'
-物料描述:description
FTX+COI+++Purchase order text'
-采购订单备注:Purchase order text
RFF+CO:order number:00001'
-采购订单编号:order number
-采购订单行号:000001
RFF+AAN:2'
-新预测编号:2
DTM+171:20151110:102'
-171 = Reference date/time
-新预测日期:20151110
RFF+SH:1'
-旧预测编号:1
DTM+171:20151103:102'
-171 = Reference date/time
-旧预测日期:20151110
NAD+CN+01::92++Delivery name+Delivery address+++postcode+country code'
-BY = Delivery
-收货方仓库:01
-收货方姓名:Delivery Name
-收货方地址:Delivery address
-邮编:postcode
-国家代码:country code
CTA+IC+key:name'
-IC = MRP controller
-物料管理员编号:key
-物料管理员姓名:name
COM++tel-number:TE'
-TE = Telephone number
-电话号码:tel-number
COM++fax-number:FX'
-FX = Fax number
-电话号码:fax-number
QTY+48:576:PCE'
-48 = Received quantity
-上一次接收数量:576
DTM+50:20151013:102'
-50 = Date of most recent delivery
-上次收货时间:20151013
RFF+DQ:DN0000001'
-DQ = last delivery note number
-上次发货通知编号:DN0000001
QTY+70:2880:PCE'
-70 = Input cumulative quantity
-累计接收数量:2880
DTM+51:20150101:102'
-51 = data cumulative quantity last reset
-累计开始时间:20150101
SCC+3'
-3 = Material procurement release
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
DTM+2:20160121:102'
-2 = Delivery date/time, requested
-需求日期:20160121
SCC+4'
-4 = Preview without go-ahead
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
DTM+2:20160211:102'
-2 = Delivery date/time, requested
-需求日期:20160121
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
DTM+64:20170101:102'
-64 = start of needs period
-开始日期:20170101
DTM+63:20170131:102'
-63 = End of needs period
-结束日期:20170131
QTY+113:576:PCE'
-113 = Quantity to be delivered
-需求数量:576
-数量单位:PCE
DTM+64:20170301:102'
-64 = start of needs period
-开始日期:20170101
DTM+63:20170331:102'
-63 = End of needs period
-结束日期:20170131
- 使用EDIFACT端口,将DELFOR报文转化为EDI系统标准XML,以Delivery Schedule为例,结果如下:
相对原始EDIFACT DELFOR来说,以下标准XML格式对技术工程师来说,更易处理,但XML结构略复杂一些,同时有许多冗余信息,将在下一步作XML简化。
<TransactionSet>
<TX-D99B-DELFOR type="TransactionSet">
<Meta>
<!--Message reference number-->
<_0062>0</_0062>
<!--MESSAGE IDENTIFIER-->
<S009 type="Composite">
<!--Message type-->
<_0065><!--Delivery schedule message-->DELFOR</_0065>
<!--Message version number-->
<_0052><!--Draft version/UN/EDIFACT Directory-->D</_0052>
<!--Message release number-->
<_0054><!--Release 1999 - B-->99B</_0054>
<!--Controlling agency, coded-->
<_0051><!--UN/CEFACT-->UN</_0051>
</S009>
</Meta>
<BGM type="Segment">
<!--DOCUMENT/MESSAGE NAME-->
<C002 type="Composite">
<!--Document name code-->
<_1001><!--Delivery schedule-->241</_1001>
</C002>
<!--DOCUMENT/MESSAGE IDENTIFICATION-->
<C106 type="Composite">
<!--Document/message number-->
<_1004>DELFOR0000001</_1004>
</C106>
<!--Message function code-->
<_1225><!--Replace-->5</_1225>
<!--Response type code-->
<_4343><!--Message acknowledgement-->AB</_4343>
</BGM>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>137</_2005>
<!--Date/time/period value-->
<_2380>20151110</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>157</_2005>
<!--Date/time/period value-->
<_2380>20151110</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
<NADLoop1 type="Loop">
<NAD type="Segment">
<!--Party function code qualifier-->
<_3035><!--Seller-->SE</_3035>
<!--PARTY IDENTIFICATION DETAILS-->
<C082 type="Composite">
<!--Party identifier-->
<_3039>Seler code</_3039>
<!--Code list identification code-->
<_1131></_1131>
<!--Code list responsible agency code-->
<_3055><!--Assigned by buyer or buyer's agent-->92</_3055>
</C082>
<!--NAME AND ADDRESS-->
<C058 type="Composite">
</C058>
<!--PARTY NAME-->
<C080 type="Composite">
<!--Party name-->
<_3036>Seller Name</_3036>
</C080>
<!--STREET-->
<C059 type="Composite">
<!--Street and number/p.o. box-->
<_3042>Seller address</_3042>
</C059>
<!--City name-->
<_3164></_3164>
<!--COUNTRY SUB-ENTITY DETAILS-->
<C819 type="Composite">
</C819>
<!--Postal identification code-->
<_3251>postcode</_3251>
<!--Country name code-->
<_3207>country code</_3207>
</NAD>
</NADLoop1>
<NADLoop1 type="Loop">
<NAD type="Segment">
<!--Party function code qualifier-->
<_3035><!--Buyer-->BY</_3035>
<!--PARTY IDENTIFICATION DETAILS-->
<C082 type="Composite">
<!--Party identifier-->
<_3039>Buyer code</_3039>
<!--Code list identification code-->
<_1131></_1131>
<!--Code list responsible agency code-->
<_3055><!--Assigned by seller or seller's agent-->91</_3055>
</C082>
<!--NAME AND ADDRESS-->
<C058 type="Composite">
</C058>
<!--PARTY NAME-->
<C080 type="Composite">
<!--Party name-->
<_3036>Buyer name</_3036>
</C080>
<!--STREET-->
<C059 type="Composite">
<!--Street and number/p.o. box-->
<_3042>Buyer address</_3042>
</C059>
<!--City name-->
<_3164></_3164>
<!--COUNTRY SUB-ENTITY DETAILS-->
<C819 type="Composite">
<!--Country sub-entity name code-->
<_3229></_3229>
</C819>
<!--Postal identification code-->
<_3251>postcode</_3251>
<!--Country name code-->
<_3207>country code</_3207>
</NAD>
</NADLoop1>
<GISLoop1 type="Loop">
<GIS type="Segment">
<!--PROCESSING INDICATOR-->
<C529 type="Composite">
<!--Processing indicator description code-->
<_7365><!--Product driven scheduling method-->95</_7365>
</C529>
</GIS>
<LINLoop1 type="Loop">
<LIN type="Segment">
<!--Line item number-->
<_1082>1</_1082>
<!--Action request/notification description code-->
<_1229/>
<!--ITEM NUMBER IDENTIFICATION-->
<C212 type="Composite">
<!--Item number-->
<_7140>1234567</_7140>
<!--Item type identification code-->
<_7143><!--Buyer's part number-->BP</_7143>
<!--Code list identification code-->
<_1131></_1131>
<!--Code list responsible agency code-->
<_3055><!--Assigned by buyer or buyer's agent-->92</_3055>
</C212>
</LIN>
<IMD type="Segment">
<!--Item description type, coded-->
<_7077/>
<!--ITEM CHARACTERISTIC-->
<C272 type="Composite">
</C272>
<!--ITEM DESCRIPTION-->
<C273 type="Composite">
<!--Item description identification-->
<_7009></_7009>
<!--Code list identification code-->
<_1131></_1131>
<!--Code list responsible agency code-->
<_3055><!--Assigned by buyer or buyer's agent-->92</_3055>
<!--Item description-->
<_7008>description</_7008>
</C273>
</IMD>
<FTX type="Segment">
<!--Text subject code qualifier-->
<_4451><!--Order information-->COI</_4451>
<!--Text function, coded-->
<_4453/>
<!--TEXT REFERENCE-->
<C107 type="Composite">
</C107>
<!--TEXT LITERAL-->
<C108 type="Composite">
<!--Free text value-->
<_4440>Purchase order text</_4440>
</C108>
</FTX>
<RFFLoop4 type="Loop">
<RFF type="Segment">
<!--REFERENCE-->
<C506 type="Composite">
<!--Reference function code qualifier-->
<_1153>CO</_1153>
<!--Reference identifier-->
<_1154>order number</_1154>
<!--Line number-->
<_1156>00001</_1156>
</C506>
</RFF>
</RFFLoop4>
<RFFLoop4 type="Loop">
<RFF type="Segment">
<!--REFERENCE-->
<C506 type="Composite">
<!--Reference function code qualifier-->
<_1153>AAN</_1153>
<!--Reference identifier-->
<_1154>2</_1154>
</C506>
</RFF>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>171</_2005>
<!--Date/time/period value-->
<_2380>20151110</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
</RFFLoop4>
<RFFLoop4 type="Loop">
<RFF type="Segment">
<!--REFERENCE-->
<C506 type="Composite">
<!--Reference function code qualifier-->
<_1153>SH</_1153>
<!--Reference identifier-->
<_1154>1</_1154>
</C506>
</RFF>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>171</_2005>
<!--Date/time/period value-->
<_2380>20151103</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
</RFFLoop4>
<NADLoop3 type="Loop">
<NAD type="Segment">
<!--Party function code qualifier-->
<_3035><!--Consignee-->CN</_3035>
<!--PARTY IDENTIFICATION DETAILS-->
<C082 type="Composite">
<!--Party identifier-->
<_3039>D5</_3039>
<!--Code list identification code-->
<_1131></_1131>
<!--Code list responsible agency code-->
<_3055><!--Assigned by buyer or buyer's agent-->92</_3055>
</C082>
<!--NAME AND ADDRESS-->
<C058 type="Composite">
</C058>
<!--PARTY NAME-->
<C080 type="Composite">
<!--Party name-->
<_3036>Delivery name</_3036>
</C080>
<!--STREET-->
<C059 type="Composite">
<!--Street and number/p.o. box-->
<_3042>Delivery address</_3042>
</C059>
<!--City name-->
<_3164></_3164>
<!--COUNTRY SUB-ENTITY DETAILS-->
<C819 type="Composite">
</C819>
<!--Postal identification code-->
<_3251>postcode</_3251>
<!--Country name code-->
<_3207>country code</_3207>
</NAD>
<CTALoop3 type="Loop">
<CTA type="Segment">
<!--Contact function code-->
<_3139><!--Information contact-->IC</_3139>
<!--DEPARTMENT OR EMPLOYEE DETAILS-->
<C056 type="Composite">
<!--Department or employee identification-->
<_3413>key</_3413>
<!--Department or employee-->
<_3412>name</_3412>
</C056>
</CTA>
<COM type="Segment">
<!--COMMUNICATION CONTACT-->
<C076 type="Composite">
<!--Communication number-->
<_3148>tel-number</_3148>
<!--Communication number code qualifier-->
<_3155>TE</_3155>
</C076>
</COM>
<COM type="Segment">
<!--COMMUNICATION CONTACT-->
<C076 type="Composite">
<!--Communication number-->
<_3148>fax-number</_3148>
<!--Communication number code qualifier-->
<_3155>FX</_3155>
</C076>
</COM>
</CTALoop3>
<QTYLoop3 type="Loop">
<QTY type="Segment">
<!--QUANTITY DETAILS-->
<C186 type="Composite">
<!--Quantity type code qualifier-->
<_6063><!--Received quantity-->48</_6063>
<!--Quantity-->
<_6060>576</_6060>
<!--Measurement unit code-->
<_6411>PCE</_6411>
</C186>
</QTY>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>50</_2005>
<!--Date/time/period value-->
<_2380>20151013</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
<RFFLoop7 type="Loop">
<RFF type="Segment">
<!--REFERENCE-->
<C506 type="Composite">
<!--Reference function code qualifier-->
<_1153>DQ</_1153>
<!--Reference identifier-->
<_1154>DN0000001</_1154>
</C506>
</RFF>
</RFFLoop7>
</QTYLoop3>
<SCCLoop2 type="Loop">
<SCC type="Segment">
<!--Delivery plan commitment level code-->
<_4017><!--Commitment for material-->3</_4017>
</SCC>
<QTYLoop4 type="Loop">
<QTY type="Segment">
<!--QUANTITY DETAILS-->
<C186 type="Composite">
<!--Quantity type code qualifier-->
<_6063><!--Quantity to be delivered-->113</_6063>
<!--Quantity-->
<_6060>576</_6060>
<!--Measurement unit code-->
<_6411>PCE</_6411>
</C186>
</QTY>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>2</_2005>
<!--Date/time/period value-->
<_2380>20160121</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
</QTYLoop4>
</SCCLoop2>
<SCCLoop2 type="Loop">
<SCC type="Segment">
<!--Delivery plan commitment level code-->
<_4017><!--Planning/forecast-->4</_4017>
</SCC>
<QTYLoop4 type="Loop">
<QTY type="Segment">
<!--QUANTITY DETAILS-->
<C186 type="Composite">
<!--Quantity type code qualifier-->
<_6063><!--Quantity to be delivered-->113</_6063>
<!--Quantity-->
<_6060>576</_6060>
<!--Measurement unit code-->
<_6411>PCE</_6411>
</C186>
</QTY>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>2</_2005>
<!--Date/time/period value-->
<_2380>20160211</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
</QTYLoop4>
<QTYLoop4 type="Loop">
<QTY type="Segment">
<!--QUANTITY DETAILS-->
<C186 type="Composite">
<!--Quantity type code qualifier-->
<_6063><!--Quantity to be delivered-->113</_6063>
<!--Quantity-->
<_6060>576</_6060>
<!--Measurement unit code-->
<_6411>PCE</_6411>
</C186>
</QTY>
<DTM type="Segment">
<!--DATE/TIME/PERIOD-->
<C507 type="Composite">
<!--Date/time/period function code qualifier-->
<_2005>2</_2005>
<!--Date/time/period value-->
<_2380>20160331</_2380>
<!--Date/time/period format code-->
<_2379>102</_2379>
</C507>
</DTM>
</QTYLoop4>
</SCCLoop2>
</NADLoop3>
</LINLoop1>
</GISLoop1>
</TX-D99B-DELFOR>
</TransactionSet>
- 使用XML Map端口,将标准XML格式转换为自定义XML
下文输出的自定义XML,仅保留了与核心业务相关的数据,阅读起来简单直白。
以Delivery Schedule为例:
<Item>
<OrderHeader>
<!-- 交货计划编号 -->
<forecase_number>DELFOR0000001</forecase_number>
<!-- 交货计划日期 -->
<create_datetime>20151110</create_datetime>
<!-- 采购方编号 -->
<buyer_code>Buyer code</buyer_code>
<!-- 采购方姓名 -->
<buyer_name>Buyer Name</buyer_name>
<!-- 采购方地址 -->
<buyer_address>Buyer address</buyer_address>
<!-- 销售方编号 -->
<seller_code>Seller code</seller_code>
<!-- 销售方姓名 -->
<seller_name>Seller Name</seller_name>
<!-- 销售方地址 -->
<seller_address>Seller address</seller_address>
<!-- 交货计划明细行 下文有三条明细数据 -->
<OrderLine>
<!-- 采购方物料编号 -->
<buyer_item_number>1234567</buyer_item_number>
<!-- 物料描述 -->
<item_descript>description</item_descript>
<!-- 采购订单编号 -->
<order_number>order number</order_number>
<!-- 采购订单行号 -->
<order_line_no>00001</order_line_no>
<!-- 需求数量 -->
<quantity>576</quantity>
<!-- 需求日期 -->
<delivery_datetime>20160121</delivery_datetime>
<!-- 开始日期 -->
<start_datetime></start_datetime>
<!-- 结束日期 -->
<end_datetime></end_datetime>
<!-- 收货方仓库 -->
<delivery_code>01</delivery_code>
<!-- 收货方姓名 -->
<delivery_name>Delivery Name</delivery_name>
<!-- 收货方地址 -->
<delivery_address>Delivery address</delivery_address>
</OrderLine>
<OrderLine>
<buyer_item_number>1234567</buyer_item_number>
<item_descript>description</item_descript>
<order_number>order number</order_number>
<order_line_no>00001</order_line_no>
<quantity>576</quantity>
<delivery_datetime></delivery_datetime>
<start_datetime>20170101</start_datetime>
<end_datetime>20170131</end_datetime>
<delivery_code>01</delivery_code>
<delivery_name>Delivery Name</delivery_name>
<delivery_address>Delivery address</delivery_address>
</OrderLine>
<OrderLine>
<buyer_item_number>1234567</buyer_item_number>
<item_descript>description</item_descript>
<order_number>order number</order_number>
<order_line_no>00001</order_line_no>
<quantity>576</quantity>
<delivery_datetime></delivery_datetime>
<start_datetime>20170301</start_datetime>
<end_datetime>20170331</end_datetime>
<delivery_code>01</delivery_code>
<delivery_name>Delivery Name</delivery_name>
<delivery_address>Delivery address</delivery_address>
</OrderLine>
</OrderHeader>
</Item>
小技巧:当发现无法将两个XML文件的字段对应起来的时候,可以试试找找值相同的标签,再比对下注释。
更多EDI系统标准XML到客户自定义XML的转换步骤,可查看。
更多STIHL文章
- 总览: [案例] STIHL EDI解决方案
- DELFOR:[案例] STIHL EDI – DELFOR 分析
- DESADV:[案例] STIHL EDI – DESADV
- DESADV:[案例] STIHL EDI – DESADV自定义XML 方案