文本介绍了在特定场景下使用KDE插件扩展BOTP功能,因Java插件有局限性。KDE插件高效且无需重启项目。文本提供了KDE插件脚本的基本框架和几个关键事件的实现方法,包括构建查询参数后、单据转换后、记录关联关系后等。通过示例说明了如何在构建数据筛选条件前设置自定义过滤条件,以及在下推后对下游单据进行字段赋值和处理的步骤,并提到了使用自定义时间工具类的必要性和引入方法。整体展示了KDE插件开发的实用性和灵活性。
当我们需要对botp功能进行扩展时,第一个想到的就是使用java插件。但是有些特定场景下,java插件有局限性,这个时候我们就要写kde插件来实现我们功能,kde插件保存即生效,不需要重新启动项目,执行效率高。但是botp暂时还没有参照样例,今天给大家介绍两个简单的样例。
Kde脚本触发时机与实现功能如下:
/** * @date 2021-12-08 */ var plugin = new ConvertPlugIn({ /** * 构建取数参数后事件 * * @param e * @remark * 添加额外的字段、过滤条件 */ afterBuildQueryParemeter: function(e) { }, /** * 单据转换后事件,最后执行 * * @param e * @remark * 插件可以在这个事件中,对生成的目标单数据,进行最后的修改 */ afterConvert: function(e) { }, /** * 记录关联关系后事件 * * @param e * @remark * 根据系统自动记录的关联关系,进行相关数据的同步携带,如携带其他子单据体数据 */ afterCreateLink: function(e) { }, /** * 创建目标单据数据包后事件 * * @param e * @remark * 这个事件,只在下推时触发,把根据分单规则创建好的目标单,传递给插件 */ afterCreateTarget: function(e) { }, /** * 目标字段赋值完毕后事件 * * @param e * @remark * 插件可以在此基础上,继续填写目标字段值 */ afterFieldMapping: function(e) { }, /** * 取源单数据后事件 * * @param e * @remark * 根据源单数据,获取其他定制的引用数据;也可以替换系统自动获取到的数据 */ afterGetSourceData: function(e) { }, /** * 构建分单、行合并模式之前事件 * * @param e * @remark * 调整分单、合并策略及依赖的字段 */ beforeBuildGroupMode: function(e) { }, /** * 编译数据筛选条件前事件 * * @param e * @remark * 设置忽略规则原生的条件,改用插件定制条件,或者在规则条件基础上,追加定制条件 * */ beforeBuildRowCondition: function(e) { }, /** * 记录关联关系前事件 * * @param e * @remark * 取消记录关联关系 */ beforeCreateLink: function(e) { }, /** * 初始化创建目标单据数据包前事件 * * @param e * @remark * 这个事件,只在选单时触发: * 选单时,需要基于现有的目标单数据包,进行追加处理; * 插件可以在此事件,获取到现有的目标单数据包,提前进行定制处理 */ beforeCreateTarget: function(e) { }, /** * 取源单数据前事件 * * @param e * @remark * 修改取数语句、取数条件 */ beforeGetSourceData: function(e) { }, /** * 初始化变量事件 * * @param e * @remark * 获取上下文信息,构建一些必须的变量 */ initVariable: function(e) { } });
首先以过滤条件为例做一个简单介绍,需要在beforeBuildRowCondition方法中实现,如下图所示
setCustFilterDesc为不符合下推条件时的提示语
setCustFilterExperssion为脚本过滤执行条件(必填条件)
setCustQFilters为向服务端发送的执行条件(必填条件)。
上图为最简单的单据过滤条件,即暂存单据不能进行下推,需要注意的是,kde中各种变量均为弱类型,必须要用var来定义。条件完成后效果如下:
另外一个常用的场景,就是在下推之后对下游单据的修改,我们也来简单介绍下。
上游单据中包含3个字段单据编号,币别,申请日期,需要将三个字段信息拼接后放入下游单据中,该如何实现呢?
我们需要在afterFieldMapping方法执行我们的逻辑。与java插件相同,首先需要获取到目标的数据包。
目标单可能为多张,需要遍历处理,这里需要注意的是,在kde脚本中遍历要使用fori的方式,如下图所示:
拿到目标单实体dataEntity以及原单行srcRows之后,我们可以获取源单的信息并对目标单进行赋值
可以使用this.getSrcMainType().getDisplayName()方法获取单据名称,在获取单据编号、日期、币别之后,对目标单的字段进行赋值。完成后测试下效果:
报异常了,这是为什么呢?
因为我们没有在源单取这些字段,导致e.getFldProperties().get("edge_applydate")为空,所以不能getValue,所以我们需要afterBuildQueryParemeter方法中添加我们需要的字段
保存之后再看下效果
同理,已经有源单数据以及目标单实体了,我们对目标单的单据体进行赋值
效果如下:
是不是并没有想象中的那么复杂呢?
另外还有一个重要的知识点需要补充,那就是在对单据头进行赋值过程中,用到了MyDateUtils,这个类是引入的是一个二开的时间工具类,因为标准产品的时间工具类并没有支持Kde脚本,所以我们需要自己创建一个工具类,在工具类的上需要增加注解@KSObject,方法上增加注解@KSMethod
创建完工具类之后,我们需要在kde脚本中引入该类
这样我们整个功能就完成了,剩下的方法小伙伴们可以自己研究一下,又不懂的地方,可以留言哦
推荐阅读