Przeglądaj źródła

feat: 迁移270-272 创建先天画像三张新表(来源权重/报告缓存/数字能量配置)

Xiaogang Liao 2 miesięcy temu
rodzic
commit
457ce33e0b

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

@@ -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. 审核中心改为分组,归集:服务角色申请审核/活动审核/待退款管理/收益提现审核

+ 45 - 0
cfc-backend/src/main/resources/schema.sql

@@ -5214,3 +5214,48 @@ CREATE TABLE IF NOT EXISTS challenge_progress (
     INDEX idx_member_id (member_id),
     UNIQUE KEY uk_member_task (member_id, task_key, week_num)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- =============================================
+-- 先天画像体系(迁移270-272)
+-- =============================================
+
+-- 先天画像来源权重配置表
+CREATE TABLE IF NOT EXISTS innate_portrait_config (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    source_type VARCHAR(20) NOT NULL COMMENT '来源: zodiac/bazi/blood/numsoul',
+    source_name VARCHAR(50) NOT NULL COMMENT '来源名称',
+    weight INT DEFAULT 25 COMMENT '权重(基点,2500=25%)',
+    enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用',
+    ai_enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用AI解读',
+    sort_order INT DEFAULT 0 COMMENT '排序',
+    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='先天画像来源权重配置';
+
+-- 先天画像报告缓存表
+CREATE TABLE IF NOT EXISTS innate_portrait_report (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT NOT NULL COMMENT '成员ID',
+    member_type VARCHAR(10) NOT NULL COMMENT '成员类型: child/parent',
+    family_id BIGINT NOT NULL COMMENT '家庭ID',
+    portrait_json TEXT COMMENT '先天画像数据JSON',
+    ai_reading TEXT COMMENT 'AI解读文案',
+    generated_at DATETIME COMMENT '生成时间',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    UNIQUE KEY uk_member (member_id, member_type)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='先天画像报告缓存';
+
+-- 数字能量详细配置表
+CREATE TABLE IF NOT EXISTS numsoul_detail_config (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    number_type VARCHAR(20) NOT NULL COMMENT '类型: life_path/talent/birthday/destiny',
+    number_value INT NOT NULL COMMENT '数字值 1-9 或主数 11/22/33',
+    title VARCHAR(50) COMMENT '称号',
+    keywords VARCHAR(200) COMMENT '性格关键词',
+    mind_base INT DEFAULT 0 COMMENT '心先天基础分(百分位)',
+    mind_advice TEXT COMMENT '心维度成长建议',
+    color_hex VARCHAR(10) COMMENT '代表色',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    UNIQUE KEY uk_type_num (number_type, number_value)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字能量详细配置';