diff --git a/ui/src/domain/workflow.ts b/ui/src/domain/workflow.ts index 415123c4..5304fe77 100644 --- a/ui/src/domain/workflow.ts +++ b/ui/src/domain/workflow.ts @@ -511,20 +511,40 @@ export const newNode = (nodeType: WorkflowNodeType, options: NewNodeOptions = {} type CloneNodeOptions = { withCopySuffix?: boolean; + nodeIdMap?: Map; }; -export const cloneNode = (sourceNode: WorkflowNode, { withCopySuffix }: CloneNodeOptions = { withCopySuffix: true }): WorkflowNode => { +export const cloneNode = (sourceNode: WorkflowNode, { withCopySuffix, nodeIdMap }: CloneNodeOptions = { withCopySuffix: true }): WorkflowNode => { const { produce } = new Immer({ autoFreeze: false }); const deepClone = (node: WorkflowNode): WorkflowNode => { return produce(node, (draft) => { draft.id = nanoid(); + nodeIdMap ??= new Map(); // 原节点 ID 映射到新节点 ID + nodeIdMap.set(node.id, draft.id); + if (draft.next) { - draft.next = cloneNode(draft.next, { withCopySuffix }); + draft.next = cloneNode(draft.next, { withCopySuffix, nodeIdMap }); } if (draft.branches) { - draft.branches = draft.branches.map((branch) => cloneNode(branch, { withCopySuffix })); + draft.branches = draft.branches.map((branch) => cloneNode(branch, { withCopySuffix, nodeIdMap })); + } + + if (draft.config) { + switch (draft.type) { + case WorkflowNodeType.Deploy: + { + const prevNodeId = (draft.config as WorkflowNodeConfigForDeploy).certificate?.split("#")?.[0]; + if (nodeIdMap.has(prevNodeId)) { + draft.config = { + ...draft.config, + certificate: `${nodeIdMap.get(prevNodeId)}#certificate`, + } as WorkflowNodeConfigForDeploy; + } + } + break; + } } return draft;