插件开发笔记(小白版)原创
10人赞赏了该文章
1,435次浏览
编辑于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) { // 事务已经完成并提交,对操作结果进行整理,或者执行其他无需事务保护的逻辑(无事务保护,请勿执行更新数据库) } }
赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读