优化动态获取下一个节点方法

This commit is contained in:
hubin 2024-12-12 22:43:08 +08:00
parent 0a835213a6
commit 6d0ca7cb67
2 changed files with 37 additions and 30 deletions

View File

@ -59,19 +59,19 @@ public class ModelHelper {
// 条件节点
flowLongContext.getFlowConditionHandler().getConditionNode(flowLongContext, execution, childNode)
// 添加执行条件节点
.ifPresent(t -> nextNodes.addAll(getChildNode(flowLongContext, execution, rootNodeModel, t.getChildNode())));
.ifPresent(t -> nextNodes.add(t.getChildNode()));
} else if (childNode.parallelNode()) {
// 并行节点
childNode.getParallelNodes().forEach(t -> nextNodes.add(t.getChildNode()));
} else if (childNode.inclusiveNode()) {
// 包容节点
flowLongContext.getFlowConditionHandler().getInclusiveNodes(flowLongContext, execution, childNode).ifPresent(optList -> {
if (Objects.equals(1, optList.size()) && null != childNode.getChildNode()) {
if (Objects.equals(1, optList.size()) && null == optList.get(0).getChildNode()) {
// 获取包容分支子节点
nextNodes.add(childNode.getChildNode());
} else {
// 添加执行条件节点
optList.forEach(t -> nextNodes.addAll(getChildNode(flowLongContext, execution, rootNodeModel, t.getChildNode())));
optList.forEach(t -> nextNodes.add(t.getChildNode()));
}
});
} else if (childNode.routeNode()) {
@ -112,10 +112,7 @@ public class ModelHelper {
nextNodes.add(parentNode.getChildNode());
} else if (parentNode.inclusiveNode()) {
// 包容分支
flowLongContext.getFlowConditionHandler().getInclusiveNodes(flowLongContext, execution, parentNode)
// 添加执行条件节点
.ifPresent(inclusiveNodes -> inclusiveNodes.forEach(t ->
nextNodes.addAll(getChildNode(flowLongContext, execution, rootNodeModel, t.getChildNode()))));
nextNodes.add(parentNode.getChildNode());
} else if (parentNode.routeNode()) {
// 路由分支
flowLongContext.getFlowConditionHandler().getRouteNode(flowLongContext, execution, parentNode)

View File

@ -3,12 +3,16 @@ package test.mysql;
import com.aizuda.bpm.engine.FlowLongEngine;
import com.aizuda.bpm.engine.core.Execution;
import com.aizuda.bpm.engine.model.ModelHelper;
import com.aizuda.bpm.engine.model.NodeModel;
import com.aizuda.bpm.engine.model.ProcessModel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
public class TestNextChildNodes extends TestModel {
@ -17,45 +21,51 @@ public class TestNextChildNodes extends TestModel {
@Test
public void testNextChildNodes() {
ProcessModel processModel = getProcessModel("test/TestNextChildNodes.json");
ProcessModel processModel = getProcessModel("test/testNextChildNodes.json");
processModel.buildParentNode(processModel.getNodeConfig());
Assertions.assertEquals("flk1733396309547", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733380944015").get(0).getNodeKey());
assertEquals("flk1733396309547", "flk1733380944015", processModel);
assertEquals("flk1733380972879", "flk1733396309547", processModel);
assertEquals("flk1733446929109", "flk1733380972879", processModel);
Assertions.assertEquals("flk1733380972879", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733396309547").get(0).getNodeKey());
Assertions.assertEquals("flk1733446929109", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733380972879").get(0).getNodeKey());
Assertions.assertEquals("flk1733446923640", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>(){{
assertEquals("flk1733446923640", "flk1733380972879", processModel, new HashMap<String, Object>() {{
put("aaa", "11");
}}), processModel.getNodeConfig(), "flk1733380972879").get(0).getNodeKey());
}});
// 下一步执行到并行分支
Assertions.assertEquals(2, ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733446929109").size());
assertConsumer("flk1733446929109", processModel, null, nodeModels -> Assertions.assertEquals(2, nodeModels.size()));
Assertions.assertEquals("flk1733446917296", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733446912655").get(0).getNodeKey());
assertEquals("flk1733446917296", "flk1733446912655", processModel);
// 路由分支
Assertions.assertEquals("flk1733446923640", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>() {{
assertEquals("flk1733446923640", "flk1733446917296", processModel, new HashMap<String, Object>() {{
put("aaa", "11");
}}), processModel.getNodeConfig(), "flk1733446917296").get(0).getNodeKey());
}});
// 跳过路由分支包容分支执行默认条件
Assertions.assertEquals("flk1733658019276", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733446917296").get(0).getNodeKey());
assertEquals("flk1733658019276", "flk1733446917296", processModel);
// 包容分支
Assertions.assertEquals("flk1733658095760", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, new HashMap<String, Object>() {{
assertEquals("flk1733658095760", "flk1733446917296", processModel, new HashMap<String, Object>() {{
put("bbb", "11");
}}), processModel.getNodeConfig(), "flk1733446917296").get(0).getNodeKey());
}});
Assertions.assertEquals("flk1733658019276", ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, null),
processModel.getNodeConfig(), "flk1733658095760").get(0).getNodeKey());
assertEquals("flk1733658019276", "flk1733658095760", processModel);
}
private void assertEquals(String nextNodeKey, String nodeKey, ProcessModel processModel) {
assertEquals(nextNodeKey, nodeKey, processModel, null);
}
private void assertEquals(String nextNodeKey, String nodeKey, ProcessModel processModel, Map<String, Object> args) {
assertConsumer(nodeKey, processModel, args, nodeModels -> Assertions.assertEquals(nextNodeKey, nodeModels.get(0).getNodeKey()));
}
private void assertConsumer(String nodeKey, ProcessModel processModel, Map<String, Object> args, Consumer<List<NodeModel>> consumer) {
List<NodeModel> nodeModels = ModelHelper.getNextChildNodes(flowLongEngine.getContext(), new Execution(testCreator, args),
processModel.getNodeConfig(), nodeKey);
if (null != consumer) {
consumer.accept(nodeModels);
}
}
}