From 43fddf44b8055f69a1659bb0b8deaa33648bc901 Mon Sep 17 00:00:00 2001 From: zly Date: Tue, 2 Jun 2026 11:11:11 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=20dataIns=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FlowEditor/nodeEditors/validators/nodeValidators.ts | 1 + src/pages/flowEditor/sideBar/config/localNodeData.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/FlowEditor/nodeEditors/validators/nodeValidators.ts b/src/components/FlowEditor/nodeEditors/validators/nodeValidators.ts index db54fe5..4d223a0 100644 --- a/src/components/FlowEditor/nodeEditors/validators/nodeValidators.ts +++ b/src/components/FlowEditor/nodeEditors/validators/nodeValidators.ts @@ -332,6 +332,7 @@ const validateBasicParams = (nodeData: any): string[] => { // 检查输入参数的完整性 if (nodeData.parameters?.dataIns) { + console.log("nodeData.parameters.dataIns", nodeData.parameters); nodeData.parameters.dataIns.forEach((param: any, index: number) => { if (!param.id) { errors.push(`第${index + 1}个输入参数的标识不能为空`); diff --git a/src/pages/flowEditor/sideBar/config/localNodeData.ts b/src/pages/flowEditor/sideBar/config/localNodeData.ts index 265c3e8..88bb984 100644 --- a/src/pages/flowEditor/sideBar/config/localNodeData.ts +++ b/src/pages/flowEditor/sideBar/config/localNodeData.ts @@ -84,6 +84,7 @@ const imageParameters = { defaultValue: '' }], dataIns: [{ + id: 'in', name: 'in', desc: 'url', dataType: 'STRING', From 294894ea567f221699bb43efeefae30dbe23c021 Mon Sep 17 00:00:00 2001 From: zly Date: Tue, 2 Jun 2026 11:59:41 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E9=A2=91=E7=B9=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AF=BC=E8=87=B4=E8=8A=82=E7=82=B9=E9=97=AA?= =?UTF-8?q?=E7=83=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useFlowCallbacks.ts | 5 +++++ src/hooks/useFlowEditorState.ts | 14 +++++++++++++- src/pages/ideContainer/index.tsx | 2 -- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/hooks/useFlowCallbacks.ts b/src/hooks/useFlowCallbacks.ts index d5a037f..91b53c1 100644 --- a/src/hooks/useFlowCallbacks.ts +++ b/src/hooks/useFlowCallbacks.ts @@ -548,8 +548,13 @@ export const useFlowCallbacks = ( // 实时更新 canvasDataMap const updateCanvasDataMapEffect = useCallback(() => { const appKey = getCurrentFlowAppKey(); + const { appRuntimeData } = store.getState().ideContainer; + const isCurrentAppRunning = + appKey && appRuntimeData[appKey]?.isRunning; + if ( appKey && + !isCurrentAppRunning && shouldPersistCanvas({ nodes, edges }) ) { updateCanvasDataMapDebounced( diff --git a/src/hooks/useFlowEditorState.ts b/src/hooks/useFlowEditorState.ts index 7acb218..7fc31c5 100644 --- a/src/hooks/useFlowEditorState.ts +++ b/src/hooks/useFlowEditorState.ts @@ -61,7 +61,9 @@ export const useFlowEditorState = (initialData?: any, readOnly?: boolean) => { Object.values(initialData.components).some((comp: any) => comp.status); setNodes((prevNodes) => { - return prevNodes.map((node) => { + let hasChanges = false; + + const nextNodes = prevNodes.map((node) => { // 如果是只读模式(历史实例查看),优先使用节点自身的历史状态 // 如果是正常运行模式,只使用运行时状态 let nodeStatus = 'waiting'; @@ -80,6 +82,14 @@ export const useFlowEditorState = (initialData?: any, readOnly?: boolean) => { showStatus = currentAppIsRunning; } + if ( + node.data.status === nodeStatus && + node.data.isStatusVisible === showStatus + ) { + return node; + } + + hasChanges = true; return { ...node, data: { @@ -89,6 +99,8 @@ export const useFlowEditorState = (initialData?: any, readOnly?: boolean) => { }, }; }); + + return hasChanges ? nextNodes : prevNodes; }); }, [ appRuntimeData, diff --git a/src/pages/ideContainer/index.tsx b/src/pages/ideContainer/index.tsx index e52e480..57186e3 100644 --- a/src/pages/ideContainer/index.tsx +++ b/src/pages/ideContainer/index.tsx @@ -4,7 +4,6 @@ import { updateSocketId, updateNodeStatus, updateEventListOld, - resetNodeStatus, updateRuntimeId, updateIsRunning } from '@/store/ideContainer'; @@ -149,7 +148,6 @@ function IDEContainer() { const reconnectRuntime = async () => { try { - dispatch(resetNodeStatus()); dispatch(updateRuntimeId(reconnectRequest.instanceId)); dispatch(updateIsRunning(true)); From bea38a7e3624b3e48e9555e8896da0d6db1cdf27 Mon Sep 17 00:00:00 2001 From: zly Date: Tue, 2 Jun 2026 13:59:35 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=88=97=E8=A1=A8=E7=8A=B6=E6=80=81=E4=B8=8E=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81=E7=9A=84=E5=85=B3?= =?UTF-8?q?=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useFlowCallbacks.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hooks/useFlowCallbacks.ts b/src/hooks/useFlowCallbacks.ts index 91b53c1..c137637 100644 --- a/src/hooks/useFlowCallbacks.ts +++ b/src/hooks/useFlowCallbacks.ts @@ -129,6 +129,10 @@ export const useFlowCallbacks = ( return getCurrentAppKey(currentAppData) || initialData?.appId; }, [initialData]); + const refreshAppList = useCallback(() => { + document.dispatchEvent(new CustomEvent('refreshAppList')); + }, []); + // region 画布操作 // 节点变更处理,添加防抖机制 const onNodesChange = useCallback( @@ -1406,6 +1410,7 @@ export const useFlowCallbacks = ( // 更新运行ID dispatch(updateRuntimeId(res.data)); + refreshAppList(); // 开始运行时动画 setEdges((eds) => @@ -1439,6 +1444,7 @@ export const useFlowCallbacks = ( // 更新运行ID dispatch(updateRuntimeId(res.data)); + refreshAppList(); // 开始运行时动画 setEdges((eds) => @@ -1467,9 +1473,8 @@ export const useFlowCallbacks = ( } else { // 特殊停止逻辑,持久化运行的应用使用这里的入参 await stopApp(currentAppData.instanceId); - // 特殊停止完成后触发事件,通知刷新应用列表 - document.dispatchEvent(new CustomEvent('refreshAppList')); } + refreshAppList(); // 重置节点状态 dispatch(resetNodeStatus()); @@ -1495,7 +1500,7 @@ export const useFlowCallbacks = ( } } }, - [getCurrentFlowAppKey] + [getCurrentFlowAppKey, refreshAppList] ); // 暂停/恢复应用