Files
hr-assessment-system/app/api/admin/test-results/detail/route.ts

224 lines
8.9 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server"
import { getTestResultById } from "@/lib/database/models/test_result"
import { getLogicTestAnswersByTestResultId } from "@/lib/database/models/logic_test_answer"
import { getCreativeTestAnswersByTestResultId } from "@/lib/database/models/creative_test_answer"
import { getCombinedTestResultById } from "@/lib/database/models/combined_test_result"
import { findUserById } from "@/lib/database/models/user"
import { findLogicQuestionById } from "@/lib/database/models/logic_question"
import { findCreativeQuestionById } from "@/lib/database/models/creative_question"
import { executeQuery } from "@/lib/database/connection"
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url)
const testResultId = searchParams.get("testResultId")
const testType = searchParams.get("testType") as "logic" | "creative" | "combined"
if (!testResultId || !testType) {
return NextResponse.json(
{ success: false, message: "缺少必要參數" },
{ status: 400 }
)
}
let result: any = null
let user: any = null
let questions: any[] = []
let answers: any[] = []
// 獲取用戶資訊
if (testType === "combined") {
const combinedResult = await getCombinedTestResultById(testResultId)
if (combinedResult) {
user = await findUserById(combinedResult.user_id)
result = {
id: combinedResult.id,
userId: combinedResult.user_id,
type: "combined",
score: combinedResult.overall_score,
completedAt: combinedResult.completed_at,
details: {
logicScore: combinedResult.logic_score,
creativeScore: combinedResult.creativity_score,
abilityBalance: combinedResult.balance_score,
breakdown: combinedResult.logic_breakdown
}
}
// 獲取綜合測試的詳細答題資料
// 綜合測試的詳細答案存儲在 logic_breakdown 和 creativity_breakdown 中
console.log('Debug: combinedResult.logic_breakdown:', combinedResult.logic_breakdown)
console.log('Debug: combinedResult.creativity_breakdown:', combinedResult.creativity_breakdown)
if (combinedResult.logic_breakdown && typeof combinedResult.logic_breakdown === 'object') {
const logicBreakdown = combinedResult.logic_breakdown as any
console.log('Debug: logicBreakdown.answers:', logicBreakdown.answers)
if (logicBreakdown.answers && typeof logicBreakdown.answers === 'object') {
// 處理物件格式的答案
const answerEntries = Object.entries(logicBreakdown.answers)
console.log('Debug: 邏輯題答案條目:', answerEntries)
// 獲取所有邏輯題目
const allLogicQuestions = await executeQuery('SELECT * FROM logic_questions ORDER BY id')
console.log('Debug: 所有邏輯題目數量:', allLogicQuestions.length)
for (let i = 0; i < answerEntries.length; i++) {
const [questionIndex, userAnswer] = answerEntries[i]
const question = allLogicQuestions[parseInt(questionIndex)] // 使用索引獲取題目
if (question) {
// 判斷是否正確
const isCorrect = userAnswer === question.correct_answer
questions.push({
...question,
type: 'logic',
userAnswer: userAnswer as string,
isCorrect: isCorrect,
correctAnswer: question.correct_answer,
explanation: question.explanation
})
}
}
}
}
if (combinedResult.creativity_breakdown && typeof combinedResult.creativity_breakdown === 'object') {
const creativityBreakdown = combinedResult.creativity_breakdown as any
console.log('Debug: creativityBreakdown.answers:', creativityBreakdown.answers)
if (creativityBreakdown.answers && typeof creativityBreakdown.answers === 'object') {
// 處理物件格式的答案
const answerEntries = Object.entries(creativityBreakdown.answers)
console.log('Debug: 創意題答案條目:', answerEntries)
// 獲取所有創意題目
const allCreativeQuestions = await executeQuery('SELECT * FROM creative_questions ORDER BY id')
console.log('Debug: 所有創意題目數量:', allCreativeQuestions.length)
for (let i = 0; i < answerEntries.length; i++) {
const [questionIndex, score] = answerEntries[i]
const question = allCreativeQuestions[parseInt(questionIndex)] // 使用索引獲取題目
if (question) {
questions.push({
...question,
type: 'creative',
userAnswer: score.toString(), // 創意題的答案就是分數
score: score as number,
isReverse: question.is_reverse
})
}
}
}
}
console.log('Debug: 總共找到題目數量:', questions.length)
// 如果 breakdown 中沒有詳細答案,嘗試從單獨的答案表獲取
if (questions.length === 0) {
console.log('從 breakdown 中沒有找到答案,嘗試從答案表獲取...')
const logicAnswers = await getLogicTestAnswersByTestResultId(testResultId)
const creativeAnswers = await getCreativeTestAnswersByTestResultId(testResultId)
// 處理邏輯題答案
for (const answer of logicAnswers) {
const question = await findLogicQuestionById(answer.question_id)
if (question) {
questions.push({
...question,
type: 'logic',
userAnswer: answer.user_answer,
isCorrect: answer.is_correct,
correctAnswer: answer.correct_answer,
explanation: answer.explanation
})
}
}
// 處理創意題答案
for (const answer of creativeAnswers) {
const question = await findCreativeQuestionById(answer.question_id)
if (question) {
questions.push({
...question,
type: 'creative',
userAnswer: answer.user_answer,
score: answer.score,
isReverse: answer.is_reverse
})
}
}
}
}
} else {
const testResult = await getTestResultById(testResultId)
if (testResult) {
user = await findUserById(testResult.user_id)
result = {
id: testResult.id,
userId: testResult.user_id,
type: testResult.test_type,
score: testResult.score,
completedAt: testResult.completed_at
}
// 獲取詳細答案
if (testType === "logic") {
answers = await getLogicTestAnswersByTestResultId(testResultId)
console.log('Debug: 邏輯測試答案數量:', answers.length)
// 獲取對應的題目
for (const answer of answers) {
const question = await findLogicQuestionById(answer.question_id)
if (question) {
questions.push({
...question,
userAnswer: answer.user_answer,
isCorrect: answer.is_correct,
correctAnswer: answer.correct_answer,
explanation: answer.explanation
})
}
}
} else if (testType === "creative") {
answers = await getCreativeTestAnswersByTestResultId(testResultId)
console.log('Debug: 創意測試答案數量:', answers.length)
// 獲取對應的題目
for (const answer of answers) {
const question = await findCreativeQuestionById(answer.question_id)
if (question) {
questions.push({
...question,
userAnswer: answer.user_answer,
score: answer.score,
isReverse: answer.is_reverse
})
}
}
}
console.log('Debug: 單一測試類型題目數量:', questions.length)
}
}
if (!result || !user) {
return NextResponse.json(
{ success: false, message: "找不到測試結果" },
{ status: 404 }
)
}
return NextResponse.json({
success: true,
data: {
result,
user,
questions,
answers
}
})
} catch (error) {
console.error("獲取詳細測試結果失敗:", error)
return NextResponse.json(
{ success: false, message: "獲取詳細結果失敗", error: error instanceof Error ? error.message : String(error) },
{ status: 500 }
)
}
}