Files
hr-assessment-system/lib/database/models/combined_test_result.ts

167 lines
5.4 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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('✅ 已清空所有綜合測試結果')
}