Explorar el Código

fix: 改进ensureColumn错误处理+添加迁移104/103验证日志

- ensureColumn失败时从warn改为error级别,确保运维能看到迁移失败
- 添加迁移完成后验证查询,通过information_schema确认列是否存在
- 若列缺失会在启动日志中打出error,替代原来静默忽略
Xiaogang Liao hace 1 mes
padre
commit
4722397b5c

+ 28 - 24
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -2654,12 +2654,12 @@ log.info("已添加template_id列到tasks表");
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS bazi_reading_template (" +
                     "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
                     "element VARCHAR(20) NOT NULL COMMENT '五行: wood/fire/earth/metal/water', " +
-                    "condition VARCHAR(20) NOT NULL COMMENT '状态: strong/weak/balanced', " +
+                    "`condition` VARCHAR(20) NOT NULL COMMENT '状态: strong/weak/balanced', " +
                     "personal_trait TEXT COMMENT '性格特质描述', " +
                     "mind_growth_advice TEXT COMMENT '心理成长建议', " +
                     "daily_tip_template TEXT COMMENT '每日宜忌模板', " +
                     "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "UNIQUE KEY uk_element_condition (element, condition)" +
+                    "UNIQUE KEY uk_element_condition (element, `condition`)" +
                     ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='五行命理解读模板'");
             log.info("已创建 bazi_reading_template 表");
         } catch (Exception e) {
@@ -2687,7 +2687,7 @@ log.info("已添加template_id列到tasks表");
                 "SELECT COUNT(*) FROM bazi_reading_template", Integer.class);
             if (count == null || count == 0) {
                 jdbcTemplate.batchUpdate(
-                    "INSERT INTO bazi_reading_template (element, condition, personal_trait, mind_growth_advice, daily_tip_template) VALUES (?, ?, ?, ?, ?)",
+                    "INSERT INTO bazi_reading_template (element, `condition`, personal_trait, mind_growth_advice, daily_tip_template) VALUES (?, ?, ?, ?, ?)",
                     java.util.Arrays.asList(new Object[][]{
                         {"wood", "strong", "性格坚韧、有进取心,具有领导力和开拓精神", "学会适当放松,避免过刚易折,培养弹性思维", "宜进行伸展运动,忌高强度冲突"},
                         {"wood", "weak", "温和有礼、善于合作,但决策时容易犹豫", "增强自信心训练,培养果断决策能力", "宜与自然相处,忌过度迁就他人"},
@@ -3124,7 +3124,7 @@ log.info("已添加template_id列到tasks表");
         // supply_settlements.remark
         modifyColumnToText("supply_settlements", "remark", "备注");
         // content_sections.description
-        modifyColumnToText("content_sections", "description", "描述说明");
+        ensureColumn("content_sections", "description", "TEXT COMMENT '描述说明'");
         // education_systems.description
         modifyColumnToText("education_systems", "description", "描述");
         // dimension_config.description
@@ -4226,18 +4226,7 @@ try {
         // 迁移36: family_members表添加generation + is_spouse列(辈分重构)
         ensureColumn("family_members", "generation", "INT COMMENT '辈分值(0=家庭创建者,+n=向上n代,-n=向下n代)'");
         ensureColumn("family_members", "is_spouse", "TINYINT(1) DEFAULT 0 COMMENT '是否配偶(同辈)'");
-
-        // 迁移37: 旧数据generation赋值(基于relationship_type映射)
-        try {
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0, is_spouse = 1 WHERE relationship_type = 'spouse'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 1 WHERE relationship_type = 'parent'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = -1 WHERE relationship_type IN ('child')");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE relationship_type = 'sibling'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE generation IS NULL AND relationship_type IS NOT NULL");
-            log.info("已迁移family_members.generation数据");
-        } catch (Exception e) {
-            log.warn("迁移family_members.generation数据失败: {}", e.getMessage());
-        }
+        // 迁移37: relationship_type列已删除,旧数据已迁移完成
 
         // 迁移38: product_orders表添加points_used/points_cost/money_amount列(混合支付支持)
         ensureColumn("product_orders", "points_used", "INT DEFAULT 0 COMMENT '使用的积分数量'");
@@ -4324,13 +4313,8 @@ try {
             log.warn("创建supply_settlement_detail表失败: {}", e.getMessage());
         }
 
-        // 迁移40: 添加supplier_admin角色到users.role ENUM
-        try {
-            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent','child','teacher','supplier_admin') NOT NULL DEFAULT 'parent' COMMENT '当前活跃角色'");
-            log.info("已添加supplier_admin到users.role ENUM");
-        } catch (Exception e) {
-            log.warn("添加supplier_admin到users.role ENUM失败: {}", e.getMessage());
-        }
+        // 迁移40: 添加supplier_admin角色到users.role(列已为VARCHAR,直接可用)
+        // 当前role列为VARCHAR(20),无需ALTER ENUM
 
         // 迁移40: users表添加mascot字段(AI助手形象: xibao浠宝/fubao福宝)
         ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI助手形象: xibao(浠宝)/fubao(福宝)'");
@@ -4678,7 +4662,7 @@ try {
             if (e.getMessage() != null && e.getMessage().contains("Duplicate column")) {
                 log.info("列 {}.{} 已存在,跳过", table, column);
             } else {
-                log.warn("添加列 {}.{} 失败: {}", table, column, e.getMessage());
+                log.error("添加列 {}.{} 失败: {}", table, column, e.getMessage());
             }
         }
     }
@@ -6244,6 +6228,26 @@ try {
         ensureColumn("tianpan_daily_fortune", "mood_emoji", "VARCHAR(10) COMMENT '心情emoji'");
         ensureColumn("tianpan_daily_fortune", "mood_text", "VARCHAR(50) COMMENT '心情文本'");
         ensureColumn("tianpan_daily_fortune", "weekly_tip", "TEXT COMMENT '每周提示'");
+
+        // 验证迁移104: 确认tianpan_daily_fortune关键列存在
+        try {
+            jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tianpan_daily_fortune' AND COLUMN_NAME='fortune_level_text'",
+                Integer.class);
+            log.info("验证通过: tianpan_daily_fortune.fortune_level_text 列存在");
+        } catch (Exception e) {
+            log.error("验证失败: tianpan_daily_fortune.fortune_level_text 列仍然不存在,迁移可能失败: {}", e.getMessage());
+        }
+
+        // 验证迁移103: 确认products.min_quantity列存在
+        try {
+            jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='products' AND COLUMN_NAME='min_quantity'",
+                Integer.class);
+            log.info("验证通过: products.min_quantity 列存在");
+        } catch (Exception e) {
+            log.error("验证失败: products.min_quantity 列仍然不存在,迁移可能失败: {}", e.getMessage());
+        }
     }
 
     private void runMigration93() {