更多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
flowNodes = Optional.ofNullable(flowNode.getJSONArray("conditionNodes")).map(e -> e.toJavaList(JSONObject.class)).orElse(Collections.emptyList()); - List
incoming = Lists.newArrayListWithCapacity(flowNodes.size()); -
- List
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
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
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,后面的审批人连接有问题,后续修改吧。