فهرست منبع

feat(cf): 数据库迁移:cf_rate_tier/cf_transfer_record 建表 + promotion_tier 精简 + coupon 加 family_id

Sisyphus 2 ماه پیش
والد
کامیت
960ec730ac

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

@@ -10105,5 +10105,73 @@ public class DatabaseInitializer implements CommandLineRunner {
         } catch (Exception e) {
             log.warn("family_coupon_grant_log 表已存在,跳过创建: {}", e.getMessage());
         }
+
+        // 迁移279: 创建 cf_rate_tier 表(CF值返佣阶梯配置,替代 promotion_tier_config)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cf_rate_tier (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "tier_name VARCHAR(50) NOT NULL COMMENT '档位名称', " +
+                    "min_team_size INT NOT NULL DEFAULT 0 COMMENT '团队规模下限(含)', " +
+                    "rate_percent INT NOT NULL DEFAULT 0 COMMENT '返佣比例(%)', " +
+                    "sort_order INT NOT NULL DEFAULT 0 COMMENT '排序,越大越高', " +
+                    "enabled TINYINT DEFAULT 1 COMMENT '1启用/0停用', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_min_size (min_team_size)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CF值返佣阶梯配置'");
+            log.info("已创建cf_rate_tier表");
+            Integer cnt = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM cf_rate_tier", Integer.class);
+            if (cnt == null || cnt == 0) {
+                jdbcTemplate.execute("INSERT INTO cf_rate_tier (tier_name, min_team_size, rate_percent, sort_order) VALUES " +
+                        "('铜牌', 0, 5, 1), ('银牌', 3, 10, 2), ('金牌', 10, 15, 3), ('铂金', 30, 20, 4), ('钻石', 100, 25, 5)");
+                log.info("cf_rate_tier 种子数据已初始化");
+            }
+        } catch (Exception e) {
+            log.warn("创建cf_rate_tier表失败: {}", e.getMessage());
+        }
+
+        // 迁移280: 创建 cf_transfer_record 表(CF值流转记录)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cf_transfer_record (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "from_user_id BIGINT COMMENT '转出用户ID(null=平台)', " +
+                    "to_user_id BIGINT COMMENT '转入用户ID', " +
+                    "family_id BIGINT COMMENT '所属家庭ID', " +
+                    "amount INT NOT NULL COMMENT 'CF值数量', " +
+                    "type VARCHAR(16) NOT NULL COMMENT 'transfer/allocate/refund', " +
+                    "ref_type VARCHAR(50) COMMENT '关联业务类型', " +
+                    "ref_id BIGINT COMMENT '关联业务ID', " +
+                    "remark VARCHAR(255), " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_from (from_user_id), " +
+                    "INDEX idx_to (to_user_id), " +
+                    "INDEX idx_family (family_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CF值流转记录'");
+            log.info("已创建cf_transfer_record表");
+        } catch (Exception e) {
+            log.warn("创建cf_transfer_record表失败: {}", e.getMessage());
+        }
+
+        // 迁移281: promotion_tier 精简列(删三层,加 rate_percent)
+        try {
+            jdbcTemplate.execute("ALTER TABLE promotion_tier DROP COLUMN team_size_1st, DROP COLUMN team_size_2nd, DROP COLUMN team_size_3rd");
+            log.info("promotion_tier 已删除三层团队列");
+        } catch (Exception e) {
+            log.warn("promotion_tier 三层列删除失败(可能不存在): {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE promotion_tier ADD COLUMN rate_percent INT DEFAULT 0 COMMENT '当前返佣比例(%)'");
+            log.info("promotion_tier 已添加 rate_percent");
+        } catch (Exception e) {
+            log.warn("promotion_tier.rate_percent 已存在: {}", e.getMessage());
+        }
+
+        // 迁移282: coupon 表添加 family_id
+        try {
+            jdbcTemplate.execute("ALTER TABLE coupon ADD COLUMN family_id BIGINT DEFAULT NULL COMMENT '绑定家庭ID(NULL=不绑定)'");
+            log.info("coupon 已添加 family_id");
+        } catch (Exception e) {
+            log.warn("coupon.family_id 已存在: {}", e.getMessage());
+        }
     }
 }

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

