This commit is contained in:
Fu Diwei 2025-06-24 10:38:27 +08:00 committed by RHQYZ
parent 2a498edef7
commit 4d42b06572

View File

@ -511,20 +511,40 @@ export const newNode = (nodeType: WorkflowNodeType, options: NewNodeOptions = {}
type CloneNodeOptions = { type CloneNodeOptions = {
withCopySuffix?: boolean; withCopySuffix?: boolean;
nodeIdMap?: Map<string, string>;
}; };
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 { produce } = new Immer({ autoFreeze: false });
const deepClone = (node: WorkflowNode): WorkflowNode => { const deepClone = (node: WorkflowNode): WorkflowNode => {
return produce(node, (draft) => { return produce(node, (draft) => {
draft.id = nanoid(); draft.id = nanoid();
nodeIdMap ??= new Map(); // 原节点 ID 映射到新节点 ID
nodeIdMap.set(node.id, draft.id);
if (draft.next) { if (draft.next) {
draft.next = cloneNode(draft.next, { withCopySuffix }); draft.next = cloneNode(draft.next, { withCopySuffix, nodeIdMap });
} }
if (draft.branches) { 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; return draft;