From de45255feb38ef7f5417ba5af6ab7aafe83da5b8 Mon Sep 17 00:00:00 2001 From: AoXuan Date: Sun, 21 Sep 2025 15:17:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=80=BB=E8=A7=88=E7=9A=84=E7=8A=B6=E6=80=81=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/TaskTree.vue | 32 ++++++- .../src/views/scheduler/TaskOverviewPanel.vue | 91 ++++++++++++++++--- .../src/views/scheduler/useSchedulerLogic.ts | 4 +- 3 files changed, 107 insertions(+), 20 deletions(-) diff --git a/frontend/src/components/TaskTree.vue b/frontend/src/components/TaskTree.vue index fca3d7c..1fa6884 100644 --- a/frontend/src/components/TaskTree.vue +++ b/frontend/src/components/TaskTree.vue @@ -107,17 +107,41 @@ const toggleScript = (scriptId: string) => { } } -// 获取状态颜色 +// 获取状态颜色 - 使用更全面的映射和后备逻辑 const getStatusColor = (status: string) => { - const statusColorMap: Record = { + // 精确匹配优先 + const exactStatusColorMap: Record = { '等待': 'orange', + '排队': 'orange', + '挂起': 'orange', '运行中': 'blue', + '运行': 'blue', + '进行中': 'blue', + '执行中': 'blue', '已完成': 'green', + '完成': 'green', + '成功': 'green', '失败': 'red', + '异常': 'red', + '错误': 'red', '暂停': 'gray', - '取消': 'default' + '取消': 'default', + '停止': 'default' } - return statusColorMap[status] || 'default' + + // 先尝试精确匹配 + if (exactStatusColorMap[status]) { + return exactStatusColorMap[status] + } + + // 使用正则表达式进行模糊匹配(作为后备) + if (/成功|完成|已完成/.test(status)) return 'green' + if (/失败|错误|异常/.test(status)) return 'red' + if (/等待|排队|挂起/.test(status)) return 'orange' + if (/进行|执行|运行/.test(status)) return 'blue' + if (/暂停|停止/.test(status)) return 'gray' + + return 'default' } // 初始化时展开所有脚本 diff --git a/frontend/src/views/scheduler/TaskOverviewPanel.vue b/frontend/src/views/scheduler/TaskOverviewPanel.vue index 8e0cda5..93a5a9c 100644 --- a/frontend/src/views/scheduler/TaskOverviewPanel.vue +++ b/frontend/src/views/scheduler/TaskOverviewPanel.vue @@ -31,7 +31,9 @@ interface WSMessage { type: string id: string data: { - task_dict: Script[] + task_dict?: Script[] + user_list?: User[] + task_list?: any[] } fullMessage?: any } @@ -40,23 +42,84 @@ interface WSMessage { const taskData = ref([]) const taskTreeRef = ref() -// 计算总任务数量 -const totalTaskCount = computed(() => { - return taskData.value.reduce((total, script) => { - return total + (script.user_list?.length || 0) - }, 0) -}) + // 处理 WebSocket 消息 const handleWSMessage = (message: WSMessage) => { console.log('TaskOverviewPanel 收到 WebSocket 消息:', message) - if (message.type === 'Update' && message.data?.task_dict) { - console.log('更新任务数据:', message.data.task_dict) - taskData.value = message.data.task_dict - console.log('设置后的 taskData:', taskData.value) - // 更新展开状态 - if (taskTreeRef.value) { - taskTreeRef.value.updateExpandedScripts() + + if (message.type === 'Update') { + // 处理 task_dict 数据(完整的脚本和用户数据) + if (message.data?.task_dict) { + console.log('更新任务数据 (task_dict):', message.data.task_dict) + taskData.value = message.data.task_dict + console.log('设置后的 taskData:', taskData.value) + + // 更新展开状态 + if (taskTreeRef.value) { + taskTreeRef.value.updateExpandedScripts() + } + } + + // 处理 user_list 数据(只有用户状态更新) + else if (message.data?.user_list && Array.isArray(message.data.user_list)) { + console.log('更新用户列表 (user_list):', message.data.user_list) + + // 如果还没有脚本数据,创建一个默认脚本来包含这些用户 + if (taskData.value.length === 0) { + taskData.value = [{ + script_id: 'default-script', + name: '新 MAA 脚本', // 使用你提供的脚本名称 + status: '运行中', + user_list: message.data.user_list + }] + } else { + // 更新现有脚本的用户列表 + // 假设所有用户都属于第一个脚本(根据你的使用场景) + if (taskData.value[0]) { + taskData.value[0].user_list = message.data.user_list + // 根据用户状态更新脚本状态 + const userStatuses = message.data.user_list.map(u => u.status) + if (userStatuses.includes('异常') || userStatuses.includes('失败')) { + taskData.value[0].status = '异常' + } else if (userStatuses.includes('运行中')) { + taskData.value[0].status = '运行中' + } else if (userStatuses.every(s => s === '已完成')) { + taskData.value[0].status = '已完成' + } else { + taskData.value[0].status = '等待' + } + } + } + + console.log('更新后的 taskData:', taskData.value) + + // 更新展开状态 + if (taskTreeRef.value) { + taskTreeRef.value.updateExpandedScripts() + } + } + + // 处理 task_list 数据 + else if (message.data?.task_list && Array.isArray(message.data.task_list)) { + console.log('更新任务列表 (task_list):', message.data.task_list) + const convertedData = message.data.task_list.map((task: any) => ({ + script_id: task.id || task.script_id || `task_${Date.now()}`, + name: task.name || '未知任务', + status: task.status || '等待', + user_list: task.user_list || [] + })) + taskData.value = convertedData + console.log('转换后的 taskData:', taskData.value) + + // 更新展开状态 + if (taskTreeRef.value) { + taskTreeRef.value.updateExpandedScripts() + } + } + + else { + console.log('收到未识别格式的更新数据:', message.data) } } } diff --git a/frontend/src/views/scheduler/useSchedulerLogic.ts b/frontend/src/views/scheduler/useSchedulerLogic.ts index fcc4b1c..83808f3 100644 --- a/frontend/src/views/scheduler/useSchedulerLogic.ts +++ b/frontend/src/views/scheduler/useSchedulerLogic.ts @@ -330,10 +330,10 @@ export function useSchedulerLogic() { // 处理task_dict初始化消息 if (data.task_dict && Array.isArray(data.task_dict)) { - // 初始化任务队列 + // 初始化任务队列 - 保持原始状态 const newTaskQueue = data.task_dict.map((item: any) => ({ name: item.name || '未知任务', - status: '等待', + status: item.status || '等待', // 使用实际状态,而不是强制设置为等待 })); // 初始化用户队列(仅包含运行状态下的用户)