'use client'; import { Box, Typography, Checkbox, Button, Select, MenuItem, Tooltip, Menu, IconButton, Badge } from '@mui/material'; import QuizIcon from '@mui/icons-material/Quiz'; import DownloadIcon from '@mui/icons-material/Download'; import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; import CleaningServicesIcon from '@mui/icons-material/CleaningServices'; import AssessmentIcon from '@mui/icons-material/Assessment'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import FilterListIcon from '@mui/icons-material/FilterList'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import axios from 'axios'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; import { useState } from 'react'; import ChunkFilterDialog from './ChunkFilterDialog'; export default function ChunkListHeader({ projectId, totalChunks, selectedChunks, onSelectAll, onBatchGenerateQuestions, onBatchEditChunks, onBatchDeleteChunks, questionFilter, setQuestionFilter, chunks = [], // 添加chunks参数,用于导出文本块 selectedModel = {}, onFilterChange = null, activeFilterCount = 0 }) { const { t, i18n } = useTranslation(); // 添加更多菜单的状态和锚点 const [moreMenuAnchorEl, setMoreMenuAnchorEl] = useState(null); const isMoreMenuOpen = Boolean(moreMenuAnchorEl); // 添加筛选对话框状态 const [filterDialogOpen, setFilterDialogOpen] = useState(false); // 自动任务菜单状态 const [autoTasksMenuAnchorEl, setAutoTasksMenuAnchorEl] = useState(null); const isAutoTasksMenuOpen = Boolean(autoTasksMenuAnchorEl); const handleAutoTasksClick = event => { setAutoTasksMenuAnchorEl(event.currentTarget); }; const handleAutoTasksClose = () => { setAutoTasksMenuAnchorEl(null); }; // 打开更多菜单 const handleMoreMenuClick = event => { setMoreMenuAnchorEl(event.currentTarget); }; // 关闭更多菜单 const handleMoreMenuClose = () => { setMoreMenuAnchorEl(null); }; // 处理批量编辑,关闭菜单并调用原有函数 const handleBatchEdit = () => { handleMoreMenuClose(); onBatchEditChunks(); }; // 处理批量删除,关闭菜单并调用原有函数 const handleBatchDelete = () => { handleMoreMenuClose(); onBatchDeleteChunks(); }; // 处理导出文本块,关闭菜单并调用原有函数 const handleExport = () => { handleMoreMenuClose(); handleExportChunks(); }; // 创建自动提取问题任务 const handleCreateAutoQuestionTask = async () => { if (!projectId || !selectedModel?.id) { toast.error(t('textSplit.selectModelFirst', { defaultValue: '请先选择模型' })); return; } try { // 调用创建任务接口 const response = await axios.post(`/api/projects/${projectId}/tasks`, { taskType: 'question-generation', modelInfo: selectedModel, language: i18n.language, detail: '批量生成问题任务' }); if (response.data?.code === 0) { toast.success(t('tasks.createSuccess', { defaultValue: '后台任务已创建,系统将自动处理未生成问题的文本块' })); } else { toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + response.data?.message); } } catch (error) { console.error('创建自动提取问题任务失败:', error); toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + error.message); } }; // 创建自动数据清洗任务 const handleCreateAutoDataCleaningTask = async () => { if (!projectId || !selectedModel?.id) { toast.error(t('textSplit.selectModelFirst', { defaultValue: '请先选择模型' })); return; } try { // 调用创建任务接口 const response = await axios.post(`/api/projects/${projectId}/tasks`, { taskType: 'data-cleaning', modelInfo: selectedModel, language: i18n.language, detail: '批量数据清洗任务' }); if (response.data?.code === 0) { toast.success( t('tasks.createSuccess', { defaultValue: '后台任务已创建,系统将自动处理所有文本块进行数据清洗' }) ); } else { toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + response.data?.message); } } catch (error) { console.error('创建自动数据清洗任务失败:', error); toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + error.message); } }; // 创建自动生成评估数据集任务 const handleCreateAutoEvalGenerationTask = async () => { if (!projectId || !selectedModel?.id) { toast.error(t('textSplit.selectModelFirst', { defaultValue: '请先选择模型' })); return; } try { // 调用创建任务接口 const response = await axios.post(`/api/projects/${projectId}/tasks`, { taskType: 'eval-generation', modelInfo: selectedModel, language: i18n.language, detail: '批量生成评估数据集任务' }); if (response.data?.code === 0) { toast.success( t('tasks.createSuccess', { defaultValue: '后台任务已创建,系统将自动为所有未生成评估题目的文本块生成评估数据集' }) ); } else { toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + response.data?.message); } } catch (error) { console.error('创建自动生成评估数据集任务失败:', error); toast.error(t('tasks.createFailed', { defaultValue: '创建任务失败' }) + ': ' + error.message); } }; // 导出文本块为JSON文件的函数 const handleExportChunks = () => { if (!chunks || chunks.length === 0) return; // 创建要导出的数据对象 const exportData = chunks.map(chunk => ({ name: chunk.name, projectId: chunk.projectId, fileName: chunk.fileName, content: chunk.content, summary: chunk.summary, size: chunk.size })); // 将数据转换为JSON字符串 const jsonString = JSON.stringify(exportData, null, 2); // 创建Blob对象 const blob = new Blob([jsonString], { type: 'application/json' }); // 创建下载链接 const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `text-chunks-export-${new Date().toISOString().split('T')[0]}.json`; // 触发下载 document.body.appendChild(a); a.click(); // 清理 document.body.removeChild(a); URL.revokeObjectURL(url); }; return ( 0 && selectedChunks.length < totalChunks} onChange={onSelectAll} /> {t('textSplit.selectedCount', { count: selectedChunks.length })} {/* 更多筛选按钮 */} {/* 自动任务下拉菜单 */} { handleCreateAutoQuestionTask(); handleAutoTasksClose(); }} > {t('textSplit.autoGenerateQuestions')} { handleCreateAutoEvalGenerationTask(); handleAutoTasksClose(); }} > {t('textSplit.autoEvalGeneration', { defaultValue: '自动生成评估集' })} { handleCreateAutoDataCleaningTask(); handleAutoTasksClose(); }} > {t('textSplit.autoDataCleaning', { defaultValue: '自动数据清洗' })} {/* 更多菜单按钮 */} {/* 更多操作下拉菜单 */} {t('batchEdit.batchEdit', { defaultValue: '批量编辑' })} {t('textSplit.batchDeleteChunks', { defaultValue: '批量删除' })} {t('textSplit.exportChunks', { defaultValue: '导出文本块' })} {/* 筛选对话框 */} setFilterDialogOpen(false)} onApply={onFilterChange} /> ); }