import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Activity, AlertTriangle, CheckCircle, Clock, Search, FileText, Calendar, Plus } from "lucide-react"; import { api } from "@/shared/config/database"; import type { AuditTask } from "@/shared/types"; import { Link } from "react-router-dom"; import { toast } from "sonner"; import CreateTaskDialog from "@/components/audit/CreateTaskDialog"; import { calculateTaskProgress } from "@/shared/utils/utils"; export default function AuditTasks() { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [showCreateDialog, setShowCreateDialog] = useState(false); useEffect(() => { loadTasks(); }, []); // 静默更新活动任务的进度(不触发loading状态) useEffect(() => { const activeTasks = tasks.filter( task => task.status === 'running' || task.status === 'pending' ); if (activeTasks.length === 0) { return; } const intervalId = setInterval(async () => { try { // 只获取活动任务的最新数据 const updatedData = await api.getAuditTasks(); // 使用函数式更新,确保基于最新状态 setTasks(prevTasks => { return prevTasks.map(prevTask => { const updated = updatedData.find(t => t.id === prevTask.id); // 只有在进度、状态或问题数真正变化时才更新 if (updated && ( updated.status !== prevTask.status || updated.scanned_files !== prevTask.scanned_files || updated.issues_count !== prevTask.issues_count )) { return updated; } return prevTask; }); }); } catch (error) { console.error('静默更新任务列表失败:', error); } }, 3000); // 每3秒静默更新一次 return () => clearInterval(intervalId); }, [tasks.map(t => t.id + t.status).join(',')]); const loadTasks = async () => { try { setLoading(true); const data = await api.getAuditTasks(); setTasks(data); } catch (error) { console.error('Failed to load tasks:', error); toast.error("加载任务失败"); } finally { setLoading(false); } }; const getStatusColor = (status: string) => { switch (status) { case 'completed': return 'bg-green-100 text-green-800'; case 'running': return 'bg-red-50 text-red-800'; case 'failed': return 'bg-red-100 text-red-900'; case 'cancelled': return 'bg-gray-100 text-gray-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getStatusIcon = (status: string) => { switch (status) { case 'completed': return ; case 'running': return ; case 'failed': return ; case 'cancelled': return ; default: return ; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('zh-CN', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; const filteredTasks = tasks.filter(task => { const matchesSearch = task.project?.name.toLowerCase().includes(searchTerm.toLowerCase()) || task.task_type.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === "all" || task.status === statusFilter; return matchesSearch && matchesStatus; }); if (loading) { return (
); } return (
{/* Decorative Background */}
{/* 页面标题 */}

审计任务

查看和管理所有代码审计任务的执行状态

{/* 统计卡片 */}

总任务数

{tasks.length}

已完成

{tasks.filter(t => t.status === 'completed').length}

运行中

{tasks.filter(t => t.status === 'running').length}

失败

{tasks.filter(t => t.status === 'failed').length}

{/* 搜索和筛选 */}
setSearchTerm(e.target.value)} className="pl-10 retro-input h-10" />
{/* 任务列表 */} {filteredTasks.length > 0 ? (
{filteredTasks.map((task) => (
{getStatusIcon(task.status)}

{task.project?.name || '未知项目'}

{task.task_type === 'repository' ? '仓库审计任务' : '即时分析任务'}

{task.status === 'completed' ? '已完成' : task.status === 'running' ? '运行中' : task.status === 'failed' ? '失败' : task.status === 'cancelled' ? '已取消' : '等待中'}
{task.total_files}

文件数

{task.total_lines.toLocaleString()}

代码行数

{task.issues_count}

发现问题

{task.quality_score.toFixed(1)}

质量评分

{/* 扫描进度 */}
扫描进度 {task.scanned_files || 0} / {task.total_files || 0} 文件
{calculateTaskProgress(task.scanned_files, task.total_files)}% 完成
{formatDate(task.created_at)}
{task.completed_at && (
{formatDate(task.completed_at)}
)}
{task.project && ( )}
))}
) : (

{searchTerm || statusFilter !== "all" ? '未找到匹配的任务' : '暂无审计任务'}

{searchTerm || statusFilter !== "all" ? '尝试调整搜索条件或筛选器' : '创建第一个审计任务开始代码质量分析'}

{!searchTerm && statusFilter === "all" && ( )}
)} {/* 新建任务对话框 */}
); }