一文读懂-如何使用kde脚本写botp插件原创
金蝶云社区-犹豫
犹豫
7人赞赏了该文章 2,281次浏览 未经作者许可,禁止转载编辑于2021年12月15日 15:59:33
summary-icon摘要由AI智能服务提供

文本介绍了在特定场景下使用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方法中实现,如下图所示

image.png

setCustFilterDesc为不符合下推条件时的提示语

setCustFilterExperssion为脚本过滤执行条件(必填条件

setCustQFilters为向服务端发送的执行条件(必填条件)。

上图为最简单的单据过滤条件,即暂存单据不能进行下推,需要注意的是,kde中各种变量均为弱类型,必须要用var来定义。条件完成后效果如下:

image.png

另外一个常用的场景,就是在下推之后对下游单据的修改,我们也来简单介绍下。

上游单据中包含3个字段单据编号,币别,申请日期,需要将三个字段信息拼接后放入下游单据中,该如何实现呢?

image.png

我们需要在afterFieldMapping方法执行我们的逻辑。与java插件相同,首先需要获取到目标的数据包。

image.png

目标单可能为多张,需要遍历处理,这里需要注意的是,在kde脚本中遍历要使用fori的方式,如下图所示:

image.png

拿到目标单实体dataEntity以及原单行srcRows之后,我们可以获取源单的信息并对目标单进行赋值

image.png

可以使用this.getSrcMainType().getDisplayName()方法获取单据名称,在获取单据编号、日期、币别之后,对目标单的字段进行赋值。完成后测试下效果:

image.png

报异常了,这是为什么呢?


因为我们没有在源单取这些字段,导致e.getFldProperties().get("edge_applydate")为空,所以不能getValue,所以我们需要afterBuildQueryParemeter方法中添加我们需要的字段

image.png

保存之后再看下效果

image.png

同理,已经有源单数据以及目标单实体了,我们对目标单的单据体进行赋值

image.png

效果如下:


image.png

是不是并没有想象中的那么复杂呢?


另外还有一个重要的知识点需要补充,那就是在对单据头进行赋值过程中,用到了MyDateUtils,这个类是引入的是一个二开的时间工具类,因为标准产品的时间工具类并没有支持Kde脚本,所以我们需要自己创建一个工具类,在工具类的上需要增加注解@KSObject,方法上增加注解@KSMethod

image.png

image.png

创建完工具类之后,我们需要在kde脚本中引入该类

image.png

这样我们整个功能就完成了,剩下的方法小伙伴们可以自己研究一下,又不懂的地方,可以留言哦

赞 7