Просмотр исходного кода

fix(db): 迁移290 批量补齐12表33列真实缺列(防Unknown column)+ auto bump

Xiaogang Liao 2 недель назад
Родитель
Сommit
c3e3a94675

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

@@ -10268,5 +10268,59 @@ public class DatabaseInitializer implements CommandLineRunner {
         // 迁移289: health_reports 补 report_format 列(HealthReport 实体已含字段,但从未迁移至 DB,全字段 SELECT 报 Unknown column)
         ensureColumn("health_reports", "report_format",
                 "VARCHAR(32) DEFAULT NULL COMMENT '报告格式: pdf/image'");
+
+        // 迁移290: 批量补齐实体已含但 DB 从未迁移的真实缺列(全字段 SELECT 防 Unknown column)
+        // 审计核实:以下列不在任何历史 ADD COLUMN/ensureColumn 中,属真实缺口
+        // 涉及 12 表 33 列(food_nutrients 命名问题单列迁移291;articles/health_reports 等解析后无缺口)
+        ensureColumn("activities", "visibility", "VARCHAR(20) DEFAULT NULL COMMENT 'visibility'");
+        ensureColumn("activities", "visible_to", "TEXT DEFAULT NULL COMMENT 'visibleTo'");
+        ensureColumn("blood_type_pairing", "blood_type1", "VARCHAR(255) DEFAULT NULL COMMENT 'bloodType1'");
+        ensureColumn("blood_type_pairing", "blood_type2", "VARCHAR(255) DEFAULT NULL COMMENT 'bloodType2'");
+        ensureColumn("dan_knowledge_base", "file_url", "VARCHAR(500) DEFAULT NULL COMMENT 'fileUrl'");
+        ensureColumn("dan_knowledge_base", "file_name", "VARCHAR(255) DEFAULT NULL COMMENT 'fileName'");
+        ensureColumn("dan_knowledge_base", "source_url", "VARCHAR(500) DEFAULT NULL COMMENT 'sourceUrl'");
+        ensureColumn("dan_knowledge_base", "source_type", "VARCHAR(20) DEFAULT NULL COMMENT 'sourceType'");
+        ensureColumn("distribution_relations", "invite_code", "VARCHAR(64) DEFAULT NULL COMMENT 'inviteCode'");
+        ensureColumn("family_members", "birth_hour", "VARCHAR(20) DEFAULT NULL COMMENT 'birthHour'");
+        ensureColumn("family_members", "birth_weight", "INT DEFAULT NULL COMMENT 'birthWeight'");
+        ensureColumn("family_members", "birth_place", "VARCHAR(255) DEFAULT NULL COMMENT 'birthPlace'");
+        ensureColumn("family_members", "is_cesarean", "INT DEFAULT NULL COMMENT 'isCesarean'");
+        ensureColumn("food_recommend_idx", "index_score", "INT DEFAULT NULL COMMENT 'indexScore'");
+        ensureColumn("health_indicators", "symptoms", "VARCHAR(2000) DEFAULT NULL COMMENT 'symptoms'");
+        ensureColumn("numsoul_config", "keywords", "VARCHAR(2000) DEFAULT NULL COMMENT 'keywords'");
+        ensureColumn("numsoul_detail_config", "keywords", "VARCHAR(2000) DEFAULT NULL COMMENT 'keywords'");
+        ensureColumn("product_orders", "tracking_number", "VARCHAR(100) DEFAULT NULL COMMENT 'trackingNumber'");
+        ensureColumn("product_orders", "express_company", "VARCHAR(100) DEFAULT NULL COMMENT 'expressCompany'");
+        ensureColumn("product_orders", "delivery_method", "INT DEFAULT NULL COMMENT 'deliveryMethod'");
+        ensureColumn("product_orders", "pickup_code", "VARCHAR(64) DEFAULT NULL COMMENT 'pickupCode'");
+        ensureColumn("product_orders", "confirm_time", "DATETIME DEFAULT NULL COMMENT 'confirmTime'");
+        ensureColumn("product_orders", "refund_status", "INT DEFAULT NULL COMMENT 'refundStatus'");
+        ensureColumn("product_orders", "refund_reason", "VARCHAR(255) DEFAULT NULL COMMENT 'refundReason'");
+        ensureColumn("product_orders", "refund_amount", "INT DEFAULT NULL COMMENT 'refundAmount'");
+        ensureColumn("product_orders", "refund_time", "DATETIME DEFAULT NULL COMMENT 'refundTime'");
+        ensureColumn("promotion_tier_config", "min_team_size", "INT DEFAULT NULL COMMENT 'minTeamSize'");
+        ensureColumn("promotion_tier_config", "min_referral_earnings", "INT DEFAULT NULL COMMENT 'minReferralEarnings'");
+        ensureColumn("promotion_tier_config", "min_share_earnings", "INT DEFAULT NULL COMMENT 'minShareEarnings'");
+        ensureColumn("promotion_tier_config", "profit_share_percent", "INT DEFAULT NULL COMMENT 'profitSharePercent'");
+        ensureColumn("promotion_tier_config", "enabled", "INT DEFAULT NULL COMMENT 'enabled'");
+        ensureColumn("zodiac_pairing", "zodiac_code1", "VARCHAR(255) DEFAULT NULL COMMENT 'zodiacCode1'");
+        ensureColumn("zodiac_pairing", "zodiac_code2", "VARCHAR(255) DEFAULT NULL COMMENT 'zodiacCode2'");
+        log.info("已补齐真实缺列 (迁移290, 12表33列)");
+
+        // 迁移291: food_nutrients 列名对齐(amount_per_100g -> amount_per100g)
+        // FoodNutrient 实体字段 amountPer100g 经 MyBatis-Plus camel->snake 映射为 amount_per100g,
+        // 但建表 SQL 误用 amount_per_100g,导致实体全字段 SELECT 报 Unknown column 'amount_per100g'。
+        // 当前 FoodNutrientMapper 无 Service 调用,属潜在隐患;此处统一列名为 amount_per100g。
+        try {
+            Integer cnt = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() " +
+                    "AND TABLE_NAME = 'food_nutrients' AND COLUMN_NAME = 'amount_per_100g'", Integer.class);
+            if (cnt != null && cnt > 0) {
+                jdbcTemplate.execute("ALTER TABLE food_nutrients CHANGE COLUMN amount_per_100g amount_per100g DECIMAL(10,4) NOT NULL COMMENT '每100g含量'");
+                log.info("已重命名 food_nutrients.amount_per_100g -> amount_per100g");
+            }
+        } catch (Exception e) {
+            // 表不存在或列不存在,忽略
+        }
     }
 }

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-bb083b137c2f6954acb764caf62dbc9c5d1b0c4d
+92be8c04e6922e77f71630db19bf44ea383f0f6c

+ 6 - 0
cfc-web/public/CHANGELOG-v1.0.md

@@ -37,6 +37,12 @@
 - health_reports 补 report_format 列(迁移289)+ auto bump
 
 
+## v1.0.1284 (2026-09-03)
+
+### Bug 修复
+- health_reports 补 report_format 列(迁移289)+ auto bump
+
+
 ## v1.0.1284 (2026-09-03)
 
 ### 新功能

+ 6 - 0
cfc-web/public/CHANGELOG.md

@@ -41,6 +41,12 @@
 - health_reports 补 report_format 列(迁移289)+ auto bump
 
 
+## v1.0.1284 (2026-09-03)
+
+### Bug 修复
+- health_reports 补 report_format 列(迁移289)+ auto bump
+
+
 ## v1.0.1284 (2026-09-03)
 
 ### 新功能