-- ===================================================================== -- 通知公告「新版发布表单」改造 DDL(改造方案.md,2026-09) -- 开发环境 ddl-auto=update 自动生效;生产环境由 DBA 手工执行本脚本。 -- 幂等性注意:MySQL 8.0 可用 IF NOT EXISTS 的 CREATE TABLE; -- ALTER TABLE ADD COLUMN 不支持 IF NOT EXISTS,重复执行前请先核查列是否已存在。 -- ===================================================================== -- --------------------------------------------------------------------- -- 0. 前置核查:存量 status=2 脏数据(改造方案 七-2) -- .NET 原系统「已发布=2」迁移时已归一化为 1,但需 DBA 核实确认; -- 新状态机中 2=待审批,若存量存在 status=2 需先归一化为 1。 -- --------------------------------------------------------------------- -- 核查(预期返回 0 行): -- SELECT id, title, status FROM notice WHERE status NOT IN (0, 1); -- 若有返回,归一化: -- UPDATE notice SET status = 1 WHERE status = 2; -- --------------------------------------------------------------------- -- 1. notice 主表加列(改造方案 2.1) -- --------------------------------------------------------------------- ALTER TABLE notice ADD COLUMN receipt_flag TINYINT NOT NULL DEFAULT 0 COMMENT '是否需要学员阅读回执:0 否 / 1 是', ADD COLUMN approver_accounts LONGTEXT NULL COMMENT '审批人快照 JSON 账号数组(提交审批时选定,或签)', ADD COLUMN timing_published TINYINT NOT NULL DEFAULT 0 COMMENT '定时发送已真正发布标记:0 未触发 / 1 已真实发布'; -- --------------------------------------------------------------------- -- 2. notice_receiver 学员身份快照列 + receive_type 语义扩展(改造方案 2.3) -- receive_type 原语义「1 接收 / 2 抄送」,其中 2 从未写入过数据,直接重定义: -- 1 教师(存量语义,无需迁移)/ 2 学员(推送范围解析快照) -- --------------------------------------------------------------------- ALTER TABLE notice_receiver ADD COLUMN stu_name VARCHAR(64) NULL COMMENT '学员姓名快照', ADD COLUMN grade_id INT NULL COMMENT '年级ID快照', ADD COLUMN grade_name VARCHAR(128) NULL COMMENT '年级名称快照', ADD COLUMN class_id INT NULL COMMENT '班级ID快照(sch_class.class_id)', ADD COLUMN class_name VARCHAR(128) NULL COMMENT '班级名称快照'; -- 圈人/可见性查询走 (notice_id, account) 命中,现有 idx_notice_id / idx_account 已覆盖。 -- --------------------------------------------------------------------- -- 3. notice_read 阅读身份快照列(改造方案 2.3) -- --------------------------------------------------------------------- ALTER TABLE notice_read ADD COLUMN sch_id INT NULL COMMENT '学校ID(取通知 sch_id)', ADD COLUMN grade_id INT NULL COMMENT '年级ID快照', ADD COLUMN grade_name VARCHAR(128) NULL COMMENT '年级名称快照', ADD COLUMN class_id INT NULL COMMENT '班级ID快照', ADD COLUMN class_name VARCHAR(128) NULL COMMENT '班级名称快照'; -- --------------------------------------------------------------------- -- 4. 推送范围表(改造方案 2.2) -- --------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS notice_push_scope ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键', notice_id INT NOT NULL COMMENT '通知ID(关联 notice.id)', scope_type INT NOT NULL COMMENT '范围类型:1 全校 / 2 学部 / 3 年级 / 4 班级 / 5 训练队 / 6 指定学员', scope_id INT NULL COMMENT '组织节点ID:学部=学制ID、年级=gradeId、班级=class_id、学员=stuId', scope_name VARCHAR(128) NULL COMMENT '快照名称(如"初二年级")', create_by VARCHAR(255) NULL COMMENT '创建人', create_time DATETIME NULL COMMENT '创建时间', update_by VARCHAR(255) NULL COMMENT '更新人', update_time DATETIME NULL COMMENT '更新时间', KEY idx_push_scope_notice (notice_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '通知推送范围(快照语义)'; -- --------------------------------------------------------------------- -- 5. 审批记录表(改造方案 2.4) -- --------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS notice_approval ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键', notice_id INT NOT NULL COMMENT '通知ID(关联 notice.id)', action INT NOT NULL COMMENT '审批动作:1 提交审批 / 2 通过 / 3 驳回', operator_account VARCHAR(64) NULL COMMENT '操作人账号', operator_name VARCHAR(64) NULL COMMENT '操作人姓名', opinion VARCHAR(1000) NULL COMMENT '审批意见', assignees LONGTEXT NULL COMMENT '仅提交行使用:审批人快照 JSON [{account,name}]', action_time DATETIME NULL COMMENT '操作时间', create_by VARCHAR(255) NULL COMMENT '创建人', create_time DATETIME NULL COMMENT '创建时间', update_by VARCHAR(255) NULL COMMENT '更新人', update_time DATETIME NULL COMMENT '更新时间', KEY idx_approval_notice (notice_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '通知审批记录(全量轨迹,驳回重提保留历史轮次)'; -- --------------------------------------------------------------------- -- 6. 审批人记忆表(改造方案 2.5) -- --------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS notice_approver_memory ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键', sch_id INT NOT NULL COMMENT '学校ID(多租户隔离)', publisher_account VARCHAR(64) NOT NULL COMMENT '发布人账号(按人记忆)', approver_accounts LONGTEXT NULL COMMENT '最近一次所选审批人账号 JSON ["a","b"]', approver_names LONGTEXT NULL COMMENT '对应姓名快照 JSON(回显免二次查询)', create_by VARCHAR(255) NULL COMMENT '创建人', create_time DATETIME NULL COMMENT '创建时间', update_by VARCHAR(255) NULL COMMENT '更新人', update_time DATETIME NULL COMMENT '更新时间', UNIQUE KEY uk_approver_memory_sch_publisher (sch_id, publisher_account) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '审批人记忆(学校+发布人粒度,Submit 覆盖更新)'; -- --------------------------------------------------------------------- -- 7. 回滚参考(如需回退改造) -- --------------------------------------------------------------------- -- ALTER TABLE notice DROP COLUMN receipt_flag, DROP COLUMN approver_accounts, DROP COLUMN timing_published; -- ALTER TABLE notice_receiver DROP COLUMN stu_name, DROP COLUMN grade_id, DROP COLUMN grade_name, DROP COLUMN class_id, DROP COLUMN class_name; -- ALTER TABLE notice_read DROP COLUMN sch_id, DROP COLUMN grade_id, DROP COLUMN grade_name, DROP COLUMN class_id, DROP COLUMN class_name; -- DROP TABLE IF EXISTS notice_push_scope; -- DROP TABLE IF EXISTS notice_approval; -- DROP TABLE IF EXISTS notice_approver_memory;