'use strict'; /** * 023 - 综合大题题库表 big_questions * * 背景(2026-09-21 需求变更) * 中职组 / 高职组取消「Word 文件上传题」,改为从题库随机抽取一道大题在线作答; * 大题含「文字描述 + 富文本表格」,下设三小问,每小问 10 分,大题总分 30 分。 * * 隔离原则(硬约束:除本次功能外不得影响其他功能) * 本表为**新增隔离表**,不改动任何现有表结构与既有客观题链路 * (choice_questions / judge_questions / zhongzhi_submissions / gaozhi_submissions * 以及本科/教师组 benke_submissions / jiaoshi_submissions 全部零改动)。 * * 环境说明 * 目标库为 MariaDB 5.5.68,**不支持 JSON 列类型**,故富文本 / 序列化数据一律用 * TEXT / MEDIUMTEXT 存储;亦不支持 DATETIME 的 DEFAULT CURRENT_TIMESTAMP, * 时间戳列交由应用层(Sequelize timestamps)写入,与既有表(word_questions 等)一致。 */ module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('big_questions', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false, comment: '大题ID', }, question_uid: { type: Sequelize.STRING(64), allowNull: false, comment: '大题稳定标识(全局唯一,形如 big_12)', }, group: { type: Sequelize.STRING(20), allowNull: false, comment: '组别:zhongzhi/gaozhi', }, title: { type: Sequelize.STRING(200), allowNull: false, comment: '大题标题', }, description: { type: Sequelize.TEXT('medium'), allowNull: true, comment: '题干富文本 HTML(含表格)', }, sub_prompt_1: { type: Sequelize.TEXT, allowNull: true, comment: '第1小问题干', }, sub_prompt_2: { type: Sequelize.TEXT, allowNull: true, comment: '第2小问题干', }, sub_prompt_3: { type: Sequelize.TEXT, allowNull: true, comment: '第3小问题干', }, score_per_sub: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 10, comment: '每小题分值', }, total_score: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 30, comment: '大题总分', }, sort_order: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: '排序', }, status: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 1, comment: '状态:1=启用(参与抽题),0=停用', }, created_at: { type: Sequelize.DATE, allowNull: true, comment: '创建时间', }, updated_at: { type: Sequelize.DATE, allowNull: true, comment: '更新时间', }, }).then(() => { return Promise.all([ queryInterface.addIndex('big_questions', ['question_uid'], { name: 'uk_big_question_uid', unique: true }), queryInterface.addIndex('big_questions', ['group', 'status', 'sort_order'], { name: 'idx_big_q_group_status' }), ]); }); }, down: async (queryInterface) => { await queryInterface.dropTable('big_questions'); }, };