載入評審結果中...
"use client" import { useState, useEffect } from "react" import { useSearchParams } from "next/navigation" import { Sidebar } from "@/components/sidebar" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, } from "recharts" import { Download, Share2, TrendingUp, AlertCircle, CheckCircle, Star } from "lucide-react" import { useToast } from "@/hooks/use-toast" // 模擬評分結果數據 - 使用您提到的例子:8, 7, 6, 8, 4,平均 = 6.6 const mockCriteria = [ { name: "內容品質", score: 8, maxScore: 10, weight: 25, weightedScore: 20, feedback: "內容結構清晰,資訊豐富且準確。建議增加更多實際案例來支撐論點。", strengths: ["邏輯清晰", "資料準確", "結構完整"], improvements: ["增加案例", "深化分析"], }, { name: "視覺設計", score: 7, maxScore: 10, weight: 20, weightedScore: 14, feedback: "整體設計風格統一,色彩搭配合理。部分頁面文字密度過高,影響閱讀體驗。", strengths: ["風格統一", "色彩協調", "版面整潔"], improvements: ["減少文字密度", "增加視覺元素"], }, { name: "邏輯結構", score: 6, maxScore: 10, weight: 20, weightedScore: 12, feedback: "邏輯架構清晰,各章節銜接自然,論述層次分明。", strengths: ["邏輯清晰", "結構完整", "銜接自然"], improvements: ["可增加總結回顧"], }, { name: "創新性", score: 8, maxScore: 10, weight: 15, weightedScore: 12, feedback: "內容具有一定創新性,但可以更大膽地提出獨特觀點和解決方案。", strengths: ["思路新穎", "角度獨特"], improvements: ["增加創新元素", "提出獨特見解"], }, { name: "實用性", score: 4, maxScore: 10, weight: 20, weightedScore: 8, feedback: "內容實用性有待提升,提供的解決方案需要更具可操作性。", strengths: ["實用性強", "可操作性好", "價值明確"], improvements: ["增加實施步驟"], }, ]; // 計算 mock 數據的 overview - 基於平均分作為閾值 const calculateMockOverview = (criteria: any[]) => { if (!criteria || criteria.length === 0) { return { excellentItems: 0, improvementItems: 0, overallPerformance: 0 }; } // 計算所有項目的平均分數(不考慮權重) const totalScore = criteria.reduce((sum, item) => sum + item.score, 0); const averageScore = totalScore / criteria.length; // 以平均分作為閾值 // ≥ 平均分 = 優秀項目,< 平均分 = 待改進項目 const excellentItems = criteria.filter(item => item.score >= averageScore).length; const improvementItems = criteria.filter(item => item.score < averageScore).length; // 整體表現:基於權重的加權平均分數 const overallPerformance = Math.round(criteria.reduce((sum, item) => sum + (item.score / item.maxScore) * item.weight, 0)); return { excellentItems, improvementItems, overallPerformance }; }; const mockResults = { projectTitle: "產品介紹簡報", overallScore: 82, totalPossible: 100, grade: "B+", analysisDate: "2024-01-15", criteria: mockCriteria, overview: calculateMockOverview(mockCriteria), } // 圖表數據將在組件內部動態生成 const COLORS = ["#0891b2", "#6366f1", "#f59e0b", "#dc2626", "#10b981"] export default function ResultsPage() { const [activeTab, setActiveTab] = useState("overview") const [evaluationData, setEvaluationData] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const { toast } = useToast() const searchParams = useSearchParams() useEffect(() => { const loadEvaluationData = async () => { try { setIsLoading(true) setError(null) // 檢查是否有 URL 參數中的評審 ID const evaluationId = searchParams.get('id') if (evaluationId) { // 從 API 獲取評審數據 console.log(`📊 從 API 獲取評審數據: ID=${evaluationId}`) const response = await fetch(`/api/evaluation/${evaluationId}`) const result = await response.json() if (result.success) { setEvaluationData(result.data) console.log('✅ 成功載入評審數據:', result.data.projectTitle) } else { throw new Error(result.error || '獲取評審數據失敗') } } else { // 回退到從 localStorage 獲取評審結果 console.log('📊 從 localStorage 獲取評審結果') const storedData = localStorage.getItem('evaluationResult') if (storedData) { const data = JSON.parse(storedData) setEvaluationData(data) console.log('✅ 成功載入 localStorage 數據') } else { throw new Error('沒有找到評審結果') } } } catch (error) { console.error('載入評審結果失敗:', error) setError(error.message) toast({ title: "載入失敗", description: error.message || "無法載入評審結果,請重新進行評審", variant: "destructive", }) } finally { setIsLoading(false) } } loadEvaluationData() }, [searchParams, toast]) // 如果正在載入,顯示載入狀態 if (isLoading) { return (
載入評審結果中...
{error ? `載入失敗: ${error}` : '沒有找到評審結果'}
{safeResults.projectTitle} - 分析完成於 {safeResults.analysisDate}
{item.feedback}
{strength.description}
{improvement.description}
{action.description}