1 組任務
1.1 概述
- 在流程定義中的任務結點的assignee固定設置任務負責人,如果臨時任務負責人變更則需要修改流程定義,系統的可擴展性差。針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務。
1.2 設置任務候選人
- 在流程圖中任務結點的配置中設置Candidate users,多個候選人之間用逗號隔開。
- 查看holiday.bpmn文件:
<process id="holiday" name="請假申請流程" isExecutable="true">
<startEvent id="startevent1" name="開始"></startEvent>
<userTask id="usertask1" name="填寫請假申請單" activiti:assignee="張三"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="部門經理審批" activiti:candidateUsers="李四,王五"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<userTask id="usertask3" name="總經理審批" activiti:assignee="趙六"></userTask>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
<endEvent id="endevent1" name="結束"></endEvent>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
</process>
- 我們可以看到部門經理審批的審核人已經設置為"李四,王五"這樣的一組候選人了。
1.3 組任務的辦理流程
- 1️⃣查詢組任務:
- 指定候選人,查詢該候選人當前的待辦任務。
- 候選人不能辦理任務。
- 2️⃣拾取(claim)任務:
- 該組任務的所有候選人都能拾取任務。
- 所謂的拾取任務就是將候選熱的組任務變成個人任務,即原來的候選人變成了任務的負責人。
- 如果拾取任務后不想辦理任務,只需要將已經拾取的個人任務歸還到組里面,那么此時的個人任務將變為組任務。
- 3️⃣查詢個人任務:
- 查詢方式同個人任務部分,根據assignee查詢用戶負責的個人任務。
- 4️⃣辦理個人任務。
1.4 組任務辦理流程的應用示例
1.4.1 准備工作
- 創建請假流程的BPMN文件(其中填寫請假申請單的assignee是
張三
,部門經理審批的candidate users是李四,王五
,總經理審批的assignee是趙六
):
- 部署流程定義以及啟動流程實例:
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
}
1.4.2 張三完成請假申請任務
- 示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
}
1.4.3 李四查詢組任務
- 示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
/**
* 查詢候選人組任務
*/
@Test
public void testQueryCandidateGroupTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
String processInstanceId = task.getProcessInstanceId();
System.out.println("流程實例的id = " + processInstanceId);
String name = task.getName();
System.out.println("任務名稱 = " + name);
String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
System.out.println("任務的負責人是 = " + assignee);
}
}
}
1.4.4 李四拾取任務
- 示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
/**
* 查詢候選人組任務
*/
@Test
public void testQueryCandidateGroupTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
String processInstanceId = task.getProcessInstanceId();
System.out.println("流程實例的id = " + processInstanceId);
String name = task.getName();
System.out.println("任務名稱 = " + name);
String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
System.out.println("任務的負責人是 = " + assignee);
}
}
/**
* 用戶拾取組任務:將候選人的組任務,變成個人任務。
* 注意:
* ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
* ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
*/
@Test
public void testClaimTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.claim(taskId,candidateUser);
System.out.println("任務拾取完畢");
}
}
}
1.4.5 李四查詢任務並完成任務
- 示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
/**
* 查詢候選人組任務
*/
@Test
public void testQueryCandidateGroupTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
String processInstanceId = task.getProcessInstanceId();
System.out.println("流程實例的id = " + processInstanceId);
String name = task.getName();
System.out.println("任務名稱 = " + name);
String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
System.out.println("任務的負責人是 = " + assignee);
}
}
/**
* 用戶拾取組任務:將候選人的組任務,變成個人任務。
* 注意:
* ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
* ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
*/
@Test
public void testClaimTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.claim(taskId,candidateUser);
System.out.println("任務拾取完畢");
}
}
/**
* 查詢任務並完成任務
*/
@Test
public void testCompleteTask(){
String processDefinitionKey = "holiday";
String assignee = "李四";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
}
1.4.6 當前用戶歸還組任務
- 示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
/**
* 查詢候選人組任務
*/
@Test
public void testQueryCandidateGroupTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
String processInstanceId = task.getProcessInstanceId();
System.out.println("流程實例的id = " + processInstanceId);
String name = task.getName();
System.out.println("任務名稱 = " + name);
String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
System.out.println("任務的負責人是 = " + assignee);
}
}
/**
* 用戶拾取組任務:將候選人的組任務,變成個人任務。
* 注意:
* ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
* ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
*/
@Test
public void testClaimTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.claim(taskId,candidateUser);
System.out.println("任務拾取完畢");
}
}
/**
* 歸還組任務
* 說明:建議歸還任務前校驗用戶是否是該任務的負責人,也可以通過setAssignee方法將任務委托給其他用戶負責,注意被委托的用戶可以不是候選人(建議不要這么做)
*/
@Test
public void testUnclaim(){
String processDefinitionKey = "holiday";
String assignee = "李四";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
// 如果設置為null,歸還組任務,該 任務沒有負責人
taskService.setAssignee(taskId, null);
}
}
// /**
// * 查詢任務並完成任務
// */
// @Test
// public void testCompleteTask(){
// String processDefinitionKey = "holiday";
//
// String assignee = "李四";
//
// TaskService taskService = processEngine.getTaskService();
//
// List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
// for (Task task : taskList) {
// String taskId = task.getId();
// System.out.println("任務的id = " + taskId);
//
// taskService.complete(taskId);
// }
// }
}
1.4.7 任務交接
-
任務交接就是任務負責人將任務交給其它候選人辦理該任務。
-
示例:
package com.sunxiaping;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-10 21:37
*/
public class GroupTest {
ProcessEngine processEngine = null;
@Before
public void before() {
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
processEngine = configuration.buildProcessEngine();
}
@Test
public void after() {
if (processEngine != null) {
processEngine.close();
}
}
/**
* 部署流程定義
*/
@Test
public void testDeployment() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("請假申請流程")
.deploy();
String id = deployment.getId();
System.out.println("流程部署的id = " + id);
String name = deployment.getName();
System.out.println("流程部署的名稱 = " + name);
}
/**
* 啟動流程實例
*/
@Test
public void testStartProcessInstance() {
String processDefinitionKey = "holiday";
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
}
/**
* 張三完成請假申請任務
*/
@Test
public void testTaskZhangsan() {
String processDefinitionKey = "holiday";
String assignee = "張三";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.complete(taskId);
}
}
/**
* 查詢候選人組任務
*/
@Test
public void testQueryCandidateGroupTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
String processInstanceId = task.getProcessInstanceId();
System.out.println("流程實例的id = " + processInstanceId);
String name = task.getName();
System.out.println("任務名稱 = " + name);
String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
System.out.println("任務的負責人是 = " + assignee);
}
}
/**
* 用戶拾取組任務:將候選人的組任務,變成個人任務。
* 注意:
* ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
* ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
*/
@Test
public void testClaimTask() {
String processDefinitionKey = "holiday";
String candidateUser = "李四";
TaskService taskService = processEngine.getTaskService();
//查詢組任務
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.claim(taskId, candidateUser);
System.out.println("任務拾取完畢");
}
}
/**
* 任務交接
*/
@Test
public void testExchangeTask() {
String processDefinitionKey = "holiday";
String assignee = "李四";
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
for (Task task : taskList) {
String taskId = task.getId();
System.out.println("任務的id = " + taskId);
taskService.setAssignee(taskId, "王五");
}
}
// /**
// * 歸還組任務
// * 說明:建議歸還任務前校驗用戶是否是該任務的負責人,也可以通過setAssignee方法將任務委托給其他用戶負責,注意被委托的用戶可以不是候選人(建議不要這么做)
// */
// @Test
// public void testUnclaim() {
// String processDefinitionKey = "holiday";
//
// String assignee = "李四";
//
// TaskService taskService = processEngine.getTaskService();
//
// List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
// for (Task task : taskList) {
// String taskId = task.getId();
// System.out.println("任務的id = " + taskId);
//
// // 如果設置為null,歸還組任務,該 任務沒有負責人
// taskService.setAssignee(taskId, null);
// }
// }
// /**
// * 查詢任務並完成任務
// */
// @Test
// public void testCompleteTask(){
// String processDefinitionKey = "holiday";
//
// String assignee = "李四";
//
// TaskService taskService = processEngine.getTaskService();
//
// List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
// for (Task task : taskList) {
// String taskId = task.getId();
// System.out.println("任務的id = " + taskId);
//
// taskService.complete(taskId);
// }
// }
}
1.4.8 數據庫表操作
- act_ru_task:任務執行表,記錄當前執行的任務,由於該任務當前是組任務,所有的assignee為空,當拾取任務后該字段就是拾取用戶的id。
- act_ru_identitylink:任務參與者,記錄當前參與任務用戶或組,當前任務如果設置了候選人,會向該表插入候選人記錄,有幾個候選人就插入幾個。
- act_ru_identitylink對應一張歷史表act_hi_identitylink,向act_ru_identitylink插入記錄的同時也會向歷史表插入記錄。
2 網關
2.1 排他網關
2.1.1 什么是排他網關?
- 排他網關(異或網關或基於數據的排他網關),用來在流程中實現決策。當流程執行到這個網關的時候,所有分支都會判斷條件是否為true,如果為true則執行該分支。
注意:
- 排他網關只會選擇一個為true的分支執行(即使有兩個分支條件都為true,排他網關也只會選擇一條分支去執行)。
2.1.2 流程定義
- 如果不用排他網關,如果條件都滿足或都不滿足,流程就結束(異常結束)了。
- 如果使用了排他網關來決定分支的走向,如下:
注意:
- 如果從網關出去的所有分支都不滿足條件,系統將拋出異常。換言之,經過排他網關有且僅有一條分支。
2.2 並行網關
2.2.1 什么是並行網關?
- 並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進入和外出的順序流的。
- Fork分支:並行后的所有外出順序流,為每個順序流都創建一個並行分支。
- Join匯聚:所有到達並行網關,在此等待的進入分支,直到所有進入順序流的分支都到達以后,流程就會通過匯聚網關。
注意:
- 如果桶一個並行網關有多個進入和多個外出順序流,它就同時具有分支和匯聚功能。這時,網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。
- 和其他網關不同的是,並行網關並不會解析條件。即使順序流中定義了條件,也會被忽略。
2.2.2 流程定義
2.3 包含網關
2.3.1 什么是包含網關?
- 包含網關可以看做是排他網關和並行網關的結合體。和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。
- 包含網關的功能是基於進入和外出順序流的:
- 分支:所有外出順序流的條件都會被解析,結果為true的順序流會以並行方式繼續執行,會為每個順序流創建一個分支。
- 匯聚:所有並行分支到達包含網關,會進入等待狀態,直到每個包含流程的進入順序流的分支都到達。這是和並行網關的最大不同。換言之,包含網關只會等待被選中執行了的進入順序流。在匯聚之后,流程會穿過包含網關繼續執行。
2.3.2 流程定義
- 企業體檢流程,公司全體員工進行常規項檢查、抽血化驗,公司管理層除常規檢查和抽血化驗還要進行增加項檢查。