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

feat(profile): 创建画像快照表和歷史表迁移脚本

Sisyphus 2 месяцев назад
Родитель
Сommit
a56b4cf891

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

@@ -9009,6 +9009,41 @@ private void runMigration100() {
 		// 迁移251: 健康饮食组挂载 报告管理/报告审核/应季食材(《角色权限与菜单归类整合方案》第二部分,幂等)
 		migrateHealthMenuMount();
 
+		// 迁移252: 创建用户画像表
+		try {
+			jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS profile_snapshot (" +
+					"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+					"member_id BIGINT NOT NULL UNIQUE, " +
+					"dimension_scores JSON DEFAULT NULL, " +
+					"body_metrics JSON DEFAULT NULL, " +
+					"mind_metrics JSON DEFAULT NULL, " +
+					"wisdom_metrics JSON DEFAULT NULL, " +
+					"action_metrics JSON DEFAULT NULL, " +
+					"wealth_metrics JSON DEFAULT NULL, " +
+					"problem_domains VARCHAR(500) DEFAULT NULL, " +
+					"computed_at DATETIME DEFAULT NULL, " +
+					"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+					"INDEX idx_member_id (member_id)" +
+					") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+			log.info("已创建profile_snapshot表");
+		} catch (Exception e) {
+			log.warn("创建profile_snapshot表可能已存在: {}", e.getMessage());
+		}
+
+		try {
+			jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS profile_history (" +
+					"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+					"member_id BIGINT NOT NULL, " +
+					"snapshot_date DATE NOT NULL, " +
+					"all_metrics JSON NOT NULL, " +
+					"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+					"INDEX idx_member_date (member_id, snapshot_date)" +
+					") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+			log.info("已创建profile_history表");
+		} catch (Exception e) {
+			log.warn("创建profile_history表可能已存在: {}", e.getMessage());
+		}
+
 	}
 
 	/**

+ 26 - 0
cfc-backend/src/main/resources/db/migration/V251__create_profile_tables.sql

@@ -0,0 +1,26 @@
+-- 用户画像最新快照表
+CREATE TABLE IF NOT EXISTS profile_snapshot (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT,
+    member_id BIGINT NOT NULL UNIQUE COMMENT '家庭成员ID',
+    dimension_scores JSON DEFAULT NULL COMMENT '五维能力评分 {"body":72,"wisdom":65,"mind":80,"action":58,"wealth":45}',
+    body_metrics JSON DEFAULT NULL COMMENT '近30天身体指标',
+    mind_metrics JSON DEFAULT NULL COMMENT '近30天心理指标',
+    wisdom_metrics JSON DEFAULT NULL COMMENT '最近测评成绩',
+    action_metrics JSON DEFAULT NULL COMMENT '近7天行为指标',
+    wealth_metrics JSON DEFAULT NULL COMMENT '近30天财商指标',
+    problem_domains VARCHAR(500) DEFAULT NULL COMMENT '关注的问题域标签 ["sleep","attention","emotion"]',
+    computed_at DATETIME DEFAULT NULL COMMENT '最后一次计算时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_member_id (member_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像最新快照';
+
+-- 画像历史表(保留365天,用于趋势展示)
+CREATE TABLE IF NOT EXISTS profile_history (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT,
+    member_id BIGINT NOT NULL COMMENT '家庭成员ID',
+    snapshot_date DATE NOT NULL COMMENT '日期',
+    all_metrics JSON NOT NULL COMMENT '当日所有指标完整快照',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_member_date (member_id, snapshot_date),
+    INDEX idx_date (snapshot_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像历史快照';

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

@@ -5002,3 +5002,30 @@ CREATE TABLE IF NOT EXISTS dan_knowledge_base_tag (
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     UNIQUE KEY uk_knowledge_tag (knowledge_id, tag_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识-标签关联表';
+
+-- 用户画像最新快照表
+CREATE TABLE IF NOT EXISTS profile_snapshot (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT,
+    member_id BIGINT NOT NULL UNIQUE COMMENT '家庭成员ID',
+    dimension_scores JSON DEFAULT NULL COMMENT '五维能力评分',
+    body_metrics JSON DEFAULT NULL COMMENT '近30天身体指标',
+    mind_metrics JSON DEFAULT NULL COMMENT '近30天心理指标',
+    wisdom_metrics JSON DEFAULT NULL COMMENT '最近测评成绩',
+    action_metrics JSON DEFAULT NULL COMMENT '近7天行为指标',
+    wealth_metrics JSON DEFAULT NULL COMMENT '近30天财商指标',
+    problem_domains VARCHAR(500) DEFAULT NULL COMMENT '关注的问题域标签',
+    computed_at DATETIME DEFAULT NULL COMMENT '最后一次计算时间',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_member_id (member_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像最新快照';
+
+-- 画像历史表(保留365天)
+CREATE TABLE IF NOT EXISTS profile_history (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT,
+    member_id BIGINT NOT NULL COMMENT '家庭成员ID',
+    snapshot_date DATE NOT NULL COMMENT '日期',
+    all_metrics JSON NOT NULL COMMENT '当日所有指标完整快照',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_member_date (member_id, snapshot_date),
+    INDEX idx_date (snapshot_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像历史快照';