實作綜合題型結果與資料庫整合

This commit is contained in:
2025-09-29 17:24:31 +08:00
parent a3b46b4430
commit f6610013ef
21 changed files with 1341 additions and 92 deletions

View File

@@ -5,6 +5,7 @@ import { createCreativeQuestionsTable } from './models/creative_question'
import { createTestResultsTable } from './models/test_result'
import { createLogicTestAnswersTable } from './models/logic_test_answer'
import { createCreativeTestAnswersTable } from './models/creative_test_answer'
import { createCombinedTestResultsTable } from './models/combined_test_result'
// 初始化資料庫
export async function initializeDatabase(): Promise<boolean> {
@@ -36,6 +37,9 @@ export async function initializeDatabase(): Promise<boolean> {
// 建立創意測驗答案表
await createCreativeTestAnswersTable()
// 建立綜合測試結果表
await createCombinedTestResultsTable()
console.log('✅ 資料庫初始化完成')
return true
} catch (error) {

View File

@@ -0,0 +1,166 @@
import { executeQuery, executeQueryOne } from '../connection'
import { v4 as uuidv4 } from 'uuid'
export interface CombinedTestResult {
id: string
user_id: string
logic_score: number
creativity_score: number
overall_score: number
level: string
description: string | null
logic_breakdown: any | null // JSON 格式
creativity_breakdown: any | null // JSON 格式
balance_score: number
completed_at: string
created_at?: string
}
export interface CreateCombinedTestResultData {
user_id: string
logic_score: number
creativity_score: number
overall_score: number
level: string
description: string | null
logic_breakdown: any | null
creativity_breakdown: any | null
balance_score: number
completed_at: string
}
// 建立綜合測試結果表(如果不存在)
export async function createCombinedTestResultsTable(): Promise<void> {
const createTableQuery = `
CREATE TABLE IF NOT EXISTS combined_test_results (
id VARCHAR(50) PRIMARY KEY,
user_id VARCHAR(50) NOT NULL,
logic_score INT NOT NULL,
creativity_score INT NOT NULL,
overall_score INT NOT NULL,
level VARCHAR(50) NOT NULL,
description TEXT NULL,
logic_breakdown JSON NULL,
creativity_breakdown JSON NULL,
balance_score INT NOT NULL,
completed_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_completed_at (completed_at)
)
`
await executeQuery(createTableQuery)
console.log('✅ 綜合測試結果表建立成功')
}
// 建立新的綜合測試結果
export async function createCombinedTestResult(resultData: CreateCombinedTestResultData): Promise<CombinedTestResult | null> {
const id = `combined_${Date.now()}_${uuidv4().substring(0, 9)}`
const insertQuery = `
INSERT INTO combined_test_results (
id, user_id, logic_score, creativity_score, overall_score,
level, description, logic_breakdown, creativity_breakdown,
balance_score, completed_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`
const values = [
id,
resultData.user_id,
resultData.logic_score,
resultData.creativity_score,
resultData.overall_score,
resultData.level,
resultData.description,
resultData.logic_breakdown ? JSON.stringify(resultData.logic_breakdown) : null,
resultData.creativity_breakdown ? JSON.stringify(resultData.creativity_breakdown) : null,
resultData.balance_score,
resultData.completed_at
]
try {
await executeQuery(insertQuery, values)
console.log('✅ 綜合測試結果建立成功ID:', id)
// 獲取剛建立的記錄
return await getCombinedTestResultById(id)
} catch (error) {
console.error('建立綜合測試結果失敗:', error)
throw error
}
}
// 根據ID獲取綜合測試結果
export async function getCombinedTestResultById(id: string): Promise<CombinedTestResult | null> {
try {
const query = 'SELECT * FROM combined_test_results WHERE id = ?'
const result = await executeQueryOne<CombinedTestResult>(query, [id])
if (result) {
// 解析 JSON 欄位
if (result.logic_breakdown && typeof result.logic_breakdown === 'string') {
result.logic_breakdown = JSON.parse(result.logic_breakdown)
}
if (result.creativity_breakdown && typeof result.creativity_breakdown === 'string') {
result.creativity_breakdown = JSON.parse(result.creativity_breakdown)
}
}
return result
} catch (error) {
console.error('獲取綜合測試結果失敗:', error)
return null
}
}
// 根據用戶ID獲取所有綜合測試結果
export async function getCombinedTestResultsByUserId(userId: string): Promise<CombinedTestResult[]> {
try {
const query = 'SELECT * FROM combined_test_results WHERE user_id = ? ORDER BY completed_at DESC'
const results = await executeQuery<CombinedTestResult>(query, [userId])
// 解析 JSON 欄位
return results.map(result => {
if (result.logic_breakdown && typeof result.logic_breakdown === 'string') {
result.logic_breakdown = JSON.parse(result.logic_breakdown)
}
if (result.creativity_breakdown && typeof result.creativity_breakdown === 'string') {
result.creativity_breakdown = JSON.parse(result.creativity_breakdown)
}
return result
})
} catch (error) {
console.error('獲取用戶綜合測試結果失敗:', error)
return []
}
}
// 獲取所有綜合測試結果
export async function getAllCombinedTestResults(): Promise<CombinedTestResult[]> {
try {
const query = 'SELECT * FROM combined_test_results ORDER BY completed_at DESC'
const results = await executeQuery<CombinedTestResult>(query)
// 解析 JSON 欄位
return results.map(result => {
if (result.logic_breakdown && typeof result.logic_breakdown === 'string') {
result.logic_breakdown = JSON.parse(result.logic_breakdown)
}
if (result.creativity_breakdown && typeof result.creativity_breakdown === 'string') {
result.creativity_breakdown = JSON.parse(result.creativity_breakdown)
}
return result
})
} catch (error) {
console.error('獲取所有綜合測試結果失敗:', error)
return []
}
}
// 清空所有綜合測試結果
export async function clearCombinedTestResults(): Promise<void> {
await executeQuery('DELETE FROM combined_test_results')
console.log('✅ 已清空所有綜合測試結果')
}