流程变量实战解析

2023-06-30 Activiti7工作流引擎

上文我们已经讲过了UEL表达式,先有一个需求如下:请假流程是,填写申请单→部门经理审核→CTO审核→财务审核,如果是小于3天的假期不需要经过CTO,如下图所示: 请假流程

不单单活动上可以设置URL表达式,流程线同样可以设置。

创建一个BPMN流程文件,如下所示,每个实例的assignee设置为0~3,流程线做出如图配置。

image-20230630165506982

# 设置global流程变量

首先创建对象

public class Holidays implements Serializable {

    /**
     * 主键id
     */
    private Long id;
    /**
     * 出差申请单名称
     */
    private String holidaysName;
    /**
     * 出差天数
     */
    private Double num;
    /**
     * 预计开始时间
     */
    private Date beginDate;
    /**
     * 预计结束时间
     */
    private Date endDate;
    /**
     * 目的地
     */
    private String destination;
    /**
     * 出差事由
     */
    private String reson;
    
    // get&set&toString
}

# 启动流程时设置变量

启动流程时传递Holidays对象到map中,流程线会读取holidays中的num变量的值来执行流程,最后可以完成任务一步一步执行,自行测试下。

public void startProcess(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    //启动实例
    Map<String,Object> map=new HashMap<>();
    Holidays holidays = new Holidays();
    holidays.setNum(2d);
    map.put("holidays",holidays);

    map.put("assignee0","itlils");
    map.put("assignee1","zhuzhu");
    map.put("assignee2","itnanls");
    map.put("assignee3","weiwei");
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("holiday-global1",map);

    System.out.println("ProcessDefinitionId"+instance.getProcessDefinitionId());
    System.out.println("Id"+instance.getId());
    System.out.println("ActivityId"+instance.getActivityId());
}

# 通过当前流程实例设置

除了创建时设置,还能在创建后,根据id或其他方式摘到具体的流程实例,通过setVariable设置全局变量

public void setGlobalVariableByExecutionId(){
    String executionId="2601";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    Holidays holidays = new Holidays();
    holidays.setNum(2d);
    // 通过流程实例 id设置流程变量
    runtimeService.setVariable(executionId, "holidays", holidays);
    // 一次设置多个值
    //runtimeService.setVariables(executionId, variables)
}

# 通过当前任务设置

public void setGlobalVariableByTaskId(){
    String taskId="1404";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Holidays holidays = new Holidays();
    holidays.setNum(2d);
    //通过任务设置流程变量
    taskService.setVariable(taskId, "holidays", holidays);
    //一次设置多个值 taskService.setVariables(taskId, variables)
}

# 设置local流程变量

1、任务办理时设置:任务办理时设置local流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无法在当前流程实例使用,可以通过查询历史任务查询。

@Test
public void completTask() {
    String taskId = "1404";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    
    Map<String, Object> variables = new HashMap<String, Object>();
    Holidays holidays = new Holidays();
    holidays.setNum(2d);
    
    Map<String, Object> variables = new HashMap<String, Object>();

    variables.put("holidays", holidays);
    //  设置local变量,作用域为该任务
    taskService.setVariablesLocal(taskId, variables);
    //  完成任务
    taskService.complete(taskId);
}

说明:设置作用域为任务的local变量,每个任务可以设置同名的变量,互不影响。

# 2、通过当前任务设置

@Test
public void setLocalVariableByTaskId(){
    String taskId="1404";
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Holidays holidays = new Holidays();
    holidays.setNum(2d);
    taskService.setVariableLocal(taskId, "holidays", holidays);
    //  一次设置多个值 
    //taskService.setVariablesLocal(taskId, variables)
}
上次更新: 5 个月前