排他网关 ExclusiveGateway
网关主要控制 Activiti 流程分支的流向。
概念
排它网关用于对流程中的决策进行建模。
当流程执行到达此网关时,所有分支都将按定义顺序进行判断,选择判断条件结果为真(true)的分支继续处理。
注意:
排它网关时只选择一个条件值为 true 的分支进行处理。如果多个分支的条件计算结果都为true,排他网关会选择id 值较小的一条分支去执行。
简而言之,就是传递流程变量,排他网关根据流程变量决定该走哪条线路
基本使用
bpmn 排他网关符号如下:
需求:
直接领导审批后, 如果小于等于3天的由行政审批;大于3天的由总经理审批, 总经理审批完再由行政审批 .
修改ModelSaveRestResource
类:
增加:
String json_xml = values.getFirst("json_xml");
String key = objectMapper.readTree(json_xml).get("properties").get("process_id").textValue();
model.setKey(key);
流程唯一标识key : testExclusiveGateway ,流程名: 排他网关流程模型
设置条件:
流程定义里用户任务节点的办理人分别是: 直接领导审批 zhangsan 行政审批 wj1 总经理 wj2
保存后,流程定义模型数据会保存到act_re_model
表里:
保存成功后,直接部署。
编写测试类,进行测试:
@Autowired
RuntimeService runtimeService;
/**
* 启动流程实例
*/
@Test
public void startProcess() {
// 流程变量
Map<String, Object> variables = new HashMap<>();
// 天数
variables.put("duration", 2);
// 启动流程实例
runtimeService.startProcessInstanceByKey("testExclusiveGateway", variables);
}
启动流程实例后,由直接领导进行审批。
审批:
@Test
public void completeTask() {
//完成任务(任务id)
taskService.complete("3ef40b37-cdad-11ec-a0e0-28d0ea3dce6b");
}
因为duration小于等于3,所以由行政进行审批。
并行网关 ParallelGateway
概念
并行网关用于对流程中的并发性建模,在流程模型中引入并发性的最简单的网关是并行网关,将流程分成多条分支,然后再多条分支汇聚到一起。
-
分支(fork):
并行所有外出顺序流,为每个顺序流都创建一个并发分支。
-
汇聚(join):
所有到达并行网关,在此等待的进入分支,只有当所有进入顺序流的分支都到达以后, 流程就会通过汇聚网 关。
注意:分支 与 汇聚成对出现 。并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略。
并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。
基本使用
bpmn 并行网关符号如下:
需求:开启流程实例 -> 分成两个分支(部门经理审批,总监审批 ) -> 两个分支任务都完成了 -> 汇聚分支
流程唯一标识key : testParallelGateway ,流程名: 并行网关流程模型
保存:
部署并启动实例
/**
* 启动流程实例
*/
@Test
public void startProcess2() {
runtimeService.startProcessInstanceByKey("testParallelGateway");
}
启动后,会出现两条任务:
包含网关 InclusiveGateway
概念
包含网关可以看做是排他网关和并行网关的结合体。和排他网关一样,你可以在连线上定义条件表达式,定义的表达式会被包含网关解析。但是包含网关主要区别是也可以不指定表达式,同时选择多条分支,这和并行网关是一样的。
简而言之:
- 排他网关:解析条件,流向条件为 true的节点,或者报错(没有满足条件的)
- 并行网关:不解析条件, 不报错, 分支节点都执行。
- 包含网关:有条件就解析条件,条件成立就流向,不成立就不流向,全都不成立报错;没有条件直接流向。
基本使用
bpmn 包含网关符号如下:
开启请假流程实例 -> 包含网关分支 -> 如果小于等于3天的部门经理审批,大于3天的由总经理审批,请假都必须经 过行政审批 -> 汇聚分支-> 流程结束
说明 :
流程唯一标识key : testInclusiveGateway ,流程名: 包含网关流程模型
跳转条件需要设置
部署并启动实例:
/**
* 启动流程实例
*/
@Test
public void startProcess3() {
// 流程变量
Map<String, Object> variables = new HashMap<>();
variables.put("duration", 2);
// 启动流程实例
runtimeService.startProcessInstanceByKey("testInclusiveGateway", variables);
}
启动后:我们请假天数是2,流向了行政审批和部门经理审批与预期相同。