import { useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; import { useI18n } from '../i18n/I18nContext'; /** * AI 诊断报告查看 Modal * @param {Object} props * @param {Object|null} props.diagnosis - 诊断记录对象 * @param {Function} props.onClose - 关闭回调 */ export default function AiDiagnosisModal({ diagnosis, onClose }) { const { en } = useI18n(); useEffect(() => { const handleEsc = (e) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleEsc); return () => window.removeEventListener('keydown', handleEsc); }, [onClose]); if (!diagnosis) return null; const riskLevelMap = { low: { label: en ? 'Low' : '低', color: '#48bb78' }, medium: { label: en ? 'Medium' : '中', color: '#ed8936' }, high: { label: en ? 'High' : '高', color: '#f56565' }, critical: { label: en ? 'Critical' : '极高', color: '#c53030' }, }; const riskInfo = riskLevelMap[diagnosis.risk_level] || { label: en ? 'Unknown' : '未知', color: '#a0aec0' }; return (
e.stopPropagation()}> {/* Header */}
🔍 {en ? 'AI Diagnosis Report' : 'AI 诊断报告'}
{/* Meta Info */}
{en ? 'Result' : '结果名称'}: {diagnosis.result_name || 'N/A'}
{en ? 'Date Range' : '监测周期'}: {diagnosis.date_range || 'N/A'}
{en ? 'Model' : '模型'}: {diagnosis.model_name}
{en ? 'Template' : '模板'}: {diagnosis.prompt_template}
{diagnosis.risk_level && (
{en ? 'Risk Level' : '风险等级'}: {riskInfo.label}
)} {diagnosis.confidence_score !== null && (
{en ? 'Confidence' : '置信度'}: {(diagnosis.confidence_score * 100).toFixed(0)}%
)} {diagnosis.quality_score !== null && (
{en ? 'Quality Score' : '质量评分'}: {diagnosis.quality_score.toFixed(1)} / 10
)}
{en ? 'Hazards Found' : '隐患点数'}: {diagnosis.hazards_found}
{diagnosis.duration_seconds !== null && (
{en ? 'Duration' : '耗时'}: {diagnosis.duration_seconds.toFixed(1)}s
)}
{en ? 'Created At' : '创建时间'}: {new Date(diagnosis.created_at).toLocaleString()}
{/* Markdown Content */}
{diagnosis.error_message ? (
{en ? 'Error' : '错误'}: {diagnosis.error_message}
) : diagnosis.diagnosis_markdown ? ( {diagnosis.diagnosis_markdown} ) : (
{en ? 'Diagnosis in progress...' : '诊断进行中...'}
)}
{/* Footer */}
); }