苍穹Java插件开发流程原创
金蝶云社区-聚宝彭
聚宝彭
18人赞赏了该文章 8167次浏览 未经作者许可,禁止转载编辑于2021年10月23日 15:46:17

目前,越来越多的伙伴加入到苍穹开发的大军中来,但很多同学对于插件开发还是相当难于快速上手,尤其是新入门的朋友,对于插件基类的选择 & 注册位置都不是很熟悉,下面仅以本文来给大家简单介绍一下,希望能给大家在苍穹开发的道路上提供一点帮助。


使用应用开发平台的设计器开发业务对象,全程配置,简单易学,但不够灵活。配置业务对象时使用的业务语意,需要预先定义,遇到未考虑的业务场景,则无法处理。业务对象设计器,目标是实现常见的大多数业务语意,利用开放的插件开发,可实现剩余的功能。


插件可以在适当的时机,根据接收到的上下文信息,对系统功能进行控制。适当的时机,是指插件只会在系统功能运行到了特定时刻,才能收到系统通知,进行功能处理,并不能对系统功能的全过程进行干预。插件拿到的上下文信息,能够调用的控制方法,也是经过系统封装,有所限制。简单的说,插件可以在系统约束的框架之内,对系统进行适度的干预,在灵活性与安全性之间有个平衡。


插件开发步骤

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

② 确定事件源&控件

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


插件基类选择

不同的业务对象类型,提供特定的业务功能,有适用的应用场景。系统为各种业务对象类型、各种应用场景,封装了相应的插件接口、事件方法,定义了抽象插件基类,实现最基本的插件接口。进行业务功能设计时,首先需要根据业务需求特点,分析业务应用场景,选择业务对象类型。如果需要进行插件开发,则根据前面确定好的业务对象类型及应用场景,从下表中选择对应插件基类进行扩展。

金蝶云苍穹java插件基类选择.png


事件/方法选择

有交互界面的应用场景(如表单、单据列表等),在界面加载、关闭时,会触发相应的插件事件。此外,用户与界面,以及界面上的控件交互时,也会触发插件事件。各种控件有其自身功能特点,适用不同的业务需求,并提供了相应的插件事件。在进行功能设计时,需要根据业务需求,选用合适的控件,确定需要重写的插件接口方法,然后响应插件事件。

没有交互界面的应用场景(如单据操作、单据转换、关联反写等),不会与用户发生交互,其插件事件是由服务引擎按顺序触发的。


响应插件事件

系统会在适当的时机,调用插件事件接口的方法,传入上下文参数,触发插件事件。不同的插件事件,触发的时机、传入的上下文参数、可以控制的功能,差异非常大。因此,必须根据业务需求,选择合适的插件事件响应。

  • 有界面交互的场景

有交互界面的应用场景,插件基类实现了表单界面支持的插件接口,但没有实现各种控件的插件接口。

如果只是要捕获表单界面事件,则扩展插件基类,重写表单事件方法即可。

如果要捕获各种控件事件,则需要:

    > 在插件类定义,实现控件支持的插件事件接口。例如:以树形控件支持节点勾选为例,业务插件需实现接口TreeNodeCheckListener,代码如下:

public class TreeViewTreeNodeCheckDemoPlugin extends AbstractBillPlugIn implements TreeNodeCheckListener

    > 实现控件的插件事件接口中的方法,完成事件的捕捉,接上例,示例代码如下:

        @Override
	public void treeNodeCheck(TreeNodeCheckEvent evt) {
		TreeView treeView = (TreeView) evt.getSource();
		if (StringUtils.equals(treeView.getKey(), KEY_TREEVIEW)){
			List<String> selectNodeIds = treeView.getTreeState().getCheckedNodeIds();
			// TODO 在此添加业务逻辑
		}
	}

    > 在表单界面插件registerListener事件,向控件实例注册本插件实例,完成控件与插件实例的绑定:控件事件发生时,即触发其所绑定的插件事件。

        @Override
	public void registerListener(EventObject e) {
		super.registerListener(e);
		// 侦听树节点勾选事件
		TreeView treeView = getView().getControl(KEY_TREEVIEW);
		treeView.addTreeNodeCheckListener(this);
	}

示例树形控件支持的节点勾选的完整代码如下:

package kd.demo;

import java.util.EventObject;
import java.util.List;

import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.control.TreeView;
import kd.bos.form.control.events.TreeNodeCheckEvent;
import kd.bos.form.control.events.TreeNodeCheckListener;

public class TreeViewTreeNodeCheckDemoPlugin extends AbstractBillPlugIn implements TreeNodeCheckListener {
	
	private final static String KEY_TREEVIEW = "treeviewap";

	@Override
	public void registerListener(EventObject e) {
		super.registerListener(e);
		// 侦听树节点勾选事件
		TreeView treeView = getView().getControl(KEY_TREEVIEW);
		treeView.addTreeNodeCheckListener(this);
	}

	@Override
	public void beforeBindData(EventObject e) {
		super.beforeBindData(e);
		TreeView treeView = getView().getControl(KEY_TREEVIEW);
		// 支持多选
		treeView.setMulti(true);
	}