@@ -2171,6 +2171,7 @@ CREATE TABLE IF NOT EXISTS coupon (
     used_count INT DEFAULT 0,
     discount_rate INT COMMENT '折扣券折扣率(千分比,9000=9折)',
     product_id BIGINT COMMENT '绑定商品ID,NULL=全场通用',
+    family_id BIGINT DEFAULT NULL COMMENT '绑定家庭ID(NULL=不绑定)',
     points_price INT DEFAULT 0 COMMENT '积分兑换价,0=不可积分兑换',
     grant_type VARCHAR(16) COMMENT '发放规则:JOIN/PERIODIC/POPULATION,NULL=不自动发放',
     grant_level_code VARCHAR(32) COMMENT '发放规则对应会员等级',
@@ -2771,12 +2772,10 @@ CREATE TABLE IF NOT EXISTS promotion_tier (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
     user_id BIGINT NOT NULL COMMENT '用户ID',
     tier VARCHAR(20) NOT NULL DEFAULT 'R0' COMMENT 'R0利他者/R1传福人/R2聚能师/R3启慧者/R4传承者',
-    team_size_1st INT DEFAULT 0 COMMENT '一层团队人数',
-    team_size_2nd INT DEFAULT 0 COMMENT '二层团队人数',
-    team_size_3rd INT DEFAULT 0 COMMENT '三层团队人数',
     total_team_size INT DEFAULT 0 COMMENT '三层累计总人数',
     total_referral_earnings INT DEFAULT 0 COMMENT '累计推荐佣金(分)',
     total_share_earnings INT DEFAULT 0 COMMENT '累计消费返利(分)',
+    rate_percent INT DEFAULT 0 COMMENT '当前返佣比例(%)',
     promoted_at DATETIME DEFAULT NULL COMMENT '最近晋级时间',
     last_change_at DATETIME DEFAULT NULL COMMENT '最后变更时间',
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
@@ -5305,3 +5304,37 @@ CREATE TABLE IF NOT EXISTS self_check_ignores (
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '忽略时间',
     INDEX idx_user_id (user_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='五维自检忽略提醒记录';
+
+-- ============================================================
+-- CF值分佣体系重构(迁移279-282)
+-- ============================================================
+
+-- CF值返佣阶梯配置表(迁移279,替代 promotion_tier_config)
+CREATE TABLE IF NOT EXISTS cf_rate_tier (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    tier_name VARCHAR(50) NOT NULL COMMENT '档位名称',
+    min_team_size INT NOT NULL DEFAULT 0 COMMENT '团队规模下限(含)',
+    rate_percent INT NOT NULL DEFAULT 0 COMMENT '返佣比例(%)',
+    sort_order INT NOT NULL DEFAULT 0 COMMENT '排序,越大越高',
+    enabled TINYINT DEFAULT 1 COMMENT '1启用/0停用',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_min_size (min_team_size)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CF值返佣阶梯配置';
+
+-- CF值流转记录表(迁移280)
+CREATE TABLE IF NOT EXISTS cf_transfer_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    from_user_id BIGINT COMMENT '转出用户ID(null=平台)',
+    to_user_id BIGINT COMMENT '转入用户ID',
+    family_id BIGINT COMMENT '所属家庭ID',
+    amount INT NOT NULL COMMENT 'CF值数量',
+    type VARCHAR(16) NOT NULL COMMENT 'transfer/allocate/refund',
+    ref_type VARCHAR(50) COMMENT '关联业务类型',
+    ref_id BIGINT COMMENT '关联业务ID',
+    remark VARCHAR(255),
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_from (from_user_id),
+    INDEX idx_to (to_user_id),
+    INDEX idx_family (family_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CF值流转记录';