```
組任務辦理流程:查詢組任務->拾取(claim)任務->查詢個人待辦任務->辦理個人任務
除此之外還可以進行任務歸還、任務交接。
```
:-: 
文件:`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