import React, { useState, useEffect } from 'react'; import { Clock, CheckCircle2, XCircle, RefreshCcw, Download, FileText, FileSpreadsheet, Loader2, ChevronDown, ChevronUp, Trash2, AlertCircle, HelpCircle } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { backendApi } from '@/db/backend-api'; import { format } from 'date-fns'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; import { Skeleton } from '@/components/ui/skeleton'; type Task = { task_id: string; status: 'pending' | 'processing' | 'success' | 'failure' | 'unknown'; created_at: string; updated_at?: string; message?: string; result?: any; error?: string; task_type?: string; }; const TaskHistory: React.FC = () => { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [expandedTask, setExpandedTask] = useState(null); // 获取任务历史数据 const fetchTasks = async () => { try { setLoading(true); const response = await backendApi.getTasks(50, 0); if (response.success && response.tasks) { // 转换后端数据格式为前端格式 const convertedTasks: Task[] = response.tasks.map((t: any) => ({ task_id: t.task_id, status: t.status || 'unknown', created_at: t.created_at || new Date().toISOString(), updated_at: t.updated_at, message: t.message || '', result: t.result, error: t.error, task_type: t.task_type || 'document_parse' })); setTasks(convertedTasks); } else { setTasks([]); } } catch (error) { console.error('获取任务列表失败:', error); toast.error('获取任务列表失败'); setTasks([]); } finally { setLoading(false); } }; useEffect(() => { fetchTasks(); }, []); const getStatusBadge = (status: string) => { switch (status) { case 'success': return 成功; case 'failure': return 失败; case 'processing': return 处理中; case 'unknown': return 未知; default: return 等待; } }; const getTaskTypeLabel = (type?: string) => { switch (type) { case 'document_parse': return '文档解析'; case 'excel_analysis': return 'Excel 分析'; case 'template_fill': return '智能填表'; case 'rag_index': return 'RAG 索引'; default: return '未知任务'; } }; const getTaskIcon = (type?: string) => { switch (type) { case 'document_parse': case 'rag_index': return ; case 'excel_analysis': return ; default: return ; } }; const handleRetry = async (taskId: string) => { toast.info('任务重试功能开发中...'); }; const handleDelete = async (taskId: string) => { try { await backendApi.deleteTask(taskId); setTasks(prev => prev.filter(t => t.task_id !== taskId)); toast.success('任务已删除'); } catch (error) { console.error('删除任务失败:', error); toast.error('删除任务失败'); } }; const stats = { total: tasks.length, success: tasks.filter(t => t.status === 'success').length, processing: tasks.filter(t => t.status === 'processing').length, failure: tasks.filter(t => t.status === 'failure').length, unknown: tasks.filter(t => t.status === 'unknown').length }; return (

任务历史

查看和管理您所有的文档处理任务记录

{/* Stats Cards */}
{[ { label: '总任务数', value: stats.total, icon: Clock, color: 'text-blue-500', bg: 'bg-blue-500/10' }, { label: '成功', value: stats.success, icon: CheckCircle2, color: 'text-emerald-500', bg: 'bg-emerald-500/10' }, { label: '处理中', value: stats.processing, icon: Loader2, color: 'text-amber-500', bg: 'bg-amber-500/10' }, { label: '失败', value: stats.failure, icon: XCircle, color: 'text-destructive', bg: 'bg-destructive/10' } ].map((stat, i) => (

{stat.value}

{stat.label}

))}
{/* Task List */}
{loading ? ( Array.from({ length: 3 }).map((_, i) => ( )) ) : tasks.length > 0 ? ( tasks.map((task) => (
{task.status === 'processing' ? ( ) : ( getTaskIcon(task.task_type) )}

{getTaskTypeLabel(task.task_type)}

{getStatusBadge(task.status)} {task.task_id}

{task.message || (task.status === 'unknown' ? '无法获取状态' : '任务执行中...')}

{task.created_at ? format(new Date(task.created_at), 'yyyy-MM-dd HH:mm:ss') : '时间未知'} {task.updated_at && task.status !== 'processing' && ( 更新: {format(new Date(task.updated_at), 'HH:mm:ss')} )}
{task.status === 'failure' && ( )} {task.result && ( )}
{/* Expanded Details */} {expandedTask === task.task_id && task.result && (

任务结果

                        {JSON.stringify(task.result, null, 2)}
                      
)} {/* Error Details */} {task.status === 'failure' && task.error && (

错误详情

{task.error}

)}
)) ) : (

暂无任务记录

上传文档或创建填表任务后,这里会显示处理记录

)}
); }; export default TaskHistory;