修改測驗時間、新增測驗提醒、新增截止測驗功能

This commit is contained in:
2025-10-12 00:18:24 +08:00
parent 967541a492
commit cf40e937a1
7 changed files with 176 additions and 19 deletions

View File

@@ -41,7 +41,8 @@ export default function CombinedTestPage() {
const [currentQuestion, setCurrentQuestion] = useState(0)
const [logicAnswers, setLogicAnswers] = useState<Record<number, string>>({})
const [creativeAnswers, setCreativeAnswers] = useState<Record<number, number>>({})
const [timeRemaining, setTimeRemaining] = useState(45 * 60) // 45 minutes total
const [timeRemaining, setTimeRemaining] = useState(30 * 60) // 30 minutes total
const [hasShownWarning, setHasShownWarning] = useState(false)
const [logicQuestions, setLogicQuestions] = useState<LogicQuestion[]>([])
const [creativeQuestions, setCreativeQuestions] = useState<CreativeQuestion[]>([])
const [isLoading, setIsLoading] = useState(true)
@@ -81,16 +82,27 @@ export default function CombinedTestPage() {
const timer = setInterval(() => {
setTimeRemaining((prev) => {
if (prev <= 1) {
handleSubmit()
const newTime = prev - 1
// 檢查是否剩餘5分鐘300秒且尚未顯示警告
if (newTime <= 300 && !hasShownWarning) {
setHasShownWarning(true)
alert('⚠️ 注意距離測試結束還有5分鐘請盡快完成剩餘題目')
}
// 時間到,強制提交
if (newTime <= 0) {
console.log('⏰ 時間到!強制提交測驗...')
handleTimeoutSubmit()
return 0
}
return prev - 1
return newTime
})
}, 1000)
return () => clearInterval(timer)
}, [logicQuestions, creativeQuestions])
}, [logicQuestions, creativeQuestions, hasShownWarning])
const formatTime = (seconds: number) => {
const mins = Math.floor(seconds / 60)
@@ -151,6 +163,121 @@ export default function CombinedTestPage() {
}
}
const handleTimeoutSubmit = async () => {
console.log('⏰ 時間到!強制提交綜合測試...')
console.log('用戶狀態:', user)
if (!user) {
console.log('❌ 用戶未登入')
alert('⏰ 時間到!但用戶未登入,無法提交結果。')
return
}
console.log('✅ 用戶已登入用戶ID:', user.id)
setIsSubmitting(true)
try {
// Calculate logic score
let logicCorrect = 0
logicQuestions.forEach((question, index) => {
if (logicAnswers[index] === question.correct_answer) {
logicCorrect++
}
})
const logicScore = Math.round((logicCorrect / logicQuestions.length) * 100)
// Calculate creativity score
let creativityTotal = 0
const processedCreativeAnswers: Record<number, number> = {}
creativeQuestions.forEach((question, index) => {
const answer = creativeAnswers[index] || 1
const processedScore = question.is_reverse ? 6 - answer : answer
creativityTotal += processedScore
processedCreativeAnswers[index] = processedScore
})
const creativityMaxScore = creativeQuestions.length * 5
const creativityScore = Math.round((creativityTotal / creativityMaxScore) * 100)
// Calculate combined score
const combinedResult = calculateCombinedScore(logicScore, creativityScore)
// Store results in localStorage with timeout flag
const results = {
type: "combined",
logicScore,
creativityScore,
overallScore: combinedResult.overallScore,
level: combinedResult.level,
description: combinedResult.description,
breakdown: combinedResult.breakdown,
logicAnswers,
creativeAnswers: processedCreativeAnswers,
logicCorrect,
creativityTotal,
creativityMaxScore,
completedAt: new Date().toISOString(),
isTimeout: true // 標記為時間到強制提交
}
localStorage.setItem("combinedTestResults", JSON.stringify(results))
console.log('✅ 強制提交結果已儲存到 localStorage')
// Upload to database with timeout flag
console.log('🔄 開始上傳強制提交結果到資料庫...')
const uploadData = {
userId: user.id,
logicScore,
creativityScore,
overallScore: combinedResult.overallScore,
level: combinedResult.level,
description: combinedResult.description,
logicBreakdown: {
correct: logicCorrect,
total: logicQuestions.length,
answers: logicAnswers
},
creativityBreakdown: {
total: creativityTotal,
maxScore: creativityMaxScore,
answers: processedCreativeAnswers
},
balanceScore: combinedResult.breakdown.balance,
completedAt: new Date().toISOString(),
isTimeout: true // 標記為時間到強制提交
}
console.log('強制提交上傳數據:', uploadData)
const uploadResponse = await fetch('/api/test-results/combined', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(uploadData)
})
console.log('📡 強制提交 API 響應狀態:', uploadResponse.status)
const uploadResult = await uploadResponse.json()
console.log('📡 強制提交 API 響應內容:', uploadResult)
if (uploadResult.success) {
console.log('✅ 強制提交結果已上傳到資料庫')
console.log('測試結果ID:', uploadResult.data.testResult.id)
} else {
console.error('❌ 強制提交上傳到資料庫失敗:', uploadResult.error)
}
// 顯示時間到提示
alert('⏰ 測試時間已到!系統已自動提交您的答案。')
router.push("/results/combined")
} catch (error) {
console.error('❌ 強制提交測驗失敗:', error)
alert('⏰ 時間到!但提交失敗,請聯繫管理員。')
} finally {
setIsSubmitting(false)
}
}
const handleSubmit = async () => {
console.log('🔍 開始提交綜合測試...')
console.log('用戶狀態:', user)
@@ -204,6 +331,7 @@ export default function CombinedTestPage() {
creativityTotal,
creativityMaxScore,
completedAt: new Date().toISOString(),
isTimeout: false // 標記為正常提交
}
localStorage.setItem("combinedTestResults", JSON.stringify(results))
@@ -229,7 +357,8 @@ export default function CombinedTestPage() {
answers: processedCreativeAnswers
},
balanceScore: combinedResult.breakdown.balance,
completedAt: new Date().toISOString()
completedAt: new Date().toISOString(),
isTimeout: false // 標記為正常提交
}
console.log('上傳數據:', uploadData)