import React, { useEffect, useRef, useState } from 'react'; import { Plus, Search, Eye, Play, Pause, Clock, User, ChevronRight, Filter, FileText, AlertTriangle, CheckCircle, XCircle, MoreHorizontal, Edit, Download, Bot, Users, Workflow, X, ArrowRight, Target, Layers, } from 'lucide-react'; import { useTheme } from '@/contexts/ThemeContext'; import { PageType } from '@/components/Sidebar'; // 导入请求服务,用于与后端 API 交互 import { requestCrudService } from '@/service/request-axios-service'; import { KanbanColumn } from './KanbanColumn'; import { TaskListItem } from '@/pages/TaskManagement'; import { DateRangePicker, DateRangePickerProps, DateRangeValue, Loading } from 'tdesign-react'; import dayjs from 'dayjs'; import { useChatContext } from '@/contexts/ChatContext'; import { useNavigate } from 'react-router-dom'; interface TaskListPageProps { title: string; category: string; subCategory: string; onNavigate: (page: PageType) => void; } interface stateItem { startTime: string, endTime: string, task: TaskListItem, } type TaskType = 'single' | 'consultation' | 'scene' | 'multi-agent' | 'task-search'; type TaskStatus = 'draft' | 'pending' | 'running' | 'paused' | 'blocked' | 'completed'; type ColumnType = 'unanalyzed' | 'analyzing' | 'completed'; const service = requestCrudService; const zncmUrl = import.meta.env.VITE_API_BASE_URL || ''; const SentimentAnalyzes: React.FC = ({ title, category, subCategory, onNavigate }) => { const { theme } = useTheme(); const isDark = theme === 'dark'; const router = useNavigate(); // 主题颜色变量 const cardBg = isDark ? 'bg-slate-800/30' : 'bg-white'; const cardBorder = isDark ? 'border-blue-800/30' : 'border-red-100'; const textPrimary = isDark ? 'text-white' : 'text-gray-900'; const textSecondary = isDark ? 'text-slate-400' : 'text-gray-600'; const textMuted = isDark ? 'text-slate-500' : 'text-gray-400'; const inputBg = isDark ? 'bg-slate-900/50' : 'bg-white'; const { setStartConfig } = useChatContext(); const [searchQuery, setSearchQuery] = useState(''); const [modeFilter, setModeFilter] = useState('all'); const [showAnalysisModal, setShowAnalysisModal] = useState(false); const [selectedTaskForAnalysis, setSelectedTaskForAnalysis] = useState(null); const [unanalyzedTotal, setUnanalyzedTotal] = useState(0); // 未分析 const [runningTotal, setRunningTotal] = useState(0); // 分析中 const [completedTotal, setCompletedTotal] = useState(0); // 已完成 const [unanalyzedList, setUnanalyzedList] = useState([]); // 未分析 const [runningList, setRunningList] = useState([]); // 分析中 const [completedList, setCompletedList] = useState([]); // 已完成 const [unanalyzedLoading, setUnanalyzedLoading] = useState(false); // 未分析 const [runningLoading, setRunningLoading] = useState(false); // 分析中 const [completedLoading, setCompletedLoading] = useState(false); // 已完成 const [presets] = useState({ 最近7天: [dayjs().subtract(6, 'day').toDate(), dayjs().toDate()], 最近3天: [dayjs().subtract(2, 'day').toDate(), dayjs().toDate()], 今天: [dayjs().toDate(), dayjs().toDate()], }); const [range, setRange] = useState([]); const state = useRef({ startTime: '', endTime: '', task: {} as TaskListItem, }) // 时间日期选择器查询 const setRangeChange = async (val) => { setRange(val); console.log('时间日期', val); state.current.startTime = ''; state.current.endTime = ''; if (val.length > 0) { state.current.startTime = val[0]; state.current.endTime = val[1]; } await taskDataChange(); } // 处理开始分析按钮点击 const handleStartAnalysis = (task: TaskListItem) => { setSelectedTaskForAnalysis(task); state.current.task = task; setShowAnalysisModal(true); }; // 处理分析模式选择 const handleSelectAnalysisMode = (mode: TaskType) => { setShowAnalysisModal(false); console.log('mode', mode); if (mode === 'single') { onNavigate('task-single'); } else if (mode === 'scene') { onNavigate('task-scene'); } else if (mode === 'consultation') { console.log('state.current.task', state.current.task) const sceneItem = JSON.parse(state.current.task.scene); if (sceneItem.taskJson) { sceneItem.taskJson = JSON.parse(sceneItem.taskJson); setStartConfig({ ...sceneItem.taskJson, llm_preset_id: 'BAILING', consistency_mode: 'soft', phase_config: { diverge_rounds: 3 }, task_context: state.current.task.overview }); router('/qa-center/mope-chat') } console.log('sceneItem', sceneItem); // onNavigate('task-consult-create'); // window.open(`http://ch1.b.uat.4.cn/mopeweb/#/mope?taskOverview=${state.current.task.overview}`) } else if (mode === 'multi-agent') { onNavigate('multi-agent-qa'); } else if (mode === 'task-search') { window.open(`https://ch1.b.uat.4.cn/web/#/task/item-aicoh/step-info-search?id=${state.current.task.id}`) } }; // 处理卡片点击 const taskListSearch = async (taskType: string, pageNum: number = 1, pageSize: number = 10) => { let taskStatus: number[] = [] if (taskType === 'unanalyzed') { // 未分析 taskStatus = [0, 10]; setUnanalyzedLoading(true); } else if (taskType === 'running') { // 分析中 taskStatus = [20]; setRunningLoading(true); } else if (taskType === 'completed') { // 已完成 taskStatus = [25, 30, 40, 60, 70, 80, 90, 100, 110]; setCompletedLoading(true); } const param = { content: searchQuery, pageNum: pageNum, pageSize: pageSize, taskStatus: taskStatus, startTime: state.current.startTime, endTime: state.current.endTime, taskDirection: '' } const res = await service.post(`${zncmUrl}/three/cop-three-tasks`, param); console.log('任务列表', res); const result = res.data; result.records.forEach((item: TaskListItem) => { item.column = taskType; if (!item.taskLevel) item.taskLevel = 1; }) if (taskType === 'unanalyzed') { setUnanalyzedLoading(false); setUnanalyzedTotal(result.total); setUnanalyzedList(result.records); } else if (taskType === 'running') { setRunningLoading(false); setRunningTotal(result.total); setRunningList(result.records); } else if (taskType === 'completed') { setCompletedLoading(false); setCompletedTotal(result.total); setCompletedList(result.records); } } /** * 页码变化时的回调函数 * 当用户切换页码时触发,更新页码并重新获取数据 * @param value - 新的页码值 */ const pageIndexChange = async (type: string, pageIndex: number) => { // 更新 ref 中存储的页码值 // 更新页码状态,触发组件重新渲染 await taskListSearch(type, pageIndex); } const taskDataChange = async (pageNum: number = 1, pageSize: number = 10) => { taskListSearch('unanalyzed', pageNum, pageSize); taskListSearch('running', pageNum, pageSize); taskListSearch('completed', pageNum, pageSize); } // 回车处理 const handleKeyDown = async (e) => { if ((e.metaKey || e.ctrlKey || e.shiftKey) && e.key === "Enter") { e.preventDefault(); } else if (e.keyCode === 13) { e.preventDefault(); await taskDataChange(); } else if (e.key === "/") { e.preventDefault(); } }; useEffect(() => { taskDataChange(); }, []); // 渲染看板列 return (
{/* 顶部工具栏 */}
{category} / {subCategory}

任务中心

{/* 搜索和筛选 */}
setSearchQuery(e.target.value)} onKeyDown={(e) => handleKeyDown(e)} className={`w-full pl-10 pr-4 py-2 border rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-red-500/20 transition-colors ${inputBg} ${cardBorder} ${textPrimary} placeholder:${textMuted}`} />
{/* */} {/* */} setRangeChange(val)} enableTimePicker={true} clearable />
{/* 统计概览栏 */}
{/* 看板区 */}
{/* 选择分析模式弹窗 */} {showAnalysisModal && selectedTaskForAnalysis && (
setShowAnalysisModal(false)}>
e.stopPropagation()} >

选择分析模式

为任务「{selectedTaskForAnalysis.taskName}」选择分析方式

{/* 多智能体会商 */}
)}
); }; export default SentimentAnalyzes;