插件开发笔记(小白版)原创
金蝶云社区-李延栋
李延栋
8人赞赏了该文章 618次浏览 未经作者许可,禁止转载编辑于2023年12月12日 11:00:43

一、插件开发流程

1、确定应用场景,选择插件基类

    1)根据页面类型选择不同插件,即继承对应的类;

    2)常用的三种页面类型:动态表单插件AbstractFormPlugin、单据插件AbstractBillPlugIn、列表插件AbstractListPlugin;

    3)插件基类之间有派生关系。

2、响应插件事件,进行业务逻辑开发

    1)重写某方法(确定使用哪个触发节点的方法,然后重写它,就实现了在对应时间节点触发方法);

    2)操作页面上的元素,即操作页面上对应的标识

3、在对应页面注册插件

    1)注意千万不要注册错页面(同一张单据的表单和列表是两个页面)

二、常用的插件开发事件(即插件触发节点)

动态表单插件开发:

import kd.bos.bill.AbstractBillPlugIn;
    import kd.bos.entity.datamodel.events.PropertyChangedArgs;
    import kd.bos.form.control.events.BeforeItemClickEvent;
    import kd.bos.form.control.events.ItemClickEvent;
    import kd.bos.form.events.*;

    import java.util.EventObject;

    public class BillPlugIn extends AbstractBillPlugIn {

        @Override
        public void initialize() {
            super.initialize();
            // 生命周期的第一个,在构建页面和页面数据之前执行
        }

        @Override
        public void afterCreateNewData(EventObject e) {
            // 界面初始化或刷新,新建表单数据包后(新增模式)进入执行的方法,与afterLoadData互斥,可以在此事件修改字段值
        }

        @Override
        public void afterLoadData(EventObject e) {
            // 从数据库加载数据后(修改、查看模式)进入执行的方法,与afterCreateNewData互斥,不建议在此事件修改字段值
        }

        @Override
        public void afterBindData(EventObject e) {
            super.afterBindData(e);
            // 准备好数据后,根据各字段值数据,重新设置控件、字段的可用、可见性等,但不建议在此处修改数据
        }

        @Override
        public void registerListener(EventObject e) {
            super.registerListener(e);
            // 所有交互的监听事件都要在这里注册(除操作事件的监听外即doOperation不需要注册即可拦截监听)
            // 如按钮标签,基础资料的选择、附件的上传删除等等都需要在这里额外注册对应的监听
        }

        @Override
        public void beforeItemClick(BeforeItemClickEvent evt) {
            // 工具栏注册的点击监听事件(可以拦截取消)
        }

        @Override
        public void beforeDoOperation(BeforeDoOperationEventArgs args) {
            super.beforeDoOperation(args);
            // 工具栏注册的操作监听事件(执行操作前,可以拦截取消)
        }

        @Override
        public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
            super.afterDoOperation(afterDoOperationEventArgs);
            // 工具栏注册的操作监听事件(执行操作后,可以获取操作状态)
        }

        @Override
        public void itemClick(ItemClickEvent evt) {
            super.itemClick(evt);
            // 工具栏注册的点击监听事件,可以处理业务逻辑
        }

        @Override
        public void click(EventObject evt) {
            super.click(evt);
            // 按钮点击事件,需要注册监听
        }

        @Override
        public void propertyChanged(PropertyChangedArgs e) {
            // 字段的内容发生变化后触发的事件(需要开启字段的值更新)
        }

        @Override
        public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
            super.confirmCallBack(messageBoxClosedEvent);
            // 弹出框操作回调事件
        }

        @Override
        public void customEvent(CustomEventArgs e) {
            // 触发自定义控件的定制事件
        }

        @Override
        public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
            super.closedCallBack(closedCallBackEvent);
            // 子页面关闭回调事件
        }

        @Override
        public void beforeClosed(BeforeClosedEvent e) {
            super.beforeClosed(e);
            // 界面关闭之前触发此事件
        }
    }

操作插件:

