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',
}}
/>
)}
)}
)}
);
}