import React, { useState, useEffect } from 'react'; import { Users, FileText, Award, TrendingUp, Calendar, Filter, Download, ChevronDown } from 'lucide-react'; import { useLanguage } from '../../contexts/LanguageContext'; import { useAuth } from '../../src/contexts/AuthContext'; import { assessmentStatsService, AssessmentStats, StatsQueryParams } from '../../src/services/assessmentStatsService'; import { templateService } from '../../services/templateService'; import { knowledgeGroupService } from '../../services/knowledgeGroupService'; import { AssessmentTemplate } from '../../types'; import { KnowledgeGroup } from '../../types'; import { cn } from '../../src/utils/cn'; interface StatCardProps { title: string; value: string | number; subtitle?: string; icon: React.ElementType; color: string; } const StatCard: React.FC = ({ title, value, subtitle, icon: Icon, color }) => (

{title}

{value}

{subtitle &&

{subtitle}

}
); export const AssessmentStatsView: React.FC = () => { const { language, t } = useLanguage(); const { user } = useAuth(); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState({}); const [templates, setTemplates] = useState([]); const [groups, setGroups] = useState([]); const [showFilters, setShowFilters] = useState(false); const isAdmin = user?.role === 'SUPER_ADMIN'; useEffect(() => { const fetchData = async () => { try { const [templatesData, groupsData] = await Promise.all([ templateService.getAll(), knowledgeGroupService.getGroups(), ]); setTemplates(templatesData); setGroups(groupsData); } catch (err) { console.error('Failed to fetch options:', err); } }; fetchData(); }, []); useEffect(() => { const fetchStats = async () => { setLoading(true); try { const data = await assessmentStatsService.getStats(filters); setStats(data); } catch (err) { console.error('Failed to fetch stats:', err); } finally { setLoading(false); } }; fetchStats(); }, [filters]); const handleFilterChange = (key: keyof StatsQueryParams, value: string) => { setFilters(prev => ({ ...prev, [key]: value || undefined })); }; const handleExport = () => { if (!stats?.recentRecords) return; const csv = [ ['ID', 'Knowledge Base/Group', 'Template', 'Score', 'Status', 'Created At'].join(','), ...stats.recentRecords.map(r => [ r.id, r.knowledgeBase, r.template, r.score ?? '', r.status, r.createdAt, ].join(',')), ].join('\n'); const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `assessment-stats-${new Date().toISOString().split('T')[0]}.csv`; a.click(); URL.revokeObjectURL(url); }; const formatDate = (dateStr: string) => { const date = new Date(dateStr); return date.toLocaleDateString(language === 'zh' ? 'zh-CN' : language === 'ja' ? 'ja-JP' : 'en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const isZh = language === 'zh'; if (!isAdmin) { return (

{isZh ? '仅管理员可查看统计' : 'Statistics only available for admins'}

); } return (

{isZh ? '评估统计' : 'Assessment Statistics'}

{isZh ? '查看所有用户评估数据' : 'View assessment data for all users'}

{stats && ( )}
{showFilters && (
handleFilterChange('startDate', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-200 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
handleFilterChange('endDate', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-200 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
)}

{isZh ? '历史记录' : 'Recent Records'}

{loading ? (
) : stats?.recentRecords?.length === 0 ? (
{isZh ? '暂无记录' : 'No records found'}
) : ( {stats?.recentRecords?.map((record) => ( ))}
{isZh ? '知识库' : 'Knowledge Base'} {isZh ? '模板' : 'Template'} {isZh ? '分数' : 'Score'} {isZh ? '状态' : 'Status'} {isZh ? '时间' : 'Created At'}
{record.knowledgeBase} {record.template} {record.score !== null ? ( = 90 ? 'text-green-600' : record.score >= 60 ? 'text-yellow-600' : 'text-red-600'}> {record.score} ) : ( - )} {record.status === 'COMPLETED' ? (isZh ? '已完成' : 'Completed') : (isZh ? '进行中' : 'In Progress')} {formatDate(record.createdAt)}
)}
); }; export default AssessmentStatsView;