@@ -0,0 +1,78 @@
|
||||
server:
|
||||
port: 8101
|
||||
|
||||
spring:
|
||||
mvc:
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
jackson:
|
||||
time-zone: GMT+8
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/campus_notice?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8mb4_general_ci&serverTimezone=Asia/Shanghai
|
||||
username: root
|
||||
password: 123123
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
min-idle: 10
|
||||
max-active: 30
|
||||
#jpa
|
||||
jpa:
|
||||
database: MySQL
|
||||
show-sql: true
|
||||
hibernate:
|
||||
# 开发期使用 update 自动建表;生产环境设置成 none
|
||||
ddl-auto: update
|
||||
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||
properties:
|
||||
hibernate.order_by.default_null_ordering: last
|
||||
open-in-view: true
|
||||
|
||||
#文件上传
|
||||
servlet:
|
||||
multipart:
|
||||
max-file-size: 100MB
|
||||
max-request-size: 100MB
|
||||
|
||||
#本地关闭 rabbit
|
||||
rabbitmq:
|
||||
listener:
|
||||
direct:
|
||||
auto-startup: false
|
||||
simple:
|
||||
auto-startup: false
|
||||
|
||||
# 文件上传存储路径(Docker 部署时与 volume 挂载一致)
|
||||
file:
|
||||
upload-path: D:/data/upload
|
||||
|
||||
# 短信模块配置
|
||||
sms:
|
||||
enabled: true
|
||||
module-id: campusnotice
|
||||
|
||||
# 单点登录 / 应用间签名鉴权(基础平台 yh-auth / yh-app-auth)
|
||||
yh:
|
||||
sso:
|
||||
server-url-prefix: http://sso.yunhaixingtong.com
|
||||
client-host-url: http://localhost:8101
|
||||
allow-headers: all
|
||||
allow-origins: all
|
||||
url-pattern: /api/*
|
||||
mobi-api-pattern: /mobiapi/*
|
||||
app-auth:
|
||||
enabled: true
|
||||
# 本应用自身身份(客户端签名用)
|
||||
app-key: 100001
|
||||
app-secret: ec4e860206374c80938719fff8e14a86
|
||||
open:
|
||||
enabled: true
|
||||
base-host: http://base.yunhaixingtong.com
|
||||
user-center-url: http://base.yunhaixingtong.com/userbase
|
||||
# 班级管理(bschclass)服务基址
|
||||
bschclass: http://base.yunhaixingtong.com/userclass
|
||||
|
||||
# 通知业务配置
|
||||
notice:
|
||||
# 审批人资格组ID(用户中心组):>0 时 Submit 逐个校验被选人属于该组;
|
||||
# 0 = 仅校验用户存在(审批资格数据源待产品确认,改造方案 5.1-#5)
|
||||
approver-group-id: 0
|
||||
@@ -0,0 +1,33 @@
|
||||
spring:
|
||||
application:
|
||||
name: campusnotice
|
||||
profiles:
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
cloud:
|
||||
nacos:
|
||||
config:
|
||||
enabled: ${NACOS_CONFIG_ENABLED:false}
|
||||
server-addr: ${NACOS_ADDR:nacos.yunhaixingtong.com:8848}
|
||||
namespace: ${SPRING_CLOUD_NACOS_CONFIG_NAMESPACE:6196f0de-a28d-4894-8f10-e2982b57c6bc}
|
||||
# 应用自身配置所在分组
|
||||
group: OA_APP
|
||||
# 配置文件格式;最终主配置 dataId = ${spring.application.name}.${file-extension},即 campusnotice.yaml
|
||||
file-extension: yaml
|
||||
encode: UTF-8
|
||||
# nacos 不可达时不强制退出,回退到本地 application.yml 兜底
|
||||
fail-fast: false
|
||||
# 只读账号
|
||||
username: ${SPRING_CLOUD_NACOS_USERNAME:yh-reader}
|
||||
password: ${SPRING_CLOUD_NACOS_PASSWORD:123456}
|
||||
# 共享公共配置:public 空间下的 common.properties
|
||||
shared-configs:
|
||||
# ① 1 号(最低优先级):public 命名空间(namespace="" 固定写空字符串)的 application-default.yaml
|
||||
- data-id: application-default.yaml
|
||||
group: DEFAULT_GROUP
|
||||
namespace: "" # ⭐ 固定 = "",强制指向 Nacos "public" 命名空间,不读上面的全局 prod namespace
|
||||
refresh: false
|
||||
|
||||
# ② 2 号(中等优先级):prod 命名空间(不写 namespace = 继承顶部全局 prod namespace id)的 application-infra.yaml
|
||||
- data-id: application-infra.yaml
|
||||
group: DEFAULT_GROUP
|
||||
refresh: false
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!-- 引入 Spring Boot 默认彩色日志变量 -->
|
||||
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
|
||||
|
||||
<!-- 控制台:所有环境都有,且带颜色2 -->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
|
||||
<charset>${CONSOLE_LOG_CHARSET}</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 文件日志:只有非 local 环境才启用 -->
|
||||
<springProfile name="!local">
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>/app/logs/app.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>/app/logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<totalSizeCap>5GB</totalSizeCap>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
</springProfile>
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<springProfile name="!local">
|
||||
<appender-ref ref="FILE" />
|
||||
</springProfile>
|
||||
</root>
|
||||
</configuration>
|
||||
@@ -0,0 +1,16 @@
|
||||
-- ============================================================
|
||||
-- notice 表补 sch_id 列(多租户隔离)
|
||||
-- 决策 D3:发布时从 BoaUser.currentRole.schId 填充,查询时按校过滤
|
||||
--
|
||||
-- 对应实体:Notice.schId / NoticeRepository 多租户统计方法
|
||||
--
|
||||
-- 执行方式:由 DBA 手动在对应环境执行,AI 不代跑
|
||||
-- MySQL 5.7+ 兼容
|
||||
-- ============================================================
|
||||
|
||||
-- 1) 加列
|
||||
ALTER TABLE `notice`
|
||||
ADD COLUMN `sch_id` INT NULL COMMENT '学校ID(多租户隔离:发布时从当前用户角色填充)';
|
||||
|
||||
-- 2) 加索引(用于按学校过滤查询)
|
||||
CREATE INDEX `idx_notice_sch_id` ON `notice` (`sch_id`);
|
||||
@@ -0,0 +1,59 @@
|
||||
-- =====================================================================
|
||||
-- 审批人存储改造:登录账号 → 教师ID(用户中心用户ID / 教师树叶子节点ID)
|
||||
-- 涉及三张表:notice / notice_approval / notice_approver_memory
|
||||
-- 开发环境 ddl-auto=update 只会「加新列」不会「改名/迁移数据」,
|
||||
-- 生产环境由 DBA 手工执行本脚本;开发环境也可直接执行(幂等性见各段注释)。
|
||||
-- 注意:账号 → 教师ID 无法在 SQL 层换算(需查用户中心),存量快照按「清空 + 重提」处理。
|
||||
-- =====================================================================
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 0. 前置确认:存量待审批(status=2)通知
|
||||
-- 旧快照为账号数组 ["a","b"],改ID后无法识别审批人,需退回草稿重提。
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 核查(有返回则执行下方 UPDATE):
|
||||
-- SELECT id, title, approver_accounts FROM notice WHERE status = 2;
|
||||
-- 旧待审批通知退回草稿(发布人重新选教师提交):
|
||||
-- UPDATE notice SET status = 0 WHERE status = 2;
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 1. notice 主表:approver_accounts → approver_tea_ids
|
||||
-- ---------------------------------------------------------------------
|
||||
ALTER TABLE notice
|
||||
CHANGE COLUMN approver_accounts approver_tea_ids LONGTEXT NULL
|
||||
COMMENT '审批人快照 JSON 教师ID数组 [101,102](提交审批时从教师树选定,或签)';
|
||||
-- 存量账号格式快照清空(按教师ID重提后自动重建):
|
||||
UPDATE notice SET approver_tea_ids = NULL WHERE approver_tea_ids IS NOT NULL;
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 2. notice_approval:assignees([{account,name}])→ assignee_tea_ids([101,102])
|
||||
-- 仅提交行(action=1)有值;历史轨迹行清空后时间线不再展示该轮审批人姓名,可接受。
|
||||
-- ---------------------------------------------------------------------
|
||||
ALTER TABLE notice_approval
|
||||
CHANGE COLUMN assignees assignee_tea_ids LONGTEXT NULL
|
||||
COMMENT '仅 action=1 提交行:选定审批教师ID快照 JSON [101,102]';
|
||||
UPDATE notice_approval SET assignee_tea_ids = NULL WHERE assignee_tea_ids IS NOT NULL;
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 3. notice_approver_memory:账号记忆 → 教师ID记忆(表结构变化大,直接重建)
|
||||
-- ---------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS notice_approver_memory;
|
||||
CREATE TABLE notice_approver_memory (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
create_time DATETIME NULL,
|
||||
update_time DATETIME NULL,
|
||||
create_by VARCHAR(64) NULL,
|
||||
update_by VARCHAR(64) NULL,
|
||||
sch_id INT NOT NULL COMMENT '学校ID',
|
||||
publisher_tea_id INT NOT NULL COMMENT '发布人教师ID(用户中心用户ID)',
|
||||
approver_tea_ids LONGTEXT NULL COMMENT '最近一次所选审批教师ID JSON [101,102]',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_approver_memory_sch_publisher (sch_id, publisher_tea_id)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '审批人记忆表(发布人最近一次所选审批教师)';
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 回滚参考(仅结构,数据不可恢复):
|
||||
-- ALTER TABLE notice CHANGE COLUMN approver_tea_ids approver_accounts LONGTEXT NULL;
|
||||
-- ALTER TABLE notice_approval CHANGE COLUMN assignee_tea_ids assignees LONGTEXT NULL;
|
||||
-- DROP TABLE IF EXISTS notice_approver_memory;
|
||||
-- (旧表结构见 notice_publish_flow.sql 第 1/2 节与原 notice_approver_memory 建表)
|
||||
-- ---------------------------------------------------------------------
|
||||
@@ -0,0 +1,159 @@
|
||||
-- ============================================================
|
||||
-- 存量数据回填脚本
|
||||
-- 1. notice.sch_id:按发布人所属学校回填(从 sys_user_role_rel 取 main=1 的 sch_id)
|
||||
-- 2. notice_receiver:从 notice.receive_list JSON 字符串展开为关联表行
|
||||
--
|
||||
-- 幂等设计:可重复执行,已存在的数据不会重复插入
|
||||
-- 执行方式:由 DBA 手动在对应环境执行,AI 不代跑
|
||||
-- MySQL 5.7+ 兼容
|
||||
-- ============================================================
|
||||
|
||||
-- ============================================================
|
||||
-- Part 1:回填 notice.sch_id
|
||||
-- ============================================================
|
||||
|
||||
-- 方式一:如果 base_user / sys_user 表有 sch_id 字段,直接关联回填
|
||||
-- 注意:需根据实际平台库表结构调整关联条件
|
||||
UPDATE `notice` n
|
||||
INNER JOIN (
|
||||
SELECT DISTINCT u.login_name, u.sch_id
|
||||
FROM base_user u
|
||||
WHERE u.sch_id IS NOT NULL
|
||||
) t ON n.publisher_account = t.login_name
|
||||
SET n.sch_id = t.sch_id
|
||||
WHERE n.sch_id IS NULL
|
||||
AND n.publisher_account IS NOT NULL
|
||||
AND n.publisher_account != '';
|
||||
|
||||
-- 方式二(备用):如果用户学校关系在 sys_user_role_rel 表
|
||||
-- 取每个用户的主身份学校(is_main=1),回填 sch_id
|
||||
-- 取消注释后执行(视实际库表结构选用)
|
||||
--
|
||||
-- UPDATE `notice` n
|
||||
-- INNER JOIN (
|
||||
-- SELECT r.account, r.sch_id
|
||||
-- FROM sys_user_role_rel r
|
||||
-- WHERE r.is_main = 1
|
||||
-- AND r.sch_id IS NOT NULL
|
||||
-- ) t ON n.publisher_account = t.account
|
||||
-- SET n.sch_id = t.sch_id
|
||||
-- WHERE n.sch_id IS NULL
|
||||
-- AND n.publisher_account IS NOT NULL
|
||||
-- AND n.publisher_account != '';
|
||||
|
||||
|
||||
-- ============================================================
|
||||
-- Part 2:从 notice.receive_list 展开到 notice_receiver 关联表
|
||||
-- ============================================================
|
||||
|
||||
-- 说明:
|
||||
-- - notice.receive_list 存储格式有两种:
|
||||
-- 1) "ALL"(全员通知)—— 不写明细行,跳过
|
||||
-- 2) JSON 数组 ["account1","account2",...] 或逗号分隔串
|
||||
-- - 本脚本使用 MySQL JSON 函数解析(MySQL 5.7+ 支持 JSON_EXTRACT)
|
||||
-- - 对于非标准 JSON 格式(逗号分隔串),使用循环逐条插入
|
||||
-- - 幂等:每次插入前先删除该通知的旧接收人记录
|
||||
|
||||
-- 注意:MySQL 5.7 的 JSON_TABLE 不可用,这里用存储过程逐条解析
|
||||
-- 如果 receive_list 是标准 JSON 数组格式,可以直接用 JSON_EXTRACT
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
-- 存储过程:展开单个通知的接收人列表
|
||||
DROP PROCEDURE IF EXISTS `expand_notice_receivers`$$
|
||||
CREATE PROCEDURE `expand_notice_receivers`()
|
||||
BEGIN
|
||||
DECLARE v_done INT DEFAULT 0;
|
||||
DECLARE v_notice_id INT;
|
||||
DECLARE v_receive_list TEXT;
|
||||
DECLARE cur CURSOR FOR
|
||||
SELECT id, receive_list
|
||||
FROM notice
|
||||
WHERE receive_list IS NOT NULL
|
||||
AND TRIM(receive_list) != ''
|
||||
AND UPPER(TRIM(receive_list)) != 'ALL'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM notice_receiver WHERE notice_id = notice.id LIMIT 1
|
||||
);
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
|
||||
|
||||
OPEN cur;
|
||||
read_loop: LOOP
|
||||
FETCH cur INTO v_notice_id, v_receive_list;
|
||||
IF v_done = 1 THEN
|
||||
LEAVE read_loop;
|
||||
END IF;
|
||||
|
||||
-- 清理旧数据(幂等)
|
||||
DELETE FROM notice_receiver WHERE notice_id = v_notice_id;
|
||||
|
||||
-- 尝试 JSON 数组解析
|
||||
-- receive_list 格式: ["account1","account2"] 或 account1,account2
|
||||
SET v_receive_list = TRIM(v_receive_list);
|
||||
|
||||
-- 去除首尾方括号(如有)
|
||||
IF LEFT(v_receive_list, 1) = '[' AND RIGHT(v_receive_list, 1) = ']' THEN
|
||||
SET v_receive_list = SUBSTRING(v_receive_list, 2, CHAR_LENGTH(v_receive_list) - 2);
|
||||
END IF;
|
||||
|
||||
-- 替换引号为空,按逗号分隔
|
||||
SET v_receive_list = REPLACE(REPLACE(v_receive_list, '"', ''), '''', '');
|
||||
|
||||
-- 逐条插入
|
||||
-- 简单实现:用 FIND_IN_SET 不适用于变量,改用临时表
|
||||
BEGIN
|
||||
DECLARE v_pos INT DEFAULT 1;
|
||||
DECLARE v_account VARCHAR(64);
|
||||
DECLARE v_remaining TEXT;
|
||||
SET v_remaining = v_receive_list;
|
||||
|
||||
WHILE v_remaining IS NOT NULL AND TRIM(v_remaining) != '' DO
|
||||
IF LOCATE(',', v_remaining) > 0 THEN
|
||||
SET v_account = TRIM(SUBSTRING_INDEX(v_remaining, ',', 1));
|
||||
SET v_remaining = SUBSTRING(v_remaining, LOCATE(',', v_remaining) + 1);
|
||||
ELSE
|
||||
SET v_account = TRIM(v_remaining);
|
||||
SET v_remaining = NULL;
|
||||
END IF;
|
||||
|
||||
IF v_account != '' AND v_account IS NOT NULL THEN
|
||||
INSERT INTO notice_receiver (notice_id, account, receive_type, create_time)
|
||||
VALUES (v_notice_id, v_account, 1, NOW());
|
||||
END IF;
|
||||
END WHILE;
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
CLOSE cur;
|
||||
END$$
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
-- 执行存储过程
|
||||
CALL expand_notice_receivers();
|
||||
|
||||
-- 清理临时存储过程
|
||||
DROP PROCEDURE IF EXISTS `expand_notice_receivers`;
|
||||
|
||||
-- ============================================================
|
||||
-- 回填结果验证查询(执行后手动检查)
|
||||
-- ============================================================
|
||||
|
||||
-- 检查1:sch_id 回填覆盖率
|
||||
-- SELECT
|
||||
-- COUNT(*) AS total,
|
||||
-- SUM(CASE WHEN sch_id IS NOT NULL THEN 1 ELSE 0 END) AS sch_id_filled,
|
||||
-- SUM(CASE WHEN sch_id IS NULL THEN 1 ELSE 0 END) AS sch_id_null
|
||||
-- FROM notice;
|
||||
|
||||
-- 检查2:notice_receiver 展开行数
|
||||
-- SELECT COUNT(*) FROM notice_receiver;
|
||||
|
||||
-- 检查3:未展开的通知(receive_list 非空非 ALL 但 receiver 表无记录)
|
||||
-- SELECT n.id, n.receive_list
|
||||
-- FROM notice n
|
||||
-- LEFT JOIN notice_receiver r ON r.notice_id = n.id
|
||||
-- WHERE n.receive_list IS NOT NULL
|
||||
-- AND TRIM(n.receive_list) != ''
|
||||
-- AND UPPER(TRIM(n.receive_list)) != 'ALL'
|
||||
-- AND r.id IS NULL;
|
||||
@@ -0,0 +1,109 @@
|
||||
-- =====================================================================
|
||||
-- 通知公告「新版发布表单」改造 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;
|
||||
@@ -0,0 +1,24 @@
|
||||
-- ============================================================
|
||||
-- notice_receiver 建表(替代 notice.receive_list JSON 字符串存储)
|
||||
-- 决策 D2-B:拆关联表,支撑阅读情况/催收/统计 SQL 化
|
||||
--
|
||||
-- 对应实体:com.yunhai.campusnotice.entity.NoticeReceiver
|
||||
-- 索引:idx_notice_id(notice_id) + idx_account(account)
|
||||
--
|
||||
-- 执行方式:由 DBA 手动在对应环境执行,AI 不代跑
|
||||
-- MySQL 5.7+ 兼容
|
||||
-- ============================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `notice_receiver` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT COMMENT '自增主键',
|
||||
`notice_id` INT NOT NULL COMMENT '通知ID(关联 notice.id)',
|
||||
`account` VARCHAR(64) NOT NULL COMMENT '接收人登录账号',
|
||||
`receive_type` INT NOT NULL DEFAULT 1 COMMENT '接收类型:1 接收 / 2 抄送',
|
||||
`create_by` VARCHAR(64) NULL COMMENT '创建人登录账号(审计填充)',
|
||||
`create_time` DATETIME NULL COMMENT '创建时间(审计填充)',
|
||||
`update_by` VARCHAR(64) NULL COMMENT '更新人登录账号(审计填充)',
|
||||
`update_time` DATETIME NULL COMMENT '更新时间(审计填充)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_notice_id` (`notice_id`),
|
||||
KEY `idx_account` (`account`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知接收人关联表';
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user