更多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、在原来流程设计器打开如下: