217 lines
8.4 KiB
JavaScript
217 lines
8.4 KiB
JavaScript
// 导入必要的模块和函数
|
||
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}`
|
||
};
|
||
}
|
||
} |