/**
* 方法学评估报告组件 - 专业版
*/
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 (
{/* 评分总览卡片 */}
{/* 分数环 */}
{/* 评估摘要 */}
方法学评估
{status.label}
{data.summary}
{/* 统计指标 */}
共检测 {data.parts.length} 个方面
{totalIssues === 0 ? (
未发现问题
) : (
<>
{majorIssues > 0 && (
{majorIssues} 个严重问题
)}
{minorIssues > 0 && (
)}
>
)}
{/* 分项详情标题 */}
分项评估
共 {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 && (
)}
);
})}
)}
{/* 无问题时的简洁显示 */}
{part.issues.length === 0 && (
该部分未发现方法学问题,符合规范要求
)}
))}
);
}