electron-vue-exam-single/electron/db/examing.js

217 lines
8.4 KiB
JavaScript
Raw 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 { getSystemDbPath, getUserDbPath } from './path.js';
import { getDbConnection } from './index.js';
import { batchInsert } from './utils.js';
/**
* 生成考生试卷
* @param {Object} examineeData - 考生数据
* @param {number} examDuration - 考试时长(分钟)
* @returns {Promise<Object>} - 包含试卷ID和状态的对象
*/
// 变更函数入参从examDuration改为examData
export async function generateExamineePaper(examineeData, examData) {
try {
// 1. 获取数据库连接
const systemDb = await getDbConnection(getSystemDbPath());
const userDb = await getDbConnection(getUserDbPath());
// 2. 处理考生数据,将空值转换为空字符串
console.log('开始处理考生数据...');
const processedExamineeData = {
id: examineeData.id,
examinee_name: examineeData.examinee_name || '',
examinee_gender: examineeData.examinee_gender || '',
examinee_unit: examineeData.examinee_unit || '',
written_exam_room: examineeData.written_exam_room || '',
written_exam_seat: examineeData.written_exam_seat || '',
computer_exam_room: examineeData.computer_exam_room || '',
computer_exam_seat: examineeData.computer_exam_seat || '',
examinee_id_card: examineeData.examinee_id_card || '',
examinee_admission_ticket: examineeData.examinee_admission_ticket || ''
};
// 3. 在user库中添加考生数据
console.log('开始添加考生数据...');
const examineeResult = await userDb.runAsync(
`INSERT INTO examinee (
id, examinee_name, examinee_gender, examinee_unit,
written_exam_room, written_exam_seat, computer_exam_room,
computer_exam_seat, examinee_id_card, examinee_admission_ticket, created_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,
[
processedExamineeData.id,
processedExamineeData.examinee_name,
processedExamineeData.examinee_gender,
processedExamineeData.examinee_unit,
processedExamineeData.written_exam_room,
processedExamineeData.written_exam_seat,
processedExamineeData.computer_exam_room,
processedExamineeData.computer_exam_seat,
processedExamineeData.examinee_id_card,
processedExamineeData.examinee_admission_ticket
]
);
const examineeId = examineeResult.lastID || processedExamineeData.id;
console.log(`成功添加考生数据ID: ${examineeId}`);
// 3. 生成examinee_papers记录
console.log('开始生成试卷记录...');
// 使用examData中的exam_minutes和exam_minutes_min
const paperResult = await userDb.runAsync(
`INSERT INTO examinee_papers (
examinee_id, paper_minutes, paper_minuts_min, paper_status
) VALUES (?, ?, ?, ?)`,
[examineeId, examData.exam_minutes, examData.exam_minutes_min, 0] // 0表示未开始
);
const paperId = paperResult.lastID;
console.log(`成功生成试卷记录ID: ${paperId}`);
// 4. 从system库获取所有questions记录
console.log('开始获取系统题库...');
const systemQuestions = await systemDb.allAsync('SELECT * FROM questions');
console.log(`成功获取 ${systemQuestions.length} 道题目`);
// 打乱题目顺序
const shuffledQuestions = [...systemQuestions].sort(() => Math.random() - 0.5);
// 5. 准备paper_questions数据
console.log('开始准备试卷题目数据...');
const paperQuestionsData = shuffledQuestions.map(question => ({
examinee_id: examineeId,
paper_id: paperId,
question_type: question.question_type,
question_name: question.question_name,
question_description: question.question_description,
created_at: new Date().toISOString()
}));
// 创建question_id映射关系system_id -> user_id
const questionIdMap = new Map();
// 6. 插入paper_questions数据并记录映射关系
console.log('开始插入试卷题目数据...');
for (let i = 0; i < paperQuestionsData.length; i++) {
const result = await userDb.runAsync(
`INSERT INTO paper_questions (
examinee_id, paper_id, question_type,
question_name, question_description, created_at
) VALUES (?, ?, ?, ?, ?, ?)`,
[
paperQuestionsData[i].examinee_id,
paperQuestionsData[i].paper_id,
paperQuestionsData[i].question_type,
paperQuestionsData[i].question_name,
paperQuestionsData[i].question_description,
paperQuestionsData[i].created_at
]
);
questionIdMap.set(systemQuestions[i].id, result.lastID);
}
console.log(`成功插入 ${paperQuestionsData.length} 条试卷题目数据`);
// 7. 处理question_datasets表
console.log('开始处理数据集...');
const systemDatasets = await systemDb.allAsync('SELECT * FROM question_datasets');
const userDatasets = systemDatasets
.filter(dataset => questionIdMap.has(dataset.question_id))
.map(dataset => ({
question_id: questionIdMap.get(dataset.question_id),
dataset_name: dataset.dataset_name,
dataset_data: dataset.dataset_data,
created_at: new Date().toISOString()
}));
if (userDatasets.length > 0) {
await batchInsert(userDb, 'question_datasets', userDatasets);
}
console.log(`成功处理 ${userDatasets.length} 个数据集`);
// 8. 处理question_images表
console.log('开始处理图片...');
const systemImages = await systemDb.allAsync('SELECT * FROM question_images');
const userImages = systemImages
.filter(image => questionIdMap.has(image.question_id))
.map(image => ({
question_id: questionIdMap.get(image.question_id),
image_name: image.image_name,
image_base64: image.image_base64,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
}));
if (userImages.length > 0) {
await batchInsert(userDb, 'question_images', userImages);
}
console.log(`成功处理 ${userImages.length} 张图片`);
// 9. 处理question_choices表
console.log('开始处理选择题...');
const systemChoices = await systemDb.allAsync('SELECT * FROM question_choices');
let userChoices = systemChoices
.filter(choice => questionIdMap.has(choice.question_id))
.map(choice => {
// 打乱选项顺序
const options = JSON.parse(choice.choice_options);
const shuffledOptions = [...options].sort(() => Math.random() - 0.5);
return {
question_id: questionIdMap.get(choice.question_id),
choice_description: choice.choice_description,
choice_type: choice.choice_type,
choice_options: JSON.stringify(shuffledOptions),
correct_answers: choice.correct_answers,
examinee_answers: '',
score: choice.score,
score_real: 0,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
};
});
// 打乱选择题顺序
userChoices = userChoices.sort(() => Math.random() - 0.5);
if (userChoices.length > 0) {
await batchInsert(userDb, 'question_choices', userChoices);
}
console.log(`成功处理 ${userChoices.length} 道选择题`);
// 10. 处理question_fill_blanks表
console.log('开始处理填空题...');
const systemFillBlanks = await systemDb.allAsync('SELECT * FROM question_fill_blanks');
let userFillBlanks = systemFillBlanks
.filter(blank => questionIdMap.has(blank.question_id))
.map(blank => ({
question_id: questionIdMap.get(blank.question_id),
blank_description: blank.blank_description,
blank_count: blank.blank_count,
correct_answers: blank.correct_answers,
examinee_answers: '',
score: blank.score,
score_real: 0,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
}));
// 打乱填空题顺序
userFillBlanks = userFillBlanks.sort(() => Math.random() - 0.5);
if (userFillBlanks.length > 0) {
await batchInsert(userDb, 'question_fill_blanks', userFillBlanks);
}
console.log(`成功处理 ${userFillBlanks.length} 道填空题`);
// 返回成功结果
return {
success: true,
paperId,
examineeId,
message: '试卷生成成功'
};
} catch (error) {
console.error('生成试卷失败:', error);
return {
success: false,
message: `生成试卷失败: ${error.message}`
};
}
}