Flowable-任务分配和流程变量

一、任务分配和流程变量

(一) 任务分配

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 runtimeService = processEngine.getRuntimeService();
    // 设置 assignee 的取值
    Map<String,Object> variables = new HashMap<>();
    variables.put("assignee0","张三") ;
    variables.put("assignee1","李四"); 
    // 启动流程实例,第一个参数是流程定义的id
    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表中可以看到对应的分配人为小明说明通过监听也完成了任务分配的工作了

(二) 流程变量

流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在Java服务任务(service task)中用于调用外部服务(例如为服务调用提供输入或结果存储),等等。

流程实例可以持有变量(称作流程变量 process variables);用户任务以及执行(executions)——流程当前活动节点的指针——也可以持有变量。流程实例可以持有任意数量的变量,每个变量存储为ACT_RU_VARIABLE数据库表的一行。

所有的startProcessInstanceXXX方法都有一个可选参数,用于在流程实例创建及启动时设置变量。例如,在RuntimeService中:

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

也可以在流程执行中加入变量。例如,(RuntimeService):

void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);

2.1 全局变量

流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量

注意:如: Global变量:userId(变量名)、zhangsan(变量值)

global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。

2.2 局部变量

任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。Local 变量名也可以和 global 变量名相同,没有影响。

2.3 案例讲解

需求:员工创建出差申请单,由部门经理审核,部门经理申请通过后3天以下由财务直接申批,3天以上先由总经理审批,总经理审批通过后再由财务审批。

连接先设置条件

部署流程

@Test
public void deploy(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    Deployment deploy = repositoryService.createDeployment()
    .addClasspathResource("出差申请单.bpmn20.xml")
    .name("请假流程...")
    .category("请假") // 分类
    .tenantId("dpb") // 租户id
    .deploy();
    System.out.println("deploy.getId() = " + deploy.getId());
    System.out.println("deploy.getName() = " + deploy.getName());
    System.out.println("deploy.getCategory() = " + deploy.getCategory());
}

启动流程实例:并且指定全局流程变量

/**
     * 在启动流程实例的时候设置流程变量
     */
@Test
public void runProcess(){
    // 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 启动流程实例通过 RuntimeService 对象
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 设置流程变量
    Map<String,Object> variables = new HashMap<>();
    // 设置assignee的取值
    variables.put("assignee0","张三");
    variables.put("assignee1","李四");
    variables.put("assignee2","王五");
    variables.put("assignee3","赵财务");
    // 启动流程实例,第一个参数是流程定义的id
    ProcessInstance processInstance = runtimeService
    .startProcessInstanceById("evection:1:4",variables);// 启动流程实例
    // 输出相关的流程实例信息
    System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
    System.out.println("流程实例的ID:" + processInstance.getId());
    System.out.println("当前活动的ID:" + processInstance.getActivityId());

}

完成Task任务,同时也可以指定流程变量

/**
     * 完成任务时指定流程变量
     */
@Test
public void completeTask(){

    // 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
    .processDefinitionId("evection:1:4")
    .taskAssignee("李四")
    .singleResult();
    // 添加流程变量
    Map<String, Object> map = task.getProcessVariables();
    map.put("num",4);

    // 完成任务
    taskService.complete(task.getId(),map);
}

当然我们也可以在处理流程之外通过Task编号来修改流程变量

/**
     * 通过当前任务设置
     */
@Test
public void currentTask(){
    //   当前待办任务id
    //  获取processEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
    .processDefinitionId("evection:1:4")
    .taskAssignee("王五")
    .singleResult();
    // 添加流程变量
    Map<String, Object> map = task.getProcessVariables();
    map.put("num",1);
    //  一次设置多个值 设置局部变量
    taskService.setVariables(task.getId(), map);
}

二、结语

以上就是关于flowable任务分配和流程变量的介绍,在实际的项目中,通常使用较多的指定任务审批人,或者指定审批角色、岗位等,如果审批有多个人员,这个时候就可以使用候选人或者候选人组。

下一节:flowable-候选人和候选人组

相关推荐

  1. centerOS docker搭建flowable流程引擎

    2024-07-16 03:38:03       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 03:38:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 03:38:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 03:38:03       57 阅读
  4. Python语言-面向对象

    2024-07-16 03:38:03       68 阅读

热门阅读

  1. 玩转springboot之SpringBoot使用jsp

    2024-07-16 03:38:03       20 阅读
  2. 神经网络调参技巧(入门案例教程)

    2024-07-16 03:38:03       19 阅读
  3. 双缓存机制

    2024-07-16 03:38:03       15 阅读
  4. CNN -1 神经网络-概述

    2024-07-16 03:38:03       18 阅读
  5. 输入两个整数,输出最大公约数与最小公倍数。

    2024-07-16 03:38:03       17 阅读
  6. linux压缩/解压缩命令

    2024-07-16 03:38:03       18 阅读
  7. python pandas处理股票量化数据:笔记4

    2024-07-16 03:38:03       17 阅读