Activiti 第四天 组任务 网关
课程安排:
组任务:
Candidate-user 候选人
Candidate-group 候选组(重点)
网关(重点):
ExclusiveGateway 排他网关
parallelGateway 并行网关
InclusiveGateway 包含网关
综合案例(重点)
1 复习
采购流程监控查询(常用,重点)
当前流程实例查询,查询系统中当前正在运行所有流程,查看流程当前运行的状态
结束的流程信息,主要应用于对历史业务数据进行统计分析:
实现方法(掌握):
分工明确,业务系统记录了业务数据,统计来源于业务系统。
可能会需要acitiviti将流程的运行信息通过监听器写入业务系统中。
监听器:
TaskListener
ExecutionListener
历史任务查询:
根据流程实例id查询该流程执行过的所有任务
根据用户id(通常是当前用户)查询该 用户所执行过的任务
流程变量:
流程变量类型包括 :
简单类型:string double…
序列化类型:自定义的pojo,需要实现serializable接口。
流程变量作用域:
Global全局变量:activiti中常用,作用域最大,是整个流程实例,当流程实例结束,global变量无效。
Local局部变量:作用域可以是一个任务Task、或一个执行分支Execution,当这个任务结束,local变量无效。
可以通过historyService查询历史流程变量。
注意:流程变量是activiti用于控制流程设置的变量,不建议流程变量中存储业务数据。
流程变量使用:(重点)
通过UEL表达式来使用流程变量控制流程的执行。
通过在连线上设置condition条件,条件使用UEL表达式,表达式中使用流程变量。
注意:
如果UEL表达式中流程变量不存在会跑出异常。
如果UEL表达式中流程变量存在,没有符合的条件,流程会执行结束。(排他网关可以避免)
全局变量设置:
常用:
1》流程启动时设置流程变量,流程变量可以任何结点使用。
runtimeService.startProcessInstanceByKey(processDefinitionKey,variables)
2》任务完成时设置流程变量,在任务的后续结点可以使用该流程变量。
taskService.complete(tasked, variables)
3》通过当前流程实例 的id设置流程变量
runtimeService.setVariables(processInstanceId, variables)
通过:runtimeService.getVariables()方法获取全局变量
processInstanceId:必须是当前正在运行的流程实例id
4》通过当前待办任务的id设置流程变量。
taskService.setVariables(taskId, variables)
通过: taskService.getVariables()方法获取全局变量
taskId:必须是当前待办任务(未完成任务)的id
2 Candidate-user候选人
2.1 什么是候选人
采用固定分配方法给任务指定负责人,如果任务负责人出现变更,需要修改流程定义,就可以采用候选人分配方式,先给任务分配多个候选人,候选人通过拾取组任务进行个人任务办理。
给任务分配候选人,如果分配多个候选人中间使用半角逗号分隔。
2.2 什么是组任务
多个候选人有资格完成该 任务,这个任务叫做组任务。
组任务具备条件:
任务没有设置assignee任务负责人
任务具有候选人
2.3 候选人办理任务过程
第一步:给任务设置候选人(多个, 中间使用半角逗号分隔)
候选人是无法办理任务
第二步:候选人查询组任务
使用taskService查询,指定candidate候选人。
第三步:候选人拾取(claim)组任务
候选人拾取组任务后,该 候选人变为任务的负责人,该任务变为个人任务
如果候选人拾取组任务后,不想办理该 任务,可以将个人任务归还,该个人任务变为组任务
第四步:查询待办个人任务
第五步:办理任务
第六步:流程结束
2.4 Candidate-user办理任务api
候选人查询组任务
使用taskService指定candidateUser候选人查询组任务。
//任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//候选人
String candidateUser = "zhangsan";
taskQuery.taskCandidateUser(candidateUser);
//流程定义key
String processDefinitionKey = "purchasingflow";
taskQuery.processDefinitionKey(processDefinitionKey);
List<Task> list = taskQuery.list();
注意:查询组任务,必须指定 candidateUser候选人,查询该 候选人有资格办理的组任务。
拾取组任务
通过taskService,指定任务id和候选人拾取任务:
TaskService taskService = processEngine.getTaskService();
//组任务id
String taskId = "5604";
//任务候选人,claim拾取后该 候选人变为任务负责人
String userId = "zhangsan";
//任务拾取
taskService.claim(taskId, userId);
注意:如果拾取人不是该任务的候选人也可以拾取成功,在拾取之前需要校验,该 候选人是否有资格拾取该 任务.
// 组任务id
String taskId = "6004";
// 任务候选人,claim拾取后该 候选人变为任务负责人
String candidateUser = "zhangsan4";
//根据候选人和组任务id查询,如果有记录说明该 候选人有资格拾取该 任务
Task task = taskService.createTaskQuery().taskId(taskId)
.taskCandidateUser(candidateUser).singleResult();
if(task!=null){
// 任务拾取
taskService.claim(taskId, candidateUser);
System.out.println("任务拾取成功");
}
组任务归还
// 归还组任务,由个人任务变为组任务,还可以进行任务交接
@Test
public void setAssignee() {
// 查询任务使用TaskService
TaskService taskService = processEngine.getTaskService();
// 当前待办任务
String taskId = "6004";
// 任务负责人
String userId = "zhangsan2";
//校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
if(task!=null){
//如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);
}
}
任务交接
任务负责人也可以将任务交给其它候选人办理该任务
代码如下:
@Test
public void setAssigneeToCandidateUser() {
// 查询任务使用TaskService
TaskService taskService = processEngine.getTaskService();
// 当前待办任务
String taskId = "6004";
// 任务负责人
String userId = "zhangsan2";
// 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService.createTaskQuery().taskId(taskId)
.taskAssignee(userId).singleResult();
if (task != null) {
// 将此任务交给其它候选人办理该 任务
String candidateuser = "zhangsan";
// 根据候选人和组任务id查询,如果有记录说明该 候选人有资格拾取该 任务
Task task2 = taskService.createTaskQuery().taskId(taskId)
.taskCandidateUser(candidateuser).singleResult();
if (task2 != null) {
// 才可以交接
taskService.setAssignee(taskId, candidateuser);
}
}
}
查询个人任务
参考个人任务章节
办理个人任务
参考个人任务章节
数据表跟踪
如果任务设置候选人,当前任务表中assignee(任务负责人)是空。
SELECT * FROM act_ru_task #当前任务表
![这里写图片描述](https://img-blog.csdn.net/20170417162639292?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1NETl9BRg==/font/5a6L5L2T/fontsize/400/fill/I0JBQ