From 7e6d2db56199ae3ff3bbf4f34d443fd209f17f30 Mon Sep 17 00:00:00 2001 From: ZLY Date: Fri, 24 Oct 2025 14:01:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(flow):=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=9A=94=E7=A6=BB=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useFlowCallbacks.ts | 50 ++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/hooks/useFlowCallbacks.ts b/src/hooks/useFlowCallbacks.ts index c7ea3e8..3a0833d 100644 --- a/src/hooks/useFlowCallbacks.ts +++ b/src/hooks/useFlowCallbacks.ts @@ -427,12 +427,14 @@ export const useFlowCallbacks = ( ...node, // 清除可能存在的运行时状态 selected: false, - dragging: false + dragging: false, + // 添加应用标识信息 + appId: initialData?.appId }; localStorage.setItem('copiedNode', JSON.stringify(nodeData)); console.log('复制节点:', node); - }, []); + }, [initialData?.appId]); // 粘贴节点 const pasteNode = useCallback((position: { x: number; y: number }) => { @@ -445,13 +447,22 @@ export const useFlowCallbacks = ( try { const copiedNode = JSON.parse(copiedNodeStr); + // 检查是否为同一应用,如果不是则不允许粘贴 + if (copiedNode.appId && initialData?.appId && copiedNode.appId !== initialData.appId) { + console.warn('不能在不同应用之间粘贴节点'); + // Message.warning('不能在不同应用之间粘贴节点'); + return; + } + // 创建新节点,更新ID和位置 const newNode = { ...copiedNode, id: `${copiedNode.type}-${Date.now()}`, // 生成新的唯一ID position, // 使用传入的位置 selected: false, - dragging: false + dragging: false, + // 移除应用标识信息,避免存储在节点数据中 + appId: undefined }; // 特殊处理循环节点 @@ -495,7 +506,7 @@ export const useFlowCallbacks = ( } catch (error) { console.error('粘贴节点时出错:', error); } - }, [edges]); + }, [edges, initialData?.appId]); // endregion // region 节点/边操作 @@ -511,7 +522,7 @@ export const useFlowCallbacks = ( if (node.data?.type === 'LOOP_START' || node.data?.type === 'LOOP_END') { // 获取关联的另一个循环节点 let relatedNodeId = null; - + // 类型断言,将component从unknown转换为具有customDef属性的对象 const component = node.data?.component as { customDef?: string } | undefined; @@ -522,7 +533,8 @@ export const useFlowCallbacks = ( } catch (e) { console.error('解析循环开始节点数据失败:', e); } - } else if (node.data?.type === 'LOOP_END' && component?.customDef) { + } + else if (node.data?.type === 'LOOP_END' && component?.customDef) { try { const customDef = JSON.parse(component.customDef); relatedNodeId = customDef.loopStartNodeId; @@ -533,17 +545,17 @@ export const useFlowCallbacks = ( // 删除两个节点及相关边 setNodes((nds: Node[]) => { - const updatedNodes = nds.filter((n) => + const updatedNodes = nds.filter((n) => n.id !== node.id && n.id !== relatedNodeId ); return updatedNodes; }); - + setEdges((eds: Edge[]) => { - const updatedEdges = eds.filter((e) => - e.source !== node.id && - e.target !== node.id && - e.source !== relatedNodeId && + const updatedEdges = eds.filter((e) => + e.source !== node.id && + e.target !== node.id && + e.source !== relatedNodeId && e.target !== relatedNodeId ); return updatedEdges; @@ -551,16 +563,16 @@ export const useFlowCallbacks = ( // 删除节点后记录历史 setTimeout(() => { - const updatedNodes = nodes.filter((n) => + const updatedNodes = nodes.filter((n) => n.id !== node.id && n.id !== relatedNodeId ); - const updatedEdges = edges.filter((e) => - e.source !== node.id && - e.target !== node.id && - e.source !== relatedNodeId && + const updatedEdges = edges.filter((e) => + e.source !== node.id && + e.target !== node.id && + e.source !== relatedNodeId && e.target !== relatedNodeId ); - + const event = new CustomEvent('takeSnapshot', { detail: { nodes: [...updatedNodes], @@ -569,7 +581,7 @@ export const useFlowCallbacks = ( }); document.dispatchEvent(event); }, 0); - + return; }