const { EvaluationUploadService, defaultAIEvaluationResult } = require('../lib/services/evaluation-upload'); /** * 測試 AI 評分結果上傳功能 */ async function testEvaluationUpload() { try { console.log('🧪 開始測試 AI 評分結果上傳功能...\n'); // 測試 1: 檢查預設資料 console.log('📋 測試 1: 檢查預設 AI 評分結果'); console.log(`專案標題: ${defaultAIEvaluationResult.projectTitle}`); console.log(`總分: ${defaultAIEvaluationResult.overallScore}/${defaultAIEvaluationResult.totalPossible}`); console.log(`等級: ${defaultAIEvaluationResult.grade}`); console.log(`評分標準數量: ${defaultAIEvaluationResult.criteria.length}`); console.log('✅ 預設資料檢查完成\n'); // 測試 2: 檢查 criteria 對應關係 console.log('📋 測試 2: 檢查 criteria 對應關係'); const criteriaMapping = EvaluationUploadService.getCriteriaMapping(); console.log('當前對應關係:', criteriaMapping); // 檢查是否所有 criteria 都有對應的 ID const missingMappings = defaultAIEvaluationResult.criteria.filter( criteria => !criteriaMapping[criteria.name] ); if (missingMappings.length > 0) { console.warn('⚠️ 缺少對應關係的評分標準:', missingMappings.map(c => c.name)); } else { console.log('✅ 所有評分標準都有對應關係\n'); } // 測試 3: 模擬上傳(不實際執行資料庫操作) console.log('📋 測試 3: 模擬資料準備'); const projectId = 1; const analysisDuration = 120; const aiModelVersion = 'gemini-1.5-pro'; // 模擬 evaluations 資料 const evaluationData = { project_id: projectId, overall_score: defaultAIEvaluationResult.overallScore, max_possible_score: defaultAIEvaluationResult.totalPossible, grade: defaultAIEvaluationResult.grade, analysis_duration: analysisDuration, ai_model_version: aiModelVersion, status: 'completed', error_message: null }; console.log('Evaluations 資料:', evaluationData); // 模擬 evaluation_scores 資料 const evaluationScoresData = defaultAIEvaluationResult.criteria.map(criteria => { const criteriaItemId = criteriaMapping[criteria.name]; return { evaluation_id: '[待生成]', criteria_item_id: criteriaItemId, score: criteria.score, max_score: criteria.maxScore, weight: criteria.weight, weighted_score: criteria.weightedScore, percentage: (criteria.score / criteria.maxScore) * 100 }; }); console.log('Evaluation Scores 資料:', evaluationScoresData); // 模擬 evaluation_feedback 資料 const feedbackCount = 1 + // 整體反饋 defaultAIEvaluationResult.criteria.length + // 各標準反饋 defaultAIEvaluationResult.criteria.reduce((sum, c) => sum + c.strengths.length + c.improvements.length, 0) + // 優點和改進建議 1 + // 整體改進建議 defaultAIEvaluationResult.improvementSuggestions.maintainStrengths.length + // 保持優勢 defaultAIEvaluationResult.improvementSuggestions.keyImprovements.length + // 關鍵改進 defaultAIEvaluationResult.improvementSuggestions.actionPlan.length; // 行動計劃 console.log(`Evaluation Feedback 資料: 預計 ${feedbackCount} 筆記錄`); console.log('✅ 資料準備完成\n'); // 測試 4: 驗證資料完整性 console.log('📋 測試 4: 驗證資料完整性'); const requiredFields = ['projectTitle', 'overallScore', 'totalPossible', 'grade', 'criteria']; const missingFields = requiredFields.filter(field => !defaultAIEvaluationResult[field]); if (missingFields.length > 0) { console.error('❌ 缺少必要欄位:', missingFields); } else { console.log('✅ 資料完整性檢查通過'); } // 檢查 criteria 資料 const criteriaIssues = defaultAIEvaluationResult.criteria.filter(criteria => !criteria.name || typeof criteria.score !== 'number' || typeof criteria.maxScore !== 'number' || !criteria.feedback ); if (criteriaIssues.length > 0) { console.error('❌ criteria 資料有問題:', criteriaIssues); } else { console.log('✅ criteria 資料檢查通過'); } console.log('\n🎉 所有測試完成!'); console.log('\n📝 使用說明:'); console.log('1. 確保資料庫連線正常'); console.log('2. 確認 criteria_items 表中有對應的評分項目'); console.log('3. 調整 projectId 為實際的專案 ID'); console.log('4. 執行: node scripts/parse-ai-evaluation.js'); } catch (error) { console.error('❌ 測試過程中發生錯誤:', error); } } // 執行測試 if (require.main === module) { testEvaluationUpload(); } module.exports = { testEvaluationUpload };