可正常启动,工作流可以正常运行,增加了其他节点,但是还没运行过,编译无错。
This commit is contained in:
parent
7991bde3ae
commit
79edbbcb82
@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user