Преглед изворни кода

feat(membership): 新增迁移352移除报告上传权益与配额残留并同步 schema.sql

迁移316 种子移除 REPORT_UPLOAD_LITE;新增迁移352(幂等)清理存量 membership_benefits 权益行与 basic_quota_usage 残留记录,schema.sql 快照同步。

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
iwt пре 6 дана
родитељ
комит
ed8625e39a

+ 20 - 2
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -10935,6 +10935,7 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
         createReportTransferRequestsTable();
         addProductMinDiscountLevel();
         backfillMembershipLevelOrder();
+        removeReportUploadQuota();
 
         createProductDimensionMappingTable();
         createProductRecommendationLogTable();
@@ -11039,8 +11040,7 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
                 "('BASIC', 'AI_CHAT_LITE', 'AI健康顾问(限3次/月)', '每月3次AI健康顾问问答', '🤖', '#DBEAFE', 1), " +
                 "('BASIC', 'REPORT_READING_LITE', '报告解读(限1次/月)', '每月1次体检/测评报告AI解读', '📊', '#FCE7F3', 4), " +
                 "('BASIC', 'GROWTH_PLAN_LITE', '基础成长计划', '创建成长计划但模板有限', '📋', '#FEF3C7', 3), " +
-                "('BASIC', 'ASSESSMENT_QUOTA_LITE', '测评预约(限1次)', '每月可预约1次测评', '📝', '#E0E7FF', 8), " +
-                "('BASIC', 'REPORT_UPLOAD_LITE', '健康报告上传(限2份/月)', '每月可上传2份健康报告', '📄', '#FEF9C3', 9)");
+                "('BASIC', 'ASSESSMENT_QUOTA_LITE', '测评预约(限1次)', '每月可预约1次测评', '📝', '#E0E7FF', 8)");
             log.info("迁移316: 已初始化BASIC会员权益列表");
         } catch (Exception e) {
             // 已存在,忽略
@@ -11798,4 +11798,22 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
             log.warn("迁移351: 顺延 membership_levels.level_order 失败: {}", e.getMessage());
         }
     }
+
+    // 迁移352: 健康报告上传改为对所有登录用户免费无限,移除 REPORT_UPLOAD 配额与 BASIC 权益文案
+    private void removeReportUploadQuota() {
+        try {
+            int deletedBenefits = jdbcTemplate.update(
+                    "DELETE FROM membership_benefits WHERE level_code = 'BASIC' AND benefit_code = 'REPORT_UPLOAD_LITE'");
+            log.info("迁移352: 已移除 BASIC 权益 REPORT_UPLOAD_LITE({} 行)", deletedBenefits);
+        } catch (Exception e) {
+            log.warn("迁移352: 移除 REPORT_UPLOAD_LITE 权益失败: {}", e.getMessage());
+        }
+        try {
+            int deletedUsage = jdbcTemplate.update(
+                    "DELETE FROM basic_quota_usage WHERE quota_type = 'REPORT_UPLOAD'");
+            log.info("迁移352: 已清理 REPORT_UPLOAD 配额记录({} 行)", deletedUsage);
+        } catch (Exception e) {
+            log.warn("迁移352: 清理 REPORT_UPLOAD 配额记录失败: {}", e.getMessage());
+        }
+    }
 }

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

@@ -5703,13 +5703,12 @@ INSERT IGNORE INTO membership_benefits (level_code, benefit_code, benefit_name,
 ('BASIC', 'AI_CHAT_LITE', 'AI健康顾问(限3次/月)', '每月3次AI健康顾问问答', '🤖', '#DBEAFE', 1),
 ('BASIC', 'REPORT_READING_LITE', '报告解读(限1次/月)', '每月1次体检/测评报告AI解读', '📊', '#FCE7F3', 4),
 ('BASIC', 'GROWTH_PLAN_LITE', '基础成长计划', '创建成长计划但模板有限', '📋', '#FEF3C7', 3),
-('BASIC', 'ASSESSMENT_QUOTA_LITE', '测评预约(限1次)', '每月可预约1次测评', '📝', '#E0E7FF', 8),
-('BASIC', 'REPORT_UPLOAD_LITE', '健康报告上传(限2份/月)', '每月可上传2份健康报告', '📄', '#FEF9C3', 9);
+('BASIC', 'ASSESSMENT_QUOTA_LITE', '测评预约(限1次)', '每月可预约1次测评', '📝', '#E0E7FF', 8);
 
 CREATE TABLE IF NOT EXISTS basic_quota_usage (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
     user_id BIGINT NOT NULL COMMENT '家长用户ID(非family_id)',
-    quota_type VARCHAR(30) NOT NULL COMMENT '配额类型: AI_CHAT/REPORT_READING/ASSESSMENT_QUOTA/REPORT_UPLOAD',
+    quota_type VARCHAR(30) NOT NULL COMMENT '配额类型: AI_CHAT/REPORT_READING/ASSESSMENT_QUOTA',
     used_count INT DEFAULT 0 COMMENT '本月已用次数',
     total_count INT NOT NULL COMMENT '月度总配额',
     period_start DATE NOT NULL COMMENT '周期开始日期(每月1号)',