可正常启动,工作流可以正常运行,增加了其他节点,但是还没运行过,编译无错。

This commit is contained in:
戚辰先生 2024-12-08 17:50:58 +08:00
parent 7991bde3ae
commit 79edbbcb82

View File

@ -36,7 +36,7 @@ public class WorkflowDefinitionParser {
try { try {
log.debug("Parsing node config: {}", nodeConfig); log.debug("Parsing node config: {}", nodeConfig);
JsonNode rootNode = objectMapper.readTree(nodeConfig); JsonNode rootNode = objectMapper.readTree(nodeConfig);
JsonNode nodesNode = rootNode.get("nodes"); JsonNode nodesNode = rootNode.get("nodeConfig");
if (nodesNode == null || !nodesNode.isArray()) { if (nodesNode == null || !nodesNode.isArray()) {
throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_INVALID); throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_INVALID);
} }
@ -63,18 +63,21 @@ public class WorkflowDefinitionParser {
public List<TransitionConfig> parseTransitionConfig(String transitionConfig) { public List<TransitionConfig> parseTransitionConfig(String transitionConfig) {
try { try {
log.debug("Parsing transition config: {}", transitionConfig); log.debug("Parsing transition config: {}", transitionConfig);
List<TransitionConfig> transitions = objectMapper.readValue( JsonNode rootNode = objectMapper.readTree(transitionConfig);
transitionConfig, JsonNode transitionsNode = rootNode.get("transitionConfig");
new TypeReference<List<TransitionConfig>>() {} if (transitionsNode == null || !transitionsNode.isArray()) {
); throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID);
}
transitions.forEach(transition -> List<TransitionConfig> transitions = new ArrayList<>();
for (JsonNode node : transitionsNode) {
TransitionConfig config = objectMapper.treeToValue(node, TransitionConfig.class);
transitions.add(config);
log.debug("Parsed transition: {} -> {}, priority={}", log.debug("Parsed transition: {} -> {}, priority={}",
transition.getSourceNodeId(), config.getSourceNodeId(),
transition.getTargetNodeId(), config.getTargetNodeId(),
transition.getPriority()) config.getPriority());
); }
return transitions; return transitions;
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("Failed to parse transition config: {}", e.getMessage(), e); log.error("Failed to parse transition config: {}", e.getMessage(), e);
@ -93,18 +96,18 @@ public class WorkflowDefinitionParser {
boolean hasStart = false; boolean hasStart = false;
boolean hasEnd = false; boolean hasEnd = false;
for (NodeConfig node : nodes) { for (NodeConfig node : nodes) {
switch (node.getType()) { if (node.getType() == NodeTypeEnum.START) {
case START -> hasStart = true; hasStart = true;
case END -> hasEnd = true; } else if (node.getType() == NodeTypeEnum.END) {
hasEnd = true;
} }
} }
if (!hasStart || !hasEnd) { if (!hasStart || !hasEnd) {
throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, "工作流必须包含开始节点和结束节点");
"Workflow must have both START and END nodes");
} }
// 2. 检查流转配置中的节点ID是否都存在 // 2. 检查流转配置的完整性
for (TransitionConfig transition : transitions) { for (TransitionConfig transition : transitions) {
boolean sourceExists = false; boolean sourceExists = false;
boolean targetExists = false; boolean targetExists = false;
@ -120,35 +123,10 @@ public class WorkflowDefinitionParser {
if (!sourceExists || !targetExists) { if (!sourceExists || !targetExists) {
throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID,
String.format("Invalid node reference in transition: %s -> %s", String.format("流转配置中的节点不存在: %s -> %s",
transition.getSourceNodeId(), transition.getTargetNodeId())); transition.getSourceNodeId(),
transition.getTargetNodeId()));
} }
} }
// 3. 检查是否存在孤立节点没有入边或出边的非开始/结束节点
for (NodeConfig node : nodes) {
if (node.getType() == NodeTypeEnum.START || node.getType() == NodeTypeEnum.END) {
continue;
}
boolean hasIncoming = false;
boolean hasOutgoing = false;
for (TransitionConfig transition : transitions) {
if (transition.getTargetNodeId().equals(node.getNodeId())) {
hasIncoming = true;
}
if (transition.getSourceNodeId().equals(node.getNodeId())) {
hasOutgoing = true;
}
}
if (!hasIncoming || !hasOutgoing) {
throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID,
String.format("Isolated node found: %s", node.getNodeId()));
}
}
log.info("Workflow configuration validation passed");
} }
} }