更多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、排它条件网关后端修改
java
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,后面的审批人连接有问题,后续修改吧。