From 3998984094223d958d00fc5aee55cada9038d034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=B0=91=E6=9D=B0?= Date: Tue, 7 Apr 2026 00:29:32 +0800 Subject: [PATCH] fix(dashboard): correct stage key mismatch, add created_at, persist cancelled tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix ANALYSIS_STAGES key 'trader' → 'trading' to match backend STAGE markers - Add created_at field to task state at creation, sort list_tasks by it - Persist task state before broadcast in cancel path (closes restart race) Co-Authored-By: Claude Opus 4.6 --- web_dashboard/backend/main.py | 8 +++++--- web_dashboard/frontend/src/pages/AnalysisMonitor.jsx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/web_dashboard/backend/main.py b/web_dashboard/backend/main.py index 9150287d..2bdeda79 100644 --- a/web_dashboard/backend/main.py +++ b/web_dashboard/backend/main.py @@ -231,6 +231,7 @@ async def start_analysis(request: AnalysisRequest): "status": "running", "progress": 0, "current_stage": "analysts", + "created_at": datetime.now().isoformat(), "elapsed": 0, "stages": [ {"status": "running", "completed_at": None}, @@ -419,10 +420,10 @@ async def list_tasks(): "progress": state.get("progress", 0), "decision": state.get("decision"), "error": state.get("error"), - "created_at": state.get("stages", [{}])[0].get("completed_at") if state.get("stages") else None, + "created_at": state.get("created_at"), }) - # Sort by task_id (which includes timestamp) descending - tasks.sort(key=lambda x: x["task_id"], reverse=True) + # Sort by created_at descending (most recent first) + tasks.sort(key=lambda x: x.get("created_at") or "", reverse=True) return {"tasks": tasks, "total": len(tasks)} @@ -446,6 +447,7 @@ async def cancel_task(task_id: str): task.cancel() app.state.task_results[task_id]["status"] = "failed" app.state.task_results[task_id]["error"] = "用户取消" + _save_task_status(task_id, app.state.task_results[task_id]) await broadcast_progress(task_id, app.state.task_results[task_id]) # Clean up temp script diff --git a/web_dashboard/frontend/src/pages/AnalysisMonitor.jsx b/web_dashboard/frontend/src/pages/AnalysisMonitor.jsx index d13c6775..f1866498 100644 --- a/web_dashboard/frontend/src/pages/AnalysisMonitor.jsx +++ b/web_dashboard/frontend/src/pages/AnalysisMonitor.jsx @@ -6,7 +6,7 @@ import { CheckCircleOutlined, SyncOutlined, CloseCircleOutlined } from '@ant-des const ANALYSIS_STAGES = [ { key: 'analysts', label: '分析师团队' }, { key: 'research', label: '研究员辩论' }, - { key: 'trader', label: '交易员' }, + { key: 'trading', label: '交易员' }, { key: 'risk', label: '风险管理' }, { key: 'portfolio', label: '组合经理' }, ]