1. 概述

在流程配置时,我们可以在流程启动时,流程完成时,流程任务启动时,流程任务完成时,进行扩展,我们说的扩展指的时,比如在任务创建时 执行一个脚本。或者在任务完成时,触发一个子流程。

在平台中,我们默认实现了一些。

有些情况下,平台也会有一些自己的独特的任务,需要我们去扩展实现,那么就有必要了解如何去开发一个自定义的事件扩展。

2. 实现步骤

实现分为事件接口实现和前端的处理。

1 .事件接口实现 是解决事件业务逻辑。

  1. 前端主要是为了处理事件的配置实现。

2.1 接口定义

平台定义了一个事件处理接口。

接口定义如下:

package com.redxun.bpm.activiti.eventhandler;

/**
 * 事件调用接口。
 *
 * @author ray
 */
public interface IEventHandler {

    /**
     * 处理器类型。
     * @return
     */
    EventHanderType getType();

    /**
     * 处理事件。
     * @param message
     */
    void handEvent(BaseEventMessage message);


}

2.2 平台脚本事件实现

下面使用脚本事件的实现来说明。

public class ScriptEventHandler implements IEventHandler {
    @Resource
    ProcessScriptEngine processScriptEngine;


    @Override
    public EventHanderType getType() {
        return new EventHanderType("script","脚本");
    }

    @Override
    public void handEvent(BaseEventMessage message) {
        EventConfig eventSetting= message.getEventConfig();
        JSONObject config=eventSetting.getConfig();
        if(BeanUtil.isEmpty(config)) {
            return;
        }
        String script = config.getString("script");
        if(StringUtils.isEmpty(script)){
            return;
        }
        Map<String,Object> vars=message.getVars();
        //获取上下文变量数据。
        Map<String,Object> contextData= ActivitiUtil.getConextData(vars);
        //替换常量
        script= SysUtil.replaceConstant(script);

        processScriptEngine.exeScript(script,contextData);

    }

}

在编写脚本时可以使用上下文数据,并且脚本中可以使用常量。

上下文变量有:

参数 说明
vars 流程变量
cmd IExecuteCmd 接口实例对象
bo定义别名 这个主要是为了通过这个bo别名定义获取表单的数据。

接口的参数 为 BaseEventMessage 。

这个对象封装如下数据:

属性 说明
action 事件配置调用的动作名称 比如 APPROVE
handerType 事件处理器类型
async 事件是否异步处理,异步就是把事件消息放到队列中,消费者再消费这个消息
config 事件的配置。比如脚本,上例 String script = config.getString("script");
nodeConfig 节点配置,这个是用于全局事件配置

2.3 前端配置界面

配置界面的代码为 :bpmEventConfig.vue

关键代码为:

handlerTypeConfig(){
                var self=this;
                var handerType=self.currentConfig.handerType;
                if(!handerType || handerType=='none'){
                    return;
                }

                var wh=['1200px', '800px'];
                if(this.widthHeight[handerType]){
                    wh=this.widthHeight[handerType];
                }


                Util.open({
                    component: BpmCallConfig,
                    title: '接口调用配置-'+self.currentConfig.handerTypeName,
                    widthHeight: wh,
                    curVm:self,
                    data:{handerType:handerType,processAttr:self.processAttr,config:self.currentConfig.config}
                },function(action){
                    if(action!='ok') return;
                    var data = this.getData();
                    self.currentConfig.config=data;
                });
            },

我们可以为每一个事件类型都配置一个处理界面

这样我们如果后端增加一个事件处理器实现,我们在前端应用增加一个配置界面。这样我们就可以方便增加一个自定义的事件处理器。

文档更新时间: 2022-01-20 14:53   作者:zyg