"use client"; import { AlertCircle, CheckCircle2 } from "lucide-react"; import { cn } from "@/lib/utils"; type DetailUiValidationSnapshot = { passed?: boolean; issues?: string[]; }; type DetailUiReviewSnapshot = { screenIndex: number; action?: "pass" | "protocol_patch" | "regenerate_image"; passed?: boolean; issues?: string[]; }; export function DetailUiValidationPanel(params: { generationMode: "classic" | "agent_layout"; planValidation?: DetailUiValidationSnapshot | null; latestScreenValidation?: DetailUiReviewSnapshot | null; surfaceId?: string | null; }) { const planIssues = Array.isArray(params.planValidation?.issues) ? params.planValidation?.issues.filter(Boolean) : []; const latestIssues = Array.isArray(params.latestScreenValidation?.issues) ? params.latestScreenValidation.issues.filter(Boolean) : []; if (!params.planValidation && !params.latestScreenValidation) { return null; } const title = params.generationMode === "agent_layout" ? "协议排版质检" : "排版与复审状态"; const hasPlanValidation = Boolean(params.planValidation); const latestActionLabel = params.latestScreenValidation?.action === "protocol_patch" ? "已走协议修正" : params.latestScreenValidation?.action === "regenerate_image" ? "已要求重生图" : "通过"; return (
{params.planValidation?.passed === false || latestIssues.length > 0 ? ( ) : ( )}

{title}

{params.surfaceId ? params.generationMode === "agent_layout" ? "结构化 surface 已建立" : "当前结果可继续复审" : params.generationMode === "agent_layout" ? "文字层可直接修正" : "问题会触发二次修图"}
规划阶段
{params.planValidation?.passed === false ? `发现 ${planIssues.length} 条协议/排版提示` : hasPlanValidation ? "协议结构已通过基础校验" : "等待本轮规划结果"}
{!hasPlanValidation ? "待开始" : params.planValidation?.passed === false ? "待优化" : "通过"}
{params.latestScreenValidation ? (
最近一屏:第 {params.latestScreenValidation.screenIndex} 屏
{params.latestScreenValidation.passed === false ? latestIssues[0] || "存在可优化项" : "最近一屏已通过当前质检"}
{latestActionLabel}
) : null} {(planIssues.length > 0 || latestIssues.length > 0) && (
当前关注点
{[...planIssues, ...latestIssues] .filter((item, index, array) => array.indexOf(item) === index) .slice(0, 3) .map((issue) => (
· {issue}
))}
)}
); }