|
|
import { createSlice } from '@reduxjs/toolkit';
|
|
|
|
|
|
// 定义初始状态类型
|
|
|
interface IDEContainerState {
|
|
|
info: any;
|
|
|
menuData: any;
|
|
|
flowData: any;
|
|
|
canvasDataMap: any;
|
|
|
projectComponentData: any;
|
|
|
currentAppData: any;
|
|
|
eventListOld: any;
|
|
|
eventList: any;
|
|
|
eventTopicList: any;
|
|
|
logBarStatus?: boolean;
|
|
|
socketId: string;
|
|
|
nodeStatusMap: Record<string, string>; // 节点状态映射
|
|
|
isRunning: boolean; // 是否正在运行
|
|
|
// 应用运行状态和日志数据,按应用ID隔离存储
|
|
|
appRuntimeData: Record<string, {
|
|
|
nodeStatusMap: Record<string, string>;
|
|
|
isRunning: boolean;
|
|
|
logs: any[];
|
|
|
}>;
|
|
|
}
|
|
|
|
|
|
// 初始状态
|
|
|
const initialState: IDEContainerState = {
|
|
|
info: {}, // 项目信息
|
|
|
menuData: {}, // 菜单数据
|
|
|
flowData: {}, // 编排数据,即流程图的渲染数据
|
|
|
canvasDataMap: {}, // 每个画布的缓存信息
|
|
|
projectComponentData: {}, // 工程下的组件列表
|
|
|
currentAppData: {}, // 当前选中的应用数据
|
|
|
eventListOld: [], // 工程下的事件列表
|
|
|
eventList: [], // 工程下的事件列表
|
|
|
eventTopicList: [], // 应用编排使用的事件名和topic列表
|
|
|
logBarStatus: false,
|
|
|
socketId: '', // 工程的socketId
|
|
|
nodeStatusMap: {}, // 初始化节点状态映射
|
|
|
isRunning: false, // 默认未运行
|
|
|
appRuntimeData: {}, // 按应用ID隔离的应用运行状态和日志数据
|
|
|
};
|
|
|
|
|
|
// 创建切片
|
|
|
const ideContainerSlice = createSlice({
|
|
|
name: 'ideContainer',
|
|
|
initialState,
|
|
|
reducers: {
|
|
|
updateInfo(state, action) {
|
|
|
state.info = action.payload;
|
|
|
},
|
|
|
updateMenuData(state, action) {
|
|
|
state.menuData = action.payload;
|
|
|
},
|
|
|
updateFlowData(state, action) {
|
|
|
state.flowData = { ...state.flowData, ...action.payload };
|
|
|
},
|
|
|
updateCanvasDataMap(state, action) {
|
|
|
state.canvasDataMap = { ...state.canvasDataMap, ...action.payload };
|
|
|
},
|
|
|
updateProjectComponentData(state, action) {
|
|
|
state.projectComponentData = { ...state.projectComponentData, ...action.payload };
|
|
|
},
|
|
|
updateCurrentAppData(state, action) {
|
|
|
state.currentAppData = action.payload;
|
|
|
},
|
|
|
updateEventList(state, action) {
|
|
|
state.eventList = action.payload;
|
|
|
},
|
|
|
updateEventListOld(state, action) {
|
|
|
state.eventListOld = action.payload;
|
|
|
},
|
|
|
updateEventTopicList(state, action) {
|
|
|
state.eventTopicList = action.payload;
|
|
|
},
|
|
|
updateLogBarStatus(state, action) {
|
|
|
state.logBarStatus = action.payload;
|
|
|
},
|
|
|
updateSocketId(state, action) {
|
|
|
state.socketId = action.payload;
|
|
|
},
|
|
|
// 更新节点状态
|
|
|
updateNodeStatus: (state, { payload }) => {
|
|
|
const { nodeId, status, actionType } = payload;
|
|
|
// 如果是运行时更新,不记录到历史记录中
|
|
|
if (actionType !== 'RUNTIME_UPDATE') {
|
|
|
state.nodeStatusMap[nodeId] = status;
|
|
|
} else {
|
|
|
// 对于运行时更新,我们仍然更新状态但标记为运行时状态
|
|
|
state.nodeStatusMap[nodeId] = status;
|
|
|
}
|
|
|
|
|
|
// 同时更新当前应用的节点状态
|
|
|
const appId = state.currentAppData?.id;
|
|
|
if (appId) {
|
|
|
if (!state.appRuntimeData[appId]) {
|
|
|
state.appRuntimeData[appId] = {
|
|
|
nodeStatusMap: {},
|
|
|
isRunning: false,
|
|
|
logs: []
|
|
|
};
|
|
|
}
|
|
|
state.appRuntimeData[appId].nodeStatusMap[nodeId] = status;
|
|
|
}
|
|
|
},
|
|
|
// 重置节点状态
|
|
|
resetNodeStatus: (state) => {
|
|
|
state.nodeStatusMap = {};
|
|
|
|
|
|
// 同时重置当前应用的节点状态
|
|
|
const appId = state.currentAppData?.id;
|
|
|
if (appId && state.appRuntimeData[appId]) {
|
|
|
state.appRuntimeData[appId].nodeStatusMap = {};
|
|
|
}
|
|
|
},
|
|
|
// 更新运行状态
|
|
|
updateIsRunning: (state, { payload }) => {
|
|
|
state.isRunning = payload;
|
|
|
|
|
|
// 同时更新当前应用的运行状态
|
|
|
const appId = state.currentAppData?.id;
|
|
|
if (appId) {
|
|
|
if (!state.appRuntimeData[appId]) {
|
|
|
state.appRuntimeData[appId] = {
|
|
|
nodeStatusMap: {},
|
|
|
isRunning: false,
|
|
|
logs: []
|
|
|
};
|
|
|
}
|
|
|
state.appRuntimeData[appId].isRunning = payload;
|
|
|
}
|
|
|
},
|
|
|
// 添加运行日志
|
|
|
addRuntimeLog: (state, { payload }) => {
|
|
|
const { log, appId } = payload;
|
|
|
if (!state.appRuntimeData[appId]) {
|
|
|
state.appRuntimeData[appId] = {
|
|
|
nodeStatusMap: {},
|
|
|
isRunning: false,
|
|
|
logs: []
|
|
|
};
|
|
|
}
|
|
|
state.appRuntimeData[appId].logs.push(log);
|
|
|
},
|
|
|
// 清空指定应用的运行日志
|
|
|
clearRuntimeLogs: (state, { payload }) => {
|
|
|
const { appId } = payload;
|
|
|
if (state.appRuntimeData[appId]) {
|
|
|
state.appRuntimeData[appId].logs = [];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 导出动作 creators
|
|
|
export const {
|
|
|
updateInfo,
|
|
|
updateMenuData,
|
|
|
updateFlowData,
|
|
|
updateCanvasDataMap,
|
|
|
updateProjectComponentData,
|
|
|
updateCurrentAppData,
|
|
|
updateEventList,
|
|
|
updateEventListOld,
|
|
|
updateEventTopicList,
|
|
|
updateLogBarStatus,
|
|
|
updateSocketId,
|
|
|
updateNodeStatus,
|
|
|
resetNodeStatus,
|
|
|
updateIsRunning,
|
|
|
addRuntimeLog,
|
|
|
clearRuntimeLogs
|
|
|
} = ideContainerSlice.actions;
|
|
|
|
|
|
// 默认导出 reducer
|
|
|
export default ideContainerSlice.reducer; |