【Flowable】 7-核心内容之任务分配

Metadata

title: 【Flowable】 7-核心内容之任务分配
date: 2023-01-23 17:08
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/Flowable
categories:
  - Flowable
keywords:
  - Flowable
description: 【Flowable】 7-核心内容之任务分配

1. 任务分配

1.1 固定分配

固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过 Assignee 来指定的方式

1.2 表达式分配

Flowable 使用 UEL 进行表达式解析。UEL 代表 _Unified Expression Language_,是 EE6 规范的一部分. Flowable 支持两种 UEL 表达式: UEL-value 和 UEL-method

1.2.1 值表达式

值表达式 Value expression: 解析为一个值。默认情况下,所有流程变量都可以使用。(若使用 Spring)所有的 Spring bean 也可以用在表达式里。例如

${myVar}
${myBean.myProperty}

案例讲解:

可以看到通过表达式处理的效果

先部署流程,然后在启动流程实例的时候绑定表达式对应的值

@Test
public void testRunProcess(){

    
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    RuntimeService runtimeService = processEngine.getRuntimeService();
    
    Map<String,Object> variables = new HashMap<>();
    variables.put("assignee0","张三") ;
    variables.put("assignee1","李四"); 
    
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("MyHolidayUI:1:4", variables);
    
    System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
    System.out.println("流程实例的ID:" + processInstance.getId());
    System.out.println("当前活动的ID:" + processInstance.getActivityId());
}

在流程变量表中我们可以看到对应的流程变量信息

同时在 Task 表中,可以看到流程当前的分配人是​​张三​​,说明 UEL 表达式被解析了

1.2.2 方法表达式

方法表达式 Method expression: 调用一个方法,可以带或不带参数。** 当调用不带参数的方法时,要确保在方法名后添加空括号(以避免与值表达式混淆)。** 传递的参数可以是字面值 (literal value),也可以是表达式,它们会被自动解析。例如:

${printer.print()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}

myBean 是 Spring 容器中的个 Bean 对象,表示调用的是 bean 的 addNewOrder 方法

1.3 监听器分配

可以使用监听器来完成很多 Flowable 的流程业务。

我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定 assignee

创建自定义监听器:

public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
    System.out.println("监听器触发了:" + delegateTask.getName());
    if("提交请假流程".equals(delegateTask.getName()) &&
            "create".equals(delegateTask.getEventName())){
        
        delegateTask.setAssignee("小明");
    }else {
        delegateTask.setAssignee("小张");
    }
}
}

然后在 FlowableUI 中关联对应的监听器

create:任务创建后触发
assignment:任务分配后触发
Delete:任务完成后触发
All:所有事件都触发

然后我们先部署流程,然后执行查看效果:

然后在 Task 表中我们可以看到对应的分配人为​​小明​​​说明通过监听也完成了任务分配的工作了

到这儿就搞定了~