/** * 任务表格组件 */ import { FileText, FileType2, Loader2, Play, Eye, RefreshCw, Trash2 } from 'lucide-react'; import type { ReviewTask } from '../types'; import { formatFileSize, formatTime } from '../api'; interface TaskTableProps { tasks: ReviewTask[]; selectedIds: string[]; onSelectChange: (ids: string[]) => void; onViewReport: (task: ReviewTask) => void; onRunTask: (task: ReviewTask) => void; onDeleteTask: (task: ReviewTask) => void; } export default function TaskTable({ tasks, selectedIds, onSelectChange, onViewReport, onRunTask, onDeleteTask }: TaskTableProps) { const allSelected = tasks.length > 0 && selectedIds.length === tasks.length; const toggleSelectAll = () => { if (allSelected) { onSelectChange([]); } else { onSelectChange(tasks.map(t => t.id)); } }; const toggleSelect = (id: string) => { if (selectedIds.includes(id)) { onSelectChange(selectedIds.filter(i => i !== id)); } else { onSelectChange([...selectedIds, id]); } }; // 获取文件图标 const getFileIcon = (fileName: string) => { if (fileName.endsWith('.pdf')) { return ; } return ; }; // 获取文件图标容器样式 const getFileIconStyle = (fileName: string) => { if (fileName.endsWith('.pdf')) { return 'bg-red-50 text-red-600 border-red-100'; } return 'bg-blue-50 text-blue-600 border-blue-100'; }; // 渲染智能体标签 const renderAgentTags = (task: ReviewTask) => { if (!task.selectedAgents || task.selectedAgents.length === 0) { return 未运行; } return (
{task.selectedAgents.includes('editorial') && ( 规范性 )} {task.selectedAgents.includes('methodology') && ( 方法学 )}
); }; // 渲染结果摘要 const renderResultSummary = (task: ReviewTask) => { if (task.status === 'pending') { return 等待发起...; } if (task.status === 'extracting' || task.status === 'reviewing') { return (
{task.status === 'extracting' ? '提取文本中...' : '审查中...'}
); } if (task.status === 'failed') { return 失败; } if (task.status === 'completed') { return (
{task.editorialScore !== undefined && (
= 80 ? 'bg-green-500' : task.editorialScore >= 60 ? 'bg-amber-500' : 'bg-red-500'}`} /> 规范性: = 80 ? 'text-green-700' : task.editorialScore >= 60 ? 'text-amber-700' : 'text-red-700'}`}> {task.editorialScore}分
)} {task.methodologyStatus && (
方法学: {task.methodologyStatus}
)}
); } return null; }; // 渲染操作按钮 const renderActions = (task: ReviewTask) => { // 待审稿:[开始审稿] [删除] if (task.status === 'pending') { return (
); } // 处理中:[查看进度] if (['extracting', 'reviewing', 'reviewing_editorial', 'reviewing_methodology'].includes(task.status)) { return ( ); } // 已完成:[查看报告] [重新审稿] [删除] if (task.status === 'completed') { return (
); } // 失败:[重新审稿] [删除] if (task.status === 'failed') { return (
); } return null; }; if (tasks.length === 0) { return (

暂无稿件,请上传新稿件开始审查

); } return (
{tasks.map(task => ( ))}
文件名称 / 信息 上传时间 审稿维度 结果摘要 操作
toggleSelect(task.id)} className="rounded border-gray-300 text-indigo-600 focus:ring-indigo-500 cursor-pointer" />
{getFileIcon(task.fileName)}
task.status === 'completed' && onViewReport(task)} > {task.fileName}
{formatFileSize(task.fileSize)} {task.wordCount && ( <> {task.wordCount.toLocaleString()} 字 )}
{formatTime(task.createdAt)} {renderAgentTags(task)} {renderResultSummary(task)} {renderActions(task)}
); }