|
@@ -11039,6 +11039,89 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
log.warn("迁移328: 补充照片语音字段失败: {}", e.getMessage());
|
|
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家族)+ 默认指纹规则
|
|
// 迁移323: 注册素质测评A2报告类型(dan家族)+ 默认指纹规则
|
|
|
// 统一上传后指纹识别为 dan_a2 → ReportCollectService 按 report_type_registry.family=dan 分流走 DAN 采集管道
|
|
// 统一上传后指纹识别为 dan_a2 → ReportCollectService 按 report_type_registry.family=dan 分流走 DAN 采集管道
|