目录
定义
类型
作用域:
Local变量
流程变量的使用方法
实例
设置流程实例的三种方式
方式一:启动流程时设置流程变量
方式二:在任务办理时设置流程变量
方式三:通过当前流程实例设置
Local 流程变量的设置
添加
查看
组任务
基本步骤
查询组任务
拾取任务
归还任务
交接任务
流程变量在Activiti 中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti 结合时少不了流程变量,流程变量就是activiti 在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以设置为流程变量,在流程流转时使用。
如果将实体 存入到流程变量中,则实体必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要横撑serialVersionUid
流程变量的作用域可以是一个流程实例(processInstence),或者一个任务(Task),或者一个执行实例(execution)
任务和执行实例仅仅是针对一个任务和一个执行实例的范围,范围没有流程实例大,成为local变量。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响,Local变量也可以和global变量名相同,没有影响!
- 在属性上使用UEL表达式
可以在assignee 处设置UEL表达式,表达式的值为任务的负责人,比如:${assigness},assigness 就是一个流程变量名称
- 在连线上使用UEL表达式,决定流程走向
比如:${price<10000},price 就是一个流程变量名称,uel表达式结果为一个布尔类型
员工创建出差申请单,由部门经理审核,部门经理审核通过后,出差三天以下由财务直接审批,三天以上先由总经理审核,总经理审核通过再由财务审批。
在启动流程时设置流程变量,变量的作用域是整个流程实例。
通过Map
/**
* 通过任务实例来设置流程变量
*
* @author 15821
* @date 2021-12-08 15:41
*/
@Test
public void testProcessInstanceIdSetVariables() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 获取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
List 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流程变量的作用域只在当前任务节点下可用
@Test
public void testTaskCompleteSetLocalVariables() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List 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 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 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());
}
}
在流程定义中,在任务节点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。这个情况,可以给任务设置多个候选人,从候选人中选择参与者来完成任务
查询组任务-> 拾取任务-> 查询个人任务-> 办理个人任务
/**
* 查询组任务
* @update 2021-12-10 11:53 by 15821
*/
@Test
public void testGroupTaskList(){
// 流程实例 的KEY
String key = "evectionGroup";
String candidateUser = "经理";
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List tasks = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUser)
.list();
for (Task task : tasks){
System.out.println("流程实例的ID:"+task.getProcessInstanceId());
System.out.println("任务ID:"+task.getId());
System.out.println("任务负责人:"+task.getAssignee());
}
}
/**
* 候选人拾取任务
* @update 2021-12-10 11:54 by 15821
*/
@Test
public void claimTask(){
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 当前任务的ID
String taskId = "57502";
// 候选人
String candidateUser = "经理";
// 事务任务
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskCandidateUser(candidateUser)
.singleResult();
if(task!=null){
taskService.claim(taskId,candidateUser);
System.out.println("taskId : "+taskId+"、用户:'"+candidateUser+"'拾取任务成功");
}
}
/**
* 归还任务
* @update 2021-12-10 12:11 by 15821
*/
@Test
public void testAssigneeToGroupTask(){
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 当前任务的ID
String taskId = "57502";
// 任务负责人
String assigness = "经理";
// 事务任务
TaskService taskService = processEngine.getTaskService();
// 通过 任务id 和负责人查询任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assigness)
.singleResult();
if(task!=null){
// 归还任务
taskService.setAssignee(taskId,null);
System.out.println("taskId : "+taskId+"、用户:'"+assigness+"'归还任务成功");
}
}
/**
* 任务的交接
* @update 2021-12-10 12:11 by 15821
*/
@Test
public void testAssigneeToCandidateUser(){
// 当前任务的ID
String taskId = "57502";
// 任务负责人
String assigness = "经理";
// 任务候选人
String candidateUser = "副经理";
// 事务任务
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 通过 任务id 和负责人查询任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assigness)
.singleResult();
if(task!=null){
// 交接任务
taskService.setAssignee(taskId,candidateUser);
System.out.println("taskId : "+taskId+"、用户:'"+assigness+"'交接任务成功");
}
}