From 6faa206b8a0601dc7836b8ae0eb70fc21c0cd4bb Mon Sep 17 00:00:00 2001 From: ZLY Date: Thu, 30 Oct 2025 14:44:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(ide):=20=E6=B7=BB=E5=8A=A0=E8=BF=90?= =?UTF-8?q?=E8=A1=8CID=E4=BB=A5=E6=94=AF=E6=8C=81=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E8=BF=BD=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useFlowCallbacks.ts | 54 +++++++++++++++++++++-------------- src/store/ideContainer.ts | 35 +++++++++++++++++------ 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/hooks/useFlowCallbacks.ts b/src/hooks/useFlowCallbacks.ts index 25d98eb..0e07104 100644 --- a/src/hooks/useFlowCallbacks.ts +++ b/src/hooks/useFlowCallbacks.ts @@ -21,7 +21,8 @@ import { updateIsRunning, updateEventListOld, addRuntimeLog, - clearRuntimeLogs + clearRuntimeLogs, + updateRuntimeId } from '@/store/ideContainer'; import { validateAllNodes, @@ -166,11 +167,11 @@ export const useFlowCallbacks = ( // 查找源节点的dataOuts中对应的数据 const sourceDataOut = (sourceParams.dataOuts || []).find((dataOut: any) => dataOut.name === params.sourceHandle || dataOut.id === params.sourceHandle); - + // 查找目标节点的dataIns中对应的数据 const targetDataIn = (targetParams.dataIns || []).find((dataIn: any) => dataIn.name === params.targetHandle || dataIn.id === params.targetHandle); - + // 验证数据类型是否一致 if (sourceDataOut && targetDataIn && sourceDataOut.dataType !== targetDataIn.dataType) { console.warn('数据类型不匹配,源节点数据类型:', sourceDataOut.dataType, '目标节点数据类型:', targetDataIn.dataType); @@ -1307,36 +1308,45 @@ export const useFlowCallbacks = ( }, [nodes, edges, initialData?.appId]); // 运行处理函数 const handleRun = useCallback(async (running: boolean) => { - const { currentAppData, socketId } = store.getState().ideContainer; + const { currentAppData, socketId, appRuntimeData } = store.getState().ideContainer; if (running) { // 启动运行 const params = { appId: currentAppData.id, socketId }; - runMainFlow(params); - - // 设置运行状态为true - dispatch(updateIsRunning(true)); - - // 重置节点状态 - dispatch(resetNodeStatus()); - - // 开始运行时动画 - setEdges((eds) => eds.map(edge => ({ - ...edge, - data: { - ...edge.data, - isRunning: true, - animationProgress: 0 - } - }))); + const res: any = await runMainFlow(params); + if (res.code === 200) { + // 设置运行状态为true + dispatch(updateIsRunning(true)); + + // 重置节点状态 + dispatch(resetNodeStatus()); + + // 更新运行ID + dispatch(updateRuntimeId(res.data)); + + // 开始运行时动画 + setEdges((eds) => eds.map(edge => ({ + ...edge, + data: { + ...edge.data, + isRunning: true, + animationProgress: 0 + } + }))); + } + else { + Message.error(res.message); + } } else { // 设置运行状态为false dispatch(updateIsRunning(false)); - stopApp(currentAppData.id); + await stopApp(appRuntimeData[currentAppData.id].runId); + // 更新运行ID + dispatch(updateRuntimeId('')); // 停止运行 setEdges((eds) => eds.map(edge => ({ diff --git a/src/store/ideContainer.ts b/src/store/ideContainer.ts index 8dc2e9d..e201e7b 100644 --- a/src/store/ideContainer.ts +++ b/src/store/ideContainer.ts @@ -20,6 +20,7 @@ interface IDEContainerState { nodeStatusMap: Record; isRunning: boolean; logs: any[]; + runId: string; }>; } @@ -38,7 +39,7 @@ const initialState: IDEContainerState = { socketId: '', // 工程的socketId nodeStatusMap: {}, // 初始化节点状态映射 isRunning: false, // 默认未运行 - appRuntimeData: {}, // 按应用ID隔离的应用运行状态和日志数据 + appRuntimeData: {} // 按应用ID隔离的应用运行状态和日志数据 }; // 创建切片 @@ -85,11 +86,12 @@ const ideContainerSlice = createSlice({ // 如果是运行时更新,不记录到历史记录中 if (actionType !== 'RUNTIME_UPDATE') { state.nodeStatusMap[nodeId] = status; - } else { + } + else { // 对于运行时更新,我们仍然更新状态但标记为运行时状态 state.nodeStatusMap[nodeId] = status; } - + // 同时更新当前应用的节点状态 const appId = state.currentAppData?.id; if (appId) { @@ -97,7 +99,8 @@ const ideContainerSlice = createSlice({ state.appRuntimeData[appId] = { nodeStatusMap: {}, isRunning: false, - logs: [] + logs: [], + runId: '' }; } state.appRuntimeData[appId].nodeStatusMap[nodeId] = status; @@ -106,7 +109,7 @@ const ideContainerSlice = createSlice({ // 重置节点状态 resetNodeStatus: (state) => { state.nodeStatusMap = {}; - + // 同时重置当前应用的节点状态 const appId = state.currentAppData?.id; if (appId && state.appRuntimeData[appId]) { @@ -116,7 +119,7 @@ const ideContainerSlice = createSlice({ // 更新运行状态 updateIsRunning: (state, { payload }) => { state.isRunning = payload; - + // 同时更新当前应用的运行状态 const appId = state.currentAppData?.id; if (appId) { @@ -124,12 +127,26 @@ const ideContainerSlice = createSlice({ state.appRuntimeData[appId] = { nodeStatusMap: {}, isRunning: false, - logs: [] + logs: [], + runId: '' }; } state.appRuntimeData[appId].isRunning = payload; } }, + // 添加运行id + updateRuntimeId: (state, { payload }) => { + const appId = state.currentAppData?.id; + if (!state.appRuntimeData[appId]) { + state.appRuntimeData[appId] = { + nodeStatusMap: {}, + isRunning: false, + logs: [], + runId: '' + }; + } + state.appRuntimeData[appId].runId = payload; + }, // 添加运行日志 addRuntimeLog: (state, { payload }) => { const { log, appId } = payload; @@ -137,7 +154,8 @@ const ideContainerSlice = createSlice({ state.appRuntimeData[appId] = { nodeStatusMap: {}, isRunning: false, - logs: [] + logs: [], + runId: '' }; } state.appRuntimeData[appId].logs.push(log); @@ -168,6 +186,7 @@ export const { updateNodeStatus, resetNodeStatus, updateIsRunning, + updateRuntimeId, addRuntimeLog, clearRuntimeLogs } = ideContainerSlice.actions;