update - 修复特殊嵌套网关模型设计,没有 child 时,异常连接到结束节点的问题
This commit is contained in:
parent
b89c4e3480
commit
91cbaee067
@ -197,7 +197,7 @@ public final class BpmnJsonConverterUtil {
|
|||||||
mainProcess.addFlowElement(convertJsonToElement(EndEvent.class, mainProcess));
|
mainProcess.addFlowElement(convertJsonToElement(EndEvent.class, mainProcess));
|
||||||
|
|
||||||
// 解析前端传入的模型设计 json
|
// 解析前端传入的模型设计 json
|
||||||
List<String> lastNodeIds = create(bpmnJsonNode, mainProcess, bpmnModel, START_EVENT_ID);
|
List<String> lastNodeIds = create(bpmnJsonNode, mainProcess, bpmnModel, null, START_EVENT_ID);
|
||||||
|
|
||||||
if (CollectionUtils.isEmpty(lastNodeIds)) {
|
if (CollectionUtils.isEmpty(lastNodeIds)) {
|
||||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "未找到链接结束节点的节点数据");
|
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "未找到链接结束节点的节点数据");
|
||||||
@ -405,10 +405,115 @@ public final class BpmnJsonConverterUtil {
|
|||||||
* @return 创建的节点的 ID
|
* @return 创建的节点的 ID
|
||||||
*/
|
*/
|
||||||
private static List<String> create(BpmnJsonNode bpmnJsonNode, Process mainProcess,
|
private static List<String> create(BpmnJsonNode bpmnJsonNode, Process mainProcess,
|
||||||
BpmnModel bpmnModel, String... preNodeIds) {
|
BpmnModel bpmnModel, BpmnJsonNode defaultConditionConnectNode, String... preNodeIds) {
|
||||||
// 设置来源节点
|
// 设置来源节点
|
||||||
bpmnJsonNode.setIncoming(Lists.newArrayList(preNodeIds));
|
bpmnJsonNode.setIncoming(Lists.newArrayList(preNodeIds));
|
||||||
|
|
||||||
|
Class<? extends BaseElement> clz = chooseNodeClass(bpmnJsonNode);
|
||||||
|
|
||||||
|
// 根据 BpmnJsonNode 创建节点
|
||||||
|
FlowElement flowElement = convertJsonToElement(clz, bpmnJsonNode, mainProcess);
|
||||||
|
mainProcess.addFlowElement(flowElement);
|
||||||
|
|
||||||
|
connectPreNodes(bpmnJsonNode, mainProcess, preNodeIds);
|
||||||
|
|
||||||
|
// 只有网关才会涉及到 branch
|
||||||
|
List<String> branchLastNodeIds = new ArrayList<>();
|
||||||
|
if (!CollectionUtils.isEmpty(bpmnJsonNode.getBranches())) {
|
||||||
|
Gateway gateway = (Gateway) flowElement;
|
||||||
|
for (BpmnJsonNode branch : bpmnJsonNode.getBranches()) {
|
||||||
|
// branch == node_condition
|
||||||
|
BpmnJsonNode nextJsonNode =
|
||||||
|
(Objects.isNull(branch.getChildren()) || Objects.isNull(branch.getChildren().getType())
|
||||||
|
|| Objects.equals(NODE_EMPTY, branch.getChildren().getType()))
|
||||||
|
? bpmnJsonNode.getChildren() : branch.getChildren();
|
||||||
|
|
||||||
|
if (Objects.isNull(nextJsonNode) || Objects.isNull(nextJsonNode.getId()) ||
|
||||||
|
(Objects.equals(NODE_EMPTY, nextJsonNode.getType()) &&
|
||||||
|
(Objects.isNull(nextJsonNode.getChildren()) || Objects.isNull(nextJsonNode.getChildren().getId())))) {
|
||||||
|
BpmnJsonNode tempEndNode = new BpmnJsonNode();
|
||||||
|
tempEndNode.setIncoming(Lists.newArrayList(gateway.getId()));
|
||||||
|
if (Objects.isNull(defaultConditionConnectNode)) {
|
||||||
|
tempEndNode.setId(END_EVENT_ID);
|
||||||
|
} else {
|
||||||
|
if (Objects.equals(defaultConditionConnectNode.getType(), NODE_EMPTY) && Objects.nonNull(defaultConditionConnectNode.getChildren())) {
|
||||||
|
tempEndNode.setId(defaultConditionConnectNode.getChildren().getId());
|
||||||
|
} else {
|
||||||
|
tempEndNode.setId(defaultConditionConnectNode.getId());
|
||||||
|
}
|
||||||
|
defaultConditionConnectNode = null;
|
||||||
|
}
|
||||||
|
nextJsonNode = tempEndNode;
|
||||||
|
} else {
|
||||||
|
if (Objects.equals(NODE_EMPTY, nextJsonNode.getType()) && Objects.nonNull(nextJsonNode.getChildren())) {
|
||||||
|
nextJsonNode = nextJsonNode.getChildren();
|
||||||
|
}
|
||||||
|
nextJsonNode.setIncoming(Lists.newArrayList(gateway.getId()));
|
||||||
|
// 将 node_condition 放入计算节点的上级属性中,方便顺序流转换器对条件进行处理
|
||||||
|
nextJsonNode.setPreJsonNode(branch);
|
||||||
|
}
|
||||||
|
SequenceFlow sequenceFlow = (SequenceFlow) convertJsonToElement(SequenceFlow.class, nextJsonNode,
|
||||||
|
mainProcess);
|
||||||
|
mainProcess.addFlowElement(sequenceFlow);
|
||||||
|
|
||||||
|
// 设置网关默认流
|
||||||
|
if (Objects.nonNull(branch.getProperty()) && Boolean.TRUE.equals(branch.getProperty().getDefaultBranch())) {
|
||||||
|
// 如果是默认流, 以防止前端输入错误, 强制置空
|
||||||
|
sequenceFlow.setConditionExpression(null);
|
||||||
|
gateway.setDefaultFlow(sequenceFlow.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Objects.nonNull(branch.getChildren()) && StringUtils.hasLength(branch.getChildren().getId())
|
||||||
|
&& !Objects.equals(NODE_EMPTY, branch.getChildren().getType())) {
|
||||||
|
branchLastNodeIds.addAll(create(branch.getChildren(), mainProcess, bpmnModel,
|
||||||
|
Objects.isNull(defaultConditionConnectNode) ? bpmnJsonNode.getChildren() : defaultConditionConnectNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始处理下级节点
|
||||||
|
BpmnJsonNode children = bpmnJsonNode.getChildren();
|
||||||
|
if (Objects.isNull(children)
|
||||||
|
|| (Objects.equals(NODE_EMPTY, children.getType()) && (Objects.isNull(children.getChildren()) || Objects.isNull(children.getChildren().getId())))
|
||||||
|
|| !StringUtils.hasLength(children.getId())) {
|
||||||
|
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
|
||||||
|
return Lists.newArrayList(flowElement.getId());
|
||||||
|
} else {
|
||||||
|
return branchLastNodeIds;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (Objects.equals(NODE_EMPTY, children.getType())
|
||||||
|
&& Objects.nonNull(children.getChildren())
|
||||||
|
&& Objects.nonNull(children.getChildren().getId())) {
|
||||||
|
children = children.getChildren();
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
|
||||||
|
return create(children, mainProcess, bpmnModel, defaultConditionConnectNode, flowElement.getId());
|
||||||
|
}
|
||||||
|
return create(children, mainProcess, bpmnModel, defaultConditionConnectNode, branchLastNodeIds.toArray(new String[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void connectPreNodes(BpmnJsonNode bpmnJsonNode, Process mainProcess, String[] preNodeIds) {
|
||||||
|
// 连接当前节点与前一个节点
|
||||||
|
if (Lists.newArrayList(preNodeIds).isEmpty()) {
|
||||||
|
// first time entrance, do nothing.
|
||||||
|
} else if (Lists.newArrayList(preNodeIds).size() == 1 && !NODE_CONDITION.equals(bpmnJsonNode.getType())) {
|
||||||
|
bpmnJsonNode.setPreJsonNode(null);
|
||||||
|
mainProcess.addFlowElement(convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess));
|
||||||
|
} else {
|
||||||
|
// 将网关分支的最末级节点 ID 关联到网关的 children 节点上,网关协议转换才算闭环
|
||||||
|
Arrays.stream(preNodeIds).forEach(income -> {
|
||||||
|
bpmnJsonNode.setIncoming(Lists.newArrayList(income));
|
||||||
|
bpmnJsonNode.setPreJsonNode(null);
|
||||||
|
FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess);
|
||||||
|
mainProcess.addFlowElement(sequenceFlow);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Class<? extends BaseElement> chooseNodeClass(BpmnJsonNode bpmnJsonNode) {
|
||||||
Class<? extends BaseElement> clz;
|
Class<? extends BaseElement> clz;
|
||||||
switch (bpmnJsonNode.getType()) {
|
switch (bpmnJsonNode.getType()) {
|
||||||
case NODE_STARTER:
|
case NODE_STARTER:
|
||||||
@ -445,92 +550,7 @@ public final class BpmnJsonConverterUtil {
|
|||||||
clz = NotSupportConverter.NotSupportFlowElement.class;
|
clz = NotSupportConverter.NotSupportFlowElement.class;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return clz;
|
||||||
// 根据 BpmnJsonNode 创建节点
|
|
||||||
FlowElement flowElement = convertJsonToElement(clz, bpmnJsonNode, mainProcess);
|
|
||||||
mainProcess.addFlowElement(flowElement);
|
|
||||||
|
|
||||||
if (Lists.newArrayList(preNodeIds).isEmpty()) {
|
|
||||||
// first time entrance, do nothing.
|
|
||||||
} else if (Lists.newArrayList(preNodeIds).size() == 1 && !NODE_CONDITION.equals(bpmnJsonNode.getType())) {
|
|
||||||
bpmnJsonNode.setPreJsonNode(null);
|
|
||||||
mainProcess.addFlowElement(convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess));
|
|
||||||
} else {
|
|
||||||
// 将网关分支的最末级节点 ID 关联到网关的 children 节点上,网关协议转换才算闭环
|
|
||||||
Arrays.stream(preNodeIds).forEach(income -> {
|
|
||||||
bpmnJsonNode.setIncoming(Lists.newArrayList(income));
|
|
||||||
bpmnJsonNode.setPreJsonNode(null);
|
|
||||||
FlowElement sequenceFlow = convertJsonToElement(SequenceFlow.class, bpmnJsonNode, mainProcess);
|
|
||||||
mainProcess.addFlowElement(sequenceFlow);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 只有网关才会涉及到 branch
|
|
||||||
List<String> branchLastNodeIds = new ArrayList<>();
|
|
||||||
if (!CollectionUtils.isEmpty(bpmnJsonNode.getBranches())) {
|
|
||||||
Gateway gateway = (Gateway) flowElement;
|
|
||||||
for (BpmnJsonNode branch : bpmnJsonNode.getBranches()) {
|
|
||||||
// branch == node_condition
|
|
||||||
BpmnJsonNode nextJsonNode =
|
|
||||||
(Objects.isNull(branch.getChildren()) || Objects.isNull(branch.getChildren().getType())
|
|
||||||
|| Objects.equals(NODE_EMPTY, branch.getChildren().getType()))
|
|
||||||
? bpmnJsonNode.getChildren() : branch.getChildren();
|
|
||||||
|
|
||||||
if (Objects.isNull(nextJsonNode) || Objects.isNull(nextJsonNode.getId()) ||
|
|
||||||
(Objects.equals(NODE_EMPTY, nextJsonNode.getType()) &&
|
|
||||||
(Objects.isNull(nextJsonNode.getChildren()) || Objects.isNull(nextJsonNode.getChildren().getId())))) {
|
|
||||||
BpmnJsonNode tempEndNode = new BpmnJsonNode();
|
|
||||||
tempEndNode.setIncoming(Lists.newArrayList(gateway.getId()));
|
|
||||||
tempEndNode.setId(END_EVENT_ID);
|
|
||||||
nextJsonNode = tempEndNode;
|
|
||||||
} else {
|
|
||||||
if (Objects.equals(NODE_EMPTY, nextJsonNode.getType()) && Objects.nonNull(nextJsonNode.getChildren())) {
|
|
||||||
nextJsonNode = nextJsonNode.getChildren();
|
|
||||||
}
|
|
||||||
nextJsonNode.setIncoming(Lists.newArrayList(gateway.getId()));
|
|
||||||
// 将 node_condition 放入计算节点的上级属性中,方便顺序流转换器对条件进行处理
|
|
||||||
nextJsonNode.setPreJsonNode(branch);
|
|
||||||
}
|
|
||||||
SequenceFlow sequenceFlow = (SequenceFlow) convertJsonToElement(SequenceFlow.class, nextJsonNode,
|
|
||||||
mainProcess);
|
|
||||||
mainProcess.addFlowElement(sequenceFlow);
|
|
||||||
|
|
||||||
// 设置网关默认流
|
|
||||||
if (Objects.nonNull(branch.getProperty()) && Boolean.TRUE.equals(branch.getProperty().getDefaultBranch())) {
|
|
||||||
// 如果是默认流, 以防止前端输入错误, 强制置空
|
|
||||||
sequenceFlow.setConditionExpression(null);
|
|
||||||
gateway.setDefaultFlow(sequenceFlow.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Objects.nonNull(branch.getChildren()) && StringUtils.hasLength(branch.getChildren().getId())
|
|
||||||
&& !Objects.equals(NODE_EMPTY, branch.getChildren().getType())) {
|
|
||||||
branchLastNodeIds.addAll(create(branch.getChildren(), mainProcess, bpmnModel));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 开始处理下级节点
|
|
||||||
BpmnJsonNode children = bpmnJsonNode.getChildren();
|
|
||||||
if (Objects.isNull(children)
|
|
||||||
|| (Objects.equals(NODE_EMPTY, children.getType()) && (Objects.isNull(children.getChildren()) || Objects.isNull(children.getChildren().getId())))
|
|
||||||
|| !StringUtils.hasLength(children.getId())) {
|
|
||||||
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
|
|
||||||
return Lists.newArrayList(flowElement.getId());
|
|
||||||
} else {
|
|
||||||
return branchLastNodeIds;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Objects.equals(NODE_EMPTY, children.getType())
|
|
||||||
&& Objects.nonNull(children.getChildren())
|
|
||||||
&& Objects.nonNull(children.getChildren().getId())) {
|
|
||||||
children = children.getChildren();
|
|
||||||
}
|
|
||||||
if (CollectionUtils.isEmpty(branchLastNodeIds)) {
|
|
||||||
return create(children, mainProcess, bpmnModel, flowElement.getId());
|
|
||||||
}
|
|
||||||
return create(children, mainProcess, bpmnModel, branchLastNodeIds.toArray(new String[0]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, Process process) {
|
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, Process process) {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user