diff --git a/web/src/app/admin/task-monitor/page.tsx b/web/src/app/admin/task-monitor/page.tsx index f2914b1..5e14a53 100644 --- a/web/src/app/admin/task-monitor/page.tsx +++ b/web/src/app/admin/task-monitor/page.tsx @@ -156,7 +156,7 @@ export default function AdminTaskMonitorPage() { const isMobile = useMobileDetection(); const canRead = hasPermission("celery.read") || hasPermission("celery.manage"); - const [autoRefresh, setAutoRefresh] = useState(true); + const [autoRefresh, setAutoRefresh] = useState(false); const [workerKeyword, setWorkerKeyword] = useState(""); const [queueKeyword, setQueueKeyword] = useState(""); const [taskKeyword, setTaskKeyword] = useState(""); @@ -174,6 +174,10 @@ export default function AdminTaskMonitorPage() { const [logModalContent, setLogModalContent] = useState(""); const [logModalTaskId, setLogModalTaskId] = useState(""); const [logModalLoading, setLogModalLoading] = useState(false); + const [detailModalVisible, setDetailModalVisible] = useState(false); + const [detailModalTask, setDetailModalTask] = useState(null); + const [exceptionModalVisible, setExceptionModalVisible] = useState(false); + const [exceptionModalTask, setExceptionModalTask] = useState(null); const resetTaskListPagination = useCallback(() => { setPagination((prev) => ({ ...prev, current: 1 })); @@ -210,6 +214,26 @@ export default function AdminTaskMonitorPage() { setLogModalContent(""); }; + const handleViewDetail = (task: TaskTableRow) => { + setDetailModalTask(task); + setDetailModalVisible(true); + }; + + const handleCloseDetailModal = () => { + setDetailModalVisible(false); + setDetailModalTask(null); + }; + + const handleViewException = (task: TaskTableRow) => { + setExceptionModalTask(task); + setExceptionModalVisible(true); + }; + + const handleCloseExceptionModal = () => { + setExceptionModalVisible(false); + setExceptionModalTask(null); + }; + const workersOverviewQuery = useQuery({ queryKey: ["flower-workers-overview"], enabled: Boolean(user) && canRead, @@ -274,13 +298,6 @@ export default function AdminTaskMonitorPage() { width: 110, render: (value: string) => renderTaskStateTag(value), }, - { - title: "监控分组", - dataIndex: "source", - key: "source", - width: 120, - render: (value: string) => renderTaskSourceTag(value), - }, { title: "队列", dataIndex: "queue_name", @@ -295,13 +312,6 @@ export default function AdminTaskMonitorPage() { width: 220, render: (value: string) => value || "-", }, - { - title: "接收时间", - dataIndex: "received_at", - key: "received_at", - width: 170, - render: (value: string | null) => formatDateTime(value), - }, { title: "开始时间", dataIndex: "started_at", @@ -323,43 +333,23 @@ export default function AdminTaskMonitorPage() { width: 110, render: (value: number | null) => formatTaskMonitorDuration(value), }, - { - title: "位置参数", - dataIndex: "args_text", - key: "args_text", - width: 220, - render: (value: string | null) => (value ? {value} : "-"), - }, - { - title: "关键字参数", - dataIndex: "kwargs_text", - key: "kwargs_text", - width: 220, - render: (value: string | null) => (value ? {value} : "-"), - }, - { - title: "异常信息", - dataIndex: "exception_text", - key: "exception_text", - width: 220, - render: (value: string | null) => - value ? ( - - {value} - - ) : ( - "-" - ), - }, { title: "操作", key: "actions", - width: 100, + width: 180, fixed: "right", render: (_: unknown, record: TaskTableRow) => ( - + + + + + ), }, ], @@ -401,7 +391,10 @@ export default function AdminTaskMonitorPage() { rows.push(...toTaskRows(overview.worker, "SCHEDULED", overview.scheduled_tasks)); rows.push(...toTaskRows(overview.worker, "RECENT", overview.recent_tasks)); } - return rows.filter((task) => task.name !== "app.tasks.worker_registry_tasks.sweep_worker_registry_offline"); + return rows.filter((task) => + task.name !== "app.tasks.worker_registry_tasks.sweep_worker_registry_offline" && + task.name !== "app.tasks.scheduled_task_tasks.dispatch_due_scheduled_tasks" + ); }, [allTasksQuery.data]); const filteredTaskRows = useMemo(() => { @@ -620,7 +613,6 @@ export default function AdminTaskMonitorPage() { {renderTaskStateTag(task.state)} } - extra={renderTaskSourceTag(task.source)} >
@@ -640,8 +632,8 @@ export default function AdminTaskMonitorPage() {
- 接收 - {formatDateTime(task.received_at)} + 开始 + {formatDateTime(task.started_at)}
完成 @@ -651,18 +643,18 @@ export default function AdminTaskMonitorPage() { 时长 {formatTaskMonitorDuration(task.runtime_seconds)}
- {task.exception_text && ( -
- 异常 - - {task.exception_text} - -
- )}
- + + + + +
@@ -713,15 +705,6 @@ export default function AdminTaskMonitorPage() { extra={( {(workersOverviewQuery.isFetching || allTasksQuery.isFetching) && } - )} > @@ -779,13 +762,7 @@ export default function AdminTaskMonitorPage() { - - - 自动刷新 - - - - + ) : ( @@ -841,26 +818,12 @@ export default function AdminTaskMonitorPage() { /> - - - 自动刷新 - - - - )} - - 生成时间:{formatDateTime(workersOverview?.generated_at)} - 执行节点:{filteredWorkers.length}/{workersOverview?.summary.total ?? 0} - 在线:{workersOverview?.summary.online ?? 0} - 离线:{workersOverview?.summary.offline ?? 0} - 任务:{filteredTaskRows.length} 条 - {!workersOverview && !workersOverviewQuery.isFetching && (
@@ -981,6 +944,94 @@ export default function AdminTaskMonitorPage() { )} + + + 关闭 + , + ]} + width={800} + style={{ top: 20 }} + > + +
+ 任务名称: + {getTaskDisplayName(detailModalTask?.name)} +
+
+ 位置参数: +
+              {detailModalTask?.args_text || "无"}
+            
+
+
+ 关键字参数: +
+              {detailModalTask?.kwargs_text || "无"}
+            
+
+
+
+ + + 关闭 + , + ]} + width={800} + style={{ top: 20 }} + > +
+          {exceptionModalTask?.exception_text || "无异常信息"}
+        
+
); }