activiti流程变量
定义
流程变量在Activiti 中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti 结合时少不了流程变量,流程变量就是activiti 在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以设置为流程变量,在流程流转时使用。
类型
如果将实体 存入到流程变量中,则实体必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要横撑serialVersionUid
作用域:
流程变量的作用域可以是一个流程实例(processInstence),或者一个任务(Task),或者一个执行实例(execution)
Local变量
任务和执行实例仅仅是针对一个任务和一个执行实例的范围,范围没有流程实例大,成为local变量。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响,Local变量也可以和global变量名相同,没有影响!
流程变量的使用方法
- 在属性上使用UEL表达式
可以在assignee 处设置UEL表达式,表达式的值为任务的负责人,比如:${assigness},assigness 就是一个流程变量名称
- 在连线上使用UEL表达式,决定流程走向
比如:${price<10000},price 就是一个流程变量名称,uel表达式结果为一个布尔类型
实例
员工创建出差申请单,由部门经理审核,部门经理审核通过后,出差三天以下由财务直接审批,三天以上先由总经理审核,总经理审核通过再由财务审批。
设置流程实例的三种方式
方式一:启动流程时设置流程变量
在启动流程时设置流程变量,变量的作用域是整个流程实例。
通过Map
/**
* 发起一个流程
*/
@Test
public void test3(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 发起流程 需要通过 runtimeService来实现
RuntimeService runtimeService = engine.getRuntimeService();
// 定义流程变量信息
Map<String,Object> map = new HashMap<>();
map.put("assignee1","张三");
map.put("assignee2","李四");
map.put("ass1","变量1");
map.put("ass2",299);
map.put("ass3","湖南长沙");
map.put("ass4","波哥666");
// 通过流程定义ID来启动流程 返回的是流程实例对象
ProcessInstance processInstance = runtimeService
.startProcessInstanceById("holiday1:1:42503",map);
System.out.println("processInstance.getId() = " + processInstance.getId());
System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}
方式二:在任务办理时设置流程变量
在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实
例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。
方式三:通过当前流程实例设置
通过流程实例id 设置全局变量,该流程实例必须未执行完成。
@Test
public void test_completeTask(){
RepositoryServicerepositoryService = processEngine().getRepositoryService();
Map<String,Object>varlues = new HashMap();
varlues.put("applyTitle","test_请假申请流程");
varlues.put("applyTime","7天");
TaskServicetaskService =processEngine().getTaskService();
taskService.complete("5005",varlues);
}
通过任务实例来设置流程变量
@Test
public void testProcessInstanceIdSetVariables() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 获取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("evection-global").list();
Evection evection = new Evection();
evection.setNum(2d);
for (ProcessInstance instance : processInstances) {
runtimeService.setVariables("17501", Map.of("assigness02", "王经理"
, "assigness03", "李总经理"
, "evection", evection));
}
}
Local 流程变量的设置
local流程变量的作用域只在当前任务节点下可用
添加
@Test
public void testTaskCompleteSetLocalVariables() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("").list();
for (Task task : tasks) {
// System.out.println(task.getId());
taskService.setVariableLocal(task.getId(),"evection","local-variable");
}
}
查看
@Test
public void testTaskCompleteGetLocalVariables() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("王经理").list();
for (Task task : tasks) {
System.out.println(taskService.getVariableLocal("22502", "evection"));
}
}
如果任务完成后,可以通过查看历史信息进行查看
@Test
public void testFindHisLocalVariable() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricTaskInstance> instances = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().list();
for (HistoricTaskInstance instance : instances) {
System.out.println("==============================");
System.out.println("任务id:" + instance.getId());
System.out.println("任务名称:" + instance.getName());
System.out.println("任务负责人:" + instance.getAssignee());
System.out.println("任务local变量:" + instance.getTaskLocalVariables());
}
}