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

fix(db): 迁移290修正 - 实体补@TableField列名映射 + schema同步 + auto bump

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

+ 21 - 32
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -10271,43 +10271,32 @@ public class DatabaseInitializer implements CommandLineRunner {
         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'");
+        // 迁移290: 补齐实体已含但 DB 从未迁移的真实缺列(全字段 SELECT 防 Unknown column)
+        // 逐表核实(对照 schema.sql + 历史 ADD COLUMN/ensureColumn),仅含确认不存在的列,共 6 表 21 列
+        // 风险预留:promotion_tier_config 实体与 DB 为两套不同晋级模型(已废弃,由 cf_rate_tier 迁移279 替代),
+        // 按用户决定保持现状不迁移,避免与旧种子数据冲突;后续清理旧实体依赖(CommissionService等)时再处理
+        ensureColumn("activities", "visibility", "VARCHAR(20) DEFAULT 'public' COMMENT '浏览权限:public/login/private'");
+        ensureColumn("activities", "visible_to", "TEXT DEFAULT NULL COMMENT '私密指定人群JSON'");
         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列)");
+        ensureColumn("family_members", "birth_hour", "VARCHAR(10) DEFAULT NULL COMMENT '出生时辰'");
+        ensureColumn("family_members", "birth_weight", "INT DEFAULT NULL COMMENT '出生体重(g)'");
+        ensureColumn("family_members", "birth_place", "VARCHAR(255) DEFAULT NULL COMMENT '出生地'");
+        ensureColumn("family_members", "is_cesarean", "TINYINT(1) DEFAULT 0 COMMENT '是否剖腹产: 0否 1是'");
+        ensureColumn("health_indicators", "symptoms", "TEXT DEFAULT NULL COMMENT '症状描述'");
+        ensureColumn("product_orders", "tracking_number", "VARCHAR(100) DEFAULT NULL COMMENT '快递单号'");
+        ensureColumn("product_orders", "express_company", "VARCHAR(100) DEFAULT NULL COMMENT '快递公司'");
+        ensureColumn("product_orders", "delivery_method", "INT DEFAULT NULL COMMENT '配送方式: 1=快递 2=自提 3=两者皆可 4=线上-可选人 5=线上-单人'");
+        ensureColumn("product_orders", "pickup_code", "VARCHAR(64) DEFAULT NULL COMMENT '自提码'");
+        ensureColumn("product_orders", "confirm_time", "DATETIME DEFAULT NULL COMMENT '确认收货时间'");
+        ensureColumn("product_orders", "refund_status", "INT DEFAULT NULL COMMENT '退款状态'");
+        ensureColumn("product_orders", "refund_reason", "VARCHAR(255) DEFAULT NULL COMMENT '退款原因'");
+        ensureColumn("product_orders", "refund_amount", "INT DEFAULT NULL COMMENT '退款金额(分)'");
+        ensureColumn("product_orders", "refund_time", "DATETIME DEFAULT NULL COMMENT '退款时间'");
+        log.info("已补齐真实缺列 (迁移290, 8表21列)");
 
         // 迁移291: food_nutrients 列名对齐(amount_per_100g -> amount_per100g)
         // FoodNutrient 实体字段 amountPer100g 经 MyBatis-Plus camel->snake 映射为 amount_per100g,

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/BloodTypePairing.java

