一、什么是网关
所谓“网关”就是用来决定流程流转指向的,可能会被用作条件分支或聚合,也可以被用作并行执行或基于事件的排它性条件判断网关用菱形表示,用于控制流程的分支和聚合。
Camunda提供了四种网关:排他网关、并行网关、包容性网关、基于事件的网关。
二、排他网关
流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流;如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。
排他网关需要和条件顺序流【也就是图上的连线】结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。
三、测试
然后部署流程定义再发起流程实例测试一下,在启动流程时把参数值都给到位,正常情况下是在申请人发起申请后才给序列流上的条件给值
public ResultReturn startProcessInstanceByKey(String processDefinitionKey, String businessKey,String initiator) {
try {
Map<String,Object> map = new HashMap<>();
//设置流程发起人
identityService.setAuthenticatedUserId("initiator");
map.put("userOne",initiator);
map.put("day",4);
map.put("minister","userTwo");
map.put("manager","userThree");
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,map);
if (ObjectUtil.isNull(processInstance)) {
return ResultReturnUtil.error(ResponseEnums.PROCESS_INSTANCE_START_FAIL);
} else {
String processInstanceId = processInstance.getProcessInstanceId();
return ResultReturnUtil.success(processInstanceId);
}
}catch (Exception e){
log.error(e.getMessage());
throw new ProcessException(ResponseEnums.PROCESS_INSTANCE_START_FAIL.getMsg());
}
}
}
从图中可以看到发起人提交申请后,流程走了上半部分
四、分支驳回
到这里如果领导驳回了该怎么做?驳回也就是让流程从某个节点重新开始,我们直接上代码
@Override
public ResultReturn startNode(String processInstanceId,String nodeId) {
//获取当前环节实例
ActivityInstance activity = runtimeService.getActivityInstance(processInstanceId);
runtimeService.createProcessInstanceModification(processInstanceId)
//关闭相关任务
.cancelActivityInstance(activity.getId())
.setAnnotation("驳回")
//启动目标活动节点
.startBeforeActivity(nodeId)
.execute();
return ResultReturnUtil.success("成功");
}
传入流程实例id和目标节点id即可
查看流程图,已经回到发起人节点
其实后台会出现一段提示
意思也就是没有默认流,是不好的建模,直接修改流程图选定一条默认流即可。
查看流程历史也是很好区分的