外观
流程插件开发
简介
AgileBPM 拥有强大的插件系统,安装插件可以让 AgileBPM 支持 自由跳转、消息发送、节点扩展Groovy脚本、会签等流程功能
AgileBPM的强大之处还体现在让你可以根据自己的需求开发出自己的插件。
AgileBPM 中流程所有功能皆插件,可插拔,各个插件之间是相互独立的。
AgileBPM 在 Activiti 引擎事件的基础上拓展了一套插件体系,简化了插件开发,只要遵循相应的规则即可。
流程中的插件分为两种:
- 配置式插件:配置类插件需要在设计器中配置,插件根据配置情况去执行,需实现配置式插件接口
- 运行时插件:在流程运行时执行的插件,无需前端配置页面,需实现运行时插件接口
配置式插件
配置类插件需要在设计器中配置,插件根据配置情况去执行,需实现配置式插件接口com.dstz.bpm.engine.plugin.BpmConfigPlugin
有两种配置插件
- 全局插件 :配置在流程全局的插件,在所有流程时机都会执行,可以选择执行时机以及执行节点,如:流程指引,节点消息等
- 节点插件 :配置在某个节点上的插件,运行到该节点才会执行该插件,如:几点会签,节点事件等
TIP
一般的业务需求,您 可以通过 全局事件插件 或者 节点事件插件 中的服务接口(HTTP 调用、ServerBean、事务消息、Groovy 脚本)来扩展业务逻辑, 如果需要批量对所有流程增强一种插件能力才需要参考该文档扩展流程能力。
配置式插件前端开发
前端主要就是针对 plugin-data 进行配置,配置后的内容,在插件执行时就可以通过 pluginDef 拿到了,我们可以根据具体配置执行具体逻辑。
TIP
如果需要初始化时默认配置该插件的话,可以在 defaultConfigJson.js 的 defaultFlow 中定义。
- 定义数据类型,方便和后端交互
- 开发配置页面
- 在index.ts 中引入配置页面,添加插件信息
定义数据接口
为了和方便后端接口交互,我们通常把配置页面用到的数据提前给定义好,数据接口定义统一放在 agilebpm/types/bpmn-design/bpmPlugins.d.ts
中。
如:流程指引插件 数据接口定义
java
declare interface NodeExplain {
/** 节点 */
nodeId?: string
/** 指引描述 */
desc: string
/** 指引文档模板 */
htmlTemplate: string
}
开发配置页面
首先开发插件的配置页面,页面统一放到 agilebpm/package/bpmn-design/package/ab-plugins/modules/
目录中
配置页 prop 入参:
plugin-data
:流程保存提交的插件配置json,对应后端的PluginDef 的配置 JSON,bo-list
: 业务对象信息node-config
:节点属性配置信息flow-setting
:流程配置属性信息,其中包含了插件信息plugins
如:流程插件指引中通过props 来接受父组件传过来的数据
java
const props = defineProps({
pluginData: { required: true, type: Array },
flowSetting: { required: true, type: Object as PropType<FlowSetting> },
})
在index.ts 中引入配置页面
在index.ts 中引入配置页面,添加插件信息。index.ts 路径 agilebpm/package/bpmn-design/package/ab-plugins/modules/index.ts
如:流程指引插件
java
import NodeExplain from './nodeExplain.vue'
//在flowPlugins 添加插件信息
{
name: '流程指引插件',
key: 'nodeExplain',
desc: '用于展示流程指导性文档',
icon: QuestionFilled,
component: markRaw(NodeExplain),
initJson: [],
},
- name : 插件名称
- kye : 插件组件,不可重复
- desc : 插件描述
- icon : 插件图标
- component : 动态加载子组件
- initJson :初始化json
配置式插件后端开发
- 定义插件数据实体类
- 插件执行类
定义插件数据实体类
插件数据实体类要实现com.dstz.bpm.engine.plugin.BpmPluginDef
接口 插件数据对象中的字段是插件在执行中需要的数据,和前端定义好的数据对象一一对应。
如:流程指引数据实体类
java
public class NodeExplain implements java.io.Serializable {
private String desc;
private String nodeId;
private String htmlTemplate;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
......
}
/**
* 流程指引插件数据实体类
*/
public class NodeExplainPluginDef implements BpmPluginDef {
private List<NodeExplain> nodeExplainList;
public List<NodeExplain> getNodeExplainList() {
return nodeExplainList;
}
public void setNodeExplainList(List<NodeExplain> nodeExplainList) {
this.nodeExplainList = nodeExplainList;
}
}
插件执行类
插件执行类需要实现 com.dstz.bpm.engine.plugin.BpmConfigPlugin
接口,下面就 BpmConfigPlugin
中的方法逐一进行详细介绍。
getTitle
标题标题
java
/**
* 获取插件标题,前端会根据title展示插件标题
*
* @return String
*/
String getTitle();
getKey
插件key插件key前后端要保持一致
java
/**
* 插件的key,也是BeanID 前端会根据插件设置 JSON key
* 同时也是 bpmProcessDef pluginDefMap 的 key
*
* @return 插件KEY
*/
String getKey();
parseConfig
解析配置
java
/**
* 解析插件定义, 默认JSON 解析,子类可重写解析
*
* @param config 配置
* @return BpmPluginDef
*/
T parseConfig(JsonNode config);
execute
插件运行插件执行方法,插件的具体执行逻辑,可以使用流程环境变量actionModel,流程设计器中插件配置的信息pluginDef,以及当前是什么时机pluginEvent。
在这里实现插件具体的功能,比如通过插件配置决定是否在当前时机执行,通过插件配置内容推送消息等。
java
/**
* 插件运行
*
* @param pluginEvent 插件事件
* @param pluginDef 插件定义
* @param actionModel action model
*/
void execute(PluginEvent pluginEvent, T pluginDef, ActionModel actionModel);
getSupportEvents
支持的流程事件设置当前插件支持的事件,该插件只会在这些时机执行,如果没有限制的是话 直接返回 空数组即可
java
/**
* 设置当前插件支持的事件
*
* @return List<PluginEventType>
*/
List<PluginEvent> getSupportEvents();
isGlobal
是否是全局插件
java
/**
* 节点插件需要重写下、
*
* @return 是否流程插件
*/
default boolean isGlobal() {
return true;
}
运行时插件
在流程运行时执行的插件,无需前端配置页面,需实现运行时插件接口 com.dstz.bpm.engine.plugin.BpmRuntimePlugin
, 和 com.dstz.bpm.engine.plugin.BpmConfigPlugin
一样,都继承了com.dstz.bpm.engine.plugin.BpmPlugin。
TIP
可以参考已有插件去实现,如代理插件BpmTaskAgencyPlugin
下面就 BpmRuntimePlugin
中的方法逐一进行详细介绍。
execute
插件运行插件执行方法,插件的具体执行逻辑,可以使用流程环境变量actionModel,流程设计器中插件配置的信息pluginDef,以及当前是什么时机pluginEvent。
在这里实现插件具体的功能,比如通过插件配置决定是否在当前时机执行,通过插件配置内容推送消息等。
java
/**
* 插件运行
*
* @param pluginEvent 插件事件
* @param pluginDef 插件定义
* @param actionModel action model
*/
void execute(PluginEvent pluginEvent, T pluginDef, ActionModel actionModel);
getSupportEvents
支持的流程事件设置当前插件支持的事件,该插件只会在这些时机执行,如果没有限制的是话 直接返回 空数组即可
java
/**
* 设置当前插件支持的事件
*
* @return List<PluginEventType>
*/
List<PluginEvent> getSupportEvents();
isGlobal
是否是全局插件
java
/**
* 节点插件需要重写下、
*
* @return 是否流程插件
*/
default boolean isGlobal() {
return true;
}