④内部公开请勿外传1993-2012金蝶软件(中国)有限公司④内部公开请勿外传业务流程单据转换反写开发④内部公开请勿外传P2概述业务流程--业务流程定义、配置、发布(简述)单据转换--转换规则定义、配置、开发--单据转换插件反写规则--反写规则定义、发布、应用--反写插件处理业务逻辑单据转换插件开发详解反写插件开发详解常见问题分析讨论④内部公开请勿外传P3业务流程--Cloud早期承载了过多的功能,目前弱化流程作用--作为限制业务流转走向,过滤目标单据的作用--自由流程更加高效和方便业务流程定义–业务流程设计中心–业务流程配置中心–业务流程管理中心业务流程定义、配置、发布(简述)④内部公开请勿外传P4预制流程(业务流向)业务流程设计中心④内部公开请勿外传P5配置单据不同单据类型对应使用的业务流程业务流程配置中心④内部公开请勿外传P6管理、查看每个流程实例业务流程管理中心④内部公开请勿外传P7转换规则(实例讲解)--BOSIDE--文件--单据转换转换规则定义、配置、开发④内部公开请勿外传P8插件实例说明(按需要重载基类相关方法)单据转换插件④内部公开请勿外传P9关联设置(实例讲解)--目标单据–单据属性--单据转换单据关联设置配置④内部公开请勿外传P10反写规则(实例讲解)--Cloud运行时--反写规则反写规则定义④内部公开请勿外传P11插件实例说明(按需要重载基类相关方法)单据反写插件④内部公开请勿外传P121.下推不成功,弹出不成功原因分析--结合界面原因分析,查看转换规则配置的选单条件策略和插件追加的部分过滤条件。2.下推到目标单上,物料为空--物料不符合目标单录入条件(没分配或者转换规则xml手工可能追加有部分物料条件可库存、可销售等)3.目标单保存或审核是报超额提示--查看转换规则超额条件,以及是否有重复反写的多个反写规则的可能(点对点的反写,注意反写条件)4.反写结果不正确分析--检查反写规则配置、反写插件是否有干预,单据基本单位数量是否正确、单位换算是否正确5.特殊情形导致反写正确的数据,某些操作导致数据二次出错常见问题分析④内部公开请勿外传P131.业务流程:t_bf_procdeft_bf_procdef_l2.转换规则:t_meta_convertrulet_meta_convertrule_L2.反写规则:t_bf_writebackrulet_bf_writebackrule_Lt_bf_writebackrulecust3.平台相关的一些表(不允许代码里面直接访问这些表)t_bf_instancet_bf_instanceentryt_bf_instanceAmountIBusinessFlowTrackerService--业务流程跟踪信息更新服务提供者开发导出脚本④内部公开请勿外传P14单据转换,是指把上游所选单据,按照转换规则,自动生成下游单据数据包的过程;不对下游单据进行保存、提交、审核等处理单据转换插件,能够介入到单据转换的各个关键时刻,对转换行为进行控制,从而调整所生成的下游数据包;单据转换按照发起方不同,可分为下推、选单;下推是指在上游单据列表,把所选单据,生成下游单据数据包,并展示出来;选单是指在下游单据新增界面,弹出上游单据列表,选择源单返回,然后根据转换规则把源单数据填写到下游单据新增界面上;选单实际上分为两个独立的过程,一个是选单前过程,根据转换规则,生成源单数据筛选条件,传给源单列表。因此源单列表上显示的,都是允许下推的数据;另外一个就是选单过程,把用户选择返回的源单数据,迁移到目标单据上;下推与选单,采用相同单据转换规则,进行数据迁移;也采用相同的单据转换插件,但触发的事件略有差异,编写单据转换插件时,需要兼顾这些差异;单据转换插件概要说明④内部公开请勿外传P15使用VS2010及以上版本的C#语言,创建一个ClassLibrary项目创建单据转换插件类库④内部公开请勿外传P16到K/3Cloud安装目录的WebSite\Bin子目录,引用如下组件:–Kingdee.BOS.dll–Kingdee.BOS.App.dll–Kingdee.BOS.BusinessEntity.dll–Kingdee.BOS.Contracts.dll–Kingdee.BOS.Core.dll–Kingdee.BOS.DataEntity.dll引用必要组件④内部公开请勿外传P17在前文所建的单据转换插件工程中,添加新类,派生自单据转换插件基类:Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.AbstractConvertPlugIn创建单据转换插件类④内部公开请勿外传P18按顺序输出单据转换-下推过程的插件事件OnInitVariable–//******本事件同时适用于下推、选单******–///<summary>–///初始化变量之后触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///此方法执行时,源单、目标单元数据,转换规则均已加载;–///可以在此事件初始化自己的变量,或者调整转换规则–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P19OnQueryBuilderParemeter–//******本事件同时适用于下推、选单******–///<summary>–///取源单数据参数(QueryBuilderParemeter)初始化完毕后触发,–///此时,已经扫描了转换规则上的映射关系、计算公式等,确定了需要加载的源单字段;–///</summary>–///<paramname=-e-></param>–///<remarks>–///默认情况下,仅会加载配置了映射关系、计算公式的源单字段;–///可以在此事件中,追加需要加载的源单字段;–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P20OnInSelectedRow–//******本事件同时适用于下推、选单******–///<summary>–///把所选的源单内码,转换为取数条件后触发,–///此时,源单内码,被拼接成FIDIN(100000,100001)条件–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件,修改取数条件,完善内码筛选条件–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P21OnParseFilter–//******本事件同时适用于下推、选单******–///<summary>–///解析完转换规则的选单条件策略之后触发,–///此时,已经把选单条件策略中设置的过滤条件,拼接成了一个SQL条件子句–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,修改取数条件,完善选单条件策略中设置的条件–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P22OnBeforeGetSourceData–//******本事件同时适用于下推、选单******–///<summary>–///调用IQueryService.GetDynamicObjectCollection()函数之前触发,–///此时取源单参数已经解析完毕,构建出了取数SQL的各种子句,如Select、From、Where子句–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对取源单数据的SQL子句进行完善–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P23OnGetSourceData–//******本事件仅适用于下推******–///<summary>–///读取了符合条件下推的源单数据之后触发,–///此时,已经拿到了源单完整数据,之前仅仅掌握源单内码;–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件,修订源单数据–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P24OnBeforeGroupBy–//******本事件同时适用于下推、选单******–///<summary>–///读取源单数据之后,按照转换规则-分组策略,对源单数据进行分组之前触发,–///此时,已经解析完分组策略,后续将按照此进行单据分组、分录合并–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,修改单据分组、分录合并规则–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P25OnCreateTarget–//******本事件仅适用于下推******–///<summary>–///根据单据分组规则,对源单分好组之后,根据分组数量,创建目标单据之后触发,–///此时,已经创建好目标单据数据包,并填写了各字段默认值–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,完善各个字段的默认值–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P26OnBeforeFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在开始按照转换规则-字段映射策略,进行数据迁移之前触发,–///此时,源单数据包、目标单数据包均已对应好,开始进行字段数据迁移–///</summary>–///<paramname=-e-></param>–///<remarks>–///因为有很多行、很多字段需要逐个迁移,总的迁移次数会很多,–///默认情况下,不会触发每个字段的迁移事件。–///如果需要监控单个字段的迁移过程,可以在此事件中,开启字段的迁移事件;–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P27OnFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在计算完目标单据每行、每个字段值,准备填写到数据包之前,均会触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///此事件默认不会被触发–///插件在OnBeforeFieldMapping事件中设置e.FireFieldMappingEvent=true,可开启本事件–///可以在此事件中,监控、修正需要写到目标单据上的字段值;–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P28OnAfterFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在根据转换规则-字段映射策略,迁移完字段值之后触发,–///此时,已经把源单数据包,都迁移到了目标单据数据包–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对目标单据数据包进行修订,或者补充其他单据体数据–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P29OnCreateLink–//******本事件同时适用于下推、选单******–///<summary>–///字段迁移完毕,创建关联关系子表,在单据上记录关联关系前触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,设置e.Cancel=true,略过关联关系的创建;–///关联关系主要用于反写、联查,如无必要,请勿取消–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P30OnAfterCreateLink–//******本事件同时适用于下推、选单******–///<summary>–///关联关系子表已经创建并填写完毕后触发,–///此时,已经在关联子表中,记录了源单与目标单之间的关系–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对关联关系子表内容进行调整,–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P31OnGetConvertBusinessService–//******本事件同时适用于下推、选单******–///<summary>–///数据从源单迁移完毕,开始执行转换规则-表单服务策略上配置的服务前触发,–///此时,已经创建好了服务执行列表,但并未实际执行服务–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,增删改服务列表–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P32AfterConvert–//******本事件同时适用于下推、选单******–///<summary>–///单据从源单到目标单已经转换完毕,输出最后的目标单数据包之前触发,–///此时,目标单数据包已经构建完毕,不会再有变动了–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对目标单数据包进行最后的修订、补充–///</remarks>示例-演示下推触发的事件④内部公开请勿外传P33输出单据转换-选单前过程的插件事件执行顺序OnInitVariable–//******本事件同时适用于下推、选单前、选单******–///<summary>–///初始化变量之后触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///此方法执行时,源单、目标单元数据,转换规则均已加载;–///可以在此事件初始化自己的变量,或者调整转换规则–///</remarks>示例-演示选单前触发的事件④内部公开请勿外传P34OnParseFilterOptions–//******本事件仅适用于选单前******–///<summary>–///根据转换规则的配置,把目标单关键字段值,拼进过滤条件之后触发,–///</summary>–///<paramname=-e-></param>–///<remarks>–///转换规则-字段映射策略中,可以勾选目标字段的过滤、仅追加选项,–///目标字段勾上此过滤选项后,选单时,会该字段值作为过滤条件,传递给源单列表,–///可以在此事件中,调整根据目标字段值生成的过滤条件–///</remarks>示例-演示选单前触发的事件④内部公开请勿外传P35OnParseFilter–//******本事件同时适用于下推、选单前******–///<summary>–///解析完转换规则的选单条件策略之后触发,–///此时,已经把选单条件策略中设置的过滤条件,拼接成了一个SQL条件子句–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,修改取数条件,完善选单条件策略中设置的条件–///</remarks>示例-演示选单前触发的事件④内部公开请勿外传P36输出单据转换-选单前过程的插件事件执行顺序OnInitVariable–//******本事件同时适用于下推、选单******–///<summary>–///初始化变量之后触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///此方法执行时,源单、目标单元数据,转换规则均已加载;–///可以在此事件初始化自己的变量,或者调整转换规则–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P37OnQueryBuilderParemeter–//******本事件同时适用于下推、选单******–///<summary>–///取源单数据参数(QueryBuilderParemeter)初始化完毕后触发,–///此时,已经扫描了转换规则上的映射关系、计算公式等,确定了需要加载的源单字段;–///</summary>–///<paramname=-e-></param>–///<remarks>–///默认情况下,仅会加载配置了映射关系、计算公式的源单字段;–///可以在此事件中,追加需要加载的源单字段;–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P38OnInSelectedRow–//******本事件同时适用于下推、选单******–///<summary>–///把所选的源单内码,转换为取数条件后触发,–///此时,源单内码,被拼接成FIDIN(100000,100001)条件–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件,修改取数条件,完善内码筛选条件–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P39OnBeforeGetSourceData–//******本事件同时适用于下推、选单******–///<summary>–///调用IQueryService.GetDynamicObjectCollection()函数之前触发,–///此时取源单参数已经解析完毕,构建出了取数SQL的各种子句,如Select、From、Where子句–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对取源单数据的SQL子句进行完善–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P40OnGetDrawSourceData–//******本事件仅适用于下推******–///<summary>–///读取了所选的源单数据之后触发,–///此时,已经拿到了源单完整数据,之前仅仅掌握源单内码;–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件,修订源单数据–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P41OnBeforeGroupBy–//******本事件同时适用于下推、选单******–///<summary>–///读取源单数据之后,按照转换规则-分组策略,对源单数据进行分组之前触发,–///此时,已经解析完分组策略,后续将按照此进行单据分组、分录合并–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,修改单据分组、分录合并规则–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P42OnCreateDrawTarget–//******本事件仅适用于下推******–///<summary>–///读取源单数据之后,对源单行进行合并,但还没有构建目标单据行之前触发,–///此时,源单行已经分好组,目标单据还是选单之前的数据包–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,调整源单分组结果–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P43OnBeforeFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在开始按照转换规则-字段映射策略,进行数据迁移之前触发,–///此时,源单数据包、目标单数据包均已对应好,开始进行字段数据迁移–///</summary>–///<paramname=-e-></param>–///<remarks>–///因为有很多行、很多字段需要逐个迁移,总的迁移次数会很多,–///默认情况下,不会触发每个字段的迁移事件。–///如果需要监控单个字段的迁移过程,可以在此事件中,开启字段的迁移事件;–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P44OnFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在计算完目标单据每行、每个字段值,准备填写到数据包之前,均会触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///此事件默认不会被触发–///插件在OnBeforeFieldMapping事件中设置e.FireFieldMappingEvent=true,可开启本事件–///可以在此事件中,监控、修正需要写到目标单据上的字段值;–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P45OnAfterFieldMapping–//******本事件同时适用于下推、选单******–///<summary>–///在根据转换规则-字段映射策略,迁移完字段值之后触发,–///此时,已经把源单数据包,都迁移到了目标单据数据包–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对目标单据数据包进行修订,或者补充其他单据体数据–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P46OnCreateLink–//******本事件同时适用于下推、选单******–///<summary>–///字段迁移完毕,创建关联关系子表,在单据上记录关联关系前触发–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,设置e.Cancel=true,略过关联关系的创建;–///关联关系主要用于反写、联查,如无必要,请勿取消–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P47OnAfterCreateLink–//******本事件同时适用于下推、选单******–///<summary>–///关联关系子表已经创建并填写完毕后触发,–///此时,已经在关联子表中,记录了源单与目标单之间的关系–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对关联关系子表内容进行调整,–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P48OnGetConvertBusinessService–//******本事件同时适用于下推、选单******–///<summary>–///数据从源单迁移完毕,开始执行转换规则-表单服务策略上配置的服务前触发,–///此时,已经创建好了服务执行列表,但并未实际执行服务–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,增删改服务列表–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P49AfterConvert–//******本事件同时适用于下推、选单******–///<summary>–///单据从源单到目标单已经转换完毕,输出最后的目标单数据包之前触发,–///此时,目标单数据包已经构建完毕,不会再有变动了–///</summary>–///<paramname=-e-></param>–///<remarks>–///可以在此事件中,对目标单数据包进行最后的修订、补充–///</remarks>示例-演示选单触发的事件④内部公开请勿外传P50下推、选单前、选单过程,采用的插件是同一个。上文只是为了突出演示效果,为下推、选单、选单过程,分别写插件演示其所触发的事件;从事件的覆盖度来看,下推过程触发的事件是最全面的,针对下推过程编写的插件,选单过程被自动覆盖;特别说明④内部公开请勿外传P51插件代码编写完毕后,编译组件,把生成的类库文件(*.dll)复制到K/3Cloud安装目录的WebSite\Bin子目录;然后进入BOS设计器,打开单据转换主界面,找到转换规则,去掉启用选项,修改插件策略,注册新插件:利用BOS设计器制作部署包时,需要在部署向导中,加入生成的转换插件类库文件(*.dll),以及自定义(或扩展)的单据转换规则。如何启用单据转换插件④内部公开请勿外传P52Context–用户登录上下文,记录当前登录用户、数据连接等信息。–调用各种服务函数时,需传入本对象作为参数。OperationNumber–操作编码标识:如选单操作、下推操作。–本属性只有两种可选值:Push、Draw;OperationResult–单据转换结果信息。–管理单据转换结果,包括提示信息、成功生成的目标单据数据包。Option–额外业务控制选项:整体业务流程的每个时机点都可拿到这些控制信息–调用下推引擎时,额外传递的一些参数字典。如是否整单下推、是否需要校验下游单据新增权限等;–单据转换插件可以到此参数字典中,获取自定义参数。公共属性④内部公开请勿外传P53下推事件–下推,是把所选源单,转换为目标单据数据包的过程,大致经过以下几个阶段:–1、初始化变量;–2、构建读取源单数据参数;–3、根据单据转换规则上,字段映射关系、计算公式等,设置需要读取的源单字段;–4、根据单据转换规则–选单条件策略,设置源单过滤条件;–5、把所选源单内码,拼进源单过滤条件;–6、构建一条取数SQL,读取源单数据;(把单据头、单据体、子单据体的字段合并在一起)–7、按照单据转换规则–分组策略,对源单数据进行分组;–8、根据分组,构建目标单空数据包;–9、把源单数据,一一迁移到目标单数据包上;–10、在目标单数据包中,记录与源单的关联关系,并自动进行单位换算;–11、执行单据转换规则–表单服务策略,对目标单据进行后期数据修正、补充;–12、返回已经生成的目标单据数据包;单据转换事件(插件基类的虚方法)④内部公开请勿外传P54整个下推的过程,单据转换插件基类上可重载的虚方法,按如下顺序被调用:–1、OnInitVariable–2、OnQueryBuilderParemeter–3、OnInSelectedRow–4、OnParseFilter–5、OnBeforeGetSourceData–6、OnGetSourceData–7、OnBeforeGroupBy–8、OnCreateTarget–9、OnBeforeFieldMapping–10、OnAfterFieldMapping–11、OnCreateLink–12、OnAfterCreateLink–13、OnGetConvertBusinessService–14、AfterConvert插件重载这些方法,调整方法的参数,以实现对下推的过程、生成的目标单据数据包进行干预、修订;下文将按照顺序介绍下推过程所触发的全部事件:单据转换事件(插件基类的虚方法)④内部公开请勿外传P55初始化变量之后触发本事件,此方法执行时,源单、目标单元数据,转换规则均已加载;可以在此事件初始化自己的变量,或者调整转换规则虚方法定义:–publicvirtualvoidOnInitVariable(InitVariableEventArgse);备注:–变量初始化完成,准备单据转换所需的变量,这个事件最早触发,插件可以在这个事件中准备所需的变量。触发时机:–单据转换服务准备完源单和目标单的元数据后,还未进入单据转换的数据处理过程应用场景:–为插件提供时机•根据接口参数,初始化插件自身的信息OnInitVariable④内部公开请勿外传P56插件接口介绍:OnInitVariableInitVariableEventArgs属性类型描述ContextContext当前系统上下文全局信息RuleConvertRuleElement转换规则元数据信息SourceBusinessInfoBusinessInfo源单单据元数据信息TargetBusinessInfoBusinessInfo目标单据元数据信息④内部公开请勿外传P57案例–结算清单下推应付单插件,初始化本地变量需求背景:–正式进入单据转换过程前,初始化一些插件全局属性实现方案:–单据转换插件中,在OnInitVariable事件里做插件全部变量初始化的工作插件示例:OnInitVariable④内部公开请勿外传P58取源单数据的参数对象(QueryBuilderParemeter)初始化完毕之后,触发本事件。此时,已经扫描了转换规则上的映射关系、计算公式等,确定了需要加载的源单字段虚方法定义–publicvirtualvoidOnQueryBuilderParemeter(QueryBuilderParemeterEventArgse);备注:–默认情况下,仅会加载配置了映射关系、计算公式的源单字段;可以在此事件中,修改QueryBuilderParemeter,追加需要加载的源单字段;触发时机:–获取单据转换字段映射中源单使用的字段和其对应的表格信息–获取源单数据之前,准备查询字段信息应用场景:–为插件提供时机•解析源单取数的字段列OnQueryBuilderParemeter④内部公开请勿外传P59插件接口介绍:OnQueryBuilderParemeterQueryBuilderParemeterEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息SourceBusinessInfoBusinessInfo源单单据元数据信息DicFieldAliasDictionary<string,string>基础资料属性字段key与字段别名关系字典,默认别名可能会超出自定义长度SelectItemsList<SelectorItemInfo>摘选的字段片段信息Y:源单字段列表④内部公开请勿外传P60案例–收货单下推退货单,需强制加载收货单的库存状态字段需求背景:–获取源单数据表格信息中,添加库存状态等字段实现方案:–OnQueryBuilderParemeter事件中,修改参数的SelectItems属性插件示例:OnQueryBuilderParemeter④内部公开请勿外传P61把所选的源单内码,转换为取数条件之后,触发本事件。此时,源单内码,已经被拼接成类似于”FIDIN(100000,100001)”的SQL条件子句。虚方法定义–publicvirtualvoidOnInSelectedRow(InSelectedRowEventArgse);备注:–通过干预源单取数的Where子句,达到过滤源单业务数据的作用触发时机:–构建源单选择行的Id的IN语句应用场景:–为插件提供时机•干预源单选中行Id的语句构造OnInSelectedRow④内部公开请勿外传P62插件接口介绍:OnInSelectedRowInSelectedRowEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息SourceBusinessInfoBusinessInfo源单单据元数据信息SelectedRowsIEnumerable<ListSelectedRow>用户在列表上的选择对象PkKeystringIn子句的主键字段keyInSelectedRowsSQLstring根据选择的行产生的条件子句Y:拼接到后续取数Sql指令的Where条件中SqlParamPKValuesSqlParam内码集合对应的Sql变量,例如:e.SqlParamPKValues=newSqlParam(-@PKValue-,KDDbType.udt_inttable,pkValueArray.Distinct().ToArray());Y:表变量参数JoinTableExtJoinTableDescription内码临时表描述对象,例如:e.JoinTable=newExtJoinTableDescription(){TableName=-table(fn_StrSplit(@PKValue,',',1))-,TableNameAs=-plugTmp-,FieldName=-FId-,ScourceKey=pkKey};Y:表变量④内部公开请勿外传P63案例–简单生产领料下推退料单,追加条件:可退数量大于0需求背景:–简单生产领料单下推简单退料单,其源单过滤条件增加实发数量减退料选单数量必须大于0实现方案:–转换插件中,在OnInSelectedRow中,修改参数的InSelectedRowsSQL,携带其过滤条件,即(FActualQty-FSelPrcdReturnQty)>0插件示例:OnInSelectedRow④内部公开请勿外传P64解析完转换规则的选单条件策略之后,触发本事件。此时,已经把选单条件策略中设置的过滤条件,拼接成了一个SQL条件子句。虚方法定义–publicvirtualvoidOnParseFilter(ParseFilterEventArgse);备注:–通过干预单据转换中配置的过滤策略中的过滤条件,干预源单取数的Where子句,达到过滤业务数据的作用触发时机:–解析过滤策略中配置的过滤条件时应用场景:–为插件提供时机•干预单据转换的过滤策略中解析出的过滤条件OnParseFilter④内部公开请勿外传P65插件接口介绍:OnParseFilterParseFilterEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息SourceBusinessInfoBusinessInfo源单单据元数据信息FilterPolicySQLstring根据过滤策略解析的条件Y:拼接到后续源单取数Sql指令的Where条件中PlugFilterDescstring插件添加的过滤条件说明Y:如果后续在取源单数据时,发现没取到符合条件的源单数据,通过此字符串,抛出取数失败的原因④内部公开请勿外传P66案例–采购订单入库,追加条件:收料组织不能为空插件示例:OnParseFilter④内部公开请勿外传P67调用取数服务,读取源单数据之前,触发本事件。此时取源单参数已经解析完毕,据此构建出了取数SQL的各种子句,如Select、From、Where子句。虚方法定义–publicvirtualvoidOnBeforeGetSourceData(BeforeGetSourceDataEventArgse);备注:–查找符合前述条件的源单数据之前,进入到数据库查询前,最后一次干预查询对象(综合前述查询条件的查询对象)触发时机:–进入数据库查询满足条件的源单数据前应用场景:–为插件提供时机•干预查询源单数据的过滤对象等过滤信息OnBeforeGetSourceData④内部公开请勿外传P68插件接口介绍:OnBeforeGetSourceDataBeforeGetSourceDataEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息BusinessInfoBusinessInfo源单单据元数据信息QueryObjectQueryObject查询对象Y:查询对象,决定源单取数结果ParamListList<SqlParam>Sql参数对象Y:查询参数对象④内部公开请勿外传P69执行取数SQL,获取到了源单数据之后,触发本事件。此时,已经拿到了源单需要迁移到下游单据的完整数据。虚方法定义–publicvirtualvoidOnGetSourceData(GetSourceDataEventArgse);备注:–进入此插件时,已经通过前面步骤中准备的源单过滤条件,找出符合过滤条件的源单数据触发时机:–根据过滤条件,找出符合条件的源单数据后应用场景:–为插件提供时机•干预源单数据集OnGetSourceData④内部公开请勿外传P70插件接口介绍:OnGetSourceDataGetSourceDataEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息SourceBusinessInfoBusinessInfo源单单据元数据信息SourceDataDynamicObjectCollection列表上选择的源单数据集合Y:选单源单数据集合DicFieldAliasDictionary<string,string>基础资料字段key与字段别名的关系字典QueryBuilderParemeterQueryBuilderParemeter获取源单数据的查询参数对象SqlParamPKValuesSqlParam内码参数对象④内部公开请勿外传P71案例–库存请检单生成库存状态转换单时,强制拆单需求背景:–库存请检单下推库存转换单时,请检单3个字段数据拆分成3行数据实现方案:–转换插件中,在OnGetSourceData事件中,对需要拆单的源单行,进行复制、拆分,新增拆分行。插件示例:OnGetSourceData④内部公开请勿外传P72读取源单数据之后,开始按照转换规则-分组策略,对源单数据进行分组之前,触发本事件。此时,已经解析完分组策略,提取了分组、合并依赖的字段,但并未实际分组虚方法定义–publicvirtualvoidOnBeforeGroupBy(BeforeGroupByEventArgse);备注:–可以在此事件中,修改单据分组、分录合并规则,从而调整控制源单数据分组。触发时机:–找出符合过滤条件的源单数据后,准备进行源单数据分组之前应用场景:–为插件提供时机•干预源单数据集合分组条件OnBeforeGroupBy④内部公开请勿外传P73插件接口介绍:OnBeforeGroupByBeforeGroupByEventArgs属性类型描述关键属性SourceDataDynamicObjectCollection源单数据集合YSourceBusinessInfoBusinessInfo源单单据元数据信息GroupByModeGroupByMode分组方式HeadGroupKeystring单据头分组字段YEntryGroupKeystring单据体分组字段YSubEntryGroupKeystring子单据体分组字段Y④内部公开请勿外传P74案例–BOM展开到领料单,按供应组织强制分单需求背景:–BOM展开结果推简单生产领料单,不同的供应组织,需要下推为不同的领料单。实现方案:–转换插件中,在OnBeforeGroupBy事件里,配置分组字段,修改对应分组属性,HeadGroupKey插件示例:OnBeforeGroupBy④内部公开请勿外传P75对源单分组完毕,并根据分组结果,创建好了目标单据数据包之后,触发本事件。此时,已经创建好目标单据数据包,并填写了各字段默认值。虚方法定义–publicvirtualvoidOnCreateTarget(CreateTargetEventArgse);备注:–可以在此事件中,完善各个字段的默认值触发时机:–源单数据分组后,根据分组创建完目标实体之后应用场景:–为插件提供时机•干预根据分组数据创建起来的目标单据实体OnCreateTarget④内部公开请勿外传P76插件接口介绍:OnCreateTargetCreateTargetEventArgs属性类型描述关键属性ContextContext当前系统上下文全局信息GroupingDataIEnumerable<object>分组后的源单数据集合TargetBusinessInfoBusinessInfo目标单单据元数据信息TargetExtendedDataEntitiesExtendedDataEntitySet扩展的数据实体数据集合Y:目标单据扁平化实体数据集合;扁平化的数据实体集合,这个对象会把元模型中的所有实体信息数据拉平进行管理,每个实体数据信息中包含了源单分组数据信息,通过此属性,可以区分扁平化的数据实体集合中,哪些实体数据信息是一组④内部公开请勿外传P77在开始按照转换规则-字段映射策略,进行数据迁移之前,触发本事件。此时,源单数据包、目标单数据包均已对应好,可以进行字段数据迁移。虚方法定义–publicvirtualvoidOnBeforeFieldMapping(BeforeFieldMappingEventArgse);备注:–因为需要把源单数据,逐行、逐字段的迁移到目标单,字段迁移次数会很多,默认情况下,不会触发每个字段的迁移事件(OnFieldMapping)。–如果需要监控单个字段的迁移过程,可以在此事件中,开启字段的迁移事件(OnFieldMapping);触发时机:–目标单据字段隐射发生前应用场景:–为插件提供时机•是否在目标单据字段完成隐射和赋值的时候,触发OnFieldMapping事件OnBeforeFieldMapping④内部公开请勿外传P78插件接口介绍:OnBefo.