1、什么是包含網關
包含網關可以看做是排他網關和並行網關的結合體;和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們;但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣,包含網關的功能是基於進入和外出順序流的;
分支:所有外出順序流的條件都會被解析,結果為true的順序會以並行方式繼續執行,會為每個順序流創建一個分支;
匯聚:所有並行分支達到包含網關,會進入等待狀態,知道每個包含流程token的進入順序流的分支都到達;這是與並行網關的最大不同;換句話說,包含網關只會等待選中執行了的進入順序流;在匯聚之后,流程會穿過包含網關繼續執行;
2、流程定義


3、部署流程
package com.zn;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
public class ActivitiInclusiveGateway {
/**
* 流程部署
*/
@Test
public void deployment() {
//獲取ProcessEngine對象 默認配置文件名稱:activiti.cfg.xml 並且configuration的Bean實例ID為processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RepositoryService對象進行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//進行部署,將對應的流程定義文件生成到數據庫當中,作為記錄進行保存
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bmpnfiles/holidayInclusiveGateway.bpmn") //加載流程文件
.name("請假流程-包含網關") //設置流程名稱
.key("holiday")
.deploy(); //部署
//輸出部署信息
System.out.println("流程名稱:" + deployment.getName());
System.out.println("流程ID:" + deployment.getId());
System.out.println("流程Key:" + deployment.getKey());
}
}
控制台:

數據庫:

4、啟動流程實例(userType=1)
當userType=1執行的時候,會走常規體驗項和抽血化驗以及早餐,如果是userType=1會走全部四項;
package com.zn;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
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.Test;
import java.util.HashMap;
import java.util.Map;
public class ActivitiInclusiveGateway {
/**
* 啟動流程實例
*/
@Test
public void startInstance() {
//獲取ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//設置流程變量
Map<String, Object> assMap = new HashMap<>();
assMap.put("userType", 1);
//啟動流程實例
ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidayInc", assMap);
System.out.println("流程實例:" + holidayGroup.getId());
}
}
數據庫:

5、任務處理
package com.zn;
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.Test;
import java.util.HashMap;
import java.util.Map;
public class ActivitiInclusiveGateway {
/*
*任務處理
*/
@Test
public void completeTask(){
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService對象
TaskService taskService = processEngine.getTaskService();
//查詢到自己的任務,然后通過任務ID進行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("zhangsan").singleResult();
//任務處理
taskService.complete(task.getId());
}
}
數據庫:

在走到包含網關時,需要判斷條件,符合條件的分支,將會執行,最終進行匯聚;
6、任務處理
package com.zn;
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.Test;
import java.util.HashMap;
import java.util.Map;
public class ActivitiInclusiveGateway {
/*
*任務處理
*/
@Test
public void completeTask(){
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService對象
TaskService taskService = processEngine.getTaskService();
//查詢到自己的任務,然后通過任務ID進行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("lisi").singleResult();
//任務處理
taskService.complete(task.getId());
}
}
數據庫:

7、任務處理
package com.zn;
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.Test;
import java.util.HashMap;
import java.util.Map;
public class ActivitiInclusiveGateway {
/*
*任務處理
*/
@Test
public void completeTask(){
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService對象
TaskService taskService = processEngine.getTaskService();
//查詢到自己的任務,然后通過任務ID進行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("wangwu").singleResult();
//任務處理
taskService.complete(task.getId());
}
}
數據庫:

8、任務處理
package com.zn;
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.Test;
import java.util.HashMap;
import java.util.Map;
public class ActivitiInclusiveGateway {
/*
*任務處理
*/
@Test
public void completeTask(){
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService對象
TaskService taskService = processEngine.getTaskService();
//查詢到自己的任務,然后通過任務ID進行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("sunqi").singleResult();
//任務處理
taskService.complete(task.getId());
}
}
數據庫:

執行完成后,整個流程就結束:


