import React, { useState, useEffect } from 'react'; import { Download, Plus, Trash2, Users, FileText, BarChart3 } from 'lucide-react'; // 项目类型配置 const PROJECT_TYPES = { '课题类': [ { name: '研究内容前沿度', weight: 30 }, { name: '研究成果完善度', weight: 30 }, { name: '现场汇报表现', weight: 20 }, { name: '成果外部正向影响度', weight: 20 } ], '咨询服务类': [ { name: '服务内容的行业探索性', weight: 30 }, { name: '服务经验总结质量', weight: 30 }, { name: '现场汇报表现', weight: 20 }, { name: '成果外部正向影响度', weight: 20 } ], '规划设计类': [ { name: '成果内容创新性', weight: 30 }, { name: '成果可推广性', weight: 30 }, { name: '现场汇报表现', weight: 20 }, { name: '成果外部正向影响度', weight: 20 } ] }; export default function ExpertScoringSystem() { const [mode, setMode] = useState('select'); // select, admin, expert const [projects, setProjects] = useState([]); const [scores, setScores] = useState([]); const [currentExpert, setCurrentExpert] = useState(''); const [expertName, setExpertName] = useState(''); // 管理员新增项目表单 const [newProject, setNewProject] = useState({ name: '', type: '课题类', experts: '' }); // 从localStorage加载数据 useEffect(() => { const savedProjects = localStorage.getItem('projects'); const savedScores = localStorage.getItem('scores'); if (savedProjects) setProjects(JSON.parse(savedProjects)); if (savedScores) setScores(JSON.parse(savedScores)); }, []); // 保存到localStorage useEffect(() => { localStorage.setItem('projects', JSON.stringify(projects)); }, [projects]); useEffect(() => { localStorage.setItem('scores', JSON.stringify(scores)); }, [scores]); // 添加项目 const addProject = () => { if (!newProject.name || !newProject.experts) { alert('请填写项目名称和专家姓名'); return; } const project = { id: Date.now(), name: newProject.name, type: newProject.type, experts: newProject.experts.split(/[,,、\s]+/).filter(e => e.trim()) }; setProjects([...projects, project]); setNewProject({ name: '', type: '课题类', experts: '' }); }; // 删除项目 const deleteProject = (id) => { if (confirm('确定删除该项目吗?相关打分记录也会被删除。')) { setProjects(projects.filter(p => p.id !== id)); setScores(scores.filter(s => s.projectId !== id)); } }; // 专家提交打分 const submitScore = (projectId, dimensions, comment) => { const newScore = { id: Date.now(), projectId, expertName: currentExpert, dimensions, comment, timestamp: new Date().toLocaleString('zh-CN') }; // 检查是否已有该专家对该项目的打分 const existingIndex = scores.findIndex( s => s.projectId === projectId && s.expertName === currentExpert ); if (existingIndex >= 0) { const newScores = [...scores]; newScores[existingIndex] = newScore; setScores(newScores); alert('打分已更新!'); } else { setScores([...scores, newScore]); alert('打分提交成功!'); } }; // 计算项目得分 const calculateProjectScore = (projectId) => { const projectScores = scores.filter(s => s.projectId === projectId); if (projectScores.length === 0) return null; const project = projects.find(p => p.id === projectId); const dimensions = PROJECT_TYPES[project.type]; // 计算每个维度的平均分 const avgDimensions = dimensions.map((dim, idx) => { const dimScores = projectScores.map(s => s.dimensions[idx] || 0); const avg = dimScores.reduce((a, b) => a + b, 0) / dimScores.length; return { name: dim.name, weight: dim.weight, score: avg }; }); // 计算总分 const totalScore = avgDimensions.reduce((sum, dim) => sum + (dim.score * dim.weight / 100), 0); return { dimensions: avgDimensions, totalScore: totalScore.toFixed(2), expertCount: projectScores.length }; }; // 导出Excel const exportToExcel = () => { let csv = '项目名称,项目类型,专家姓名,'; // 添加表头 const firstProject = projects[0]; if (firstProject) { const dims = PROJECT_TYPES[firstProject.type]; dims.forEach(d => csv += `${d.name},`); csv += '专家评语,提交时间,项目总分,参与专家数\n'; } // 添加数据 projects.forEach(project => { const projectScore = calculateProjectScore(project.id); const projectScores = scores.filter(s => s.projectId === project.id); if (projectScores.length === 0) { csv += `${project.name},${project.type},暂无打分,,,,,,,${projectScore ? projectScore.totalScore : ''},0\n`; } else { projectScores.forEach(score => { csv += `${project.name},${project.type},${score.expertName},`; score.dimensions.forEach(d => csv += `${d},`); csv += `"${score.comment || ''}",${score.timestamp},`; csv += `${projectScore ? projectScore.totalScore : ''},${projectScore ? projectScore.expertCount : 0}\n`; }); } }); const blob = new Blob(['\ufeff' + csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `专家打分结果_${new Date().toLocaleDateString()}.csv`; link.click(); }; // 选择模式界面 if (mode === 'select') { return (
请选择您的身份进入系统
暂无项目,请先添加项目
) : (类型:{project.type}
分配专家:{project.experts.join('、')}
专家评分详情:
{projectScores.map(score => (当前登录:{currentExpert}
暂无分配给您的项目
项目类型:{project.type}
上次提交时间:{existingScore.timestamp}
)}