	@Override
	public void treeNodeCheck(TreeNodeCheckEvent evt) {
		TreeView treeView = (TreeView) evt.getSource();
		if (StringUtils.equals(treeView.getKey(), KEY_TREEVIEW)){
			List<String> selectNodeIds = treeView.getTreeState().getCheckedNodeIds();
			// TODO 在此添加业务逻辑
		}
	}
}


  • 无界面交互的场景

没有交互界面的应用场景,插件基类已经实现了必要的插件接口,插件只需要扩展插件基类,重写事件方法即可完成事件的捕捉。


插件注册

由于苍穹平台内部的插件类型不同,其注册的位置亦不相同,下面逐一介绍各插件的注册位置。

动态表单/单据/基础资料PC端界面插件

插件注册路径:表单设计器 →【大纲】→ 根节点 →【业务属性】→【插件】→【注册】

image.png


动态表单/单据/基础资料PC端(标准/左树右表/树形)列表界面插件

插件注册路径:列表设计器 →【大纲】→ 根节点 →【业务属性】→【列表插件】→【注册】

image.png


业务操作插件

插件注册路径:

表单设计器 →【大纲】→ 根节点 →【业务属性】→【操作】→ 选择需要注册插件的操作代码(以save为例) →【修改】→【其它控制】→【服务插件】→【注册】

image.png

image.png


单据转换插件

插件注册路径:【开发服务云】→【业务流开发】→【转换规则】→ 选择一条转换规则进入详情界面 →【插件】→【注册】

image.png

image.png

image.png


工作流插件

插件注册路径:【流程服务云】→【工作流服务】→【设计中心】→【流程设计】→ 新建/打开一条流程

image.png

image.png


① 流程设计器界面空白处 →【基本信息】→【启动条件】→【条件类型】→【外部接口】→【类型】→【Java插件】→【插件类】

image.png


② 流程设计器界面空白处 →【流程控制】→【流程插件】→【新增】→【外部接口】→【类型】→【Java插件】→【插件类】

image.png


流程节点 →【插件】→【进入节点时执行/离开节点时执行/任务处理时执行】→【新增】→【类型】→【Java插件】→【插件类】

image.png

image.png


引入插件

操作插件注册路径:

表单设计器 →【大纲】→ 根节点 →【业务属性】→【操作】→ 【importdata】 →【修改】→【参数设置】→【引入插件】→【注册】

image.png

image.png


界面插件注册路径:

通过前述内容,我们已知道,引出插件的基类也是AbstractBillPlugin/AbstractBasePlugIn,即单据/基础资料插件基类,故其注册位置保持一致,这里不再赘述。


引出插件

通过前述内容,我们已知道,引出插件的基类也是AbstractListPlugin,即列表插件基类,故其注册位置保持一致,这里不再赘述。


套打/打印插件

插件注册路径:打印模板页面 →【大纲】→ 根节点 →【业务属性】→【插件】→【注册】

image.png


后台任务插件

插件注册路径:【系统服务云】→【系统管理】→【调度管理】→【调度作业】→ 新增/选择一条调度作业 → 【执行程序】

image.png

image.png

image.png


OpenAPI插件

插件注册路径:【开发服务云】→【开放平台】→【新增】→【新建API服务】→【操作服务/自定义服务】→【插件】→【注册】

image.png

image.png

image.png


报表界面插件

插件注册路径:报表页面 →【大纲】→ 根节点 →【业务属性】→【插件】→【注册】

image.png


报表取数插件

插件注册路径:报表页面 →【大纲】→【报表列表】→【业务属性】→【查询插件】

image.png


日志查看

① 测试/UAT/生产环境的日志可通过monitor查看。

② 日志输出方式的配置:租户管理中心(MC)→【基础数据维护】→【环境公共配置项】→【标准公共配置】→【配置】→【mservice】→【prop】→编码为log.confi的配置项。有关详细配置项的具体含义可自行百度查阅。


注意事项

1. 动态表单/单据/基础资料/列表/打印插件一定要先【大纲】页签下选中根节点

2. 因流程插件在不同的位置配置可实现不同的业务逻辑功能,故流程设计器界面多处位置可配置工作流插件,本文如有遗漏,请以标准产品相关资料为准。金蝶云•苍穹流程服务云使用指南:https://club.kdcloud.com/article/183308 。

3. 所有注册插件的地方请填写Java类的全类名


参考资料

https://dev.kingdee.com/index/docsNew/34f4b44b-0ced-4bbd-8421-251243949f02 ——《金蝶云苍穹平台插件开发指南》

https://dev.kingdee.com/index/docsNew/4f18dcb4-6f30-4b0f-817e-0485aabef97d 

https://dev.kingdee.com/index/docsNew/a750d6d3-a0a7-45c7-b9b5-4aecedf4f81d 



大家如有任何建议和意见,欢迎在评论区留言,我将不断努力改进。

创作不易,如能帮到大家,请动动您的金手指点赞鼓励一下,非常感谢~【emoji】【emoji】【emoji】


赞 18