支持获取当前已使用的节点key列表

This commit is contained in:
hubin 2024-11-20 21:04:37 +08:00
parent a32385920a
commit 673dc84d73
5 changed files with 93 additions and 3 deletions

View File

@ -2,7 +2,7 @@
buildscript {
ext {
springBootVersion = "2.7.0"
mybatisPlusVersion = "3.5.9"
mybatisPlusVersion = "3.5.8"
solonVersion = "3.0.1"
}

View File

@ -8,7 +8,6 @@ import com.aizuda.bpm.engine.FlowLongEngine;
import com.aizuda.bpm.engine.TaskActorProvider;
import com.aizuda.bpm.engine.assist.Assert;
import com.aizuda.bpm.engine.entity.FlwInstance;
import com.aizuda.bpm.engine.entity.FlwProcess;
import com.aizuda.bpm.engine.entity.FlwTask;
import com.aizuda.bpm.engine.entity.FlwTaskActor;
import com.aizuda.bpm.engine.model.ModelHelper;
@ -124,6 +123,14 @@ public class Execution implements Serializable {
this.args = args;
}
/**
* 构造函数仅适用于模型条件节点查找
*/
public Execution(FlowCreator flowCreator, Map<String, Object> args) {
this.flowCreator = flowCreator;
this.args = args;
}
/**
* 根据当前执行对象execution子流程定义process当前节点名称产生子流程的执行对象
*

View File

@ -6,6 +6,8 @@ package com.aizuda.bpm.engine.model;
import com.aizuda.bpm.engine.FlowConstants;
import com.aizuda.bpm.engine.FlowDataTransfer;
import com.aizuda.bpm.engine.assist.ObjectUtils;
import com.aizuda.bpm.engine.core.Execution;
import com.aizuda.bpm.engine.core.FlowLongContext;
import com.aizuda.bpm.engine.core.enums.NodeSetType;
import com.aizuda.bpm.engine.core.enums.TaskType;
@ -368,4 +370,61 @@ public class ModelHelper {
FlowDataTransfer.removeByKey(FlowConstants.processDynamicAssignee);
}
}
/**
* 获取当前已使用的节点key列表
*
* @param flowLongContext 流程上下文 {@link FlowLongContext}
* @param execution 流程执行对象 {@link Execution}
* @param rootNodeModel 模型根节点 {@link NodeModel}
* @param currentNodeKey 当前所在节点
* @return 当前已使用的节点key列表
*/
public static List<String> getAllUsedNodeKeys(FlowLongContext flowLongContext, Execution execution, NodeModel rootNodeModel, String currentNodeKey) {
List<String> currentUsedNodeKeys = new ArrayList<>();
if (null != rootNodeModel) {
String nodeKey = rootNodeModel.getNodeKey();
if (Objects.equals(currentNodeKey, nodeKey)) {
// 找到执行最后一个节点直接结束
currentUsedNodeKeys.add(nodeKey);
} else {
// 处理完成节点
if (rootNodeModel.conditionNode()) {
// 条件节点
List<ConditionNode> conditionNodes = rootNodeModel.getConditionNodes();
if (ObjectUtils.isNotEmpty(conditionNodes)) {
// 找到对应节点
flowLongContext.getFlowConditionHandler().getConditionNode(flowLongContext, execution, rootNodeModel).ifPresent(t -> {
// 添加执行条件节点
currentUsedNodeKeys.add(t.getNodeKey());
// 条件节点分支子节点
getChildAllUsedNodeKeys(currentUsedNodeKeys, flowLongContext, execution, t.getChildNode(), currentNodeKey);
});
}
// 条件节点子节点
getChildAllUsedNodeKeys(currentUsedNodeKeys, flowLongContext, execution, rootNodeModel.getChildNode(), currentNodeKey);
} else {
// 普通节点
currentUsedNodeKeys.add(nodeKey);
// 找子节点
NodeModel childNodeModel = rootNodeModel.getChildNode();
if (null != childNodeModel) {
getChildAllUsedNodeKeys(currentUsedNodeKeys, flowLongContext, execution, childNodeModel, currentNodeKey);
}
}
}
}
return currentUsedNodeKeys;
}
public static void getChildAllUsedNodeKeys(List<String> currentUsedNodeKeys, FlowLongContext flowLongContext,
Execution execution, NodeModel rootNodeModel, String currentNodeKey) {
if (!currentUsedNodeKeys.contains(currentNodeKey)) {
currentUsedNodeKeys.addAll(getAllUsedNodeKeys(flowLongContext, execution, rootNodeModel, currentNodeKey));
}
}
}

View File

@ -5,6 +5,7 @@ package test.mysql;
import com.aizuda.bpm.engine.FlowDataTransfer;
import com.aizuda.bpm.engine.assist.StreamUtils;
import com.aizuda.bpm.engine.core.Execution;
import com.aizuda.bpm.engine.core.FlowCreator;
import com.aizuda.bpm.engine.core.FlowLongContext;
import com.aizuda.bpm.engine.model.*;
@ -193,4 +194,27 @@ public class TestModel extends MysqlTest {
ProcessModel errorModel01 = getProcessModel("test/errorModel01.json");
Assertions.assertFalse(ModelHelper.checkExistApprovalNode(errorModel01.getNodeConfig()));
}
/**
* 测试获取当前已使用的节点key列表
*/
@Test
public void testCurrentUsedNodeKeys() {
ProcessModel processModel = getProcessModel("test/ccToCondition.json");
Assertions.assertEquals(2, ModelHelper.getAllUsedNodeKeys(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "k002").size());
Assertions.assertEquals(4, ModelHelper.getAllUsedNodeKeys(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>() {{
put("day", 3);
}}), processModel.getNodeConfig(), "k007").size());
Assertions.assertEquals(4, ModelHelper.getAllUsedNodeKeys(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>() {{
put("day", 8);
}}), processModel.getNodeConfig(), "k005").size());
Assertions.assertEquals(5, ModelHelper.getAllUsedNodeKeys(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>() {{
put("day", 8);
}}), processModel.getNodeConfig(), "k008").size());
}
}

View File

@ -21,7 +21,7 @@
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-boot.version>2.7.0</spring-boot.version>
<mybatis.plus-version>3.5.9</mybatis.plus-version>
<mybatis.plus-version>3.5.8</mybatis.plus-version>
<mysql.version>8.0.32</mysql.version>
<solon.version>3.0.1</solon.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>