/** * 方法学评估报告组件 - 专业版 */ import { XCircle, AlertTriangle, CheckCircle, Microscope, Lightbulb, MapPin, TrendingUp } from 'lucide-react'; import type { MethodologyReviewResult } from '../types'; interface MethodologyReportProps { data: MethodologyReviewResult; } export default function MethodologyReport({ data }: MethodologyReportProps) { // 统计问题数量 const totalIssues = data.parts.reduce((sum, part) => sum + part.issues.length, 0); const majorIssues = data.parts.reduce((sum, part) => sum + part.issues.filter(i => i.severity === 'major').length, 0); const minorIssues = totalIssues - majorIssues; const getSeverityStyle = (severity: 'major' | 'minor') => { return severity === 'major' ? { icon: , label: '严重', badge: 'bg-red-100 text-red-700 border-red-200' } : { icon: , label: '轻微', badge: 'bg-amber-100 text-amber-700 border-amber-200' }; }; const getScoreGrade = (score: number) => { if (score >= 90) return { label: '优秀', color: 'text-green-600', bg: 'bg-green-500' }; if (score >= 80) return { label: '良好', color: 'text-green-600', bg: 'bg-green-500' }; if (score >= 70) return { label: '中等', color: 'text-amber-600', bg: 'bg-amber-500' }; if (score >= 60) return { label: '及格', color: 'text-amber-600', bg: 'bg-amber-500' }; return { label: '不及格', color: 'text-red-600', bg: 'bg-red-500' }; }; const getOverallStatus = () => { if (data.overall_score >= 80) return { label: '通过', color: 'text-green-700', bg: 'bg-green-50', border: 'border-green-200' }; if (data.overall_score >= 60) return { label: '存疑', color: 'text-amber-700', bg: 'bg-amber-50', border: 'border-amber-200' }; return { label: '不通过', color: 'text-red-700', bg: 'bg-red-50', border: 'border-red-200' }; }; const grade = getScoreGrade(data.overall_score); const status = getOverallStatus(); return (
{/* 评分总览卡片 */}
{/* 分数环 */}
{data.overall_score}
{grade.label}
{/* 评估摘要 */}

方法学评估

{status.label}

{data.summary}

{/* 统计指标 */}
共检测 {data.parts.length} 个方面
{totalIssues === 0 ? (
未发现问题
) : ( <> {majorIssues > 0 && (
{majorIssues} 个严重问题
)} {minorIssues > 0 && (
{minorIssues} 个轻微问题
)} )}
{/* 分项详情标题 */}

分项评估

共 {data.parts.length} 项
{/* 分项详情 */}
{data.parts.map((part, partIndex) => (
{/* 分项头部 */}
{part.issues.length === 0 ? ( ) : ( )}

{part.part}

= 80 ? 'bg-green-100 text-green-700' : part.score >= 60 ? 'bg-amber-100 text-amber-700' : 'bg-red-100 text-red-700' }`}> {part.score}分 {part.issues.length === 0 ? ( 无问题 ) : ( {part.issues.length} 个问题 )}
{/* 问题列表 */} {part.issues.length > 0 && (
{part.issues.map((issue, issueIndex) => { const severity = getSeverityStyle(issue.severity); return (
{severity.icon}
{/* 问题标题和严重程度 */}
{issue.type} {severity.label}
{/* 问题描述 */}

{issue.description}

{/* 位置信息 */} {issue.location && (
位置:{issue.location}
)} {/* 改进建议 */} {issue.suggestion && (

改进建议

{issue.suggestion}

)}
); })}
)} {/* 无问题时的简洁显示 */} {part.issues.length === 0 && (
该部分未发现方法学问题,符合规范要求
)}
))}
); }