更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
这个章节来完成并行网关,前端无需修改,直接后端修改就可以了。
1、并行网关后端修改如下:
String createConcurrentGatewayBuilder(String formId, JSONObject flowNode) throws InvocationTargetException, IllegalAccessException {
//String name = flowNode.getString("nodeName");
ParallelGateway parallelGateway = new ParallelGateway();
String parallelGatewayId = id("parallelGateway");
parallelGateway.setId(parallelGatewayId);
parallelGateway.setName("并行网关");
ddProcess.addFlowElement(parallelGateway);
ddProcess.addFlowElement(connect(formId, parallelGatewayId));
if (Objects.isNull(flowNode.getJSONArray("concurrentNodes"))
&& Objects.isNull(flowNode.getJSONObject("childNode"))) {
return parallelGatewayId;
}
List<JSONObject> flowNodes = Optional.ofNullable(flowNode.getJSONArray("concurrentNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList());
List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size());
for (JSONObject element : flowNodes) {
JSONObject childNode = element.getJSONObject("childNode");
if (Objects.isNull(childNode)) {
incoming.add(parallelGatewayId);
continue;
}
String identifier = create(parallelGatewayId, childNode);
if (Objects.nonNull(identifier)) {
incoming.add(identifier);
}
}
JSONObject childNode = flowNode.getJSONObject("childNode");
if (Objects.nonNull(childNode)) {
// 普通结束网关
if (CollectionUtils.isEmpty(incoming)) {
return create(parallelGatewayId, childNode);
} else {
// 所有 service task 连接 end parallel gateway
childNode.put("incoming", incoming);
FlowElement flowElement = ddBpmnModel.getFlowElement(incoming.get(0));
// 1.0 先进行边连接, 暂存 nextNode
JSONObject nextNode = childNode.getJSONObject("childNode");
childNode.put("childNode", null);
String identifier = create(incoming.get(0), childNode);
for (int i = 1; i < incoming.size(); i++) {
FlowElement flowElement1 = ddBpmnModel.getFlowElement(incoming.get(i));
ddProcess.addFlowElement(connect(flowElement1.getId(), identifier));
}
// 1.1 边连接完成后,在进行 nextNode 创建
if (Objects.nonNull(nextNode)) {
return create(identifier, nextNode);
} else {
return identifier;
}
}
}
return parallelGatewayId;
}
2、效果图如下:
3、生产的xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/test">
<process id="Process_1233c789-c986-4de2-8ab2-9c24ef0a2312" name="dingding演示流程" isExecutable="true">
<startEvent id="start_36faea0bc7344384bc52078dd43c0829"></startEvent>
<parallelGateway id="parallelGateway_31fb5c2d6062402688b9bceb230610df" name="并行网关"></parallelGateway>
<sequenceFlow id="sequenceFlow_8f3fb2e6498847aea4e88ad7f8527720" sourceRef="start_36faea0bc7344384bc52078dd43c0829" targetRef="parallelGateway_31fb5c2d6062402688b9bceb230610df"></sequenceFlow>
<userTask id="userTask_261260b7d3c643f08d6000f422628363" name="审批人" flowable:assignee="ry" flowable:dataType="USERS" flowable:text="若依"></userTask>
<sequenceFlow id="sequenceFlow_ec473d524b1f4c70ac8d59c9d11cf20a" sourceRef="parallelGateway_31fb5c2d6062402688b9bceb230610df" targetRef="userTask_261260b7d3c643f08d6000f422628363"></sequenceFlow>
<userTask id="userTask_182b04b3cc0c465589ae5bb936185fe5" name="审批人" flowable:assignee="zhangsan" flowable:dataType="USERS" flowable:text="张三"></userTask>
<sequenceFlow id="sequenceFlow_9c0f2e6f0a434217996502850297b251" sourceRef="parallelGateway_31fb5c2d6062402688b9bceb230610df" targetRef="userTask_182b04b3cc0c465589ae5bb936185fe5"></sequenceFlow>
<userTask id="userTask_d81ef1ca0fa2436abf543dc6cb7d80df" name="审批人" flowable:assignee="admin" flowable:dataType="USERS" flowable:text="若依管理员"></userTask>
<sequenceFlow id="sequenceFlow_2227bd432d044dc889aa9a9132ca7589" sourceRef="userTask_261260b7d3c643f08d6000f422628363" targetRef="userTask_d81ef1ca0fa2436abf543dc6cb7d80df"></sequenceFlow>
<sequenceFlow id="sequenceFlow_8bb051d48a654b3bba4a687c6320eb29" sourceRef="userTask_182b04b3cc0c465589ae5bb936185fe5" targetRef="userTask_d81ef1ca0fa2436abf543dc6cb7d80df"></sequenceFlow>
<endEvent id="end_28c4b21fe4d145cfb6aa1019d13a24ac"></endEvent>
<sequenceFlow id="sequenceFlow_008d4f7e2c0e4246af7d5c4092af6a21" sourceRef="userTask_d81ef1ca0fa2436abf543dc6cb7d80df" targetRef="end_28c4b21fe4d145cfb6aa1019d13a24ac"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_Process_1233c789-c986-4de2-8ab2-9c24ef0a2312">
<bpmndi:BPMNPlane bpmnElement="Process_1233c789-c986-4de2-8ab2-9c24ef0a2312" id="BPMNPlane_Process_1233c789-c986-4de2-8ab2-9c24ef0a2312">
<bpmndi:BPMNShape bpmnElement="start_36faea0bc7344384bc52078dd43c0829" id="BPMNShape_start_36faea0bc7344384bc52078dd43c0829">
<omgdc:Bounds height="30.0" width="30.0" x="0.0" y="95.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask_d81ef1ca0fa2436abf543dc6cb7d80df" id="BPMNShape_userTask_d81ef1ca0fa2436abf543dc6cb7d80df">
<omgdc:Bounds height="60.0" width="100.0" x="320.0" y="80.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask_182b04b3cc0c465589ae5bb936185fe5" id="BPMNShape_userTask_182b04b3cc0c465589ae5bb936185fe5">
<omgdc:Bounds height="60.0" width="100.0" x="170.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="parallelGateway_31fb5c2d6062402688b9bceb230610df" id="BPMNShape_parallelGateway_31fb5c2d6062402688b9bceb230610df">
<omgdc:Bounds height="40.0" width="40.0" x="80.0" y="90.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask_261260b7d3c643f08d6000f422628363" id="BPMNShape_userTask_261260b7d3c643f08d6000f422628363">
<omgdc:Bounds height="60.0" width="100.0" x="170.0" y="0.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="end_28c4b21fe4d145cfb6aa1019d13a24ac" id="BPMNShape_end_28c4b21fe4d145cfb6aa1019d13a24ac">
<omgdc:Bounds height="30.0" width="30.0" x="470.0" y="95.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8bb051d48a654b3bba4a687c6320eb29" id="BPMNEdge_sequenceFlow_8bb051d48a654b3bba4a687c6320eb29">
<omgdi:waypoint x="270.0" y="190.0"></omgdi:waypoint>
<omgdi:waypoint x="282.0" y="190.0"></omgdi:waypoint>
<omgdi:waypoint x="282.0" y="110.0"></omgdi:waypoint>
<omgdi:waypoint x="320.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8f3fb2e6498847aea4e88ad7f8527720" id="BPMNEdge_sequenceFlow_8f3fb2e6498847aea4e88ad7f8527720">
<omgdi:waypoint x="30.0" y="110.0"></omgdi:waypoint>
<omgdi:waypoint x="80.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ec473d524b1f4c70ac8d59c9d11cf20a" id="BPMNEdge_sequenceFlow_ec473d524b1f4c70ac8d59c9d11cf20a">
<omgdi:waypoint x="120.0" y="102.5"></omgdi:waypoint>
<omgdi:waypoint x="132.0" y="102.5"></omgdi:waypoint>
<omgdi:waypoint x="132.0" y="30.000000000000007"></omgdi:waypoint>
<omgdi:waypoint x="170.0" y="30.000000000000007"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9c0f2e6f0a434217996502850297b251" id="BPMNEdge_sequenceFlow_9c0f2e6f0a434217996502850297b251">
<omgdi:waypoint x="120.0" y="117.5"></omgdi:waypoint>
<omgdi:waypoint x="132.0" y="117.5"></omgdi:waypoint>
<omgdi:waypoint x="132.0" y="190.0"></omgdi:waypoint>
<omgdi:waypoint x="170.0" y="190.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_008d4f7e2c0e4246af7d5c4092af6a21" id="BPMNEdge_sequenceFlow_008d4f7e2c0e4246af7d5c4092af6a21">
<omgdi:waypoint x="420.0" y="110.0"></omgdi:waypoint>
<omgdi:waypoint x="470.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_2227bd432d044dc889aa9a9132ca7589" id="BPMNEdge_sequenceFlow_2227bd432d044dc889aa9a9132ca7589">
<omgdi:waypoint x="270.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="282.0" y="30.0"></omgdi:waypoint>
<omgdi:waypoint x="282.0" y="110.0"></omgdi:waypoint>
<omgdi:waypoint x="320.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
4、在原来流程设计器打开如下: