diff --git a/api/controllers/quizController.ts b/api/controllers/quizController.ts index f5ea83f..cb823fc 100644 --- a/api/controllers/quizController.ts +++ b/api/controllers/quizController.ts @@ -163,12 +163,24 @@ export class QuizController { const result = await QuizModel.submitQuiz({ userId, answers: processedAnswers }); if (subjectId || taskId) { + let finalSubjectId: string | null = subjectId || null; + const finalTaskId: string | null = taskId || null; + + // 任务考试场景下,如果前端未传subjectId,则从任务中反查 + if (!finalSubjectId && finalTaskId) { + const { ExamTaskModel } = await import('../models/examTask'); + const task = await ExamTaskModel.findById(finalTaskId); + if (task?.subjectId) { + finalSubjectId = task.subjectId; + } + } + const sql = ` UPDATE quiz_records SET subject_id = ?, task_id = ? WHERE id = ? `; - await import('../database').then(({ run }) => run(sql, [subjectId || null, taskId || null, result.record.id])); + await import('../database').then(({ run }) => run(sql, [finalSubjectId, finalTaskId, result.record.id])); } res.json({ diff --git a/api/models/quiz.ts b/api/models/quiz.ts index d925e3e..07571b9 100644 --- a/api/models/quiz.ts +++ b/api/models/quiz.ts @@ -140,11 +140,13 @@ export class QuizModel { const recordsSql = ` SELECT r.id, r.user_id as userId, r.total_score as totalScore, r.correct_count as correctCount, r.total_count as totalCount, r.score_percentage as scorePercentage, r.status, r.created_at as createdAt, - r.subject_id as subjectId, s.name as subjectName, + COALESCE(r.subject_id, t.subject_id) as subjectId, + COALESCE(s.name, ts.name) as subjectName, r.task_id as taskId, t.name as taskName FROM quiz_records r - LEFT JOIN exam_subjects s ON r.subject_id = s.id LEFT JOIN exam_tasks t ON r.task_id = t.id + LEFT JOIN exam_subjects s ON r.subject_id = s.id + LEFT JOIN exam_subjects ts ON t.subject_id = ts.id WHERE r.user_id = ? ORDER BY r.created_at DESC LIMIT ? OFFSET ? @@ -169,11 +171,16 @@ export class QuizModel { SELECT r.id, r.user_id as userId, u.name as userName, u.phone as userPhone, r.total_score as totalScore, r.correct_count as correctCount, r.total_count as totalCount, r.score_percentage as scorePercentage, r.status, - r.created_at as createdAt, r.subject_id as subjectId, s.name as subjectName, - r.task_id as taskId + r.created_at as createdAt, + COALESCE(r.subject_id, t.subject_id) as subjectId, + COALESCE(s.name, ts.name) as subjectName, + r.task_id as taskId, + t.name as taskName FROM quiz_records r JOIN users u ON r.user_id = u.id + LEFT JOIN exam_tasks t ON r.task_id = t.id LEFT JOIN exam_subjects s ON r.subject_id = s.id + LEFT JOIN exam_subjects ts ON t.subject_id = ts.id ORDER BY r.created_at DESC LIMIT ? OFFSET ? `; diff --git a/data/survey.db b/data/survey.db index 7b37a2b..b43fe6d 100644 Binary files a/data/survey.db and b/data/survey.db differ diff --git a/package.json b/package.json index bd745a5..56ae8d3 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build": "tsc && vite build", "preview": "vite preview", "start": "node dist/api/server.js", - "test": "node --import tsx --test test/admin-task-stats.test.ts test/question-text-import.test.ts test/swipe-detect.test.ts test/user-tasks.test.ts", + "test": "node --import tsx --test test/admin-task-stats.test.ts test/question-text-import.test.ts test/swipe-detect.test.ts test/user-tasks.test.ts test/user-records-subjectname.test.ts", "check": "tsc --noEmit" }, "dependencies": { diff --git a/src/layouts/AdminLayout.tsx b/src/layouts/AdminLayout.tsx index eb595b2..c13337a 100644 --- a/src/layouts/AdminLayout.tsx +++ b/src/layouts/AdminLayout.tsx @@ -128,7 +128,7 @@ const AdminLayout = ({ children }: { children: React.ReactNode }) => {