|
|
@@ -3154,6 +3154,96 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
log.warn("sleep_record 时间列修改失败(可能已为 TIME): {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
+ // ==================== 迁移270: 先天画像来源权重配置表 ====================
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS innate_portrait_config (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "source_type VARCHAR(20) NOT NULL," +
|
|
|
+ "source_name VARCHAR(50) NOT NULL," +
|
|
|
+ "weight INT DEFAULT 25," +
|
|
|
+ "enabled TINYINT(1) DEFAULT 1," +
|
|
|
+ "ai_enabled TINYINT(1) DEFAULT 1," +
|
|
|
+ "sort_order INT DEFAULT 0," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "UNIQUE KEY uk_source (source_type)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='先天画像来源权重配置'");
|
|
|
+ Integer cnt = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM innate_portrait_config", Integer.class);
|
|
|
+ if (cnt == null || cnt == 0) {
|
|
|
+ jdbcTemplate.batchUpdate(
|
|
|
+ "INSERT INTO innate_portrait_config (source_type, source_name, weight, sort_order) VALUES (?, ?, ?, ?)",
|
|
|
+ java.util.Arrays.asList(new Object[][]{
|
|
|
+ {"zodiac", "星座", 2500, 1},
|
|
|
+ {"bazi", "八字", 2500, 2},
|
|
|
+ {"blood", "血型", 2500, 3},
|
|
|
+ {"numsoul", "数字能量", 2500, 4},
|
|
|
+ })
|
|
|
+ );
|
|
|
+ log.info("迁移270: innate_portrait_config 种子数据已加载 (4条)");
|
|
|
+ }
|
|
|
+ log.info("迁移270: innate_portrait_config 表创建完成");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移270失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 迁移271: 先天画像报告缓存表 ====================
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS innate_portrait_report (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "member_id BIGINT NOT NULL," +
|
|
|
+ "member_type VARCHAR(10) NOT NULL," +
|
|
|
+ "family_id BIGINT NOT NULL," +
|
|
|
+ "portrait_json TEXT," +
|
|
|
+ "ai_reading TEXT," +
|
|
|
+ "generated_at DATETIME," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "UNIQUE KEY uk_member (member_id, member_type)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='先天画像报告缓存'");
|
|
|
+ log.info("迁移271: innate_portrait_report 表创建完成");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移271失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 迁移272: 数字能量详细配置表 ====================
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS numsoul_detail_config (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "number_type VARCHAR(20) NOT NULL," +
|
|
|
+ "number_value INT NOT NULL," +
|
|
|
+ "title VARCHAR(50)," +
|
|
|
+ "keywords VARCHAR(200)," +
|
|
|
+ "mind_base INT DEFAULT 0," +
|
|
|
+ "mind_advice TEXT," +
|
|
|
+ "color_hex VARCHAR(10)," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "UNIQUE KEY uk_type_num (number_type, number_value)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字能量详细配置'");
|
|
|
+ Integer cnt2 = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM numsoul_detail_config", Integer.class);
|
|
|
+ if (cnt2 == null || cnt2 == 0) {
|
|
|
+ jdbcTemplate.batchUpdate(
|
|
|
+ "INSERT INTO numsoul_detail_config (number_type, number_value, title, keywords, mind_base, mind_advice, color_hex) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
|
+ java.util.Arrays.asList(new Object[][]{
|
|
|
+ {"life_path", 1, "开创者", "独立、领导、创新", 68, "培养团队协作意识,避免独断专行", "#FF4444"},
|
|
|
+ {"life_path", 2, "和平者", "温和、合作、敏感", 72, "增强自我主张,避免过度迎合", "#FF8C00"},
|
|
|
+ {"life_path", 3, "表达者", "创意、社交、乐观", 78, "保持专注,避免浅尝辄止", "#FFD700"},
|
|
|
+ {"life_path", 4, "建设者", "务实、稳定、有序", 70, "学会变通,避免过于固执", "#4CAF50"},
|
|
|
+ {"life_path", 5, "自由者", "冒险、变化、好奇", 75, "培养持久力,避免缺乏恒心", "#2196F3"},
|
|
|
+ {"life_path", 6, "关怀者", "责任、关爱、奉献", 80, "学会自我关爱,避免过度付出", "#9C27B0"},
|
|
|
+ {"life_path", 7, "探索者", "智慧、分析、内省", 76, "与人分享见解,避免过度封闭", "#673AB7"},
|
|
|
+ {"life_path", 8, "成就者", "雄心、管理、决策", 72, "关注内在成长,避免过度追求外在", "#3F51B5"},
|
|
|
+ {"life_path", 9, "博爱者", "包容、智慧、善良", 82, "设定个人边界,避免过度牺牲", "#E91E63"},
|
|
|
+ {"life_path", 11, "启明者", "直觉、灵感、理想", 85, "落地执行,避免空想", "#7C4DFF"},
|
|
|
+ {"life_path", 22, "建造师", "远见、实践、宏图", 88, "分步落地大目标", "#536DFE"},
|
|
|
+ {"life_path", 33, "引路人", "大爱、奉献、疗愈", 90, "先照顾好自己再照亮他人", "#FF4081"},
|
|
|
+ })
|
|
|
+ );
|
|
|
+ log.info("迁移272: numsoul_detail_config 生命灵数种子已加载");
|
|
|
+ }
|
|
|
+ log.info("迁移272: numsoul_detail_config 表创建完成");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移272失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
private void migrateHealthDimensionsTable() {
|
|
|
@@ -9408,6 +9498,8 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
|
|
|
// 迁移267: 方案中心菜单(插在家庭运营与任务中心之间)
|
|
|
migratePlanCenterMenu();
|
|
|
+ // 迁移268: coupon 表添加 status 列(优惠券停用/启用)
|
|
|
+ migrateCouponStatus();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -9468,6 +9560,19 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 迁移268: coupon 表添加 status 列(优惠券停用/启用,幂等)
|
|
|
+ * 存量数据 status 为 NULL,查询层按 ACTIVE 处理,不影响现有券。
|
|
|
+ */
|
|
|
+ private void migrateCouponStatus() {
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE coupon ADD COLUMN status VARCHAR(16) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE=启用/DISABLED=停用'");
|
|
|
+ log.info("迁移268: 已为 coupon 表添加 status 列");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 迁移249: 存量库 sys_menu 菜单归类调整 + 权限点拆分(幂等,按 path/title 定位)
|
|
|
* 1. 审核中心改为分组,归集:服务角色申请审核/活动审核/待退款管理/收益提现审核
|