更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
这个章节来完成并行网关与排它条件网关的功能
1、前端
目前就修改了排它条件网关的前端条件部分,简化条件公式,考虑与原有流程设计器兼容。
主要是以下部分修改
<!-- 条件 --> <section class="condition-pane" v-if="value && isConditionNode()"> <!-- 字符串条件 --> <el-input placeholder="请输入条件表达式" v-model="pconditions"> <template slot="prepend">条件表达式:</template> </el-input> </section> /** * 条件节点确认保存得回调 */ conditionNodeComfirm() { this.properties.conditions = this.pconditions // 发起人虽然是条件 但是这里把发起人放到外部单独判断 this.properties.initiator = this.initiator['dep&user'] //this.initiator['dep&user'] && (nodeContent = `[发起人: ${this.getOrgSelectLabel('condition')}]` + '\n' + nodeContent) this.$emit("confirm", this.properties, this.pconditions || '请设置条件表达式'); this.visible = false; }, /** * 初始化条件节点数据 */ initConditionNodeData(){ this.pconditions = this.value.content },
2、排它条件网关后端修改
String createExclusiveGatewayBuilder(String formId, JSONObject flowNode) throws InvocationTargetException, IllegalAccessException { //String name = flowNode.getString("nodeName"); String exclusiveGatewayId = id("exclusiveGateway"); ExclusiveGateway exclusiveGateway = new ExclusiveGateway(); exclusiveGateway.setId(exclusiveGatewayId); exclusiveGateway.setName("排它条件网关"); ddProcess.addFlowElement(exclusiveGateway); ddProcess.addFlowElement(connect(formId, exclusiveGatewayId)); if (Objects.isNull(flowNode.getJSONArray("conditionNodes")) && Objects.isNull(flowNode.getJSONObject("childNode"))) { return exclusiveGatewayId; } List<JSONObject> flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size()); List<JSONObject> conditions = Lists.newCopyOnWriteArrayList(); for (JSONObject element : flowNodes) { JSONObject childNode = element.getJSONObject("childNode"); JSONObject properties = element.getJSONObject("properties"); String nodeName = properties.getString("title"); String expression = properties.getString("conditions"); if (Objects.isNull(childNode)) { incoming.add(exclusiveGatewayId); JSONObject condition = new JSONObject(); condition.fluentPut("nodeName", nodeName) .fluentPut("expression", expression); conditions.add(condition); continue; } // 只生成一个任务,同时设置当前任务的条件 childNode.put("incoming", Collections.singletonList(exclusiveGatewayId)); String identifier = create(exclusiveGatewayId, childNode); List<SequenceFlow> flows = ddSequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId, flow.getSourceRef())) .collect(Collectors.toList()); flows.stream().forEach( e -> { if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) { e.setName(nodeName); } // 设置条件表达式 if (Objects.isNull(e.getConditionExpression()) && StringUtils.isNotBlank(expression)) { e.setConditionExpression(expression); } } ); if (Objects.nonNull(identifier)) { incoming.add(identifier); } } JSONObject childNode = flowNode.getJSONObject("childNode"); if (Objects.nonNull(childNode)) { if (incoming == null || incoming.isEmpty()) { return create(exclusiveGatewayId, childNode); } else { // 所有 service task 连接 end exclusive 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(flowElement.getId(), childNode); for (int i = 1; i < incoming.size(); i++) { ddProcess.addFlowElement(connect(incoming.get(i), identifier)); } // 针对 gateway 空任务分支 添加条件表达式 if (!conditions.isEmpty()) { FlowElement flowElement1 = ddBpmnModel.getFlowElement(identifier); // 获取从 gateway 到目标节点 未设置条件表达式的节点 List<SequenceFlow> flows = ddSequenceFlows.stream().filter(flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef())) .filter(flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId)) .collect(Collectors.toList()); flows.stream().forEach(sequenceFlow -> { if (!conditions.isEmpty()) { JSONObject condition = conditions.get(0); String nodeName = condition.getString("content"); String expression = condition.getString("expression"); if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils.isNotBlank(nodeName)) { sequenceFlow.setName(nodeName); } // 设置条件表达式 if (Objects.isNull(sequenceFlow.getConditionExpression()) && StringUtils.isNotBlank(expression)) { sequenceFlow.setConditionExpression(expression); } conditions.remove(0); } }); } // 1.1 边连接完成后,在进行 nextNode 创建 if (Objects.nonNull(nextNode)) { return create(identifier, nextNode); } else { return identifier; } } } return exclusiveGatewayId; }
4、效果图如下:
还是有bug,后面的审批人连接有问题,后续修改吧。