Browse Source

fix(cf): 修复推荐树 level 倒置 + referral_tree 唯一键改为 (parent_id, child_id) 联合

Sisyphus 2 weeks ago
parent
commit
dfc0f029e8

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

@@ -10173,5 +10173,19 @@ public class DatabaseInitializer implements CommandLineRunner {
         } catch (Exception e) {
             log.warn("coupon.family_id 已存在: {}", e.getMessage());
         }
+
+        // 迁移283: referral_tree 唯一键改为 (parent_id, child_id) 联合唯一(支持每祖先一行物化)
+        try {
+            jdbcTemplate.execute("ALTER TABLE referral_tree DROP INDEX uk_child_id");
+            log.info("referral_tree 已删除 uk_child_id 唯一键");
+        } catch (Exception e) {
+            log.warn("referral_tree.uk_child_id 删除失败(可能不存在): {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE referral_tree ADD UNIQUE KEY uk_parent_child (parent_id, child_id)");
+            log.info("referral_tree 已添加 uk_parent_child 联合唯一键");
+        } catch (Exception e) {
+            log.warn("referral_tree.uk_parent_child 已存在: {}", e.getMessage());
+        }
     }
 }

+ 2 - 2
cfc-backend/src/main/java/com/etotem/cfc/service/CfReferralService.java

@@ -47,7 +47,7 @@ public class CfReferralService {
             chain.add(cur.getReferrerId());
             cur = userMapper.selectById(cur.getReferrerId());
         }
-        // 写 referral_tree:level = 1..n,path = 从根到该祖先
+        // 写 referral_tree:level = 1..n(1 = 直接推荐人,越远 level 越大),path = 从根到该祖先
         // path 格式: /ancestorId/.../directReferrerId/
         StringBuilder path = new StringBuilder("/");
         for (int i = chain.size() - 1; i >= 0; i--) {
@@ -56,7 +56,7 @@ public class CfReferralService {
             ReferralTree node = new ReferralTree();
             node.setParentId(parentId);
             node.setChildId(childId);
-            node.setLevel(chain.size() - i);
+            node.setLevel(i + 1);
             node.setPath(path.toString());
             node.setCreatedAt(new Date());
             referralTreeMapper.insert(node);

+ 1 - 1
cfc-backend/src/main/resources/schema.sql

@@ -2803,7 +2803,7 @@ CREATE TABLE IF NOT EXISTS referral_tree (
     level INT NOT NULL COMMENT '层级深度(1/2/3)',
     path VARCHAR(255) DEFAULT NULL COMMENT 'materialized path如/1/2/3/',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE KEY uk_child_id (child_id),
+    UNIQUE KEY uk_parent_child (parent_id, child_id),
     INDEX idx_parent_id (parent_id),
     INDEX idx_level (level)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='推荐关系树';