Files
competition-website/database/migrations/020-add-question-type-to-submissions.js
WorkBuddy a303cf2d53 chore: 后端首次基线提交
运行必须源码:app/(controller/model/service/middleware/lib/utils/validate/router)、config/、database/(migrations/seeders/sql)、启动脚本、app/public/templates 模板。
已忽略运行非必须:node_modules/、logs/、run/、app/public 运行时上传数据、.env*、构建/缓存产物。
2026-08-17 12:25:42 +08:00

41 lines
1.8 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.
'use strict';
/**
* 迁移 020:为 zhongzhi_submissions / gaozhi_submissions 增加 question_type 列
*
* 背景(Bug #11 / B11):选择题(choice_questions)与判断题(judge_questions)的 id
* 在不同表中数值重叠(如 choice#5 与 judge#5 均为 5),原 saveAnswers 仅按
* (aggregation_uid, question_uid) 查找并 upsert,导致同 id 的选择题与判断题被
* 折叠成一条记录,考生作答数少于抽题数、部分答案静默丢失。
*
* 修复:新增 question_type 列(choice/judge),与 question_uid 联合唯一标识一道题;
* service.saveAnswers 的查找/写入键改为 (aggregation_uid, question_uid, question_type);
* autoScore 判分不受影响(其本就按 question_type 选模型 + 用原始 id 作主键)。
*/
module.exports = {
up: async (queryInterface, Sequelize) => {
const addCol = async (table) => {
await queryInterface.addColumn(table, 'question_type', {
type: Sequelize.STRING(16),
allowNull: false,
defaultValue: '',
comment: '题型:choice/judge,与 question_uid 联合区分题目',
});
await queryInterface.addIndex(
table,
['aggregation_uid', 'question_uid', 'question_type'],
{ name: `idx_${table}_agg_qtype` }
);
};
await addCol('zhongzhi_submissions');
await addCol('gaozhi_submissions');
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeIndex('zhongzhi_submissions', 'idx_zhongzhi_submissions_agg_qtype');
await queryInterface.removeColumn('zhongzhi_submissions', 'question_type');
await queryInterface.removeIndex('gaozhi_submissions', 'idx_gaozhi_submissions_agg_qtype');
await queryInterface.removeColumn('gaozhi_submissions', 'question_type');
},
};