diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/parser/WorkflowDefinitionParser.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/parser/WorkflowDefinitionParser.java index 46eeffa0..273fd5f0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/parser/WorkflowDefinitionParser.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/engine/parser/WorkflowDefinitionParser.java @@ -36,7 +36,7 @@ public class WorkflowDefinitionParser { try { log.debug("Parsing node config: {}", nodeConfig); JsonNode rootNode = objectMapper.readTree(nodeConfig); - JsonNode nodesNode = rootNode.get("nodes"); + JsonNode nodesNode = rootNode.get("nodeConfig"); if (nodesNode == null || !nodesNode.isArray()) { throw new WorkflowEngineException(ResponseCode.WORKFLOW_NODE_CONFIG_INVALID); } @@ -63,18 +63,21 @@ public class WorkflowDefinitionParser { public List parseTransitionConfig(String transitionConfig) { try { log.debug("Parsing transition config: {}", transitionConfig); - List transitions = objectMapper.readValue( - transitionConfig, - new TypeReference>() {} - ); - - transitions.forEach(transition -> + JsonNode rootNode = objectMapper.readTree(transitionConfig); + JsonNode transitionsNode = rootNode.get("transitionConfig"); + if (transitionsNode == null || !transitionsNode.isArray()) { + throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID); + } + + List transitions = new ArrayList<>(); + for (JsonNode node : transitionsNode) { + TransitionConfig config = objectMapper.treeToValue(node, TransitionConfig.class); + transitions.add(config); log.debug("Parsed transition: {} -> {}, priority={}", - transition.getSourceNodeId(), - transition.getTargetNodeId(), - transition.getPriority()) - ); - + config.getSourceNodeId(), + config.getTargetNodeId(), + config.getPriority()); + } return transitions; } catch (JsonProcessingException e) { log.error("Failed to parse transition config: {}", e.getMessage(), e); @@ -93,18 +96,18 @@ public class WorkflowDefinitionParser { boolean hasStart = false; boolean hasEnd = false; for (NodeConfig node : nodes) { - switch (node.getType()) { - case START -> hasStart = true; - case END -> hasEnd = true; + if (node.getType() == NodeTypeEnum.START) { + hasStart = true; + } else if (node.getType() == NodeTypeEnum.END) { + hasEnd = true; } } if (!hasStart || !hasEnd) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, - "Workflow must have both START and END nodes"); + throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, "工作流必须包含开始节点和结束节点"); } - // 2. 检查流转配置中的节点ID是否都存在 + // 2. 检查流转配置的完整性 for (TransitionConfig transition : transitions) { boolean sourceExists = false; boolean targetExists = false; @@ -119,36 +122,11 @@ public class WorkflowDefinitionParser { } if (!sourceExists || !targetExists) { - throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, - String.format("Invalid node reference in transition: %s -> %s", - transition.getSourceNodeId(), transition.getTargetNodeId())); + throw new WorkflowEngineException(ResponseCode.WORKFLOW_CONFIG_INVALID, + String.format("流转配置中的节点不存在: %s -> %s", + 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"); } -} \ No newline at end of file +} \ No newline at end of file