```
组任务办理流程:查询组任务->拾取(claim)任务->查询个人待办任务->办理个人任务
除此之外还可以进行任务归还、任务交接。
```
:-: ![](https://img.kancloud.cn/31/99/3199fc5fcb0ba433726e05cedff89f53_1233x205.png)
文件:`evection-candidate.bpmn`
示例源码:*/activit-01/src/test/java/-/TestCandidate*
代码如下:
```java
/**
* 测试候选人
*/
public class TestCandidate {
/**
* 流程部署
*/
@Test
public void testDeployment() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
Deployment deploy = repositoryService.createDeployment()
.name("出差申请流程-Candidate")
.addClasspathResource("bpmn/evection-candidate.bpmn")
.addClasspathResource("bpmn/image/evection-candidate.png")
.deploy();
//4、输出部署信息
System.out.println("流程部署id=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
/**
* 启动流程
*/
@Test
public void testStartProcess() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//流程定义Key
String key = "testCandidate";
//启动流程
runtimeService.startProcessInstanceByKey(key);
}
/**
* >>>>>>>>>>1. 查询组任务<<<<<<<<<<
* 1)查询该候选人当前的待办任务。
* 2)候选人不能立即办理任务。
*/
@Test
public void findGroupTaskList() {
//流程定义的Key
String key = "testCandidate";
//任务候选人
String candidateUser = "wangwu";
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUser) //根据候选人查询任务
.list();
for (Task task : taskList) {
System.out.println("流程实例ID=" + task.getProcessInstanceId());
System.out.println("任务id=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
System.out.println();
}
//流程实例ID=35001
//任务id=37502
//任务负责人=null
//任务名称=部门经理审批
}
/**
* >>>>>>>>>>2. 候选人拾取任务<<<<<<<<<<
* 1)该组任务的所有候选人都能拾取。
* 2)将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
* 3)如果拾取后不想办理该任务, 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
*/
@Test
public void claimTask() {
//当前任务的id
String taskId = "37502";
//任务候选人
String candidateUser = "wangwu";
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//查询任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskCandidateUser(candidateUser)
.singleResult();
if (task != null) {
//拾取任务
taskService.claim(taskId, candidateUser);
//taskid-37502-用户-wangwu-拾取任务完成
System.out.println("taskid-" + taskId + "-用户-" + candidateUser + "-拾取任务完成");
} else {
System.out.println("taskid-" + taskId + "-用户-" + candidateUser + "-没有要拾取的任务");
}
}
/**
* >>>>>>>>>>3. 查询个人待办任务<<<<<<<<<<
*/
@Test
public void findPersonalTaskList() {
//流程定义key
String processDefinitionKey = "testCandidate";
//任务负责人
String assignee = "wangwu";
//获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建TaskService
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.taskAssignee(assignee)
.list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
System.out.println();
}
//流程实例id:35001
//任务id:37502
//任务负责人:wangwu
//任务名称:部门经理审批
}
/**
* >>>>>>>>>>4. 办理个人任务<<<<<<<<<<
*/
@Test
public void completeTask() {
//流程定义的Key
String key = "testCandidate";
//任务负责人
String assingee = "wangwu";
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取taskservice
TaskService taskService = processEngine.getTaskService();
//查询任务
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assingee)
.singleResult();
if (task != null) {
//根据任务id来完成任务
taskService.complete(task.getId());
System.out.println(assingee + " 完成了任务,任务id=" + task.getId());
} else {
System.out.println(assingee + "没有要完成的任务!");
}
}
/**
* 任务的归还
* 1) 如果拾取任务后不想办理该任务, 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
*/
@Test
public void testAssigneeToGroupTask() {
//当前任务的id
String taskId = "67502";
//任务负责人
String assignee = "wangwu";
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//根据key 和负责人来查询任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assignee)
.singleResult();
if (task != null) {
//归还任务 ,就是把负责人设置为空
taskService.setAssignee(taskId, null);
System.out.println("taskid-" + taskId + "-归还任务完成");
} else {
System.out.println(assignee + "没有要归还的任务!");
}
}
/**
* 任务的交接
*/
@Test
public void testAssigneeToCandidateUser() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//当前任务的id
String taskId = "67502";
//任务负责人
String assignee = "wangwu";
//任务候选人
String candidateUser = "lisi";
//根据key 和负责人来查询任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assignee)
.singleResult();
if (task != null) {
//交接任务 ,就是把负责人 设置为空
taskService.setAssignee(taskId, candidateUser);
System.out.println("taskid-" + taskId + "-交接任务完成");
} else {
System.out.println(assignee + "没有要交接的任务!");
}
}
}
```
数据库中查看:
```sql
#任务执行表,记录当前执行的任务,当任务是组任务时,所有assignee为空,当拾取任务后该字段就是拾取用户的id
mysql> select * from act_ru_task;
+-------+------+---------------+---------------+-----------------------+--------------...------+-----. ..
| ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | NAME_ | ...| ASSIGNEE_ ...
+-------+------+---------------+---------------+-----------------------+--------------+-------------...
| 50002 | 1 | 47502 | 47501 | testCandidate:1:32504 | 部门经理审批 ...| NULL |...
+-------+------+---------------+---------------+-----------------------+--------------+-------------...
#记录任务参与者
#记录当前参与任务用户或组,当前任务如果设置了候选人,会向该表插入候选人记录,有几个候选就插入几个
#与表act_ru_identitylink对应的还有一张历史表act_hi_identitylink,
#向act_ru_identitylink插入记录的同时也会向历史表插入记录。
mysql> select * from act_ru_identitylink;
+-------+------+-----------+-------------+----------+----------+---------------+--------------+
| ID_ | REV_ | GROUP_ID_ | TYPE_ | USER_ID_ | TASK_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ |
+-------+------+-----------+-------------+----------+----------+---------------+--------------+
| 47506 | 1 | NULL | participant | 汤姆 | NULL | 47501 | NULL |
| 50003 | 1 | NULL | candidate | lisi | 50002 | NULL | NULL |
| 50004 | 1 | NULL | participant | lisi | NULL | 47501 | NULL |
| 50005 | 1 | NULL | candidate | wangwu | 50002 | NULL | NULL |
| 50006 | 1 | NULL | participant | wangwu | NULL | 47501 | NULL |
+-------+------+-----------+-------------+----------+----------+---------------+--------------+
```
- Activiti流程引擎
- 工作流介绍
- Activiti是什么
- Activiti流程处理步骤
- Activiti环境搭建
- 搭建步骤
- 表结构介绍
- ActivitiAPI结构
- 认识流程符号
- 流程设计器的使用
- 流程处理步骤
- 乱码问题
- 流程实例
- 流程实例是什么
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 个人任务
- 分配任务负责人
- 查询待办任务
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 使用流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 4种网关类型
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable与Activiti
- Flowable环境搭建
- FlowableAPI
- 流程引擎API与服务
- 流程处理步骤
- 流程部署
- 流程部署方式
- 流程定义版本
- 删除已部署的流程
- 下载资源
- 流程实例
- 什么是流程实例
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 分配任务负责人
- 固定分配
- UEL表达式分配
- 监听器分配
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- 历史查询
- 查询历史
- Spring整合Flowable
- 配置文件整合
- 配置类整合
- SpringBoot整合Flowable