1.4.2. YakInterface组件架构
Application ServerEDI ServerFront 前置机LogEDI Formatter格式转化器Code MappingSAP_Accounting FormatterBiz Components业务功能模块Agent任务代理UF_Accounting Formatter Transfer Component代码翻译器Controller控制器TargetDelegate目标代理IBM WPGCommunicationAgentPostProcessor&PreProcessor[PolicyEngine]Validate BizRule&Log2DB&Save2DBCacheManager缓存管理HibernateComponent
其中各组件的说明如下:
① EDI处理模块与其他处理模块之间的交互都通过代理完成,其中Agent负责服务器端业务功能组件与EDI处理模块之间的交互;TargetDelegate负责EDI处理模块与EDI Server之间的交互。
② EDI Formatter:负责对EDI进行打包和解包
③ SAP_Accounting Formatter: 负责对SAP格式报文进行打包 ④ UF_Accounting Formatter:负责对用友格式报文进行打包
⑤ Transfer: 代码转换,即将系统定义的代码转换为目标格式代码 ⑥ PolicyEngine:业务策略引擎(根据定义的策略进行业务规则校验、记录数据库日志,回填业务数据)
⑦ Controller: 负责控制Agent之间的交互 ⑧ log: 操作日志组件
⑨ CacheManager:缓存组件
⑩ Hibernate Component:数据映射组件,使用框架公用组件完成数据持久化
11 PostProcessor&PreProcessor:前置机对打包后处理和解包预处理的组件,主要完成○
对EDI报 文的特殊字符的处理和还原以及脱壳和加壳处理
1.5. WPG
WPG为第三方中间件,用来完成报文格式的转换。
发送报文时,接收YakInterface发送的标准格式的报文,再根据不同的报文格式和接收方,生成具体的基本符合接收方要求的报文,并加上与报文处理相关的“壳”信息,再将生成的报文发送到前置机进行最后的处理。
6
接收报文时,接收前置机发送的不同格式的报文,转换成统一的接口内部格式,发送给YakInterface。
WPG主要使用与之配合客户端工具DISClient进行报文格式的定义和报文格是的转换。
1.6. YakFront
发送报文时,收到WPG发送的报文,再根据配置信息和报文中的“壳”信息,对报文进行字符的校验和特殊处理,并去掉“壳”信息,最后通过指定的方式把报文发送出去。
在接收报文时,根据配置信息和不同的发送方,对报文进行特殊字符处理,并加上“壳”信息,再发送到WPG。
2. EDI开发步骤
2.1. 报文格式分析
发送报文时,系统支持交通部和UN/EDIFACT两种标准,另外有些船公司的报文为其自定义格式。交通部标准的报文,以上海亿通的报文格式为标准和基础,UN/EDIFACT标准的报文,以WPG提供的报文格式为标准和基础。下面以亿通格式的订舱报文(IFTMBF)为例进行说明,UN/EDIFACT标准和自定义格式的报文处理方式类似。
例如:收到船公司A的订舱报文,检查其格式说明文件,发现其报文内容组成形式基本符合亿通订舱报文,但是修改了某些段(记录、Segment)和字段(Item),将不同的部分进行记录,记录的内容包括:增加/删除/修改、循环次数、数据类型、数据长度。如果船公司同时提供了代码表,则表示在生成报文时需要进行代码映射;如果没有提供代码表,并不表示不需要进行代码映射,有可能会在后期用户测试阶段提出代码映射的要求。
根据记录的报文格式中发生变化的数据,检查FOCUS系统的“订舱委托表”(T_CO_OCEANORDER),以及相关的“预配信息表”(T_CO_OCEANPRELOAD)、“货物表”(T_CO_CARGO)、“参与方表”(T_CO_OCEANORDER,存放收货人、发货人、通知人信息),如果发现这些表不能提供生成报文所需的信息,则检查报文格式说明,该信息是否为生成报文的必须信息,如果不是则忽略该信息;如果是必须信息,则与业务组协商,如何补充该信息。
处理完报文以后,还需要获得的信息为:报文发送方式、发送方代码、接收方代码,这些信息可以先使用虚拟数据代替,在客户测试阶段更新为真实数据。
2.2. 增加Policy
YakInterface里面的Policy分为两级,第一级处理不同的报文格式,第二级处理不同的报文接收方。每一个Policy对应系统中的一个实现类,第一级的类放在yak.sysinterface.edi.policy包中,第二级的类放在yak.sysinterface.edi.rule报中。报文格式与实现类、接收方与实现类的对应关系放在FOCUS系统的配置文件PolicyEngine.properties中。
文件的内容如下:
7
######################################################################## ## POLICY ENGINE CONFIGURE SECTION ## THE RULE IS:
## BUSINESS CODE = POLICY IMPLEMENT CLASS OF PROCESSING THAT BUSINESS ########################################################################
## BIZ RULE RELATED POLICY ########################################### IFTMBF=yak.sysinterface.edi.policy.IftmbfPolicy IFTMBC=yak.sysinterface.edi.policy.IftmbcPolicy IFTMIN=yak.sysinterface.edi.policy.IftminPolicy SAP=yak.sysinterface.sap.policy.SapPolicy …
## FILENAME RELATED POLICY ###########################################
## VALIDATE RULE POLICY ############################################## EASIPASS.RulePolicy=yak.sysinterface.edi.rule.EasiPassPolicy COSFRE.RulePolicy=yak.sysinterface.edi.rule.CosfrePolicy …
上半段内容是报文格式与实现类的配置信息,下半段内容是接收方与实现类的配置信息。
例如新增加一种报文格式,格式名称为“TESTFORMAT”,则需要实现下面几项内容:
? 完成该格式的实现类:
yak.sysinterface.edi.rule.TestFormatPolicy.java
? 在上面的配置文件中增加一行配置信息:
TESTFORMAT =yak.sysinterface.edi.policy.IftminPolicy
如果新增加一个报文接收方,名称为“TESTRECEIVER”,则需要实现下面几项内容:
? 完成该接收方的实现类:
yak.sysinterface.edi.rule.TestReceiverPolicy.java
? 在上面的配置文件中增加移行配置信息:
TESTRECEIVER.RulePolicy=yak.sysinterface.edi.rule.TestReceiverPolicy
第一级Policy(报文格式)在完成实现类时,要实现Policy接口,接口定义如下: public interface Policy {
public PolicyResult log2DB(String operation,Object o,String errorCode,String errorDesc) throws InterfaceException;
public final static String ERROR_HANDLE_POLICY = \; public final static String ERROR_SAVE_LOG_TO_DB = \;
public PolicyResult validateBizRule(String operation,Object o) throws
InterfaceException;
8
} 其中:
validateBizRule是业务规则校验的处理方法方法;可 log2DB是保存处理日志的方法;
save2DB是接收报文时,保存数据的方法;
这三个方法由FormatterTask(yak.sysinterface.edi.FormatterTask.java),根据当前处理的不同报文报文格式和处理阶段,自动调用。例如:在处理接收EDI订舱单(IFTMBF)时,FormatterTask会依次调用IFTMBFPolicy的validateBizRule、save2DB、log2DB。
如果某一种报文格式没有定义其对应的Policy,则系统在处理该报文格式时,会抛出InterfaceException。
public PolicyResult save2DB(String operation,Object o) throws InterfaceException;
第二级Policy(接收方)在完成实现类时,要实现RulePolicy接口,接口定义如下: public interface RulePolicy { }
public static final String RULE_POLICY_SUFFIX = \; public boolean validateIFTMBF(String ope ration,Object o); public boolean validateIFTMIN(String operation,Object o); public boolean validateCOSTCO(String operation,Object o);
其中: validateIFTMBF是处理订舱单报文的处理规则; validateIFTMIN是处理提单确认报文的处理规则; validateCOSTCO是处理装箱单报文的处理规则;
这三个方法由第一级Policy(报文格式Policy)来自动调用,例如:IFTMBFPolicy在处理发送到“TESTRECEIVER”订舱单的过程中会自动调用TestReceiverPolicy的validateIFTMBF。
如果某一接收方没有定义其对应的Policy,则系统在处理该报文格式时,在第一级Policy中查找是否有缺省的处理方式,如果找到则执行默认的处理方式,否则会抛出InterfaceException。
2.3. 增加数据库配置信息
在数据库中需要根据报文接收/发送方的不同要求,在下面的这些表中配置相应的信息。
2.3.1. EDI参与方(EDI_PARTNER)
用来记录FOCUS系统中目前所支持的报文接收方的主要信息,结构如下:
中文名称 EDI参与方主键 EDI参与方名称
字段名称 EDI_PATN_ID EDI_PATN_NAME 字段类型 NUMBER(12) VARCHAR2(40) 备注 9
EDI参与方代码 非EDI中心报文名称代码 非EDI中心接收方代码 系统合作伙伴ID 是否支持直接发送 是否支持EDI中心 是否EDI中心 删除标志 修改日期 EDI_PATN_CODE DR_MSG_CODE DR_RCV_CODE SYS_PATN_ID SPRT_DR SPRT_EDI_CNTR IS_EDI_CNTR IS_DELETED UPD_DATE VARCHAR2(40) VARCHAR2(40) VARCHAR2(40) NUMBER(12) VARCHAR2(20) VARCHAR2(20) CHAR(1) CHAR(1) TIMESTAMP 例如,上海中集的配置记录如下: 1009 主键 COSCO 客户端显示的名称 COSFRE EDI合作伙伴代码 直接发送时,报文类型代码,需要与WPG中定义的报文类型名称相匹配。例如,在WPGDR_MSG_CODE COSFRE 中上海中集的订舱报文的名称定义为“IFTMBF_COSFRE”,则该字段的取值必须是“COSFRE” 直接发送时,报文中的接收方DR_RCV_CODE 63148792 代码 SPRT_DR Y 允许直接发送报文给中集 SPRT_EDI_CNTR N 不支持通过EDI中心发送 在系统合作伙伴基础信息表SYS_PATN_ID 7000 中对应的ID IS_EDI_CNTR N 不是EDI中心 IS_DELETED N 没有被删除 12-12月-06 11.31.29.626025 上数据最后一次修改时间 UPD_DATE 午 上海亿通的配置记录如下:
字段名称 字段值 说明 EDI_PATN_ID 1010 主键 EDI_PATN_NAME 亿通 客户端显示的名称 EDI_PATN_CODE EASIPASS EDI合作伙伴代码 因为是EDI中心,不是具体的DR_MSG_CODE 业务合作伙伴,只是转发报文,不需要配置该数据 因为是EDI中心,不是具体的DR_RCV_CODE 业务合作伙伴,只是转发报文,不需要配置该数据
10
字段名称 EDI_PATN_ID EDI_PATN_NAME EDI_PATN_CODE 字段值 说明