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

feat(cfc-backend): add family_relationships table with entity/mapper/migration

Add bidirectional relationship table to support generation-based relationship labels. Includes schema.sql DDL, DatabaseInitializer migration #41, FamilyRelationship entity and mapper.

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
User 2 месяцев назад
Родитель
Сommit
4040600745

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

@@ -4220,6 +4220,27 @@ try {
 
 
         // 迁移40: users表添加mascot字段(AI助手形象: xibao浠宝/fubao福宝)
         // 迁移40: users表添加mascot字段(AI助手形象: xibao浠宝/fubao福宝)
         ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI助手形象: xibao(浠宝)/fubao(福宝)'");
         ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI助手形象: xibao(浠宝)/fubao(福宝)'");
+
+        // 迁移41: 创建family_relationships表(家庭成员双向关系,替代relationship_type/role_override)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_relationships (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL COMMENT '所属家庭ID', " +
+                    "from_member_id BIGINT NOT NULL COMMENT '关系起点成员ID', " +
+                    "to_member_id BIGINT NOT NULL COMMENT '关系终点成员ID', " +
+                    "generation_value INT NOT NULL COMMENT '辈分值: -1=子女, 0=同辈, 1=父母, 2=祖父母, 3=曾祖父母', " +
+                    "relationship_key VARCHAR(50) COMMENT '关系标签key(冗余用于显示)', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY uk_from_to (from_member_id, to_member_id), " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_from (from_member_id), " +
+                    "INDEX idx_to (to_member_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员双向关系表'");
+            log.info("已创建family_relationships表");
+        } catch (Exception e) {
+            log.warn("创建family_relationships表可能已存在: {}", e.getMessage());
+        }
     }
     }
 
 
     private void insertSysConfigSeed(String key, String value, String desc) {
     private void insertSysConfigSeed(String key, String value, String desc) {

+ 36 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/FamilyRelationship.java

@@ -0,0 +1,36 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("family_relationships")
+public class FamilyRelationship implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 所属家庭ID */
+    private Long familyId;
+
+    /** 关系起点成员ID */
+    private Long fromMemberId;
+
+    /** 关系终点成员ID */
+    private Long toMemberId;
+
+    /** 辈分值: -1=子女, 0=同辈, 1=父母, 2=祖父母, 3=曾祖父母 */
+    private Integer generationValue;
+
+    /** 关系标签key(冗余用于显示) */
+    private String relationshipKey;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/FamilyRelationshipMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.FamilyRelationship;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FamilyRelationshipMapper extends BaseMapper<FamilyRelationship> {
+}

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

@@ -1733,6 +1733,22 @@ CREATE TABLE IF NOT EXISTS family_members (
     INDEX idx_phone (phone)
     INDEX idx_phone (phone)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员表(手动添加)';
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员表(手动添加)';
 
 
+-- 家庭成员双向关系表(v2: 替代relationship_type/role_override)
+CREATE TABLE IF NOT EXISTS family_relationships (
+    id               BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id        BIGINT       NOT NULL COMMENT '所属家庭ID',
+    from_member_id   BIGINT       NOT NULL COMMENT '关系起点成员ID',
+    to_member_id     BIGINT       NOT NULL COMMENT '关系终点成员ID',
+    generation_value INT          NOT NULL COMMENT '辈分值: -1=子女, 0=同辈, 1=父母, 2=祖父母, 3=曾祖父母',
+    relationship_key VARCHAR(50)  COMMENT '关系标签key(冗余用于显示, 如father/mother/son/daughter/spouse/sibling)',
+    created_at       DATETIME     DEFAULT CURRENT_TIMESTAMP,
+    updated_at       DATETIME     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY uk_from_to (from_member_id, to_member_id),
+    INDEX idx_family_id (family_id),
+    INDEX idx_from (from_member_id),
+    INDEX idx_to (to_member_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员双向关系表';
+
 -- 关系类型配置表(管理端可配置)
 -- 关系类型配置表(管理端可配置)
 CREATE TABLE IF NOT EXISTS relationship_types (
 CREATE TABLE IF NOT EXISTS relationship_types (
     id               BIGINT AUTO_INCREMENT PRIMARY KEY,
     id               BIGINT AUTO_INCREMENT PRIMARY KEY,