Sisyphus Agent пре 1 недеља
родитељ
комит
e3083bd46d

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

@@ -10565,5 +10565,78 @@ public class DatabaseInitializer implements CommandLineRunner {
         } catch (Exception e) {
             // ignore
         }
+
+        // 迁移307: resource_items 表添加社会连接分类字段(珍珠图重构:25 类连接类型 + 价值分级)
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD COLUMN connection_type VARCHAR(50) NOT NULL DEFAULT '' COMMENT '连接类型枚举名(ConnectionType)'");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.connection_type 已存在或添加失败: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD COLUMN priority TINYINT DEFAULT 2 COMMENT '优先级: 1=高 2=中 3=低(手动覆盖)'");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.priority 已存在或添加失败: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD COLUMN value_score INT DEFAULT 0 COMMENT '价值分 0-100(自动计算,可手动覆盖)'");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.value_score 已存在或添加失败: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD COLUMN last_interaction_at DATETIME DEFAULT NULL COMMENT '最近互动时间'");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.last_interaction_at 已存在或添加失败: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD COLUMN interaction_count INT DEFAULT 0 COMMENT '互动总次数'");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.interaction_count 已存在或添加失败: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE resource_items ADD INDEX idx_ri_connection_type (connection_type)");
+        } catch (Exception e) {
+            log.warn("迁移307: resource_items.connection_type 索引已存在或添加失败: {}", e.getMessage());
+        }
+        log.info("迁移307: resource_items 社会连接字段添加完成");
+
+        // 迁移308: 创建珍珠图互动日志表
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS pearl_interaction_log (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '操作人', " +
+                    "resource_item_id BIGINT NOT NULL COMMENT '关联资源', " +
+                    "interaction_type VARCHAR(20) NOT NULL COMMENT 'PHONE/WECHAT/MEETING/OTHER', " +
+                    "content VARCHAR(500) DEFAULT NULL COMMENT '互动内容简记', " +
+                    "happened_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '互动发生时间', " +
+                    "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_pil_user (user_id), " +
+                    "INDEX idx_pil_resource (resource_item_id), " +
+                    "INDEX idx_pil_happened (happened_at) " +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图互动日志'");
+            log.info("迁移308: 已创建 pearl_interaction_log 表");
+        } catch (Exception e) {
+            log.warn("迁移308: 创建 pearl_interaction_log 表失败: {}", e.getMessage());
+        }
+
+        // 迁移309: 创建珍珠图互动提醒表
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS pearl_interaction_reminder (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL, " +
+                    "resource_item_id BIGINT NOT NULL, " +
+                    "connection_type VARCHAR(50) NOT NULL, " +
+                    "suggest_interval_month INT NOT NULL COMMENT '建议互动周期(月)', " +
+                    "last_interaction_at DATETIME DEFAULT NULL, " +
+                    "days_since_last INT NOT NULL COMMENT '距上次互动天数', " +
+                    "status VARCHAR(20) DEFAULT 'PENDING' COMMENT 'PENDING/DONE/DISMISSED', " +
+                    "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_pir_user_status (user_id, status), " +
+                    "INDEX idx_pir_resource (resource_item_id) " +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图互动提醒'");
+            log.info("迁移309: 已创建 pearl_interaction_reminder 表");
+        } catch (Exception e) {
+            log.warn("迁移309: 创建 pearl_interaction_reminder 表失败: {}", e.getMessage());
+        }
     }
 }

+ 39 - 3
cfc-backend/src/main/resources/schema.sql

@@ -5249,17 +5249,23 @@ CREATE TABLE IF NOT EXISTS contact_help_logs (
     INDEX idx_chl_contact (contact_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='联系人帮助记录(章鱼图数据源)';
 
--- 珍珠图资源登记表(信息/场所/技能类资源)
+-- 珍珠图资源登记表(社会连接资源)
 CREATE TABLE IF NOT EXISTS resource_items (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
     user_id BIGINT NOT NULL COMMENT '资源拥有者(当前用户)',
     type VARCHAR(16) NOT NULL COMMENT '资源类型: INFO(信息)/PLACE(场所)/SKILL(技能)',
+    connection_type VARCHAR(50) NOT NULL DEFAULT '' COMMENT '连接类型枚举名(ConnectionType)',
+    priority TINYINT DEFAULT 2 COMMENT '优先级: 1=高 2=中 3=低(手动覆盖)',
+    value_score INT DEFAULT 0 COMMENT '价值分 0-100(自动计算,可手动覆盖)',
+    last_interaction_at DATETIME DEFAULT NULL COMMENT '最近互动时间',
+    interaction_count INT DEFAULT 0 COMMENT '互动总次数',
     name VARCHAR(100) NOT NULL COMMENT '资源名称',
     description VARCHAR(255) COMMENT '资源描述(可调用方式/说明)',
     contact_id BIGINT DEFAULT NULL COMMENT '关联联系人ID(可选)',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-    INDEX idx_ri_user (user_id)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图资源登记表(信息/场所/技能类资源)';
+    INDEX idx_ri_user (user_id),
+    INDEX idx_ri_connection_type (connection_type)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图资源登记表(社会连接资源)';
 
 -- 维度配置表(cfclub 五维能量体系)
 CREATE TABLE IF NOT EXISTS product_dimension_config (
@@ -5490,3 +5496,33 @@ CREATE TABLE IF NOT EXISTS family_member_dimension_base_scores (
     UNIQUE KEY uk_member_dimension (member_id, dimension_code),
     INDEX idx_member (member_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='五维基础能量分(落库,支持重算)';
+
+-- 珍珠图互动日志表
+CREATE TABLE IF NOT EXISTS pearl_interaction_log (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT NOT NULL COMMENT '操作人',
+    resource_item_id BIGINT NOT NULL COMMENT '关联资源',
+    interaction_type VARCHAR(20) NOT NULL COMMENT 'PHONE/WECHAT/MEETING/OTHER',
+    content VARCHAR(500) DEFAULT NULL COMMENT '互动内容简记',
+    happened_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '互动发生时间',
+    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_pil_user (user_id),
+    INDEX idx_pil_resource (resource_item_id),
+    INDEX idx_pil_happened (happened_at)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图互动日志';
+
+-- 珍珠图互动提醒表
+CREATE TABLE IF NOT EXISTS pearl_interaction_reminder (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT NOT NULL,
+    resource_item_id BIGINT NOT NULL,
+    connection_type VARCHAR(50) NOT NULL,
+    suggest_interval_month INT NOT NULL COMMENT '建议互动周期(月)',
+    last_interaction_at DATETIME DEFAULT NULL,
+    days_since_last INT NOT NULL COMMENT '距上次互动天数',
+    status VARCHAR(20) DEFAULT 'PENDING' COMMENT 'PENDING/DONE/DISMISSED',
+    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_pir_user_status (user_id, status),
+    INDEX idx_pir_resource (resource_item_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='珍珠图互动提醒';