import { useMemo } from 'react'; import { CheckCircle2, AlertTriangle, XCircle, TrendingUp, TrendingDown } from 'lucide-react'; interface MeasurementItem { name: string; value: number; unit: string; tolerance: number; status: 'pass' | 'warning' | 'fail'; } interface ErrorStats { min: number; max: number; mean: number; stdDev: number; } interface RealtimeReportProps { processedChunks: number; totalChunks: number; measurements: MeasurementItem[]; errorStats: ErrorStats | null; isProcessing: boolean; className?: string; } export default function RealtimeReport({ processedChunks, totalChunks, measurements, errorStats, isProcessing, className = '' }: RealtimeReportProps) { const visibleMeasurements = useMemo(() => { const ratio = processedChunks / totalChunks; const count = Math.floor(measurements.length * ratio); return measurements.slice(0, count); }, [processedChunks, totalChunks, measurements]); const stats = useMemo(() => { const pass = visibleMeasurements.filter(m => m.status === 'pass').length; const warning = visibleMeasurements.filter(m => m.status === 'warning').length; const fail = visibleMeasurements.filter(m => m.status === 'fail').length; return { pass, warning, fail, total: visibleMeasurements.length }; }, [visibleMeasurements]); return (
{/* 误差统计卡片 */}
误差统计 {isProcessing && ( 实时更新中... )}
{errorStats ? (
最小误差 {errorStats.min.toFixed(4)} mm
最大误差 {errorStats.max.toFixed(4)} mm
平均误差 {errorStats.mean.toFixed(4)} mm
标准差 {errorStats.stdDev.toFixed(4)} mm
) : (
等待数据处理...
)}
{/* 测量结果卡片 */}
测量结果
{stats.pass > 0 && ( {stats.pass} )} {stats.warning > 0 && ( {stats.warning} )} {stats.fail > 0 && ( {stats.fail} )}
{visibleMeasurements.length > 0 ? (
{visibleMeasurements.map((item, index) => (
{item.status === 'pass' && } {item.status === 'warning' && } {item.status === 'fail' && } {item.name}
{item.value.toFixed(3)} {item.unit} ±{item.tolerance}
))}
) : (
等待测量数据...
)}
{/* 热力图图例 */}
误差热力图
负
正
0.00 mm 2.50 mm
); }