|
|
@@ -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
|