import { useState, useEffect, ElementType } from "react"; import { Card, Button, Badge, Table, Modal, message, Tooltip } from "antd"; import { Plus, ArrowUp, ArrowDown, Pause, Play, CheckCircle, Sparkles, } from "lucide-react"; import { DeleteOutlined, EyeOutlined } from "@ant-design/icons"; import { Link, useNavigate } from "react-router"; import { SearchControls } from "@/components/SearchControls"; import { formatDateTime } from "@/utils/unit"; import { querySynthesisTasksUsingGet, deleteSynthesisTaskByIdUsingDelete, archiveSynthesisTaskToDatasetUsingPost, } from "@/pages/SynthesisTask/synthesis-api"; import { createDatasetUsingPost } from "@/pages/DataManagement/dataset.api"; interface SynthesisTask { id: string; name: string; description?: string; status: string; synthesis_type: string; model_id: string; progress?: number; result_data_location?: string; text_split_config?: { chunk_size: number; chunk_overlap: number; }; synthesis_config?: { temperature?: number | null; prompt_template?: string; synthesis_count?: number | null; }; source_file_id?: string[]; total_files?: number; processed_files?: number; total_chunks?: number; processed_chunks?: number; total_synthesis_data?: number; created_at: string; updated_at?: string; created_by?: string; updated_by?: string; } export default function SynthesisTaskTab() { const navigate = useNavigate(); const [searchQuery, setSearchQuery] = useState(""); const [tasks, setTasks] = useState([]); const [filterStatus, setFilterStatus] = useState("all"); const [sortBy, setSortBy] = useState<"createdAt" | "name">("createdAt"); const [sortOrder, setSortOrder] = useState<"asc" | "desc">("desc"); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); // 获取任务列表 const loadTasks = async () => { setLoading(true); try { const params = { page: page, page_size: pageSize, } as { page?: number; page_size?: number; synthesis_type?: string; status?: string; name?: string; }; if (searchQuery) params.name = searchQuery; if (filterStatus !== "all") params.synthesis_type = filterStatus; const res = await querySynthesisTasksUsingGet(params); setTasks(res?.data?.content || []); setTotal(res?.data?.totalElements || 0); } catch { setTasks([]); setTotal(0); } finally { setLoading(false); } }; useEffect(() => { loadTasks(); // eslint-disable-next-line }, [searchQuery, filterStatus, page, pageSize]); // 状态徽章 const getStatusBadge = (status: string) => { const statusConfig: Record = { pending: { label: "等待中", color: "#F59E0B", icon: Pause }, running: { label: "运行中", color: "#3B82F6", icon: Play }, completed: { label: "已完成", color: "#10B981", icon: CheckCircle }, failed: { label: "失败", color: "#EF4444", icon: Pause }, paused: { label: "已暂停", color: "#E5E7EB", icon: Pause }, }; return statusConfig[status] ?? statusConfig["pending"]; }; // 类型映射 const typeMap: Record = { QA: "问答对生成", COT: "链式推理生成", }; // 表格列 const taskColumns = [ { title: ( ), dataIndex: "name", key: "name", fixed: "left" as const, render: (_: unknown, task: SynthesisTask) => (
{task.synthesis_type?.toUpperCase()?.slice(0, 1) || "T"}
{task.name}
), }, { title: "类型", dataIndex: "synthesis_type", key: "synthesis_type", render: (type: string) => typeMap[type] || type, }, { title: "文件数", dataIndex: "total_files", key: "total_files", render: (num: number, task: SynthesisTask) => {num ?? (task.source_file_id?.length ?? 0)}, }, { title: "创建时间", dataIndex: "created_at", key: "created_at", render: (val: string) => formatDateTime(val), }, { title: "操作", key: "actions", fixed: "right" as const, render: (_: unknown, task: SynthesisTask) => (
), }, ]; const handleArchiveTask = async (task: SynthesisTask) => { try { // 1. 创建目标数据集(使用简单的默认命名 + 随机后缀,可后续扩展为弹窗自定义) const randomSuffix = Math.random().toString(36).slice(2, 8); const datasetReq = { name: `${task.name}-合成数据留用${randomSuffix}`, description: `由合成任务 ${task.id} 留用生成`, datasetType: "TEXT", category: "SYNTHESIS", format: "JSONL", status: "DRAFT", } as any; const datasetRes = await createDatasetUsingPost(datasetReq); const datasetId = datasetRes?.data?.id; if (!datasetId) { message.error("创建数据集失败"); return; } // 2. 调用后端归档接口,将合成数据写入该数据集 await archiveSynthesisTaskToDatasetUsingPost(task.id, datasetId); message.success("归档成功"); // 3. 可选:跳转到数据集详情页 navigate(`/data/management/detail/${datasetId}`); } catch (e) { console.error(e); message.error("归档失败"); } }; return (
{/* 搜索和筛选 */} { setFilterStatus(filters.status?.[0] || "all"); }} showFilters showViewToggle={false} /> {/* 任务表格 */} { setPage(p); setPageSize(ps); }, showSizeChanger: true, }} scroll={{ x: "max-content" }} locale={{ emptyText: (

暂无合成任务

{searchQuery ? "没有找到匹配的任务" : "开始创建您的第一个合成任务"}

{!searchQuery && filterStatus === "all" && ( )}
), }} /> ); }