【Flowable】 8-流程变量

Metadata

title: 【Flowable】 8-流程变量
date: 2023-01-23 17:10
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/Flowable
categories:
  - Flowable
keywords:
  - Flowable
description: 【Flowable】 8-流程变量

流程变量

流程实例按步骤执行时,需要使用一些数据。在 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);

1. 全局变量

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

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

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

2. 局部变量

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

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

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") 
    .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 = processEngine.getRuntimeService();
    
    Map<String,Object> variables = new HashMap<>();
    
    variables.put("assignee0","张三");
    variables.put("assignee1","李四");
    variables.put("assignee2","王五");
    variables.put("assignee3","赵财务");
    
    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(){
    
    
    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);
}

搞定~