Bläddra i källkod

fix(db): guide_popup引导弹窗表迁移333-336并入runSystemMigrations无条件执行 + getValue缓存null防护

Xiaogang Liao 2 dagar sedan
förälder
incheckning
69cd3eee37

+ 83 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -11039,6 +11039,89 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
             log.warn("迁移328: 补充照片语音字段失败: {}", e.getMessage());
         }
 
+        // 迁移333-336: 引导弹窗配置表(guide_popup 系列,原远程版本误置于 seedGutFloraFingerprints 早返回之后,
+        // 现并入 runSystemMigrations 无条件执行;编号 333-336 为本地迁移329(task_orchestration)以后的续号)
+        // 迁移333: 创建 guide_popup 表(弹窗引导页配置化管理)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_popup (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', " +
+                    "slug VARCHAR(64) NOT NULL UNIQUE COMMENT '唯一标识', " +
+                    "title VARCHAR(128) NOT NULL DEFAULT '' COMMENT '弹窗标题', " +
+                    "description TEXT COMMENT '主描述文案', " +
+                    "icon VARCHAR(256) NOT NULL DEFAULT '' COMMENT '图标:emoji或图片URL', " +
+                    "icon_type TINYINT NOT NULL DEFAULT 0 COMMENT '图标类型:0=emoji 1=图片', " +
+                    "theme_color VARCHAR(20) NOT NULL DEFAULT '#F97316' COMMENT '主题色', " +
+                    "btn_text VARCHAR(64) NOT NULL DEFAULT '知道了' COMMENT '按钮文案', " +
+                    "btn_action VARCHAR(256) NOT NULL DEFAULT '' COMMENT '点击跳转路径,空=关闭', " +
+                    "status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0=禁用 1=启用', " +
+                    "sort_order INT NOT NULL DEFAULT 0 COMMENT '排序优先级', " +
+                    "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', " +
+                    "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', " +
+                    "INDEX idx_status_sort (status, sort_order)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='引导弹窗配置表'");
+            log.info("迁移333: 已创建 guide_popup 表");
+        } catch (Exception e) {
+            log.warn("guide_popup 表可能已存在: {}", e.getMessage());
+        }
+
+        // 迁移334: 创建 guide_popup_step 表(引导弹窗步骤)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_popup_step (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', " +
+                    "popup_id BIGINT NOT NULL COMMENT '关联 guide_popup.id', " +
+                    "step_order INT NOT NULL DEFAULT 0 COMMENT '步骤顺序', " +
+                    "title VARCHAR(128) NOT NULL DEFAULT '' COMMENT '步骤标题', " +
+                    "desc TEXT COMMENT '步骤描述', " +
+                    "icon VARCHAR(256) NOT NULL DEFAULT '' COMMENT '步骤图标', " +
+                    "icon_type TINYINT NOT NULL DEFAULT 0 COMMENT '图标类型:0=emoji 1=图片', " +
+                    "is_intro TINYINT NOT NULL DEFAULT 0 COMMENT '是否为开场身份定义页', " +
+                    "btn_text VARCHAR(64) NOT NULL DEFAULT '下一步' COMMENT '本步骤按钮文案', " +
+                    "btn_action VARCHAR(256) NOT NULL DEFAULT '' COMMENT '最后一步跳转链接', " +
+                    "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', " +
+                    "INDEX idx_popup_order (popup_id, step_order)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='引导弹窗步骤表'");
+            log.info("迁移334: 已创建 guide_popup_step 表");
+        } catch (Exception e) {
+            log.warn("guide_popup_step 表可能已存在: {}", e.getMessage());
+        }
+
+        // 迁移335: 创建 guide_popup_trigger 表(引导弹窗触发条件)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_popup_trigger (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', " +
+                    "popup_id BIGINT NOT NULL COMMENT '关联 guide_popup.id', " +
+                    "trigger_type VARCHAR(32) NOT NULL COMMENT '触发类型:page_enter/task_complete/assessment_done/first_login/daily_active/role_change', " +
+                    "target_page VARCHAR(128) DEFAULT '' COMMENT '目标页面路径', " +
+                    "target_action VARCHAR(128) DEFAULT '' COMMENT '触发行为标识', " +
+                    "min_role VARCHAR(32) DEFAULT 'parent' COMMENT '最低角色要求', " +
+                    "extra_config JSON DEFAULT NULL COMMENT '扩展条件', " +
+                    "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', " +
+                    "INDEX idx_popup_trigger (popup_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='引导弹窗触发条件表'");
+            log.info("迁移335: 已创建 guide_popup_trigger 表");
+        } catch (Exception e) {
+            log.warn("guide_popup_trigger 表可能已存在: {}", e.getMessage());
+        }
+
+        // 迁移336: 创建 guide_popup_log 表(引导弹窗用户消费记录)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_popup_log (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', " +
+                    "popup_id BIGINT NOT NULL COMMENT '关联 guide_popup.id', " +
+                    "user_id BIGINT NOT NULL COMMENT '用户ID users.id', " +
+                    "member_id BIGINT DEFAULT NULL COMMENT '家庭成员ID family_members.id', " +
+                    "role VARCHAR(32) NOT NULL COMMENT '弹出时所在角色', " +
+                    "consumed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '消费时间', " +
+                    "button_clicked TINYINT NOT NULL DEFAULT 0 COMMENT '是否点击按钮', " +
+                    "INDEX idx_user_popup (user_id, popup_id), " +
+                    "INDEX idx_consume_time (consumed_at)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='引导弹窗用户消费记录表'");
+            log.info("迁移336: 已创建 guide_popup_log 表");
+        } catch (Exception e) {
+            log.warn("guide_popup_log 表可能已存在: {}", e.getMessage());
+        }
+
+
 
         // 迁移323: 注册素质测评A2报告类型(dan家族)+ 默认指纹规则
         // 统一上传后指纹识别为 dan_a2 → ReportCollectService 按 report_type_registry.family=dan 分流走 DAN 采集管道