import { useState, useEffect } from "react"; // 定义字段比对结果类型 interface FieldComparison { field: string; status: string; details: string; source_page: string; template_page: string; } // 定义比对结果类型 interface ComparisonResults { [sectionName: string]: FieldComparison[]; } // 定义比对文档类型 interface ComparisonDocument { comparison_results?: ComparisonResults; [key: string]: unknown; } // 定义组件Props类型 interface ComparisonProps { comparison_document: ComparisonDocument | null; onPageJump?: (sourcePage: number, templatePage: number) => void; } // 筛选类型 type FilterType = 'all' | 'normal' | 'abnormal'; export function Comparison({ comparison_document, onPageJump }: ComparisonProps) { const [expandedSections, setExpandedSections] = useState>(new Set()); const [filterType, setFilterType] = useState('all'); // 默认展开所有章节 useEffect(() => { if (comparison_document?.comparison_results) { const allSections = Object.keys(comparison_document.comparison_results); setExpandedSections(new Set(allSections)); } }, [comparison_document?.comparison_results]); // 如果没有比对文档,显示暂无数据 if (!comparison_document || !comparison_document.comparison_results) { return (
结构比对(0)

暂无结构比对数据

); } const comparisonResults = comparison_document.comparison_results; // 确保 comparisonResults 的所有值都是数组,过滤掉非数组项 const validComparisonResults: ComparisonResults = {}; if (comparisonResults) { Object.entries(comparisonResults).forEach(([key, value]) => { if (Array.isArray(value)) { validComparisonResults[key] = value; } }); } // 切换章节展开状态 const toggleSection = (sectionName: string) => { const newExpanded = new Set(expandedSections); if (newExpanded.has(sectionName)) { newExpanded.delete(sectionName); } else { newExpanded.add(sectionName); } setExpandedSections(newExpanded); }; // 处理整个字段框的点击,同时传递两个页码 const handleFieldClick = (field: FieldComparison) => { if (onPageJump) { const sourcePage = field.source_page ? parseInt(field.source_page) : 0; const templatePage = field.template_page ? parseInt(field.template_page) : 0; onPageJump(sourcePage, templatePage); } }; // 处理键盘事件 const handleFieldKeyDown = (event: React.KeyboardEvent, field: FieldComparison) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); handleFieldClick(field); } }; // 获取状态样式 const getStatusStyle = (status: string) => { if (status === 'normal') { return { icon: 'ri-check-circle-line', color: 'text-green-500', bgColor: 'bg-green-50', borderColor: 'border-green-200' }; } else { return { icon: 'ri-alert-circle-line', color: 'text-red-500', bgColor: 'bg-red-50', borderColor: 'border-red-200' }; } }; // 统计总体信息 const totalFields = Object.values(validComparisonResults).flat().length; const normalFields = Object.values(validComparisonResults).flat().filter(field => field.status === 'normal').length; const abnormalFields = totalFields - normalFields; // 根据筛选类型过滤数据 const getFilteredResults = () => { if (filterType === 'all') { return validComparisonResults; } const filteredResults: ComparisonResults = {}; Object.entries(validComparisonResults).forEach(([sectionName, fields]) => { let filteredFields: FieldComparison[] = []; if (filterType === 'normal') { filteredFields = fields.filter(field => field.status === 'normal'); } else if (filterType === 'abnormal') { filteredFields = fields.filter(field => field.status !== 'normal'); } if (filteredFields.length > 0) { filteredResults[sectionName] = filteredFields; } }); return filteredResults; }; const filteredResults = getFilteredResults(); return (
{/* 固定头部 */}
结构比对({totalFields})
{/* 固定统计概览和筛选按钮 */}
{/* 统计概览 */}
{/* 筛选重置按钮 */} {filterType !== 'all' && ( )}
{/* 滚动内容区域 */}
{Object.keys(filteredResults).length === 0 ? (

没有找到{filterType === 'normal' ? '正常' : '异常'}的字段

) : ( Object.entries(filteredResults).map(([sectionName, fields]) => { const isExpanded = expandedSections.has(sectionName); const sectionAbnormalCount = fields.filter(field => field.status !== 'normal').length; return (
{/* 章节头部 */} {/* 章节内容 */} {isExpanded && (
{fields.map((field, index) => { const statusStyle = getStatusStyle(field.status); return (
handleFieldClick(field)} onKeyDown={(e) => handleFieldKeyDown(e, field)} className={`text-sm mb-3 last:mb-0 p-2 rounded-lg border cursor-pointer transition-all duration-200 ${statusStyle.bgColor} ${statusStyle.borderColor} hover:shadow-md hover:scale-[1.02] hover:border-opacity-80 focus:outline-none focus:ring-1 ${field.status === 'normal' ? 'focus:ring-green-700' : 'focus:ring-red-700'} focus:ring-opacity-50 ${field.status === 'normal' ? 'border-green-200' : 'border-red-200'}`} > {/* 字段名和状态 */}
{field.field}
{field.status === 'normal' ? '正常' : '异常'}
{/* 详细说明 */}

{field.details}

{/* 页码信息 */}
{field.source_page ? (
主文件: 第{field.source_page}页
) : (
主文件: 未找到内容
)} {field.template_page ? (
模板: 第{field.template_page}页
) : (
模板: 未找到内容
)}
); })}
)}
); }) )}
{/* 底部说明 */} {/*
点击字段框可同时跳转到主文件和模板对应页面
*/}
); }