Selaa lähdekoodia

feat(migration): 存量 role=child 账号强制迁移为成员模型(迁移298)

iwt 1 kuukausi sitten
vanhempi
sitoutus
4c26dba6b1

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

@@ -10391,6 +10391,29 @@ public class DatabaseInitializer implements CommandLineRunner {
             log.warn("迁移297执行失败(training_plan_tasks 表可能不存在): {}", e.getMessage());
         }
 
+        // 迁移298: 存量 role='child' 账号强制迁移为成员模型
+        // 1) 有 openid 的 child → role 改 parent(可登录成员,登录后进成员端界面,不能被切换)
+        // 2) 无 openid 的 child → 保持不可登录,确保有 family_members 记录(仅可被切换)
+        try {
+            Integer updated = jdbcTemplate.update(
+                    "UPDATE users SET role='parent' WHERE role='child' AND openid IS NOT NULL AND openid <> ''");
+            log.info("迁移298: 已迁移{}条有 openid 的 child 账号 role → parent", updated);
+        } catch (Exception e) {
+            log.warn("迁移298第一步失败", e);
+        }
+        try {
+            jdbcTemplate.execute(
+                "INSERT INTO family_members (family_id, user_id, nickname, gender, birthday, generation, show_to_family, total_points, created_at, updated_at) " +
+                "SELECT u.family_id, u.id, u.nickname, u.gender, u.birthday, -1, 1, 0, NOW(), NOW() " +
+                "FROM users u " +
+                "WHERE u.role='child' AND (u.openid IS NULL OR u.openid='') " +
+                "AND u.family_id IS NOT NULL " +
+                "AND NOT EXISTS (SELECT 1 FROM family_members fm WHERE fm.user_id = u.id)");
+            log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记录");
+        } catch (Exception e) {
+            log.warn("迁移298第二步失败", e);
+        }
+
         // ===== 生产库对账候选风险记录(已核对生产库,2026-09,按用户决定不迁移/暂不动,仅记录)=====
         // 注:以下为 entity 期望但生产库未对齐.项目,用户已决定保持现状或记为候选,勿重复迁移。
         // 1. children 表缺 phone、id_card(Child 实体+ChildMapper 仍活跃,AccountCleanupService

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

@@ -44,6 +44,9 @@ CREATE TABLE IF NOT EXISTS users (
     INDEX idx_family_id (family_id),
     INDEX idx_phone (phone)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+-- 注:role 字段值 'child' 已废弃,存量数据通过迁移298统一归一为 'parent'。
+-- 可登录成员(有 openid)= 原 role='child' 迁移后的账号;
+-- 不可登录成员(无 openid)= 家长手动创建的子账号。
 
 -- ============================================================
 -- 【已废除】children 表已合并到 family_members