我正在参加「掘金·启航计划」
其他具体的SpringBoot集成Activiti7流的配置请看上篇:
SpringBoot继承Activiti7工作流引擎(一) - 掘金 (juejin.cn)
SpringBoot继承Activiti7工作流引擎-Activiti7入门(二) - 掘金 (juejin.cn)
SpringBoot继承Activiti7工作流引擎-Activiti7进阶(三) - 掘金 (juejin.cn)
1.Activiti7网关概念
网关用来控制流程的流向(或像BPMN里描述的那样,流程的tokens。) 网关可以消费也可以生成token。网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。
我们可以类别流程图,每个节点都有判断,是 "且(&)" 还是" 或(|)";
2. Activiti7网关
2.1 排他网关
排他网关(ExclusiveGateway)(异或网关或基于数据的排他网关),用来在流程中实现决策。当流程执行到这个网关的时候,所有分支都会判断条件是否为true,如果为true则执行该分支。
注意: 排他网关只会选择一个为true的分支执行(即使有两个分支条件都为true,排他网关也只会选择一条分支去执行,选择序号小的路径执行)。
本次画BPMN文件的时候将部门经理的assignee设置为李四,总经理审批的assignee设置为王五,总经理审批的assignee设置为王五,人事复批存档设置为赵六。
public class EGatewayTest {
/**
* 部署
*/
@Test
public void testDeploy(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/leave-EGateway.bpmn")
.name("请假流程-排他网关")
.deploy();
//输出部署的一些信息
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署名称:"+deployment.getName());
}
@Test
public void testStartProcess(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("day",0);
//根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveEGatewayProcess",variables);
//获取流程实例的相关信息
System.out.println("流程定义的id = " + instance.getProcessDefinitionId());
System.out.println("流程实例的id = " + instance.getId());
}
@Test
public void testCompleteTask(){
//任务负责人
String assignee = "张三";
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//获取任务集合
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("leaveEGatewayProcess")
.taskAssignee(assignee)
.list();
//遍历任务列表
for(Task task:taskList){
taskService.complete(task.getId());
}
}
}
2.2 并行网关
并行网关(InclusiveGateway)允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流的, 两者没有前后需要两个人全部审批才能进入下个节点。就是并行网关
并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略
本次画BPMN文件的时候将技术经理的assignee设置为李四,项目经理审批的assignee设置为王五,人事复批的assignee设置为王五
public class PGatewayTest {
/**
* 部署
*/
@Test
public void testDeploy(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/leave-PGateway.bpmn")
.name("请假流程-并行网关")
.deploy();
//输出部署的一些信息
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署名称:"+deployment.getName());
}
@Test
public void testStartProcess(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> variables = new HashMap<String,Object>();
//根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leavePGatewayProcess");
//获取流程实例的相关信息
System.out.println("流程定义的id = " + instance.getProcessDefinitionId());
System.out.println("流程实例的id = " + instance.getId());
}
//完成任务
@Test
public void testCompleteTask(){
//任务负责人
String assignee = "张三";
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//获取任务集合
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("leavePGatewayProcess")
.taskAssignee(assignee)
.list();
//遍历任务列表
for(Task task:taskList){
taskService.complete(task.getId());
}
}
}
2.3 包含网关
包含网关可以看做是排他网关和并行网关的结合体。
需求:出差申请大于3天需要由项目经理审批,小于3等于天由技术经理审批,出差申请必须经过人事助理审批。
本次画BPMN文件的时候将技术经理的assignee设置为张三,项目经理的assignee设置为李四,人事助理的assignee设置为王五,人事复批存档设置为赵六。
public class IGatewayTest {
/**
* 部署
*/
@Test
public void testDeploy(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/leave-IGateway.bpmn")
.name("请假流程-包含网关")
.deploy();
//输出部署的一些信息
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署名称:"+deployment.getName());
}
@Test
public void testStartProcess(){
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("day",5);
//根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveIGatewayProcess",variables);
//获取流程实例的相关信息
System.out.println("流程定义的id = " + instance.getProcessDefinitionId());
System.out.println("流程实例的id = " + instance.getId());
}
//完成任务
@Test
public void testCompleteTask(){
//任务负责人
String assignee = "王五";
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//获取任务集合
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("leaveIGatewayProcess")
.taskAssignee(assignee)
.list();
//遍历任务列表
for(Task task:taskList){
taskService.complete(task.getId());
}
}
}