Appearance
上文我们已经讲过了UEL表达式,先有一个需求如下:请假流程是,填写申请单→部门经理审核→CTO审核→财务审核,如果是小于3天的假期不需要经过CTO,如下图所示:
不单单活动上可以设置URL表达式,流程线同样可以设置。
创建一个BPMN流程文件,如下所示,每个实例的assignee设置为0~3,流程线做出如图配置。
设置global流程变量
首先创建对象
java
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变量的值来执行流程,最后可以完成任务一步一步执行,自行测试下。
java
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
设置全局变量
java
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)
}
通过当前任务设置
java
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流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无法在当前流程实例使用,可以通过查询历史任务查询。
java
@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、通过当前任务设置
java
@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)
}