import { Select, Input, Form, Radio, Modal, Button, UploadFile, Switch, Tooltip } from "antd"; import { InboxOutlined, QuestionCircleOutlined } from "@ant-design/icons"; import { dataSourceOptions } from "../../dataset.const"; import { Dataset, DataSource } from "../../dataset.model"; import { useEffect, useState } from "react"; import { queryTasksUsingGet } from "@/pages/DataCollection/collection.apis"; import { updateDatasetByIdUsingPut } from "../../dataset.api"; import { sliceFile } from "@/utils/file.util"; import Dragger from "antd/es/upload/Dragger"; /** * 按行分割文件 * @param file 原始文件 * @returns 分割后的文件列表,每行一个文件 */ async function splitFileByLines(file: UploadFile): Promise { const originFile = (file as any).originFileObj || file; if (!originFile || typeof originFile.text !== "function") { return [file]; } const text = await originFile.text(); if (!text) return [file]; // 按行分割并过滤空行 const lines = text.split(/\r?\n/).filter((line: string) => line.trim() !== ""); if (lines.length === 0) return []; // 生成文件名:原文件名_序号.扩展名 const nameParts = file.name.split("."); const ext = nameParts.length > 1 ? "." + nameParts.pop() : ""; const baseName = nameParts.join("."); const padLength = String(lines.length).length; return lines.map((line: string, index: number) => { const newFileName = `${baseName}_${String(index + 1).padStart(padLength, "0")}${ext}`; const blob = new Blob([line], { type: "text/plain" }); const newFile = new File([blob], newFileName, { type: "text/plain" }); return { uid: `${file.uid}-${index}`, name: newFileName, size: newFile.size, type: "text/plain", originFileObj: newFile as any, } as UploadFile; }); } export default function ImportConfiguration({ data, open, onClose, updateEvent = "update:dataset", prefix, }: { data: Dataset | null; open: boolean; onClose: () => void; updateEvent?: string; prefix?: string; }) { const [form] = Form.useForm(); const [collectionOptions, setCollectionOptions] = useState([]); const [importConfig, setImportConfig] = useState({ source: DataSource.UPLOAD, }); const [currentPrefix, setCurrentPrefix] = useState(""); const [fileList, setFileList] = useState([]); // 本地上传文件相关逻辑 const resetFiles = () => { setFileList([]); }; const handleUpload = async (dataset: Dataset) => { let filesToUpload = fileList; // 如果启用分行分割,处理文件 if (importConfig.splitByLine) { const splitResults = await Promise.all( fileList.map((file) => splitFileByLines(file)) ); filesToUpload = splitResults.flat(); } // 计算分片列表 const sliceList = filesToUpload.map((file) => { const originFile = (file as any).originFileObj || file; const slices = sliceFile(originFile); return { originFile: file, slices, name: file.name, size: (file as any).size || originFile.size || 0, }; }); console.log("[ImportConfiguration] Uploading with currentPrefix:", currentPrefix); window.dispatchEvent( new CustomEvent("upload:dataset", { detail: { dataset, files: sliceList, updateEvent, hasArchive: importConfig.hasArchive, prefix: currentPrefix, }, }) ); resetFiles(); }; const handleBeforeUpload = (_, files: UploadFile[]) => { setFileList([...fileList, ...files]); return false; }; const handleRemoveFile = (file: UploadFile) => { setFileList((prev) => prev.filter((f) => f.uid !== file.uid)); }; const fetchCollectionTasks = async () => { if (importConfig.source !== DataSource.COLLECTION) return; try { const res = await queryTasksUsingGet({ page: 0, size: 100 }); const options = res.data.content.map((task: any) => ({ label: task.name, value: task.id, })); setCollectionOptions(options); } catch (error) { console.error("Error fetching collection tasks:", error); } }; const resetState = () => { console.log('[ImportConfiguration] resetState called, preserving currentPrefix:', currentPrefix); form.resetFields(); setFileList([]); form.setFieldsValue({ files: null }); setImportConfig({ source: importConfig.source ? importConfig.source : DataSource.UPLOAD }); console.log('[ImportConfiguration] resetState done, currentPrefix still:', currentPrefix); }; const handleImportData = async () => { if (!data) return; console.log('[ImportConfiguration] handleImportData called, currentPrefix:', currentPrefix); if (importConfig.source === DataSource.UPLOAD) { await handleUpload(data); } else if (importConfig.source === DataSource.COLLECTION) { await updateDatasetByIdUsingPut(data.id, { ...importConfig, }); } onClose(); }; useEffect(() => { if (open) { setCurrentPrefix(prefix || ""); console.log('[ImportConfiguration] Modal opened with prefix:', prefix); resetState(); fetchCollectionTasks(); } }, [open]); // Separate effect for fetching collection tasks when source changes useEffect(() => { if (open && importConfig.source === DataSource.COLLECTION) { fetchCollectionTasks(); } }, [importConfig.source]); return ( { onClose(); resetState(); }} maskClosable={false} footer={ <> } >
setImportConfig(allValues)} > {importConfig?.source === DataSource.COLLECTION && ( )} {/* Local Upload Component */} {importConfig?.source === DataSource.UPLOAD && ( <> 按分行分割{" "} } name="splitByLine" valuePropName="checked" initialValue={false} >

本地文件上传

拖拽文件到此处或点击选择文件

)} {/* Target Configuration */} {importConfig?.target && importConfig?.target !== DataSource.UPLOAD && (
{importConfig?.target === DataSource.DATABASE && (
)}
)}
); }