"use client"; import { motion } from "motion/react"; import { AlertTriangle, CheckCircle, Info, Sparkles } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; interface AISuggestionPanelProps { totalFields: number; highConfidence: number; mediumConfidence: number; lowConfidence: number; confirmedCount: number; onAutoConfirm?: () => void; className?: string; } const config = { success: { bg: "bg-emerald-50 dark:bg-emerald-950/30", border: "border-emerald-200 dark:border-emerald-800", iconBg: "bg-emerald-100 dark:bg-emerald-900/50", iconColor: "text-emerald-600 dark:text-emerald-400", titleColor: "text-emerald-800 dark:text-emerald-300", descColor: "text-emerald-700 dark:text-emerald-400", buttonBg: "bg-emerald-600 hover:bg-emerald-700", progressBg: "bg-emerald-500", }, warning: { bg: "bg-amber-50 dark:bg-amber-950/30", border: "border-amber-200 dark:border-amber-800", iconBg: "bg-amber-100 dark:bg-amber-900/50", iconColor: "text-amber-600 dark:text-amber-400", titleColor: "text-amber-800 dark:text-amber-300", descColor: "text-amber-700 dark:text-amber-400", buttonBg: "bg-amber-600 hover:bg-amber-700", progressBg: "bg-amber-500", }, info: { bg: "bg-blue-50 dark:bg-blue-950/30", border: "border-blue-200 dark:border-blue-800", iconBg: "bg-blue-100 dark:bg-blue-900/50", iconColor: "text-blue-600 dark:text-blue-400", titleColor: "text-blue-800 dark:text-blue-300", descColor: "text-blue-700 dark:text-blue-400", buttonBg: "bg-blue-600 hover:bg-blue-700", progressBg: "bg-blue-500", }, }; export function AISuggestionPanel({ totalFields, highConfidence, mediumConfidence, lowConfidence, confirmedCount, onAutoConfirm, className, }: AISuggestionPanelProps) { const pendingCount = totalFields - confirmedCount; const allConfirmed = pendingCount === 0; const progressPercent = totalFields > 0 ? (confirmedCount / totalFields) * 100 : 0; const getSuggestion = () => { if (allConfirmed) { return { type: "success" as const, icon: CheckCircle, title: "所有字段已确认", description: "字段映射已完成,可以进入下一步", action: null, }; } if (lowConfidence > 0) { return { type: "warning" as const, icon: AlertTriangle, title: "建议检查低置信度字段", description: `有 ${lowConfidence} 个字段置信度较低(<70%),建议人工确认`, action: "检查低置信度字段", }; } if (mediumConfidence > 0) { return { type: "info" as const, icon: Info, title: "存在中等置信度字段", description: `有 ${mediumConfidence} 个字段置信度为中等(70%-90%),建议确认`, action: "批量确认", }; } return { type: "success" as const, icon: Sparkles, title: "可直接确认", description: "所有字段置信度较高,可以批量确认", action: "批量确认", }; }; const suggestion = getSuggestion(); const Icon = suggestion.icon; const style = config[suggestion.type]; return (
{/* Icon */} {/* Content */}

{suggestion.title}

{suggestion.description}

{suggestion.action && !allConfirmed && onAutoConfirm && ( )}
{/* Progress Stats */}
{confirmedCount} /{totalFields}

已确认

{/* Progress Bar */}
确认进度 {Math.round(progressPercent)}%
{/* Confidence Distribution */}

置信度分布

高置信度: {highConfidence}
中置信度: {mediumConfidence}
低置信度: {lowConfidence}
); } export default AISuggestionPanel;