Flowable 快速入门教程:TaskListener 任务监听器设置审核人等参数案例

前言

具体功能实现需参考各自项目设计,这里主要提供一个实现思路,请勿照搬硬套

关于这个的实现,其实并不难,关键在于如何设计的更加通用化。

任务监听器类型

  1. create:在任务创建且所有任务属性设置完成之后才触发。
  2. assignment:在任务被分配给某个班里人之后触发,它是在create事件触发前被触发。
  3. complete:在配置了监听器的任务完成时触发,也就是说运行期任务删除之前触发。
  4. delete:任务删除触发

思路

结构

业务系统微服务
流程引擎微服务
参数配置表:配置节点需要设置的参数,包含审核人等
PS:这里参数配置表我放在业务系统

逻辑

  1. 任务节点设置统一的任务监听器 TaskListener
  2. 任务节点开始,初始化完参数后进入任务监听器
  3. 任务监听器去请求配置表获取需要配置的参数
  4. 循环获取的参数,根据配置设置变量

配置表设计

整体

配置表的设计仅作参考

参数需配置到具体的流程定义节点
在这里插入图片描述

类别

用于区分是普通参数,审核人,或者候选人

这里没有候选组,因为流程设计器原来设置组后,IDM 也会自动转化为候选人,只是在字段上做了下区分,因此这里只提供到候选人
在这里插入图片描述
在这里插入图片描述

类型

用于区分值的类型与获取方式
List 集合:需要特殊转化,主要在 多实例 使用
钩子函数:通过请求的方式,在业务系统端,自行通过接口设置参数,这个主要考虑再怎么设计参数也不可能尽善尽美,因此这里可以通过钩子函数方式,自行设置参数,当然我会带基本数据去请求,这样的配置也更加自由化
在这里插入图片描述

整体流程图

在这里插入图片描述

流程节点说明

第一审核人节点:审核人参数设置

在这里插入图片描述

流程设计器配置

在这里插入图片描述
在这里插入图片描述

配置表参数

配置审核人为 admin
在这里插入图片描述

任务步骤

发起流程

按照监听事件 create,监听器会在任务属性设置完成后触发,因此设计器上面审核人字段是直接设空的,因为如果设为变量会因找不到变量报错

获取节点参数

参数配置用的是流程定义 key,是为了流程版本迭代不需要重新配置参数
在这里插入图片描述
返回的参数,另一个参数是下个会签流程的,后面再说
在这里插入图片描述

设置参数

根据参数配置信息,能知道配置的这个是审核人参数,因此直接设置为节点审核人
在这里插入图片描述

结果

第一个节点完成
在这里插入图片描述

会签节点:多实例参数设置

在这里插入图片描述

流程设计器配置

基本的多实例配置,完成条件简单点一个人审核就通过

监听器都是同一个监听器
在这里插入图片描述
在这里插入图片描述

配置表参数

你会发现,参数的设置节点选择的是前一个节点

根据任务监听器 create 会在参数初始化结束才调用监听器

因此设计器上设置的 assigneeList 多实例变量也会初始化,因此肯定会报错

因此,多实例这种只能在之前节点提前设置参数

如果第一个节点就是会签怎么办?

我会选择在前面放个自动节点设置会签参数
在这里插入图片描述

任务步骤

设置参数

基本上的逻辑和之前都是一样的,因此直接来看设置参数

虽然是多实例,但是本质就是普通参数而已

由于是集合类型,因此需要转换为集合

所以我在参数配置特意分了一个 List 集合类别
在这里插入图片描述
在这里插入图片描述

结果

这是正在进行的任务,由于设置了两个用户,因此生成两个任务实例
在这里插入图片描述
来看下身份信息关联表
在这里插入图片描述

参考代码

关于代码中用到的 SpringUtilConfig,看下面这个文章
Flowable 监听器获取不到 Bean 问题

/**
 * 节点监听器设置参数
 * @author: linjinp
 * @create: 2019-12-16 14:02
 **/
@Component
public class ParamTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
    
        // 通过业务系统的接口获取数据
        // bean 获取
        RequsetFunctionService requsetFunctionService = SpringUtilConfig.getBean(RequsetFunctionService.class);
        FeignFlowParamService feignFlowParamService = SpringUtilConfig.getBean(FeignFlowParamService.class);
        // 获取流程定义 Key
        String processDefKey = (String) delegateTask.getVariable("processDefKey");
        // 请求获取配置参数列表
        String json = feignFlowParamService.getFlowTaskParam(processDefKey, delegateTask.getTaskDefinitionKey());
        ErrorMsg errorMsg = JSON.parseObject(json, ErrorMsg.class);
        // 请求没成功后面不继续执行
        if (!errorMsg.getErrorCode().equals(ErrorMsg.SUCCESS.getErrorCode())) {
            return;
        }
        
        // 钩子函数的参数
        Map<String, Object> data = new HashMap<>();
        data.put("processDefId", delegateTask.getProcessDefinitionId());
        data.put("processDefKey", processDefKey);
        data.put("processInstanceId", delegateTask.getProcessInstanceId());
        data.put("category", delegateTask.getCategory());
        data.put("taskId", delegateTask.getId());
        data.put("taskDefKey", delegateTask.getTaskDefinitionKey());
        // 循环设置参数
        if (errorMsg.getData() != null && !"".equals(errorMsg.getData())) {
            List<Map<String, Object>> flowParamList = (List<Map<String, Object>>) errorMsg.getData();
            flowParamList.forEach(flowParam -> {
                if ("1".equals(flowParam.get("style"))) {
                    // List 类型参数需特殊处理
                    String[] arr = ((String) flowParam.get("value")).split(",");
                    delegateTask.setVariable((String) flowParam.get("name"), Arrays.asList(arr));
                } else if ("2".equals(flowParam.get("style"))) {
                    // 钩子请求,不接收返回值,用户自行设置参数
                    requsetFunctionService.requestHook((String) flowParam.get("value"), JsonUtil.toJSON(data));
                } else {
                    if ("0".equals(flowParam.get("category"))) {
                        // 参数
                        delegateTask.setVariable((String) flowParam.get("name"), flowParam.get("value"));
                    } else if ("1".equals(flowParam.get("category"))) {
                        // 审核人
                        delegateTask.setAssignee((String) flowParam.get("value"));
                    } else {
                        // 候选人
                        String[] candicateUsers = ((String) flowParam.get("value")).split(",");
                        delegateTask.addCandidateUsers(Arrays.asList(candicateUsers));
                    }

                }
            });
        }
    }
}
发布了102 篇原创文章 · 获赞 375 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_37143673/article/details/103601649
今日推荐