操作插件的执行时机是在执行完beforeDoOperation后(表单操作情况下且未取消后续操作),afterDoOperation事件前

    import kd.bos.bill.AbstractBillPlugIn;
    import kd.bos.entity.datamodel.events.PropertyChangedArgs;
    import kd.bos.form.control.events.BeforeItemClickEvent;
    import kd.bos.form.control.events.ItemClickEvent;
    import kd.bos.form.events.*;

    import java.util.EventObject;

    public class BillPlugIn extends AbstractBillPlugIn {

        @Override
        public void initialize() {
            super.initialize();
            // 生命周期的第一个,在构建页面和页面数据之前执行
        }

        @Override
        public void afterCreateNewData(EventObject e) {
            // 界面初始化或刷新,新建表单数据包后(新增模式)进入执行的方法,与afterLoadData互斥,可以在此事件修改字段值
        }

        @Override
        public void afterLoadData(EventObject e) {
            // 从数据库加载数据后(修改、查看模式)进入执行的方法,与afterCreateNewData互斥,不建议在此事件修改字段值
        }

        @Override
        public void afterBindData(EventObject e) {
            super.afterBindData(e);
            // 准备好数据后,根据各字段值数据,重新设置控件、字段的可用、可见性等,但不建议在此处修改数据
        }

        @Override
        public void registerListener(EventObject e) {
            super.registerListener(e);
            // 所有交互的监听事件都要在这里注册(除操作事件的监听外即doOperation不需要注册即可拦截监听)
            // 如按钮标签,基础资料的选择、附件的上传删除等等都需要在这里额外注册对应的监听
        }

        @Override
        public void beforeItemClick(BeforeItemClickEvent evt) {
            // 工具栏注册的点击监听事件(可以拦截取消)
        }

        @Override
        public void beforeDoOperation(BeforeDoOperationEventArgs args) {
            super.beforeDoOperation(args);
            // 工具栏注册的操作监听事件(执行操作前,可以拦截取消)
        }

        @Override
        public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
            super.afterDoOperation(afterDoOperationEventArgs);
            // 工具栏注册的操作监听事件(执行操作后,可以获取操作状态)
        }

        @Override
        public void itemClick(ItemClickEvent evt) {
            super.itemClick(evt);
            // 工具栏注册的点击监听事件,可以处理业务逻辑
        }

        @Override
        public void click(EventObject evt) {
            super.click(evt);
            // 按钮点击事件,需要注册监听
        }

        @Override
        public void propertyChanged(PropertyChangedArgs e) {
            // 字段的内容发生变化后触发的事件(需要开启字段的值更新)
        }

        @Override
        public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
            super.confirmCallBack(messageBoxClosedEvent);
            // 弹出框操作回调事件
        }

        @Override
        public void customEvent(CustomEventArgs e) {
            // 触发自定义控件的定制事件
        }

        @Override
        public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
            super.closedCallBack(closedCallBackEvent);
            // 子页面关闭回调事件
        }

        @Override
        public void beforeClosed(BeforeClosedEvent e) {
            super.beforeClosed(e);
            // 界面关闭之前触发此事件
        }
    }


操作插件
操作插件的执行时机是在执行完beforeDoOperation后(表单操作情况下且未取消后续操作),afterDoOperation事件前

    import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
    import kd.bos.entity.plugin.AddValidatorsEventArgs;
    import kd.bos.entity.plugin.PreparePropertysEventArgs;
    import kd.bos.entity.plugin.args.*;

    public class OperationServicePlugIn extends AbstractOperationServicePlugIn {

        @Override
        public void onPreparePropertys(PreparePropertysEventArgs e) {
            super.onPreparePropertys(e);
            // 数据包准备,设置操作插件需要的数据包字段
        }

        @Override
        public void onAddValidators(AddValidatorsEventArgs e) {
            super.onAddValidators(e);
            // 增加自定义操作校验器,或者去掉内置的校验器(用来判断是否可以继续执行)
        }

        @Override
        public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
            // 对已经通过校验的数据,进行整理,或者取消操作的执行(请勿在此修改数据库数据)
            // e.getSelectedRows().addAll(passDataEntities); 设置通过的数据包内容
            // e.setCancelMessage(""); e.setCancel(true); 设置取消继续操作
        }

        @Override
        public void beginOperationTransaction(BeginOperationTransactionArgs e) {
            // 操作校验通过,开启了事务之后触发。触发时,系统还没有调用ORM引擎修改单据,数据库仍然是旧数据,可以在此处修改单据的值
            // 通过 this.operationResult.addErrorInfo(""); 来完成待修改数据包的非法数据处理

        }

        @Override
        public void endOperationTransaction(EndOperationTransactionArgs e) {
            // 系统已经调用ORM引擎存储了单据,数据已经入库
        }

        @Override
        public void rollbackOperation(RollbackOperationArgs e) {
            // 操作事务提交失败,事务回滚之后触发此事件
        }

        @Override
        public void afterExecuteOperationTransaction(AfterOperationArgs e) {
            // 事务已经完成并提交,对操作结果进行整理,或者执行其他无需事务保护的逻辑(无事务保护,请勿执行更新数据库)
        }
    }



赞 8