|
|
|
@ -39,7 +39,7 @@ import { appFLowHandle } from '@/pages/flowEditor/utils/appFlowhandle';
|
|
|
|
import { handelEventNodeList, updateEvent, upDatePublish } from '@/pages/flowEditor/utils/common';
|
|
|
|
import { handelEventNodeList, updateEvent, upDatePublish } from '@/pages/flowEditor/utils/common';
|
|
|
|
|
|
|
|
|
|
|
|
import { Dispatch } from 'redux';
|
|
|
|
import { Dispatch } from 'redux';
|
|
|
|
import { getAppListBySceneId, runMainFlow, stopApp } from '@/api/apps';
|
|
|
|
import { getAppListBySceneId, runMainFlow, runSubFlow, stopApp } from '@/api/apps';
|
|
|
|
import store from '@/store';
|
|
|
|
import store from '@/store';
|
|
|
|
import { updateAppEvent, updateAppEventChannel, updateAppFlowData } from '@/api/appEvent';
|
|
|
|
import { updateAppEvent, updateAppEventChannel, updateAppFlowData } from '@/api/appEvent';
|
|
|
|
import { getUrlParams, sleep } from '@/utils/common';
|
|
|
|
import { getUrlParams, sleep } from '@/utils/common';
|
|
|
|
@ -74,6 +74,19 @@ export const useFlowCallbacks = (
|
|
|
|
setIsDelete: React.Dispatch<React.SetStateAction<boolean>>
|
|
|
|
setIsDelete: React.Dispatch<React.SetStateAction<boolean>>
|
|
|
|
) => {
|
|
|
|
) => {
|
|
|
|
const { getGuidelines, clearGuidelines } = useAlignmentGuidelines();
|
|
|
|
const { getGuidelines, clearGuidelines } = useAlignmentGuidelines();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 辅助函数:获取当前应用/子流程的唯一标识符
|
|
|
|
|
|
|
|
const getCurrentAppKey = useCallback(() => {
|
|
|
|
|
|
|
|
const { currentAppData } = store.getState().ideContainer;
|
|
|
|
|
|
|
|
if (!currentAppData) return null;
|
|
|
|
|
|
|
|
// 如果是子流程(key包含'sub'),使用key作为标识符
|
|
|
|
|
|
|
|
if (currentAppData.key && currentAppData.key.includes('sub')) {
|
|
|
|
|
|
|
|
return currentAppData.key;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 否则使用id或initialData.appId
|
|
|
|
|
|
|
|
return currentAppData.id || initialData?.appId;
|
|
|
|
|
|
|
|
}, [initialData]);
|
|
|
|
|
|
|
|
|
|
|
|
// region 画布操作
|
|
|
|
// region 画布操作
|
|
|
|
// 节点变更处理,添加防抖机制
|
|
|
|
// 节点变更处理,添加防抖机制
|
|
|
|
const onNodesChange = useCallback((changes: any) => {
|
|
|
|
const onNodesChange = useCallback((changes: any) => {
|
|
|
|
@ -448,8 +461,9 @@ export const useFlowCallbacks = (
|
|
|
|
// region 画布数据处理
|
|
|
|
// region 画布数据处理
|
|
|
|
// 初始化画布数据
|
|
|
|
// 初始化画布数据
|
|
|
|
const initializeCanvasData = useCallback(() => {
|
|
|
|
const initializeCanvasData = useCallback(() => {
|
|
|
|
if (canvasDataMap[initialData?.appId]) {
|
|
|
|
const appKey = getCurrentAppKey();
|
|
|
|
const { edges, nodes } = canvasDataMap[initialData?.appId];
|
|
|
|
if (appKey && canvasDataMap[appKey]) {
|
|
|
|
|
|
|
|
const { edges, nodes } = canvasDataMap[appKey];
|
|
|
|
setNodes(nodes);
|
|
|
|
setNodes(nodes);
|
|
|
|
setEdges(edges);
|
|
|
|
setEdges(edges);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -461,18 +475,19 @@ export const useFlowCallbacks = (
|
|
|
|
|
|
|
|
|
|
|
|
// 标记历史记录已初始化
|
|
|
|
// 标记历史记录已初始化
|
|
|
|
setHistoryInitialized(true);
|
|
|
|
setHistoryInitialized(true);
|
|
|
|
}, [initialData, canvasDataMap]);
|
|
|
|
}, [initialData, canvasDataMap, getCurrentAppKey]);
|
|
|
|
// 实时更新 canvasDataMap
|
|
|
|
// 实时更新 canvasDataMap
|
|
|
|
const updateCanvasDataMapEffect = useCallback(() => {
|
|
|
|
const updateCanvasDataMapEffect = useCallback(() => {
|
|
|
|
if (initialData?.appId) {
|
|
|
|
const appKey = getCurrentAppKey();
|
|
|
|
updateCanvasDataMapDebounced(dispatch, canvasDataMap, initialData.appId, nodes, edges);
|
|
|
|
if (appKey) {
|
|
|
|
|
|
|
|
updateCanvasDataMapDebounced(dispatch, canvasDataMap, appKey, nodes, edges);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 清理函数,在组件卸载时取消防抖
|
|
|
|
// 清理函数,在组件卸载时取消防抖
|
|
|
|
return () => {
|
|
|
|
return () => {
|
|
|
|
// 取消防抖函数
|
|
|
|
// 取消防抖函数
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}, [nodes, edges, initialData?.appId, dispatch, canvasDataMap]);
|
|
|
|
}, [nodes, edges, dispatch, canvasDataMap, getCurrentAppKey]);
|
|
|
|
// 关闭编辑弹窗
|
|
|
|
// 关闭编辑弹窗
|
|
|
|
const closeEditModal = useCallback(() => {
|
|
|
|
const closeEditModal = useCallback(() => {
|
|
|
|
setIsEditModalOpen(false);
|
|
|
|
setIsEditModalOpen(false);
|
|
|
|
@ -1152,14 +1167,19 @@ export const useFlowCallbacks = (
|
|
|
|
const appRes: any = await getAppInfoNew(currentAppData.parentAppId);
|
|
|
|
const appRes: any = await getAppInfoNew(currentAppData.parentAppId);
|
|
|
|
// 更新 flowData 中的数据
|
|
|
|
// 更新 flowData 中的数据
|
|
|
|
dispatch(updateFlowData({ [currentAppData.parentAppId]: appRes.data }));
|
|
|
|
dispatch(updateFlowData({ [currentAppData.parentAppId]: appRes.data }));
|
|
|
|
// 同步更新到 canvasDataMap
|
|
|
|
// 同步更新主流程到 canvasDataMap(使用父应用ID)
|
|
|
|
if (appRes.data.main?.components) {
|
|
|
|
if (appRes.data.main?.components) {
|
|
|
|
const { nodes, edges } = convertFlowData(appRes.data.main.components, true);
|
|
|
|
const { nodes: parentNodes, edges: parentEdges } = convertFlowData(appRes.data.main.components, true);
|
|
|
|
dispatch(updateCanvasDataMap({
|
|
|
|
dispatch(updateCanvasDataMap({
|
|
|
|
...canvasDataMap,
|
|
|
|
...canvasDataMap,
|
|
|
|
[currentAppData.parentAppId]: { nodes, edges }
|
|
|
|
[currentAppData.parentAppId]: { nodes: parentNodes, edges: parentEdges }
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 同步更新子流程到 canvasDataMap(使用子流程key)
|
|
|
|
|
|
|
|
dispatch(updateCanvasDataMap({
|
|
|
|
|
|
|
|
...canvasDataMap,
|
|
|
|
|
|
|
|
[currentAppData.key]: { nodes, edges }
|
|
|
|
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
Message.error(res.message);
|
|
|
|
Message.error(res.message);
|
|
|
|
@ -1294,42 +1314,86 @@ export const useFlowCallbacks = (
|
|
|
|
// 运行处理函数
|
|
|
|
// 运行处理函数
|
|
|
|
const handleRun = useCallback(async (running: boolean) => {
|
|
|
|
const handleRun = useCallback(async (running: boolean) => {
|
|
|
|
const { currentAppData, socketId, appRuntimeData } = store.getState().ideContainer;
|
|
|
|
const { currentAppData, socketId, appRuntimeData } = store.getState().ideContainer;
|
|
|
|
|
|
|
|
const appKey = getCurrentAppKey();
|
|
|
|
|
|
|
|
|
|
|
|
if (running) {
|
|
|
|
if (running) {
|
|
|
|
// 启动运行
|
|
|
|
// 子流程运行
|
|
|
|
const params = {
|
|
|
|
if (currentAppData.key.includes('sub')) {
|
|
|
|
appId: currentAppData.id,
|
|
|
|
// 启动运行
|
|
|
|
socketId
|
|
|
|
const params = {
|
|
|
|
};
|
|
|
|
appId: currentAppData.parentAppId,
|
|
|
|
const res: any = await runMainFlow(params);
|
|
|
|
socketId,
|
|
|
|
if (res.code === 200) {
|
|
|
|
subflowId: currentAppData.key
|
|
|
|
// 设置运行状态为true
|
|
|
|
};
|
|
|
|
dispatch(updateIsRunning(true));
|
|
|
|
const res: any = await runSubFlow(params);
|
|
|
|
|
|
|
|
|
|
|
|
// 重置节点状态
|
|
|
|
if (res.code === 200) {
|
|
|
|
dispatch(resetNodeStatus());
|
|
|
|
// 设置运行状态为true
|
|
|
|
|
|
|
|
dispatch(updateIsRunning(true));
|
|
|
|
|
|
|
|
|
|
|
|
// 更新运行ID
|
|
|
|
// 重置节点状态
|
|
|
|
dispatch(updateRuntimeId(res.data));
|
|
|
|
dispatch(resetNodeStatus());
|
|
|
|
|
|
|
|
|
|
|
|
// 开始运行时动画
|
|
|
|
// 更新运行ID
|
|
|
|
setEdges((eds) => eds.map(edge => ({
|
|
|
|
dispatch(updateRuntimeId(res.data));
|
|
|
|
...edge,
|
|
|
|
|
|
|
|
data: {
|
|
|
|
// 开始运行时动画
|
|
|
|
...edge.data,
|
|
|
|
setEdges((eds) => eds.map(edge => ({
|
|
|
|
isRunning: true,
|
|
|
|
...edge,
|
|
|
|
animationProgress: 0
|
|
|
|
data: {
|
|
|
|
}
|
|
|
|
...edge.data,
|
|
|
|
})));
|
|
|
|
isRunning: true,
|
|
|
|
|
|
|
|
animationProgress: 0
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
Message.error(res.message);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 主流程运行
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
Message.error(res.message);
|
|
|
|
// 启动运行
|
|
|
|
|
|
|
|
const params = {
|
|
|
|
|
|
|
|
appId: currentAppData.id,
|
|
|
|
|
|
|
|
socketId
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
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 {
|
|
|
|
else {
|
|
|
|
// 设置运行状态为false
|
|
|
|
// 设置运行状态为false
|
|
|
|
dispatch(updateIsRunning(false));
|
|
|
|
dispatch(updateIsRunning(false));
|
|
|
|
|
|
|
|
|
|
|
|
await stopApp(appRuntimeData[currentAppData.id].runId);
|
|
|
|
// 使用正确的 appKey 获取 runId
|
|
|
|
|
|
|
|
const runId = appKey && appRuntimeData[appKey] ? appRuntimeData[appKey].runId : '';
|
|
|
|
|
|
|
|
if (runId) {
|
|
|
|
|
|
|
|
await stopApp(runId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新运行ID
|
|
|
|
// 更新运行ID
|
|
|
|
dispatch(updateRuntimeId(''));
|
|
|
|
dispatch(updateRuntimeId(''));
|
|
|
|
|
|
|
|
|
|
|
|
@ -1344,9 +1408,11 @@ export const useFlowCallbacks = (
|
|
|
|
})));
|
|
|
|
})));
|
|
|
|
|
|
|
|
|
|
|
|
// 清空当前应用的运行日志
|
|
|
|
// 清空当前应用的运行日志
|
|
|
|
dispatch(clearRuntimeLogs({ appId: currentAppData.id }));
|
|
|
|
if (appKey) {
|
|
|
|
|
|
|
|
dispatch(clearRuntimeLogs({ appId: appKey }));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, [initialData?.appId]);
|
|
|
|
}, [getCurrentAppKey]);
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
// Event handlers
|
|
|
|
// Event handlers
|
|
|
|
|