import React, { useState } from 'react'; import { Plus, Search, Eye, Play, Pause, Trash2, Target, Clock, User, ChevronRight, Filter, Bot, Workflow, Users, MoreHorizontal, Edit, Copy, FileText } from 'lucide-react'; import { useTheme } from '@/contexts/ThemeContext'; import { PageType } from '@/components/Sidebar'; interface TaskListProps { onViewWorkspace: (id: string) => void; onNavigate: (page: PageType) => void; } interface Task { id: string; name: string; type: 'single' | 'scene' | 'consultation'; agent?: string; scene?: string; participants?: string[]; status: 'draft' | 'pending' | 'running' | 'paused' | 'blocked' | 'completed'; currentPhase: string; summary?: string; creator: string; createTime: string; updateTime: string; column: 'unanalyzed' | 'analyzing' | 'completed'; } const TaskList: React.FC = ({ onViewWorkspace, onNavigate }) => { const { theme } = useTheme(); const isDark = theme === 'dark'; const [tasks] = useState([ // 未分析列 { id: '8', name: '端午节品牌传播方案', type: 'scene', scene: '宣传策略生成', status: 'draft', currentPhase: '待配置', summary: '针对端午节品牌活动制定完整传播策略方案', creator: '李策划', createTime: '2026-03-19 16:00', updateTime: '2026-03-19 16:00', column: 'unanalyzed', }, { id: '9', name: '新品上市用户调研', type: 'single', agent: 'AudienceAgent', status: 'pending', currentPhase: '待启动', summary: '对新品目标用户进行画像分析', creator: '王运营', createTime: '2026-03-19 14:30', updateTime: '2026-03-19 15:00', column: 'unanalyzed', }, // 分析中列 { id: '1', name: '五四青年节宣传活动策略', type: 'scene', scene: '宣传策略生成', status: 'running', currentPhase: '行为分析', summary: '正在按场景模板执行目标、受众、行为、叙事等分析...', creator: '张策略', createTime: '2026-03-19 10:30', updateTime: '2026-03-19 15:45', column: 'analyzing', }, { id: '7', name: '品牌升级叙事方向研讨', type: 'consultation', participants: ['GoalAgent', 'NarrativeAgent', 'RiskAgent'], status: 'running', currentPhase: '第2轮讨论中', summary: '围绕宣传方向、叙事方式和受众切入点开展多视角会商...', creator: '王策划', createTime: '2026-03-19 15:00', updateTime: '2026-03-19 16:30', column: 'analyzing', }, { id: '3', name: '年度品牌升级方案推演', type: 'scene', scene: '宣传方案推演', status: 'paused', currentPhase: '叙事分析', summary: '任务已暂停,等待人工介入确认叙事方向', creator: '王策划', createTime: '2026-03-17 14:00', updateTime: '2026-03-19 11:30', column: 'analyzing', }, // 已完成列 { id: '2', name: '新产品发布会舆情应对预案', type: 'scene', scene: '舆情应对策略', status: 'completed', currentPhase: '已完成', summary: '已完成舆情应对策略方案生成', creator: '李分析师', createTime: '2026-03-18 09:00', updateTime: '2026-03-18 16:20', column: 'completed', }, { id: '4', name: '五四青年节受众快速分析', type: 'single', agent: 'AudienceAgent', status: 'completed', currentPhase: '已完成', summary: '已完成目标受众识别、关切提炼和阻力分析', creator: '赵运营', createTime: '2026-03-19 09:00', updateTime: '2026-03-19 09:15', column: 'completed', }, { id: '6', name: '五四青年节宣传策略会商', type: 'consultation', participants: ['GoalAgent', 'AudienceAgent', 'NarrativeAgent', 'RiskAgent'], status: 'completed', currentPhase: '已完成', summary: '已完成多智能体会商,形成结论与分歧报告', creator: '赵运营', createTime: '2026-03-19 14:30', updateTime: '2026-03-19 16:00', column: 'completed', }, ]); const [activeTab, setActiveTab] = useState<'all' | 'unanalyzed' | 'analyzing' | 'completed'>('all'); const [searchQuery, setSearchQuery] = useState(''); const [modeFilter, setModeFilter] = useState<'all' | 'single' | 'scene' | 'consultation'>('all'); const getTypeConfig = (type: string) => { if (isDark) { switch (type) { case 'single': return { label: '单智能体', color: 'bg-cyan-500/20 text-cyan-400', icon: Bot }; case 'scene': return { label: '场景执行', color: 'bg-purple-500/20 text-purple-400', icon: Workflow }; case 'consultation': return { label: '多智能体会商', color: 'bg-orange-500/20 text-orange-400', icon: Users }; default: return { label: '未知', color: 'bg-slate-500/20 text-slate-400', icon: Bot }; } } else { switch (type) { case 'single': return { label: '单智能体', color: 'bg-red-100 text-red-600', icon: Bot }; case 'scene': return { label: '场景执行', color: 'bg-red-100 text-red-600', icon: Workflow }; case 'consultation': return { label: '多智能体会商', color: 'bg-red-100 text-red-600', icon: Users }; default: return { label: '未知', color: 'bg-gray-100 text-gray-600', icon: Bot }; } } }; const getStatusConfig = (status: string) => { if (isDark) { switch (status) { case 'draft': return { label: '草稿', color: 'bg-slate-500/20 text-slate-400' }; case 'pending': return { label: '待启动', color: 'bg-slate-500/20 text-slate-400' }; case 'running': return { label: '运行中', color: 'bg-blue-500/20 text-blue-400' }; case 'paused': return { label: '已暂停', color: 'bg-yellow-500/20 text-yellow-400' }; case 'blocked': return { label: '阻塞中', color: 'bg-red-500/20 text-red-400' }; case 'completed': return { label: '已完成', color: 'bg-green-500/20 text-green-400' }; default: return { label: '未知', color: 'bg-slate-500/20 text-slate-400' }; } } else { switch (status) { case 'draft': return { label: '草稿', color: 'bg-gray-100 text-gray-600' }; case 'pending': return { label: '待启动', color: 'bg-gray-100 text-gray-600' }; case 'running': return { label: '运行中', color: 'bg-red-100 text-red-600' }; case 'paused': return { label: '已暂停', color: 'bg-yellow-100 text-yellow-600' }; case 'blocked': return { label: '阻塞中', color: 'bg-red-100 text-red-600' }; case 'completed': return { label: '已完成', color: 'bg-green-100 text-green-600' }; default: return { label: '未知', color: 'bg-gray-100 text-gray-600' }; } } }; const filteredTasks = tasks.filter(task => { const matchesTab = activeTab === 'all' || task.column === activeTab; const matchesSearch = task.name.toLowerCase().includes(searchQuery.toLowerCase()) || task.id.toLowerCase().includes(searchQuery.toLowerCase()); const matchesMode = modeFilter === 'all' || task.type === modeFilter; return matchesTab && matchesSearch && matchesMode; }); const unanalyzedTasks = filteredTasks.filter(t => t.column === 'unanalyzed'); const analyzingTasks = filteredTasks.filter(t => t.column === 'analyzing'); const completedTasks = filteredTasks.filter(t => t.column === 'completed'); const totalCount = tasks.length; const unanalyzedCount = tasks.filter(t => t.column === 'unanalyzed').length; const analyzingCount = tasks.filter(t => t.column === 'analyzing').length; const completedCount = tasks.filter(t => t.column === 'completed').length; const handleTaskClick = (task: Task) => { if (task.column === 'completed') { if (task.type === 'consultation') { onNavigate('task-consult-result'); } else { onNavigate('strategy-result'); } } else if (task.column === 'analyzing') { if (task.type === 'scene') { onNavigate('task-scene'); } else if (task.type === 'consultation') { onNavigate('task-consult'); } else { onNavigate('task-single'); } } else { // 未分析 - 进入创建/配置 onNavigate('task-create'); } }; const TaskCard = ({ task }: { task: Task }) => { const typeConfig = getTypeConfig(task.type); const statusConfig = getStatusConfig(task.status); const TypeIcon = typeConfig.icon; return (
handleTaskClick(task)} > {/* 卡片头部:模式标签 + 状态标签 */}
{typeConfig.label} {statusConfig.label}
{/* 任务名称 */}

{task.name}

{/* 任务编号 */}

TASK-{task.id.padStart(4, '0')}

{/* 任务摘要 */}

{task.summary}

{/* 补充信息 */}
{task.type === 'single' && (
执行智能体: {task.agent}
)} {task.type === 'scene' && (
关联场景: {task.scene}
)} {task.type === 'consultation' && ( <>
参与智能体: {task.participants?.length || 0}个
当前轮次: {task.currentPhase}
)} {task.column !== 'unanalyzed' && task.column !== 'completed' && (
当前阶段: {task.currentPhase}
)}
{/* 时间信息 */}
{task.creator}
{task.column === 'completed' ? `完成于 ${task.updateTime}` : `更新于 ${task.updateTime}`}
{/* 操作按钮区 */}
{task.column === 'unanalyzed' && ( <> )} {(task.column === 'analyzing') && ( <> )} {task.column === 'completed' && ( <> )}
); }; const ColumnHeader = ({ title, count, color }: { title: string; count: number; color: string }) => (

{title}

{count}
); return (
{/* 顶部工具栏 */}

任务中心

{/* 搜索和筛选 */}
setSearchQuery(e.target.value)} 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 theme-transition ${ isDark ? 'bg-slate-900/50 border-blue-800/30 text-white placeholder-slate-500' : 'bg-white border-red-200 text-gray-900 placeholder-red-300' }`} />
{/* 统计概览栏 */}
{/* 看板区 */}
{/* 未分析列 */}
{unanalyzedTasks.length === 0 ? (

暂无待分析任务

) : ( unanalyzedTasks.map(task => ) )}
{/* 分析中列 */}
{analyzingTasks.length === 0 ? (

暂无分析中任务

) : ( analyzingTasks.map(task => ) )}
{/* 已完成列 */}
{completedTasks.length === 0 ? (

暂无已完成任务

) : ( completedTasks.map(task => ) )}
); }; export default TaskList;