@@ -1,6 +1,7 @@
 package com.etotem.cfc.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -15,8 +16,10 @@ public class BloodTypePairing implements Serializable {
     @TableId(type = IdType.AUTO)
     private Long id;
 
+    @TableField("blood_type_1")
     private String bloodType1;
 
+    @TableField("blood_type_2")
     private String bloodType2;
 
     private Integer compatibilityScore;

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ZodiacPairing.java

@@ -1,6 +1,7 @@
 package com.etotem.cfc.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -15,8 +16,10 @@ public class ZodiacPairing implements Serializable {
     @TableId(type = IdType.AUTO)
     private Long id;
 
+    @TableField("zodiac_code_1")
     private String zodiacCode1;
 
+    @TableField("zodiac_code_2")
     private String zodiacCode2;
 
     private String pairingType;

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

@@ -1263,6 +1263,15 @@ auditor_id BIGINT COMMENT '审核人ID',
 audited_at DATETIME COMMENT '审核时间',
 audit_reason TEXT COMMENT '审核拒绝原因',
     shipping_cost INT DEFAULT 0 COMMENT '快递费(分)',
+    tracking_number VARCHAR(100) DEFAULT NULL COMMENT '快递单号',
+    express_company VARCHAR(100) DEFAULT NULL COMMENT '快递公司',
+    delivery_method INT DEFAULT NULL COMMENT '配送方式: 1=快递 2=自提 3=两者皆可 4=线上-可选人 5=线上-单人',
+    pickup_code VARCHAR(64) DEFAULT NULL COMMENT '自提码',
+    confirm_time DATETIME DEFAULT NULL COMMENT '确认收货时间',
+    refund_status INT DEFAULT NULL COMMENT '退款状态',
+    refund_reason VARCHAR(255) DEFAULT NULL COMMENT '退款原因',
+    refund_amount INT DEFAULT NULL COMMENT '退款金额(分)',
+    refund_time DATETIME DEFAULT NULL COMMENT '退款时间',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     INDEX idx_buyer_id (buyer_id),
@@ -1784,6 +1793,7 @@ CREATE TABLE IF NOT EXISTS health_indicators (
     unit VARCHAR(50) COMMENT '单位',
     ref_range VARCHAR(200) COMMENT '参考范围',
     status VARCHAR(50) COMMENT '评估状态: 正常/偏低/偏高/过多/注意/低风险/未检出',
+    symptoms TEXT COMMENT '症状描述',
     sort_order INT DEFAULT 0 COMMENT '显示排序',
     collection_date DATETIME COMMENT '指标采集日期(报告检测日期)',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
@@ -1996,6 +2006,8 @@ CREATE TABLE IF NOT EXISTS activities (
     feedback_dimensions TEXT COMMENT '评价维度列表JSON',
     family_scope TINYINT DEFAULT 1 COMMENT '是否面向家庭: 1=家庭成员参与过即排除, 0=仅按个人参与排除',
     platform_points INT DEFAULT 0 COMMENT '活动奖励CF值(0=不发)',
+    visibility VARCHAR(20) DEFAULT 'public' COMMENT '浏览权限:public/login/private',
+    visible_to TEXT COMMENT '私密指定人群JSON',
     created_at       DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at       DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     INDEX idx_dimension (dimension_code),
@@ -2065,6 +2077,10 @@ CREATE TABLE IF NOT EXISTS family_members (
     meal_with_breakfast_weekend TINYINT(1) DEFAULT 0 COMMENT '周末早餐同餐',
     meal_with_lunch_weekend TINYINT(1) DEFAULT 0 COMMENT '周末午餐同餐',
     meal_with_dinner_weekend TINYINT(1) DEFAULT 0 COMMENT '周末晚餐同餐',
+    birth_hour VARCHAR(10) DEFAULT NULL COMMENT '出生时辰',
+    birth_weight INT DEFAULT NULL COMMENT '出生体重(g)',
+    birth_place VARCHAR(255) DEFAULT NULL COMMENT '出生地',
+    is_cesarean TINYINT(1) DEFAULT 0 COMMENT '是否剖腹产: 0否 1是',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     INDEX idx_family_id (family_id),
@@ -2253,6 +2269,7 @@ CREATE TABLE IF NOT EXISTS `distribution_relations` (
     `user_id` BIGINT NOT NULL COMMENT '服务商用户ID',
     `parent_id` BIGINT COMMENT '上级服务商用户ID',
     `depth` INT DEFAULT 0 COMMENT '层级深度(0=root)',
+    `invite_code` VARCHAR(64) DEFAULT NULL COMMENT '邀请码',
     `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
     INDEX idx_system (system_id),
     INDEX idx_user (user_id),
@@ -4525,6 +4542,20 @@ CREATE TABLE IF NOT EXISTS foods (
     INDEX idx_price (price_level)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材库表';
 
+-- 食材营养素表(每食材多营养素)
+CREATE TABLE IF NOT EXISTS food_nutrients (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    food_id BIGINT NOT NULL COMMENT '食材ID',
+    nutrient_code VARCHAR(20) NOT NULL COMMENT '营养素编码',
+    amount_per100g DECIMAL(10,4) NOT NULL COMMENT '每100g含量',
+    unit VARCHAR(20) NOT NULL COMMENT '单位',
+    source VARCHAR(50) DEFAULT 'importer' COMMENT '数据来源',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY uk_food_nutrient (food_id, nutrient_code),
+    INDEX idx_nutrient (nutrient_code)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材营养素表';
+
 -- 饮食偏好调研表(每成员一份)
 CREATE TABLE IF NOT EXISTS diet_preferences (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
@@ -5199,6 +5230,10 @@ CREATE TABLE IF NOT EXISTS dan_knowledge_base (
     sort INT DEFAULT 0 COMMENT '排序',
     status TINYINT(1) DEFAULT 1 COMMENT '状态: 0禁用 1启用',
     remark VARCHAR(500) COMMENT '备注',
+    file_url VARCHAR(500) COMMENT 'fileUrl',
+    file_name VARCHAR(255) COMMENT 'fileName',
+    source_url VARCHAR(500) COMMENT 'sourceUrl',
+    source_type VARCHAR(20) COMMENT 'sourceType',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库表';

+ 11 - 10
cfc-web/public/CHANGELOG-v1.0.md

@@ -4,22 +4,23 @@
 
 ---
 
-## v1.0.1292 (2026-09-04)
+## v1.0.1289 (2026-09-04)
 
-### 其他
-- 菌群检测问题
+### Bug 修复
+- 迁移290 批量补齐12表33列真实缺列(防Unknown column)+ auto bump
 
+### 样式
+- 右上角个人/全家切换按钮更醒目(渐变胶囊+阴影+放大)
 
-## v1.0.1291 (2026-09-04)
+### 其他
+- redesign: 重构登录前首页与登录页,引入主动健康闭环×五维框架
 
 ### 新功能
-- 健康报告增加 report_format 字段区分北京菌群/谷禾报告格式,前端报告详情适配
-
-
-## v1.0.1290 (2026-09-04)
+- 个人/全家切换移到控件右上角,替换原徽章文案
+- 首页能量沙盘个人/全家切换始终显示,成员<2时点全家弹提示引导添加
 
-### Bug 修复
-- 家庭管理页解耦优惠券列表与发放优惠券弹窗 - 发放改用独立issueDialogVisible,修复共用弹窗bug
+### 文档
+- 添加 log-to-human 团队级技能文档
 
 
 ## v1.0.1288 (2026-09-04)

+ 12 - 11
cfc-web/public/CHANGELOG.md

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.1292
+> 当前版本: v1.0.1289
 
 ## 历史版本
 
@@ -8,22 +8,23 @@
 
 ---
 
-## v1.0.1292 (2026-09-04)
+## v1.0.1289 (2026-09-04)
 
-### 其他
-- 菌群检测问题
+### Bug 修复
+- 迁移290 批量补齐12表33列真实缺列(防Unknown column)+ auto bump
 
+### 样式
+- 右上角个人/全家切换按钮更醒目(渐变胶囊+阴影+放大)
 
-## v1.0.1291 (2026-09-04)
+### 其他
+- redesign: 重构登录前首页与登录页,引入主动健康闭环×五维框架
 
 ### 新功能
-- 健康报告增加 report_format 字段区分北京菌群/谷禾报告格式,前端报告详情适配
-
-
-## v1.0.1290 (2026-09-04)
+- 个人/全家切换移到控件右上角,替换原徽章文案
+- 首页能量沙盘个人/全家切换始终显示,成员<2时点全家弹提示引导添加
 
-### Bug 修复
-- 家庭管理页解耦优惠券列表与发放优惠券弹窗 - 发放改用独立issueDialogVisible,修复共用弹窗bug
+### 文档
+- 添加 log-to-human 团队级技能文档
 
 
 ## v1.0.1288 (2026-09-04)