executeNode 执行单个节点
(execution *WorkflowExecution, nodeID string)
| 514 | |
| 515 | // executeNode 执行单个节点 |
| 516 | func (e *Engine) executeNode(execution *WorkflowExecution, nodeID string) bool { |
| 517 | node := e.findNode(execution.Definition, nodeID) |
| 518 | if node == nil { |
| 519 | e.markExecutionFailed(execution, fmt.Errorf("node not found: %s", nodeID)) |
| 520 | return false |
| 521 | } |
| 522 | |
| 523 | // 检查节点是否已完成 |
| 524 | if execution.CompletedNodes[nodeID] { |
| 525 | return true |
| 526 | } |
| 527 | |
| 528 | // 检查节点是否失败 |
| 529 | if _, failed := execution.FailedNodes[nodeID]; failed { |
| 530 | return false |
| 531 | } |
| 532 | |
| 533 | // 创建节点结果 |
| 534 | result := &NodeResult{ |
| 535 | NodeID: nodeID, |
| 536 | NodeName: node.Name, |
| 537 | NodeType: node.Type, |
| 538 | Status: StatusRunning, |
| 539 | StartTime: time.Now(), |
| 540 | Inputs: make(map[string]any), |
| 541 | Outputs: make(map[string]any), |
| 542 | Metadata: make(map[string]any), |
| 543 | } |
| 544 | |
| 545 | // 执行节点 |
| 546 | var err error |
| 547 | switch node.Type { |
| 548 | case NodeTypeStart: |
| 549 | err = e.executeStartNode(execution, node, result) |
| 550 | case NodeTypeEnd: |
| 551 | err = e.executeEndNode(execution, node, result) |
| 552 | case NodeTypeTask: |
| 553 | err = e.executeTaskNode(execution, node, result) |
| 554 | case NodeTypeCondition: |
| 555 | err = e.executeConditionNode(execution, node, result) |
| 556 | case NodeTypeLoop: |
| 557 | err = e.executeLoopNode(execution, node, result) |
| 558 | case NodeTypeParallel: |
| 559 | err = e.executeParallelNode(execution, node, result) |
| 560 | case NodeTypeMerge: |
| 561 | err = e.executeMergeNode(execution, node, result) |
| 562 | default: |
| 563 | err = fmt.Errorf("unsupported node type: %s", node.Type) |
| 564 | } |
| 565 | |
| 566 | // 更新结果 |
| 567 | result.EndTime = time.Now() |
| 568 | result.Duration = result.EndTime.Sub(result.StartTime) |
| 569 | |
| 570 | if err != nil { |
| 571 | result.Status = StatusFailed |
| 572 | result.Error = err.Error() |
| 573 | execution.FailedNodes[nodeID] = err |
no test coverage detected