1、流程变量
其实流程变量 Map<String,Object> 和Business Key都是可以存储我们业务数据的,只是流程变量可以参与到流程的控制中,而Business Key 在流程中没有任何作用,只是存储个额外数据。
1.流程变量尽量不要存储太多业务数据,尽量少存储数据,多用于流程判断中
2.Objcect值可以存储JSON数据,这个POJO类需要实现Serializable接口
3.流程变量的作用域有global和local
Global 全局作用域:默认流程变量就是全局的,这个流程每个节点都会向下传递,相同的Key会覆盖之前的变量值
//1:启动流程时设置变量
runtimeService.startProcessInstanceByKey("myLeave2", variables);
//2:TaskService设置变量
taskService.setVariables("taskID",null);
//3:提交任务时,设置变量
taskService.complete(t.getId(),"map 全局变量信息");
//4: RuntimeService 设置变量,只要任务不结束可随时设置
runtimeService.setVariables(processInstanceId,null);
Local作用域只针对1个任务或1个执行实例的范围,Local变量可以和Global变量名称一样,相互不影响。在某个Task设置变量
taskService.setVariablesLocal("taskID",null);
runtimeService.setVariableLocal(processInstanceId,"设置Local变量","");
2、变量注意事项,程序设置的变量值尽量提前手动规则校验
- 流程变量采用UEL表达式,用
${}
包裹变量或表达式${evection.num>3}
- 如果UEL表达式中变量名称不存在则报错
- 如果UEL表达式中变量值为NULL,不可判断,流程结束
- 如果UEL表达式都不符合,流程结束(异常结束)
- 如果连线不设置条件,会走flow 序号小的那条线(最新拉去线)
- 设置流程变量会向表
act_ru_variable
插入记录,同时向历史表act_hi_varinst
插入
3、流程中添加变量,通过变量控制流程走向
项目中添加流程MyLeave2.bpmn 请假流程2,当请假天数大于3时,需要提交给”总经理“审批。否则直接给”财务“审批。流程中下一个节点负责人 由变量动态控制。
3.1、创建流程时,设置变量判断
3.2、开启流程时设置变量
package com.hongying.activiti;
import com.hongying.model.Evection;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zyk
* @version 1.0.0
* @ClassName VariablesTest
* @Description 请假流程案例-变量
* @createTime 2021年06月27日 16:30:00
*/
@Slf4j
public class VariablesTest {
/**
* 配置请假工作流2,请假大于3天时,需要总经理审批。否则直接给财务审批。
*/
@Test
public void deployDemployment(){
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("bpmn/MyLeave2.bpmn")
.addClasspathResource("bpmn/MyLeave2.myLeave2.png")
.name("请假流程2")
.deploy();
log.info("请假流程部署,ID:{}",deploy.getId());
log.info("请假流程部署,Name:{}",deploy.getName());
}
/**
* 开启请假流程2,请假大于3天给总经理审批;
* 所有请假审批负责人由 变量控制
*/
@Test
public void startProcess(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> variables=new HashMap<>();
Evection evection=new Evection();
evection.setNum(5);
variables.put("evection",evection);
variables.put("work","gg");
variables.put("manager","总经理");
variables.put("finance","财务");
//开启流程传递变量
ProcessInstance myLeave2 = runtimeService.startProcessInstanceByKey("myLeave2", variables);
log.info("开启新流程2:{}",myLeave2.getId());
//打印历史信息
printNextProcessInfo(myLeave2.getId());
}
/**
* 当前负责人完成任务
*/
@Test
public void completeProcess(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().processDefinitionKey("myLeave2")
.taskAssignee("财务").list();
//这里也可以设置变量
// taskService.setVariables("taskID",null);
//Task可以设置局部变量,只在当前Task有效
// taskService.setVariablesLocal("taskID",null);
for(Task t:tasks){
log.info("任务:{}-已被:{} 处理,变量:{}",t.getName(),t.getAssignee(),t.getProcessVariables());
//完成任务
taskService.complete(t.getId());
//提交任务时也可以设置变量。这里可修改全局变量
// taskService.complete(t.getId(),"map 全局变量信息");
//打印历史信息,及待处理人
printNextProcessInfo(t.getProcessInstanceId());
}
}
/**
* 通过RuntimeService 设置变量,Global和Local
*/
public void setVariables(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
String processInstanceId="52501";
runtimeService.setVariables(processInstanceId,null);
runtimeService.setVariable(processInstanceId,"manager","经理2");
runtimeService.setVariableLocal(processInstanceId,"设置Local变量","");
}
/**
* 查看下一个结点处理人
* @param instanceId
*/
private void printNextProcessInfo(String instanceId){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//根据流程实例ID查询
instanceQuery.processInstanceId(instanceId);
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
List<HistoricActivityInstance> history = instanceQuery.list();
for(HistoricActivityInstance hi:history){
log.info(hi.getActivityId());
log.info(hi.getActivityName());
log.info(hi.getProcessDefinitionId());
log.info(hi.getProcessInstanceId());
log.info(hi.getAssignee());
}
}
}