"use client"; import { useCallback, useEffect, useState } from "react"; import { useDropzone } from "react-dropzone"; import { AlertTriangle, CheckCircle2, Download, FileCode, FileText, Loader2, Play, Upload, } from "lucide-react"; import DashboardLayout from "@/components/layout/dashboard-layout"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { useToast } from "@/components/ui/use-toast"; import { ConsistencyReport, downloadJson, loadConsistencyDraft, mockAnalyzeConsistency, saveConsistencyDraft, } from "@/lib/document-mock"; import { cn } from "@/lib/utils"; const severityVariant: Record = { 高: "destructive", 中: "default", 低: "secondary", }; export default function ConsistencyAnalysisPage() { const [requirementFile, setRequirementFile] = useState(null); const [codeFile, setCodeFile] = useState(null); const [report, setReport] = useState(null); const [isAnalyzing, setIsAnalyzing] = useState(false); const { toast } = useToast(); useEffect(() => { const draft = loadConsistencyDraft(); if (!draft) { return; } setReport(draft); }, []); const requirementDropzone = useDropzone({ onDrop: useCallback((acceptedFiles: File[]) => { const file = acceptedFiles[0]; if (!file) { return; } setRequirementFile(file); }, []), maxFiles: 1, accept: { "application/pdf": [".pdf"], "application/msword": [".doc"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ ".docx", ], "application/json": [".json"], "text/plain": [".txt", ".md"], }, }); const codeDropzone = useDropzone({ onDrop: useCallback((acceptedFiles: File[]) => { const file = acceptedFiles[0]; if (!file) { return; } setCodeFile(file); }, []), maxFiles: 1, accept: { "text/plain": [ ".py", ".js", ".ts", ".tsx", ".java", ".go", ".cs", ".cpp", ".c", ".md", ".json", ], }, }); const handleAnalyze = async () => { if (!requirementFile || !codeFile) { toast({ title: "缺少输入文件", description: "请同时上传需求文档和代码文件。", variant: "destructive", }); return; } setIsAnalyzing(true); try { const result = await mockAnalyzeConsistency(requirementFile, codeFile); setReport(result); saveConsistencyDraft(result); toast({ title: "分析完成", description: `发现 ${result.issues.length} 项待处理问题。`, }); } catch { toast({ title: "分析失败", description: "前端模拟分析失败,请重试。", variant: "destructive", }); } finally { setIsAnalyzing(false); } }; const handleExportReport = () => { if (!report) { return; } const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); downloadJson(`consistency-report-${timestamp}.json`, report); toast({ title: "导出成功", description: "一致性分析报告已下载。", }); }; return (
一致性分析 上传需求文档与代码文件,比较需求-代码一致性并输出问题清单。

需求文档

支持 Word、PDF、JSON、TXT/MD

{requirementFile && (

{requirementFile.name}

)}

代码文件

支持 py/js/ts/tsx/java/go/cs/cpp/c 等文本代码文件

{codeFile && (

{codeFile.name}

)}
{report && ( <>

总体一致性

{report.consistencyScore}%

需求覆盖率

{report.coverage}%

问题数量

{report.issues.length}

需优先处理高严重度问题

问题清单 来源: {report.requirementFileName} vs {report.codeFileName}
{report.issues.map((issue) => (

{issue.id} · {issue.type}

严重度 {issue.severity}

{issue.summary}

关联需求: {issue.requirementRef}
关联代码: {issue.codeRef}
建议处理: {issue.suggestion}
))}
)}
); }