【套打高阶】套打干预数据包接口原创
金蝶云社区-_Tmp
_Tmp
6人赞赏了该文章 3361次浏览 未经作者许可,禁止转载编辑于2020年08月25日 16:34:48

每次都听说套打干预数据包进行数据调整,那么到底套打里面干预数据包的接口逻辑是怎么样的呢,下面来演示下完整的逻辑和关键细节。


<0>初探套打干预数据包接口

通过表单插件或列表插件重写OnPrePareNotePrintData,根据系统提供的参数了解接口:

image.png

以工序计划为例,单据头、工序序列单据体、工序列表子单据体三级关联数据套打为例

image.png

image.png

image.png

讲解下数据包干预接口的各参数含义:

BillIds:当前数据的内码集合

DataSourceId:当前干预数据包所在的实体

DataObjects、DynamicObjectType:当前的打印数据包(数据包以字段标识命名)、当前数据包的动态实体属性

NotePrintTplID:套打模板标识,用作针对部分模板干预数据包判断

Fields:当前数据源下的字段

第一次调用看下数据包的结构,明显与单据的数据包不一样。

首先第一点是数据少了,套打根据需要字段按需取数,如果需要取对应的字段,那么必须要在套打模板上存在该字段(有时候需要这个字段做插件处理时但又不需要显示可以通过绑定文本控件设置不打印解决);

第二点是平铺结构,单据数据包作为一棵树,而套打数据包更像是一个点,对应数据实体标识下的点,所以这里很容易联想到通过根节点和对应子节点标识输出对应子节点的数据包(层序遍历,套打部分实现也使用了这一逻辑);

第三点,套打数据包是以字段标识命名而非字段的绑定实体属性(单据套打的取数细节主要以查询服务QureyService实现)

image.png

第四点,即使我们没有加入组织字段,但是为什么数据包中会有组织呢,修改会有什么影响?

由于调整了单据头的套打数据包的组织内码,对应的单据头打印为无权,其他实体不受影响(引出套打各层数据包独立的概念,后续细化),因此如果二开的时候如果不是很有把握,如果需要创建新的数据包建议在构造新的数据包的时候,使用原数据包把所有字段进行复制,而后调整自己的字段,二开数据包时带组织控制的字段权限问题

image.png

第五点,套打的多语言字段实现,以多语言文本为例演示

数据包中多语言字段的值为List<Kingdee.BOS.LocaleValue>

image.png

当需要获取对应语言的值,那么直接在控件上设置属性(前提是数据包为多语言结构)。

image.png

第六点,套打数据包属于数据库直接取数得到,对应与界面显示不一致,后续还要经过全县验证、列表外观格式化、套打格式化才得到输出结果,也就是说套打数据包会被覆盖,针对部分特殊字段处理,不保证插件调整后不会被系统覆盖(历史逻辑,如基础资料下的子字段),因此如果干预后无效的,建议创建自己的动态字段解决

创建动态字段:【套打】python插件加二开字段实现自定义功能【套打】套打打印自定义图片


基本上针对单一数据源的干预套打数据包逻辑在上面就讲解完成,接下来讲整个套打周期下的套打干预数据包接口运作

<1>深入套打干预数据包接口的调用逻辑

还是接着上面的例子,我们加入日志记录,记录一次套打操作中调用的套打数据包逻辑。

image.png

image.png

在这个工序计划单中,单据头FBillHead调用了一次,单据体FEntity调用了一次,子单据体调用了两次。

在普通连续套打(单个单据套打也是普通连续套打)中,我们首先根据单据内码加载单据头,加载完单据头后加载单据头的子实体(这里指单据体),这是对应的前两次的加载逻辑;针对两个单据体分录我们需要使用同一个数据源标识去存放数据,是怎么实现的呢?通过在其父级数据源(如单据体的父实体就是单据头、子单据体的父实体就是单据体)绑定一个值更新事件:当前处在数据行修改时,更新其所关联子实体的数据。

image.png

因此在修正套打啊数据包的时候,如果需要针对子单据体及以下等级(如父实体为子单据体的子单据体实体,也就是第四层)时,需要判断数据包中的分录内码,判断当前的父分录所属的数据(因此当当前实体存在父实体时,一定会携带有父实体的分录内码)。

也就是在普通连续套打中,有多少个单据体分录,对应的子单据体数据就需要取多少次,因此套打干预数据包接口本身就调用很频繁,在二开时不用做频繁的数据库访问或者复杂度较高的逻辑,引入记忆化处理或批量取数等逻辑进行处理。

验证下两个单据的普通连续套打的接口调用示例,将日志对应行号与模板对应执行关系

image.png

image.png


<2>了解合并套打=》合并单据头套打、合并单据体套打(单据体分录合并,子分录连续套打)

合并套打不同于连续套打,还是按照上面紧接的示例,如果是用文本空间绑定单据头放置在数据表格的普通行,而且套打换页,对应文本控件的输出会很有意思,如下图所示。

image.png

image.png

合并套打在单据体合并套打时,能够根据对应的单据体分录焦点行更新当前的单据头,让单据头重新取数,使得对应的文本能够获取到对应的数字,也就是说在单据体合并套打时,对应的单据体分录内码改变时,其单据头会跟随移动,子单据体也会重新取数。

了解的数据包的关联关系后,可以针对关联关系做数据调整,调整对应的输出逻辑,参考示例:【套打】自实现合并套打所选子分录



其他注意事项:

数据包中的单据内码、父实体分录内码、当前实体分录内码不建议进行修改,否则会影响关联实体更新的逻辑


赞 6