单据转换与反写的开发经验分享
金蝶云社区-付豆_kd
付豆_kd
14人赞赏了该文章 2.5万次浏览 未经作者许可,禁止转载编辑于2014年06月09日 17:50:13
summary-icon摘要由AI智能服务提供

本文总结了单据转换与反写的开发过程。涉及转换规则配置(含分组、选单条件、附加条件等),反写规则配置,以及当配置无法满足时,需开发转换插件和反写插件。转换插件处理复杂选单条件、多语言字段等;反写插件解决特定反写逻辑问题,如多层反写或特定单据结构反写。开发时需在BOS IDE中配置插件策略,并扩展相应接口实现特定功能。

前段时间做了单据转换与反写的相关开发,做一总结,留作参考。由源单A到目标单B,涉及到转换规则的配置;B中字段值的改变回写到A,涉及到反写规则的配置;一些特殊的情况,配置无法满足时,就需要开发转换插件、反写插件。1. 配置单据转换规则“分组策略”能够设置A和B的关系一对一、多对一、按规则分组合并。比如,要设置A的每条单据体对应B的一条单头,就在“单据分组依据”中添加A的单据头.单据编号、单据体.分录号,用来唯一识别A的每条单据体。“选单条件策略”中,尽量使用下方的字段分录进行配置,这样就能在不符合转换条件时,根据这些字段拼出对应于具体分录条件的提示信息,方便用户理解;不符合“附加条件”时,会显示“附加条件说明”中配置的提示信息;“不符合条件的提示信息”则更为笼统,不能定位到具体的出错条件。除了在BOS IDE中配置转换规则,还需要在目标单B的元数据中配置“单据关联配置”,其中的“关联表名”将记录两张单据的关系,若漏配,则单据上、下查就查不出来。2. 配置反写规则反写规则的配置要在产品中进行,可以设置反写的操作、条件、计算公式、超额处理等,功能还是很强大的。3. 转换插件通常情况下,是不需要开发转换插件的,但总有一些特殊情况。比如,选单条件比较复杂,涉及到单据类型参数,此时无法进行配置,需要插件实现;或者,转换的字段中存在多语言字段,即使在转换规则中配置了,也是无法直接从A带到B的;再或者,B的某些字段并不能直接获取,需要在转换后处理中设置。在BOS IDE的“单据转换”规则中配置“插件策略”,将插件注册进去。插件类需要扩展AbstractConvertPlugIn,该类实现了IConvertPlugIn接口。OnQueryBuilderParemeter,该方法定义了查询源单时需要加载的字段,缺省只取转换规则中配置过的字段;OnGetDrawSourceData,上拉选单时,读取源单数据。若需要获取查询出来的源单信息,可以在该方法中实现。OnGetSourceData,下推时,读取源单数据。OnParseFilterOptions,上拉时,选单前的过滤事件,该过滤作用于选单界面弹出前,注意与OnInSelectedRow的区别。OnInSelectedRow,下推或上拉选择行返回后的过滤事件,该过滤作用于下推、或者上拉操作已经选单后的过滤,若不满足转换条件,则弹出转换规则中的提示。当过滤条件无法在单据转换规则中的“选单条件策略”中配置时,可以在此方法中进行处理。OnAfterCreateLink,转换后处理,能获取单据转换规则执行后的目标单信息,并对目标单进行转换规则无法实现的字段设置,是转换插件中最重要的方法。4. 反写插件反写规则能实现基本的单据反写,但有些情况就需要插件实现反写。比如,A的单据结构是单据头-单据体-子单据体,且由子单据体下推B,而B又要反写到A的子单据体,此种情况下,反写时无法定位到A的子单据体(只能到A的单据体这一级);再比如,B在反写A的某字段后,还需要反写到A的上游单据,即两层反写,也是无法配置的。在下游单据元数据的“单据关联配置”中配置“插件”,插件类需要扩展AbstractBusinessFlowServicePlugIn,该类实现了IBusinessFlowServicePlugIn接口。AfterCustomReadFields,上游单据需要加载的字段。AfterCommitAmount,根据某条反写规则将反写值填充到上游单据的后处理,按照反写规则循环执行,适合处理与具体反写规则相关的扩展操作。FinishWriteBack,所有反写规则都执行完成后的处理,适合处理批量状态更新之类的扩展操作。需要注意的是,插件中能够获取到的下游单据字段与执行反写的操作有关,因此当相应操作触发反写时,需要保证在这些操作中加载了反写所需的所有字段,即在相应操作(保存、审核、反审核等扩展了AbstractOperationServicePlugIn的操作)的OnPreparePropertys方法中加载了所需的字段。