import { useState } from 'react'; import { getTaskTypeLabel } from '../config/taskUiPolicies'; export default function GlobalTaskCenter({ isVisible, activeTasks, runtimeSummary, t, isAdmin, showCancelTask, cancelTaskPwd, onShowCancelTask, onCancelTaskPwdChange, onCancelTaskConfirm, onCloseCancelTask, }) { const [expanded, setExpanded] = useState(false); const jobs = runtimeSummary?.jobs || {}; const worker = runtimeSummary?.worker || {}; const scan = runtimeSummary?.scan || {}; const activeJobs = Array.isArray(jobs.items) ? jobs.items : []; const activeCount = Math.max( activeTasks.length, Number(jobs.active_count) || 0, ); const workerCount = Number(worker.worker_count) || 0; const queuedJobs = Number(jobs.queued_count) || 0; const runningJobs = Number(jobs.running_count) || 0; const scanJobCount = Number(scan.active_job_count) || 0; if (!isVisible || activeCount === 0) { return null; } const avgProgress = Math.round( activeTasks.reduce((sum, task) => sum + (Number(task.progress) || 0), 0) / Math.max(1, activeCount) ); const visibleJobs = activeJobs.slice(0, 8); return (
{!expanded && ( )} {expanded && (

后台任务

展示 Worker、执行中 Job、排队 Job 和任务进度;同类重复提交由后端冲突检查处理。

Worker {workerCount}
执行中 {runningJobs}
排队 {queuedJobs}
扫描 {scanJobCount}
{visibleJobs.length > 0 && (
{visibleJobs.map((job) => (
{job.status || '-'} {getTaskTypeLabel(job.task_type || job.job_type)} {job.locked_by ? `Worker ${job.locked_by}` : (job.status === 'RETRY' ? '等待重试' : '等待领取')}
))}
)}
{(() => { const waterTasks = activeTasks.filter(task => task.task_type?.startsWith('WATER_GEOCODE_') || task.task_type?.startsWith('WATER_FLOOD_') ); const otherTasks = activeTasks.filter(task => !task.task_type?.startsWith('WATER_GEOCODE_') && !task.task_type?.startsWith('WATER_FLOOD_') ); const waterDone = waterTasks.filter(task => task.progress >= 100).length; return ( <> {otherTasks.map((task) => (
{getTaskTypeLabel(task.task_type)} {Number(task.progress) || 0}%

{t(task.message || '')}

))} {waterTasks.length > 0 && (
水体处理(剩余 {waterTasks.length - waterDone} 景)
)} {otherTasks.length === 0 && waterTasks.length === 0 && visibleJobs.length > 0 && (

当前只有 Job 运行态,任务进度尚未写入 system_tasks。

)} ); })()}

取消按钮只作用于可跟踪的 Task;纯 Job 取消需要在对应功能页或运维接口处理。

{isAdmin && (
{!showCancelTask ? ( ) : (
onCancelTaskPwdChange(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { onCancelTaskConfirm(); } }} style={{ padding: '5px 10px', fontSize: '12px', borderRadius: '4px', border: '1px solid #cbd5e1', background: '#ffffff', color: '#0f172a', width: '160px', outline: 'none', }} />
)}
)}
)}
); }