Просмотр исходного кода

chore: auto bump version and changelog [skip ci]

iwt 2 месяцев назад
Родитель
Сommit
717e9897f5

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

@@ -1,4715 +1,4715 @@
-package com.etotem.cfc.config;
-
-import com.etotem.cfc.mapper.*;
-import lombok.extern.slf4j.Slf4j;
-import javax.annotation.Resource;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.core.io.ResourceLoader;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StreamUtils;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@Slf4j
-@Component
-public class DatabaseInitializer implements CommandLineRunner {
-
-    @Resource
-    private JdbcTemplate jdbcTemplate;
-
-    @Resource
-    private ResourceLoader resourceLoader;
-
-    @Override
-    public void run(String... args) throws Exception {
-        log.info("撘�憪见�憪见��唳旿摨?..");
-
-        // 1. 璉��亙僎�𥕦遣�唳旿摨?
-        initializeDatabase();
-
-        // 2. 璉��亙僎�𥕦遣銵?
-        initializeTables();
-
-        // 3. �扯��唳旿摨栞�蝘鳴�瘛餃��啣�嚗?
-        runMigrations();
-
-        // 4. �嘥��㚚�霈斗㺭�?
-        initializeDefaultData();
-
-        // 5. �嘥��㚚���㮾�唾”
-        initFoodTables();
-
-        log.info("�唳旿摨枏�憪见�摰峕�嚗?);
-    }
-
-    private void initializeDatabase() {
-        try {
-            // 撠肽�餈墧𦻖�唳旿摨橒�憒��銝滚��典��𥕦遣
-            jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS xzyj DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
-            log.info("�唳旿摨𤘪��亙��?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣�唳旿摨枏仃韐? {}", e.getMessage());
-        }
-    }
-
-    private void initializeTables() {
-        try {
-            org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:schema.sql");
-            String content;
-            try (java.io.InputStream is = resource.getInputStream()) {
-                content = new String(StreamUtils.copyToByteArray(is), StandardCharsets.UTF_8);
-            }
-
-            // Remove SQL single-line comments
-            content = content.replaceAll("(?m)^\\s*--.*$", "");
-
-            // Extract all CREATE TABLE IF NOT EXISTS statements
-            Pattern pattern = Pattern.compile(
-                "CREATE\\s+TABLE\\s+IF\\s+NOT\\s+EXISTS\\s+.*?;",
-                Pattern.CASE_INSENSITIVE | Pattern.DOTALL
-            );
-            Matcher matcher = pattern.matcher(content);
-
-            List<String> createTableSQLs = new ArrayList<>();
-            while (matcher.find()) {
-                String sql = matcher.group().trim();
-                if (!sql.isEmpty()) {
-                    createTableSQLs.add(sql);
-                }
-            }
-
-            log.info("隞?schema.sql �㰘蝸鈭?{} 銝芸遣銵刻祗�?, createTableSQLs.size());
-
-            for (String sql : createTableSQLs) {
-                try {
-                    jdbcTemplate.execute(sql);
-                } catch (Exception e) {
-                    log.warn("�𥕦遣銵典仃韐? {}", e.getMessage());
-                }
-            }
-
-            log.info("�唳旿銵冽��亙��?);
-        } catch (Exception e) {
-            log.error("霂餃� schema.sql 憭梯揖", e);
-        }
-    }
-
-    private void runMigrations() {
-        // 餈�宏1: 隞餃𦛚銵冽溶�䭾�銵諹���畾?
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN executor_type ENUM('child', 'parent') DEFAULT 'child' COMMENT '�扯���掩�?");
-            log.info("撌脫溶�猬xecutor_type�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN executor_id BIGINT COMMENT '�扯���D'");
-            log.info("撌脫溶�猬xecutor_id�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD INDEX idx_executor (executor_type, executor_id)");
-            log.info("撌脫溶�犲dx_executor蝝W��配asks銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏2: �冽�銵冽溶�㰘��脣�蝘臬�摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN roles VARCHAR(100) COMMENT '閫坿𠧧�𡑒”'");
-            log.info("撌脫溶��oles�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_points INT DEFAULT 0 COMMENT '摰園鵭�餌妖�?");
-            log.info("撌脫溶�慯otal_points�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_roles (roles(20))");
-            log.info("撌脫溶�犲dx_roles蝝W��酌sers銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏3: users銵冽溶�䭾鰵摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN id_card VARCHAR(18) COMMENT '頨思遢霂�噡'");
-            log.info("撌脫溶�犲d_card�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN real_name VARCHAR(50) COMMENT '�笔�憪枏�'");
-            log.info("撌脫溶��eal_name�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN phone VARCHAR(11) COMMENT '�𧢲㦤�?");
-            log.info("撌脫溶�麖hone�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birthday DATE COMMENT '��𠯫'");
-            log.info("撌脫溶��irthday�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN gender ENUM('male', 'female') COMMENT '�批�'");
-            log.info("撌脫溶�鮰ender�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_phone (phone)");
-            log.info("撌脫溶�犲dx_phone蝝W��酌sers銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏4: children銵冽溶�䭾鰵摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE children ADD COLUMN birthday DATE COMMENT '��𠯫'");
-            log.info("撌脫溶��irthday�堒�children銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE children ADD COLUMN gender ENUM('male', 'female') COMMENT '�批�'");
-            log.info("撌脫溶�鮰ender�堒�children銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏5: 靽格㺿users.role銝箸𣈲��eacher
-        try {
-            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent', 'child', 'teacher') NOT NULL");
-            log.info("撌脫凒�酌sers.role摮埈挾�舀�teacher閫坿𠧧");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏5.1: 靽格㺿users.role銝箸𣈲��dmin
-        try {
-            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent', 'child', 'teacher', 'admin') NOT NULL");
-            log.info("撌脫凒�酌sers.role摮埈挾�舀�admin閫坿𠧧");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏5.2: 蝖桐�蝞∠��䁅��脖蛹admin嚗�耨憭齿唂�唳旿�㛖��桅�嚗?
-        try {
-            int updated = jdbcTemplate.update("UPDATE admins SET role = 'admin' WHERE username = 'admin'");
-            if (updated > 0) {
-                log.info("撌脖耨甇�恣���閫坿𠧧銝榮dmin");
-            }
-        } catch (Exception e) {
-            // �湔鰵憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏6: �𥕦遣streets銵剁�銵烾��啣�蝏游漲銵剁�
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS streets (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "province VARCHAR(50) COMMENT '��遢', " +
-                    "province_code VARCHAR(20) COMMENT '��遢蝻𣇉�', " +
-                    "city VARCHAR(50) COMMENT '�𤾸�', " +
-                    "city_code VARCHAR(20) COMMENT '�𤾸�蝻𣇉�', " +
-                    "district VARCHAR(50) COMMENT '�箏礶', " +
-                    "district_code VARCHAR(20) COMMENT '�箏礶蝻𣇉�', " +
-                    "street VARCHAR(100) COMMENT '銵烾�', " +
-                    "street_code VARCHAR(20) COMMENT '銵烾�蝻𣇉�', " +
-                    "full_name VARCHAR(200) COMMENT '摰峕㟲�啣�', " +
-                    "level INT COMMENT '撅�漣:1�?撣?�?銵烾�', " +
-                    "parent_id BIGINT COMMENT '�嗥漣ID', " +
-                    "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_level (level), " +
-                    "INDEX idx_parent_id (parent_id), " +
-                    "INDEX idx_street_code (street_code), " +
-                    "INDEX idx_full_name (full_name(50))" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-            log.info("撌脣�撱漳treets銵?);
-        } catch (Exception e) {
-            // 銵典歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏7: families銵冽溶�惩𧑐��摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
-            log.info("撌脫溶�坟treet_id�堒�families銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
-            log.info("撌脫溶�惩𧑐��摮埈挾�逆amilies銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD INDEX idx_street_id (street_id)");
-            log.info("撌脫溶�犲dx_street_id蝝W��逆amilies銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏7b: families銵冽溶�慯eacher_id�稪reator_id摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN teacher_id BIGINT COMMENT '蝏穃�����輯��鍦�ID'");
-            log.info("撌脫溶�慯eacher_id�堒�families銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN creator_id BIGINT COMMENT '摰嗅滬�𥕦遣��D'");
-            log.info("撌脫溶�蠏reator_id�堒�families銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏8: teachers銵冽溶�惩𧑐��摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
-            log.info("撌脫溶�坟treet_id�堒�teachers銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
-            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
-            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
-            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
-            log.info("撌脫溶�惩𧑐��摮埈挾�配eachers銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE teachers ADD INDEX idx_street_id (street_id)");
-            log.info("撌脫溶�犲dx_street_id蝝W��配eachers銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏9: users銵冽溶�䭾��輯��鍦��詨�摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_no VARCHAR(50) COMMENT '�鞾鵭閫��撣��銋血噡'");
-            log.info("撌脫溶�慯eacher_no�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_photo VARCHAR(500) COMMENT '�鞾鵭閫��撣���?");
-            log.info("撌脫溶�慯eacher_photo�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN certificate_image VARCHAR(500) COMMENT '�鞾鵭閫��撣��銋衣��?");
-            log.info("撌脫溶�蠏ertificate_image�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_status VARCHAR(20) DEFAULT 'pending' COMMENT '�鞾鵭閫��撣�恣�貊𠶖�?");
-            log.info("撌脫溶�慯eacher_status�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_teacher_status (teacher_status)");
-            log.info("撌脫溶�犲dx_teacher_status蝝W��酌sers銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏10: users銵冽溶�慯eacherFamilyIds摮埈挾嚗���輯��鍦��唾���振摨背D�𡑒”嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_family_ids VARCHAR(500) COMMENT '�鞾鵭閫��撣���𠉛�摰嗅滬ID�𡑒”(�堒噡���)'");
-            log.info("撌脫溶�慯eacher_family_ids�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏11: families銵冽溶�慯eacherId摮埈挾嚗��摰𡁶��鞾鵭閫��撣㇆D嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN teacher_id BIGINT COMMENT '蝏穃�����輯��鍦�ID'");
-            log.info("撌脫溶�慯eacher_id�堒�families銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE families ADD INDEX idx_teacher_id (teacher_id)");
-            log.info("撌脫溶�犲dx_teacher_id蝝W��逆amilies銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        // 餈�宏12: �𥕦遣 teacher_messages 銵剁�摰園鵭�刻砭�鞾鵭閫��撣��
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS teacher_messages (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
-                    "parent_id BIGINT NOT NULL COMMENT '摰園鵭�冽�ID', " +
-                    "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣�鍂�弒D', " +
-                    "content TEXT NOT NULL COMMENT '瘨����捆', " +
-                    "reply_content TEXT COMMENT '�𧼮���捆', " +
-                    "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�?pending(敺��憭?/replied(撌脣�憭?', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "replied_at DATETIME COMMENT '�𧼮��園𡢿', " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_teacher_id (teacher_id), " +
-                    "INDEX idx_parent_id (parent_id), " +
-                    "INDEX idx_status (status)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-            log.info("撌脣�撱演eacher_messages銵?);
-        } catch (Exception e) {
-            // 銵典歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-// 餈�宏13: admin_task_templates銵冽溶�慯eacher_id摮埈挾
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN teacher_id BIGINT COMMENT '�鞾鵭閫��撣㇆D'");
-log.info("撌脫溶�慯eacher_id�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏13b: admin_task_templates銵冽溶�䭾鰵摮埈挾
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN complete_types VARCHAR(100) COMMENT '摰峕��孵�JSON'");
-log.info("撌脫溶�蠏omplete_types�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN duration INT COMMENT '憸�恣摰峕��園鵭(���)'");
-log.info("撌脫溶�賷uration�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN review_type VARCHAR(20) COMMENT '摰⊥瓲鈭箇掩�? creator/parent/teacher/ai'");
-log.info("撌脫溶��eview_type�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN task_type VARCHAR(20) COMMENT '隞餃𦛚�扯捶: onetime/recurring'");
-log.info("撌脫溶�慯ask_type�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN frequency VARCHAR(20) COMMENT '憸𤑳�: daily/weekly/monthly'");
-log.info("撌脫溶�霡requency�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-try {
-jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN max_frequency INT COMMENT '�冽����憭𡁜��鞉活�?");
-log.info("撌脫溶�𦅙ax_frequency�堒�admin_task_templates銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏14: rewards銵牢hild_id摮埈挾��捂NULL嚗�芋�踹��曹���閬�hild_id嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE rewards MODIFY COLUMN child_id BIGINT NULL COMMENT '摮拙�ID嚗峕芋�踹��曹蛹NULL'");
-            log.info("撌脖耨�雹ewards.child_id摮埈挾��捂NULL");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏15: admins銵冽溶�删撩憭勗�
-        try {
-            jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN nickname VARCHAR(50) DEFAULT NULL AFTER password");
-            log.info("撌脫溶�慙ickname�堒�admins銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN email VARCHAR(100) DEFAULT NULL AFTER phone");
-            log.info("撌脫溶�猬mail�堒�admins銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE admins MODIFY COLUMN status VARCHAR(20) DEFAULT 'active'");
-            log.info("撌脖耨�鈴dmins.status摮埈挾蝐餃�");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏16: �𥕦遣�冽��滢��亙�銵?
-try {
-jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_operation_logs (" +
-"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-"user_id BIGINT COMMENT \'�冽�ID\', " +
-"nickname VARCHAR(50) COMMENT \'�冽��萇妍\', " +
-"operation_type VARCHAR(20) NOT NULL COMMENT \'�滢�蝐餃�: login/logout/create/update/delete/query蝑声', " +
-"description VARCHAR(500) COMMENT \'�滢��讛膩\', " +
-"request_path VARCHAR(200) COMMENT \'霂瑟�頝臬�\', " +
-"request_method VARCHAR(10) COMMENT \'霂瑟��寞�\', " +
-"request_params TEXT COMMENT \'霂瑟���㺭嚗���𧶏�\', " +
-"response_status INT COMMENT \'�滚��嗆���\', " +
-"client_ip VARCHAR(50) COMMENT \'摰X�蝡涅P\', " +
-"user_agent VARCHAR(500) COMMENT \'User-Agent\', " +
-"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-"INDEX idx_user_id (user_id), " +
-"INDEX idx_operation_type (operation_type), " +
-"INDEX idx_created_at (created_at)" +
-") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-log.info("撌脣�撱滾ser_operation_logs銵?);
-} catch (Exception e) {
-// 銵典歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏16: tasks銵冽溶��onus_rule摮埈挾嚗㇊OINT-002: 頞��蝘臬�閫��嚗?
-try {
-jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN bonus_rule VARCHAR(500) COMMENT \'頞��蝘臬�閫��JSON\'");
-log.info("撌脫溶��onus_rule�堒�tasks銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏17: tasks銵冽溶�麖oints_expire_days摮埈挾嚗㇊OINT-009: 蝘臬��㗇����
-try {
-jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN points_expire_days INT DEFAULT 0 COMMENT \'蝘臬��㗇��笔予�堆�0銵函內瘞訾��㗇�\'");
-log.info("撌脫溶�麖oints_expire_days�堒�tasks銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏18: points_log銵冽溶�猬xpire_at摮埈挾嚗㇊OINT-009: 蝘臬��㗇����
-try {
-jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN expire_at DATE COMMENT \'蝘臬�餈���交�\'");
-log.info("撌脫溶�猬xpire_at�堒�points_log銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏19: points_log銵冽溶�猬xpired摮埈挾嚗㇊OINT-009: 餈���嗆���霈堆�
-try {
-jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN expired TINYINT DEFAULT 0 COMMENT \'�臬炏撌脰��? 0�?�珮'");
-log.info("撌脫溶�猬xpired�堒�points_log銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-// 餈�宏20: tasks銵冽溶�慯emplate_id摮埈挾嚗㇍ASK-004: �滚�隞餃𦛚璅⊥踎餈質葵嚗?
-try {
-jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN template_id BIGINT COMMENT \'璅⊥踎隞餃𦛚ID\'");
-log.info("撌脫溶�慯emplate_id�堒�tasks銵?);
-} catch (Exception e) {
-// �堒歇摮睃銁嚗�蕭�仿�霂?
-}
-
-        // 餈�宏21: tasks銵冽溶�犲s_template摮埈挾嚗㇍ASK-004: ��扇璅⊥踎隞餃𦛚嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN is_template TINYINT DEFAULT 0 COMMENT '�臬炏銝箸芋�蹂遙�?");
-            log.info("撌脫溶�犲s_template�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏22: 靽桀�tasks銵牢hild_id�𩥇eadline��捂NULL嚗�𣈲���摮拙���振�蹂遙�∴�
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks MODIFY COLUMN child_id BIGINT NULL COMMENT '�扯���D'");
-            log.info("撌脖耨�靖asks.child_id��捂NULL");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks MODIFY COLUMN deadline DATETIME NULL COMMENT '�芣迫�園𡢿'");
-            log.info("撌脖耨�靖asks.deadline��捂NULL");
-        } catch (Exception e) {
-            // 靽格㺿憭梯揖嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏23: tasks銵冽溶�䭾鰵摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN task_type VARCHAR(20) COMMENT '隞餃𦛚�扯捶: onetime/recurring'");
-            log.info("撌脫溶�慯ask_type�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN frequency VARCHAR(20) COMMENT '憸𤑳�: daily/weekly/monthly'");
-            log.info("撌脫溶�霡requency�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN max_frequency INT COMMENT '�冽����憭𡁜��鞉活�?");
-            log.info("撌脫溶�𦅙ax_frequency�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN complete_types VARCHAR(100) COMMENT '摰峕��孵�JSON'");
-            log.info("撌脫溶�蠏omplete_types�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN review_type VARCHAR(20) COMMENT '摰⊥瓲鈭箇掩�? creator/parent/teacher/ai'");
-            log.info("撌脫溶��eview_type�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN earliest_start DATETIME COMMENT '���拙�憪𧢲𧒄�?");
-            log.info("撌脫溶�猬arliest_start�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN latest_end DATETIME COMMENT '���𡁶���𧒄�?");
-            log.info("撌脫溶�饊atest_end�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏24: tasks銵冽溶�𦅙inigame_code摮埈挾嚗��皜豢�隞餃𦛚嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN minigame_code VARCHAR(50) DEFAULT NULL COMMENT '撠𤩺虜�譍誨�? schulte/1a2b/sudoku'");
-            log.info("撌脫溶�𦅙inigame_code�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏25: tasks銵冽溶�賷uration摮埈挾嚗㇍ASK-011: 隞餃𦛚憸�恣�園鵭嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN duration INT DEFAULT 0 COMMENT '憸�恣�園鵭嚗�����'");
-            log.info("撌脫溶�賷uration�堒�tasks銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE tasks ADD INDEX idx_minigame (minigame_code) WHERE minigame_code IS NOT NULL");
-            log.info("撌脫溶�犲dx_minigame蝝W��配asks銵?);
-        } catch (Exception e) {
-            // 蝝W�撌脣��剁�敹賜裦�躰秤
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS trial_memberships (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
-                    "start_date DATETIME NOT NULL COMMENT '霂閧鍂撘�憪𧢲𧒄�?, " +
-                    "end_date DATETIME NOT NULL COMMENT '霂閧鍂蝏𤘪��園𡢿', " +
-                    "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆�?PENDING/ACTIVE/EXPIRED/CONVERTED', " +
-                    "trial_days INT DEFAULT 7 COMMENT '霂閧鍂憭拇㺭', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_user_id (user_id), " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_status (status), " +
-                    "INDEX idx_end_date (end_date)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-            log.info("撌脣�撱演rial_memberships銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣trial_memberships銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // assessment_appointments �啣�畾?
-        try {
-            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN user_id BIGINT COMMENT '�冽�ID'");
-        } catch (Exception e) {
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN guide_id BIGINT COMMENT '�鞾鵭閫��撣㇆D'");
-        } catch (Exception e) {
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN package_id BIGINT COMMENT '憟烾�ID'");
-        } catch (Exception e) {
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN remark VARCHAR(500) COMMENT '憭�釣'");
-        } catch (Exception e) {
-        }
-
-        // assessment_orders 銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS assessment_orders (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "order_no VARCHAR(64) NOT NULL UNIQUE, " +
-                    "family_id BIGINT NOT NULL, " +
-                    "user_id BIGINT NOT NULL, " +
-                    "child_id BIGINT, " +
-                    "guide_id BIGINT NOT NULL, " +
-                    "package_id BIGINT NOT NULL, " +
-                    "guide_name VARCHAR(50), " +
-                    "package_name VARCHAR(100), " +
-                    "total_price BIGINT DEFAULT 0, " +
-                    "discount_amount BIGINT DEFAULT 0, " +
-                    "actual_price BIGINT DEFAULT 0, " +
-                    "status VARCHAR(20) DEFAULT 'pending', " +
-                    "pay_time VARCHAR(50), " +
-                    "pay_type VARCHAR(20), " +
-                    "transaction_id VARCHAR(64), " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_family (family_id), " +
-                    "INDEX idx_guide (guide_id), " +
-                    "INDEX idx_status (status)) " +
-                    "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霂�摯霈W�銵?");
-        } catch (Exception e) {
-        }
-
-        // 餈�宏26: guide_applications銵冽溶�蟵ddress�𠩯ank_card摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN address VARCHAR(500) COMMENT '�啣�'");
-            log.info("撌脫溶�蟵ddress�堒�guide_applications銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN bank_card VARCHAR(50) COMMENT '�嗉��∪噡'");
-            log.info("撌脫溶��ank_card�堒�guide_applications銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN bank_name VARCHAR(100) COMMENT '撘��瑁�'");
-            log.info("撌脫溶��ank_name�堒�guide_applications銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏27: users銵冽溶�蟵ddress摮埈挾嚗���輯��鍦��啣�嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN address VARCHAR(500) COMMENT '�啣�'");
-            log.info("撌脫溶�蟵ddress�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏28: �𥕦遣guide_application_records銵剁��唾窈餈��霈啣�嚗?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_application_records (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "application_id BIGINT NOT NULL COMMENT '�唾��唾窈ID', " +
-                    "user_id BIGINT NOT NULL COMMENT '�滢�鈭箇鍂�弒D', " +
-                    "action VARCHAR(50) NOT NULL COMMENT '�滢�: submit/approve/reject/withdraw/resubmit', " +
-                    "from_status VARCHAR(20) COMMENT '�滢��滨𠶖�?, " +
-                    "to_status VARCHAR(20) NOT NULL COMMENT '�滢��𡒊𠶖�?, " +
-                    "remark VARCHAR(500) COMMENT '憭�釣/�笔�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "INDEX idx_application_id (application_id), " +
-                    "INDEX idx_user_id (user_id), " +
-                    "INDEX idx_action (action)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�鞾鵭閫��撣�𤚗霂瑁�蝔贝扇敶閗”'");
-            log.info("撌脣�撱榫uide_application_records銵?);
-        } catch (Exception e) {
-            // 銵典歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏20: children銵冽溶�坟ystem_points摮埈挾
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'children' AND COLUMN_NAME = 'system_points'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE children ADD COLUMN system_points INT DEFAULT 0 COMMENT '蝟餌�蝘臬�'");
-                log.info("撌脫溶�坟ystem_points�堒�children銵?);
-            } else {
-                log.info("system_points�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�system_points�堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏21: points_log銵冽溶�蠏ategory摮埈挾
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'points_log' AND COLUMN_NAME = 'category'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN category VARCHAR(20) DEFAULT 'task' COMMENT '蝘臬���掩: task隞餃𦛚蝘臬�, system蝟餌�蝘臬�'");
-                log.info("撌脫溶�蠏ategory�堒�points_log銵?);
-            } else {
-                log.info("category�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�category�堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏22: �𥕦遣invite_card銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS invite_card (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "type VARCHAR(20) NOT NULL COMMENT 'child/family/guide', " +
-                    "code VARCHAR(64) NOT NULL UNIQUE COMMENT '��霂瑞�', " +
-                    "ref_id BIGINT NOT NULL COMMENT '�唾�ID(childId/familyId)', " +
-                    "creator_id BIGINT NOT NULL COMMENT '�𥕦遣鈭?, " +
-                    "expires_at DATETIME NOT NULL, " +
-                    "used TINYINT DEFAULT 0, " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_code (code), " +
-                    "INDEX idx_ref_type (ref_id, type)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��霂瑕㨃�?");
-            log.info("撌脣�撱槐nvite_card銵?);
-        } catch (Exception e) {
-            // 銵典歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏23: �𥕦遣wishes銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS wishes (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "family_id BIGINT COMMENT '摰嗅滬ID', " +
-                    "child_id BIGINT COMMENT '�格�摮拙�ID', " +
-                    "created_by BIGINT COMMENT '�𥕦遣��鍂�弒D', " +
-                    "creator_type VARCHAR(20) COMMENT '�𥕦遣��掩�? child/parent', " +
-                    "title VARCHAR(200) NOT NULL COMMENT '敹�����', " +
-                    "description VARCHAR(500) COMMENT '敹���讛膩', " +
-                    "category VARCHAR(32) COMMENT '敹����掩', " +
-                    "points_required INT COMMENT '����蝘臬�', " +
-                    "points_set_by BIGINT COMMENT '摰帋遠��D', " +
-                    "points_set_at DATETIME COMMENT '摰帋遠�園𡢿', " +
-                    "status VARCHAR(32) DEFAULT 'active' COMMENT '�嗆�? draft/active/pending_exchange/approved/exchanging/fulfilled/cancelled/rejected', " +
-                    "exchange_requested_at DATETIME COMMENT '�唾窈�烐揢�園𡢿', " +
-                    "exchange_approved_by BIGINT COMMENT '�孵���D', " +
-                    "exchange_approved_at DATETIME COMMENT '�孵��園𡢿', " +
-                    "points_deducted_at DATETIME COMMENT '��妖��𧒄�?, " +
-                    "fulfilled_by BIGINT COMMENT '�𤑳緵��D', " +
-                    "fulfilled_at DATETIME COMMENT '�𤑳緵�園𡢿', " +
-                    "child_confirmed_at DATETIME COMMENT '摮拙�蝖株恕�嗉揮�園𡢿', " +
-                    "rejected_by BIGINT COMMENT '�垍���D', " +
-                    "rejected_at DATETIME COMMENT '�垍��園𡢿', " +
-                    "reject_reason VARCHAR(500) COMMENT '�垍��笔�', " +
-                    "reject_count INT DEFAULT 0 COMMENT '鋡急�蝏脲活�?, " +
-                    "cancelled_by BIGINT COMMENT '�𡝗���D', " +
-                    "cancelled_at DATETIME COMMENT '�𡝗��園𡢿', " +
-                    "cancel_reason VARCHAR(500) COMMENT '�𡝗��笔�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_child_id (child_id), " +
-                    "INDEX idx_status (status)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='敹���閗”'");
-            log.info("撌脣�撱滴ishes銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣wishes銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏24: users銵冽溶�牐葵鈭箔縑�航‘���畾?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'ethnicity'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE users " +
-                    "ADD COLUMN ethnicity VARCHAR(32) DEFAULT NULL COMMENT '瘞烐�', " +
-                    "ADD COLUMN blood_type VARCHAR(16) DEFAULT NULL COMMENT '銵��?, " +
-                    "ADD COLUMN highest_education VARCHAR(32) DEFAULT NULL COMMENT '��擃睃郎�?, " +
-                    "ADD COLUMN marital_status VARCHAR(16) DEFAULT NULL COMMENT '憍𡁜宏�嗆�?, " +
-                    "ADD COLUMN family_role VARCHAR(16) DEFAULT NULL COMMENT '摰園鵭頨思遢: �貊�/憒��/�瑞�/憟嗅扒/憪亦�/憪亙坏/�嗡�'");
-                log.info("撌脫溶�牐葵鈭箔縑�航‘���畾萄�users銵?);
-            } else {
-                log.info("銝芯犖靽⊥�銵亙�摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�銝芯犖靽⊥�銵亙�摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // Phase 0: 瘚㰘𪄳蝳譍膨銋鞾� �?�滚𦛚���畾?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'vendor_type'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_type VARCHAR(32) DEFAULT NULL COMMENT '�滚𦛚��掩�? planner/activity_provider/product_supplier'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_status VARCHAR(16) DEFAULT NULL COMMENT '�滚𦛚��恣�貊𠶖�? pending/approved/rejected'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_reject_reason VARCHAR(500) DEFAULT NULL COMMENT '摰⊥瓲�垍��笔�'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN is_family_admin TINYINT DEFAULT 0 COMMENT '�臬炏摰嗅滬蝞∠��?");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_info VARCHAR(2000) DEFAULT NULL COMMENT '�滚𦛚���韐其縑�?JSON)'");
-                log.info("撌脫溶�䭾��曄�靽曹��冽��∪�摮埈挾�酌sers銵?);
-            } else {
-                log.info("瘚㰘𪄳蝳譍膨銋鞾��滚𦛚���畾萄歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃��滚𦛚���畾萄仃韐? {}", e.getMessage());
-        }
-
-        // Phase 0: 餈�宏撌脫�閫��撣���滚𦛚���蝟?
-        try {
-            int updated = jdbcTemplate.update(
-                "UPDATE users SET vendor_type = 'planner', vendor_status = 'approved' WHERE teacher_status = 'approved' AND vendor_type IS NULL"
-            );
-            if (updated > 0) {
-                log.info("撌脰�蝘?{} �滩��鍦��唳��∪�雿梶頂", updated);
-            }
-        } catch (Exception e) {
-            log.warn("餈�宏閫��撣���滚𦛚���蝟餃仃韐? {}", e.getMessage());
-        }
-
-        // ====== Phase 1: 瘚㰘𪄳蝳譍膨銋鞾����蝟餌� ======
-
-        // ���銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS products (" +
-                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "  name VARCHAR(200) NOT NULL," +
-                "  description VARCHAR(1000)," +
-                "  intro TEXT," +
-                "  cover_image VARCHAR(500)," +
-                "  images TEXT," +
-                "  price INT NOT NULL DEFAULT 0 COMMENT '隞瑟聢(�?'," +
-                "  stock INT NOT NULL DEFAULT 0," +
-                "  sales_count INT NOT NULL DEFAULT 0," +
-                "  product_type VARCHAR(32) NOT NULL COMMENT 'activity/course/physical/digital/service'," +
-                "  vendor_id BIGINT," +
-                "  vendor_name VARCHAR(100)," +
-                "  status VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/pending/approved/rejected/on_shelf/off_shelf'," +
-                "  reject_reason VARCHAR(500)," +
-                "  member_price INT COMMENT '隡𡁜�隞?�?'," +
-                "  profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋�?���瘥?'," +
-                "  member_eligible VARCHAR(32) DEFAULT 'none' COMMENT 'all/budget/none'," +
-                "  domain VARCHAR(32) COMMENT 'action/mind/body/wisdom/wealth'," +
-                "  external_source VARCHAR(64)," +
-                "  external_id VARCHAR(128)," +
-                "  external_data TEXT," +
-                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")"
-            );
-        } catch (Exception e) {
-            log.warn("�𥕦遣products銵典仃韐? {}", e.getMessage());
-        }
-
-        // ���SKU銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS product_skus (" +
-                "  id INT NOT NULL AUTO_INCREMENT," +
-                "  product_id INT NOT NULL COMMENT '���ID'," +
-                "  sku_code VARCHAR(64) NOT NULL COMMENT 'SKU蝻𣇉�'," +
-                "  specs JSON NOT NULL COMMENT '閫�聢JSON'," +
-                "  price DECIMAL(10,2) NOT NULL COMMENT 'SKU隞瑟聢'," +
-                "  stock INT NOT NULL DEFAULT 0 COMMENT '摨枏�'," +
-                "  original_price DECIMAL(10,2) COMMENT '�煺遠/�垍瑪隞?," +
-                "  image VARCHAR(512) COMMENT 'SKU�曄�'," +
-                "  enabled TINYINT(1) NOT NULL DEFAULT 1," +
-                "  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," +
-                "  update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "  PRIMARY KEY (id)," +
-                "  KEY idx_product_id (product_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���SKU'"
-            );
-            log.info("撌脣�撱歉roduct_skus銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣product_skus銵典仃韐? {}", e.getMessage());
-        }
-
-        // 霈W�銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS product_orders (" +
-                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "  order_no VARCHAR(64) NOT NULL UNIQUE," +
-                "  product_id BIGINT NOT NULL," +
-                "  product_name VARCHAR(200)," +
-                "  product_type VARCHAR(32)," +
-                "  buyer_id BIGINT NOT NULL," +
-                "  family_id BIGINT," +
-                "  quantity INT NOT NULL DEFAULT 1," +
-                "  unit_price INT NOT NULL COMMENT '�蓥遠(�?'," +
-                "  total_amount INT NOT NULL COMMENT '�駁�憸?�?'," +
-                "  status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/completed/cancelled/refunded'," +
-                "  payment_method VARCHAR(32) COMMENT 'wechat/points/membership'," +
-                "  remark VARCHAR(500)," +
-                "  paid_at DATETIME," +
-                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")"
-            );
-        } catch (Exception e) {
-            log.warn("�𥕦遣product_orders銵典仃韐? {}", e.getMessage());
-        }
-
-        // 蝟餌��滨蔭銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS sys_config (" +
-                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "  config_key VARCHAR(64) NOT NULL UNIQUE," +
-                "  config_value TEXT," +
-                "  description VARCHAR(500)," +
-                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")"
-            );
-        } catch (Exception e) {
-            log.warn("�𥕦遣sys_config銵典仃韐? {}", e.getMessage());
-        }
-
-        // Migration: product_orders add logistics fields
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_no VARCHAR(64) COMMENT '�拇��訫噡'");
-            log.info("撌脫溶�饊ogistics_no�堒�product_orders銵?);
-        } catch (Exception e) { }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_company VARCHAR(100) COMMENT '�拇��砍虬'");
-            log.info("撌脫溶�饊ogistics_company�堒�product_orders銵?);
-        } catch (Exception e) { }
-
-        // SysConfig 蝘滚��唳旿
-        try {
-            insertSysConfigSeed("points_exchange_rate", "1", "蝘臬��烐揢瘙��嚗?蝘臬�=1���?.01���");
-            insertSysConfigSeed("points_deduct_cap", "0.5", "蝘臬��菜緍銝𢠃�嚗?0%嚗?);
-            insertSysConfigSeed("member_fee_standard", "1314", "���隡𡁜�撟渲晶嚗��嚗?);
-            insertSysConfigSeed("member_fee_premium", "3650", "擃条漣隡𡁜�撟渲晶嚗��嚗?);
-            insertSysConfigSeed("member_eligible_budget", "1314", "蝑匧�澆����㗇𥋘憸��銝𢠃�嚗��嚗?);
-            insertSysConfigSeed("renewal_discount_rate", "0.85", "蝏剛晶�䀹緍�?);
-            insertSysConfigSeed("member_discount_standard", "0.9", "���隡𡁜��䀹緍�?);
-            insertSysConfigSeed("member_discount_premium", "0.8", "擃条漣隡𡁜��䀹緍�?);
-            insertSysConfigSeed("member_fee_family", "36500", "摰嗅滬隡𡁜�撟渲晶嚗��嚗?);
-            insertSysConfigSeed("member_upgrade_threshold", "131400", "�芸𢆡��漣摰嗅滬隡𡁜�蝝航恣瘨�晶�冽�嚗��嚗?);
-            insertSysConfigSeed("member_discount_family", "9000", "摰嗅滬隡𡁜�����䀹緍(bps)");
-            insertSysConfigSeed("commission_member_l1_rate", "2000", "�刻�摰嗅滬隡𡁜�L1雿���?bps)");
-            insertSysConfigSeed("commission_member_l2_rate", "500", "�刻�摰嗅滬隡𡁜�L2雿���?bps)");
-            insertSysConfigSeed("commission_product_profit_share", "1000", "銝讠瑪���韐凋僭�拇隋���(bps)");
-            insertSysConfigSeed("commission_service_rate", "1000", "銝讠瑪�滚𦛚韐凋僭雿���?bps)");
-            insertSysConfigSeed("commission_event_fixed", "2000", "�刻��啁鍂�瑟𥁒�齿暑�典𤐄摰帋膛�?�?");
-            insertSysConfigSeed("withdraw_min_amount", "10000", "��雿擧��圈�憸?�?");
-            insertSysConfigSeed("withdraw_tax_rate", "2000", "雿��蝔𡒊�(bps)");
-            insertSysConfigSeed("withdraw_fee_free_threshold", "80000", "�滨�憸嘥漲(�?");
-            insertSysConfigSeed("article_energy_rate_normal", "1", "�桅�𡁏�蝡㰘��𤩺��?瘥?00摮?");
-            insertSysConfigSeed("article_energy_rate_premium", "2", "隡䁅捶����賡�瘙��(瘥?00摮?");
-            insertSysConfigSeed("article_energy_rate_original", "3", "�笔�����賡�瘙��(瘥?00摮?");
-            insertSysConfigSeed("article_reading_min_seconds", "60", "�����粉颲暹���撠𤑳��?);
-            insertSysConfigSeed("activity_checkin_default_points", "5", "瘣餃𢆡蝑曉�暺䁅恕蝘臬�");
-            insertSysConfigSeed("health_checkin_points", "5", "�亙熒�枏㨃蝘臬�");
-            insertSysConfigSeed("finance_checkin_points", "5", "��揣�枏㨃蝘臬�");
-            insertSysConfigSeed("trial_enabled", "true", "�臬炏�舐鍂隡𡁜�霂閧鍂");
-            insertSysConfigSeed("trial_days", "7", "霂閧鍂憭拇㺭");
-            insertSysConfigSeed("trial_features", "[\"free_activities\",\"free_courses\",\"teacher_consultation\"]", "霂閧鍂�罸𡢿�舐鍂�蠘�");
-            insertSysConfigSeed("health_dimension_weights", "{\"growth\":0.20,\"sleep\":0.15,\"vision\":0.10,\"immunity\":0.15,\"nutrition\":0.15,\"gut\":0.10,\"exercise\":0.15}", "7蝏游�摨猾�頨怨��𤩺��漤�蝵?);
-            insertSysConfigSeed("health_dimension_sync_factor", "0.5", "7蝏游�摨瑕�甇亥秐頨怨��讐頂�?);
-            log.info("SysConfig 蝘滚��唳旿撌脣�頧?);
-        } catch (Exception e) {
-            log.warn("SysConfig 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // Product 蝘滚��唳旿嚗? 銝芰內靘见����閬���券� 5 蝘?productType嚗?
-        try {
-            insertProductSeed("鈭脣��喟頂撌乩��?, "蝥蹂��𦠜𠯫撌乩��𠺪��滚遣摰嗅滬撖寡�璅∪�", "activity", 38800, "action", "all");
-            insertProductSeed("��貌蝞∠�21憭抵悌蝏�𨯫", "21憭抵�憸𤏸紋蝔页�霂��撟嗥恣���蝏?, "course", 19900, "mind", "all");
-            insertProductSeed("�𣳇��𣬚黎璉�瘚见�鋆?, "摰嗥鍂璉�瘚?+ �亙�閫�粉", "physical", 59900, "body", "budget");
-            insertProductSeed("�輻咱憭𡁏芋��恕�交�霂?, "�函瑪瘚贝� + 銝芣�批�撱箄悅", "digital", 9900, "wisdom", "none");
-            insertProductSeed("�鞾鵭閫��撣?撖?�刻砭", "60���銝㮖�閫��", "service", 50000, "wealth", "budget");
-            log.info("Product 蝘滚��唳旿撌脣�頧?);
-        } catch (Exception e) {
-            log.warn("Product 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // ====== Phase 2: ��捆�箏��航��折�蝵?======
-
-        // ��捆�箏��滨蔭銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS content_sections (" +
-                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "  page_key VARCHAR(50) NOT NULL," +
-                "  section_key VARCHAR(50) NOT NULL," +
-                "  title VARCHAR(100)," +
-                "  allowed_roles VARCHAR(255) DEFAULT '[\"anonymous\"]'," +
-                "  sort_order INT DEFAULT 0," +
-                "  status VARCHAR(20) DEFAULT 'active'," +
-                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")"
-            );
-            log.info("content_sections 銵典歇�𥕦遣");
-        } catch (Exception e) {
-            log.warn("�𥕦遣 content_sections 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ContentSection 蝘滚��唳旿
-        try {
-            insertContentSectionSeed("mind", "func_entries", "�蠘��亙藁", "[\"anonymous\"]", 1);
-            insertContentSectionSeed("mind", "daily_tip", "瘥𤩺𠯫敹��", "[\"anonymous\"]", 2);
-            insertContentSectionSeed("mind", "recommended_reading", "�刻���粉", "[\"anonymous\"]", 3);
-            insertContentSectionSeed("mind", "premium_content", "隡𡁜�銝枏���捆", "[\"parent\",\"teacher\"]", 4);
-            insertContentSectionSeed("mind", "mind_tasks", "敹�惣隞餃𦛚", "[\"parent\",\"child\"]", 5);
-            insertContentSectionSeed("mind", "related_activities", "�詨�瘣餃𢆡", "[\"parent\",\"child\"]", 6);
-            insertContentSectionSeed("mind", "purchased_courses", "撌脰揚霂曄�", "[\"parent\",\"child\"]", 7);
-            insertContentSectionSeed("body", "func_entries", "�蠘��亙藁", "[\"anonymous\"]", 1);
-            insertContentSectionSeed("body", "daily_stats", "隞𦠜𠯫�唳旿", "[\"anonymous\"]", 2);
-            insertContentSectionSeed("body", "health_tips", "�亙熒撠讛斐憯?, "[\"anonymous\"]", 3);
-            insertContentSectionSeed("body", "teacher_tips", "閫��撣�綫�?, "[\"teacher\"]", 4);
-            log.info("ContentSection 蝘滚��唳旿撌脣�頧?);
-        } catch (Exception e) {
-            log.warn("ContentSection 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // ====== �����捆蝟餌�蝘滚��唳旿 ======
-
-        // �����掩蝘滚��唳旿
-        try {
-            Integer catCount = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM article_categories WHERE id IN (1,2,3,4,5)", Integer.class);
-            if (catCount == null || catCount == 0) {
-                jdbcTemplate.execute("INSERT IGNORE INTO article_categories (id, name, icon, color, sort_order, status) VALUES " +
-                    "(1, '敹���亙熒', '��', '#5B9BD5', 1, 1), " +
-                    "(2, '��貌蝞∠�', '��', '#FF6B35', 2, 1), " +
-                    "(3, '鈭脣��躰�', '�𪂹�㵵�抽�㵵�把�?, '#4CAF50', 3, 1), " +
-                    "(4, '摮虫��?, '��', '#FFD700', 4, 1), " +
-                    "(5, '銝𤘪釣�?, '�㴓', '#8D6E63', 5, 1)");
-                log.info("�����掩蝘滚��唳旿撌脣�頧?);
-            }
-        } catch (Exception e) {
-            log.warn("�����掩蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // ====== ��膛鋆��蝟餌� ======
-        
-        // 餈�宏: users銵冽溶�䭾綫�𣂷犖摮埈挾
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'referrer_id'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN referrer_id BIGINT DEFAULT NULL COMMENT '�刻�鈭截D'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN referral_code VARCHAR(32) DEFAULT NULL COMMENT '銝芯犖��霂瑞�'");
-                jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_referral_code (referral_code)");
-                log.info("撌脫溶�惩�雿��畾萄�users銵?);
-            } else {
-                log.info("��膛�穃�畾萄歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃���膛�穃�畾萄仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: products銵冽溶�惩⏚瘨衣�摮埈挾
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'products' AND COLUMN_NAME = 'profit_rate'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE products ADD COLUMN profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋�?bps,100=1%)'");
-                log.info("撌脫溶�麖rofit_rate�堒�products銵?);
-            } else {
-                log.info("profit_rate�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�profit_rate�堒仃韐? {}", e.getMessage());
-        }
-
-        // �啗”: commission_records (雿��霈啣�)
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS commission_records (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "order_type VARCHAR(32) NOT NULL COMMENT '霈W�蝐餃�: membership/product/assessment/package', " +
-                "referrer_id BIGINT NOT NULL COMMENT '�刻�鈭截D', " +
-                "buyer_id BIGINT NOT NULL COMMENT '韐凋僭鈭截D', " +
-                "commission_type VARCHAR(16) NOT NULL COMMENT '雿��蝐餃�: member/profit', " +
-                "order_amount INT NOT NULL COMMENT '霈W��煾�(�?', " +
-                "profit_rate INT DEFAULT 0 COMMENT '�拇隋�?bps,100=1%)', " +
-                "commission_amount INT NOT NULL COMMENT '雿���煾�(�?', " +
-                "status VARCHAR(16) NOT NULL DEFAULT 'settled' COMMENT '�嗆�? pending/settled', " +
-                "remark VARCHAR(255) DEFAULT NULL, " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_referrer (referrer_id), " +
-                "INDEX idx_buyer (buyer_id), " +
-                "INDEX idx_order (order_id, order_type)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-            log.info("撌脣�撱構ommission_records銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣commission_records銵典仃韐? {}", e.getMessage());
-        }
-
-        // �啗”: withdrawal_requests (�鞟緵�唾窈)
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS withdrawal_requests (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "amount INT NOT NULL COMMENT '�鞟緵�煾�(�?', " +
-                "account_info TEXT COMMENT '韐行�靽⊥�(JSON)', " +
-                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '�嗆�? pending/approved/rejected', " +
-                "audit_by BIGINT DEFAULT NULL COMMENT '摰⊥瓲鈭截D', " +
-                "audit_at DATETIME DEFAULT NULL COMMENT '摰⊥瓲�園𡢿', " +
-                "remark VARCHAR(255) DEFAULT NULL COMMENT '摰⊥瓲憭�釣', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_user (user_id), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
-            log.info("撌脣�撱滴ithdrawal_requests銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣withdrawal_requests銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 隡𡁜�雿梶頂 & ��膛�拙� ======
-
-        // 餈�宏: users銵冽溶�牐��睃�畾?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'member_level'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN member_level VARCHAR(20) DEFAULT 'FREE' COMMENT '隡𡁜�蝑厩漣: FREE/FAMILY/PROVIDER'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN member_expire_time DATETIME DEFAULT NULL COMMENT '摰嗅滬隡𡁜��唳��園𡢿'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_consumption BIGINT DEFAULT 0 COMMENT '蝝航恣瘨�晶�煾�嚗��嚗?");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN upgrade_from_consumption TINYINT DEFAULT 0 COMMENT '�臬炏�朞�蝝航恣瘨�晶�芸𢆡��漣'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN direct_count INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箸㺭'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN indirect_count INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箸㺭'");
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_commission_earned BIGINT DEFAULT 0 COMMENT '蝝航恣�瑕�雿��嚗��嚗?");
-                log.info("撌脫溶�牐��睃�畾萄�users銵?);
-            } else {
-                log.info("隡𡁜�摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�隡𡁜�摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: commission_records銵冽溶�䭾�撅訫�畾?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'commission_records' AND COLUMN_NAME = 'level'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN level INT DEFAULT 1 COMMENT '雿��撅�漣: 1=�湔𦻖�刻�, 2=�湔𦻖�刻�'");
-                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN settled_at DATETIME DEFAULT NULL COMMENT '蝏梶��園𡢿'");
-                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN withdrawn_at DATETIME DEFAULT NULL COMMENT '�鞟緵�園𡢿'");
-                log.info("撌脫溶�䭾�撅訫�畾萄�commission_records銵?);
-            } else {
-                log.info("commission_records�拙�摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�commission_records�拙�摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // �啗”: member_upgrade_records (隡𡁜���漣霈啣�)
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS member_upgrade_records (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "from_level VARCHAR(20) NOT NULL COMMENT '��漣�滨�蝥?, " +
-                "to_level VARCHAR(20) NOT NULL COMMENT '��漣�𡒊�蝥?, " +
-                "upgrade_type VARCHAR(20) NOT NULL COMMENT '��漣蝐餃�: pay/consumption/admin', " +
-                "order_id BIGINT DEFAULT NULL COMMENT '�唾��臭�霈W�ID', " +
-                "consumption_amount BIGINT DEFAULT NULL COMMENT '閫血���漣��敞霈⊥�韐寥�憸?, " +
-                "expire_time DATETIME DEFAULT NULL COMMENT '摰嗅滬隡𡁜��唳��園𡢿', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_user (user_id), " +
-                "INDEX idx_order (order_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隡𡁜���漣霈啣�'");
-            log.info("撌脣�撱榦ember_upgrade_records銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣member_upgrade_records銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== �����捆蝟餌� ======
-
-        // �����掩銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_categories (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "name VARCHAR(50) NOT NULL COMMENT '��掩�?, " +
-                "icon VARCHAR(20) DEFAULT '' COMMENT '�暹�emoji', " +
-                "color VARCHAR(20) DEFAULT '#5B9BD5' COMMENT '����?, " +
-                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
-                "status TINYINT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂'" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����掩'");
-            log.info("撌脣�撱榮rticle_categories銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣article_categories銵典仃韐? {}", e.getMessage());
-        }
-
-        // ���銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS articles (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "category_id BIGINT DEFAULT 0 COMMENT '��撅𧼮�蝐膏D', " +
-                "title VARCHAR(200) NOT NULL COMMENT '���', " +
-                "summary VARCHAR(500) DEFAULT '' COMMENT '�䁅�', " +
-                "cover_image VARCHAR(500) DEFAULT '' COMMENT '撠�𢒰�銳RL', " +
-                "content LONGTEXT COMMENT '撖峕��砍�摰?, " +
-                "tags VARCHAR(200) DEFAULT '' COMMENT '��倌JSON�啁�', " +
-                "author VARCHAR(100) DEFAULT '瘚㰘𪄳蝳? COMMENT '雿𡏭?, " +
-                "read_time INT DEFAULT 0 COMMENT '憸�恣��粉����?, " +
-                "related_dimensions VARCHAR(100) DEFAULT '' COMMENT '�唾�鈭𠉛輕JSON�啁�', " +
-                "visibility VARCHAR(20) DEFAULT 'public' COMMENT '瘚讛����:public/login/private', " +
-                "visible_to TEXT COMMENT '蝘�����鈭箇黎JSON', " +
-                "status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/published/archived', " +
-                "is_featured TINYINT DEFAULT 0 COMMENT '1蝎?0�?, " +
-                "published_at DATETIME DEFAULT NULL COMMENT '�穃��園𡢿', " +
-                "view_count INT DEFAULT 0 COMMENT '瘚讛�甈⊥㺭', " +
-                "created_by BIGINT DEFAULT 0 COMMENT '�穃�鈭榮dminID', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���'");
-            log.info("撌脣�撱榮rticles銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣articles銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: articles銵刻‘��鰵摮埈挾嚗��摰寞唂銵剁�
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'visibility'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN visibility VARCHAR(20) DEFAULT 'public' COMMENT '瘚讛����:public/login/private' AFTER related_dimensions");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN visible_to TEXT COMMENT '蝘�����鈭箇黎JSON' AFTER visibility");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN tags VARCHAR(200) DEFAULT '' COMMENT '��倌JSON�啁�' AFTER content");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN related_dimensions VARCHAR(100) DEFAULT '' COMMENT '�唾�鈭𠉛輕JSON�啁�' AFTER read_time");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN is_featured TINYINT DEFAULT 0 COMMENT '1蝎?0�? AFTER status");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN published_at DATETIME DEFAULT NULL COMMENT '�穃��園𡢿' AFTER is_featured");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN view_count INT DEFAULT 0 COMMENT '瘚讛�甈⊥㺭' AFTER published_at");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN created_by BIGINT DEFAULT 0 COMMENT '�穃�鈭榮dminID' AFTER view_count");
-                log.info("撌脰�蝘蒼rticles銵刻‘���畾?);
-            } else {
-                log.info("articles銵典�畾萄歇摰峕㟲嚗諹歲餈��蝘?);
-            }
-        } catch (Exception e) {
-            log.warn("articles銵典�畾菔�蝘餃仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: articles銵刻‘��䰻霂�葉敹�鰵摮埈挾嚗Ếontent_type/difficulty_level/dimension_ids嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'content_type'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN content_type VARCHAR(20) DEFAULT 'article' COMMENT '��捆蝐餃�: article/knowledge/course/tip' AFTER article_type");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN difficulty_level TINYINT DEFAULT 0 COMMENT '�曉漲蝑厩漣 1-5' AFTER content_type");
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN dimension_ids TEXT COMMENT '�唾�蝏游漲ID�𡑒”JSON' AFTER related_dimensions");
-                log.info("撌脰�蝘蒼rticles銵函䰻霂�葉敹�鰵摮埈挾");
-            } else {
-                log.info("articles銵函䰻霂�葉敹��畾萄歇摰峕㟲嚗諹歲餈��蝘?);
-            }
-        } catch (Exception e) {
-            log.warn("articles銵函䰻霂�葉敹��畾菔�蝘餃仃韐? {}", e.getMessage());
-        }
-
-        // �����倌�唾�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_tags (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "article_id BIGINT NOT NULL COMMENT '���ID', " +
-                "tag_id BIGINT NOT NULL COMMENT '��倌ID嚗���㺱an_knowledge_tag.id嚗?, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_article_tag (article_id, tag_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���-��倌�唾�銵?");
-            log.info("撌脣�撱榮rticle_tags銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣article_tags銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 鈭𠉛輕�賡�蝟餌�嚗�揭�祆芋撘𧶏� ======
-
-        // 蝏游漲摰帋�銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS energy_dimension (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "code VARCHAR(16) NOT NULL UNIQUE COMMENT '蝏游漲隞��: body/mind/wisdom/action/wealth', " +
-                "name VARCHAR(20) NOT NULL COMMENT '蝏游漲�滨妍: 頨?敹?�?銵?撖?, " +
-                "icon VARCHAR(16) COMMENT '�暹�emoji', " +
-                "element VARCHAR(10) COMMENT '鈭磰����: �?�?�?�?瘞?, " +
-                "sort_order INT DEFAULT 0 COMMENT '�曄內憿箏�', " +
-                "status TINYINT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�賡�蝏游漲摰帋�銵?"
-            );
-            log.info("撌脣�撱榷nergy_dimension銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣energy_dimension銵典仃韐? {}", e.getMessage());
-        }
-
-        // �滚𦛚-蝏游漲瘥𥪯��滨蔭銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS energy_source_config (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "source_type VARCHAR(32) NOT NULL COMMENT '�交�蝐餃�: task/activity/course/product/consultation', " +
-                "source_id BIGINT NOT NULL COMMENT '�交�銝𡁜𦛚銵沉D', " +
-                "source_name VARCHAR(200) COMMENT '�𦯀��滨妍', " +
-                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
-                "ratio INT NOT NULL COMMENT '�䭾�(bps,10000=100%)', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_source (source_type, source_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�滚𦛚-蝏游漲瘥𥪯��滨蔭銵?"
-            );
-            log.info("撌脣�撱榷nergy_source_config銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣energy_source_config銵典仃韐? {}", e.getMessage());
-        }
-
-        // 韐剔�頧?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cart_items (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
-                "product_id BIGINT NOT NULL COMMENT '���ID'," +
-                "quantity INT DEFAULT 1 COMMENT '�圈�'," +
-                "selected TINYINT(1) DEFAULT 1 COMMENT '�臬炏�劐葉'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "INDEX idx_user (user_id)," +
-                "INDEX idx_product (product_id)," +
-                "UNIQUE KEY uk_user_product (user_id, product_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐剔�頧?");
-            log.info("撌脣�撱構art_items銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣cart_items銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_categories (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "name VARCHAR(64) NOT NULL COMMENT '��掩�滨妍'," +
-                "parent_id BIGINT DEFAULT 0 COMMENT '�嗅�蝐膏D(0=�寡��?'," +
-                "level INT DEFAULT 0 COMMENT '撅�漣(0/1/2/3)'," +
-                "sort INT DEFAULT 0 COMMENT '�鍦�'," +
-                "image VARCHAR(512) COMMENT '��掩�暹�'," +
-                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
-                "dimension_codes VARCHAR(128) COMMENT '蝏游漲蝻𣇉�(�堒噡���: body,mind,heart)'," +
-                "product_types VARCHAR(128) COMMENT '���蝐餃�(�堒噡���: PHYSICAL,COURSE,ASSESSMENT)'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "INDEX idx_parent (parent_id)," +
-                "INDEX idx_sort (sort)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���蝐餌𤌍'");
-            log.info("撌脣�撱漳hop_categories銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣shop_categories銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_systems (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "name VARCHAR(64) NOT NULL COMMENT '雿梶頂�滨妍'," +
-                "description VARCHAR(255) COMMENT '�讛膩'," +
-                "owner_id BIGINT COMMENT '�𥕦遣��D'," +
-                "profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋�?���瘥?'," +
-                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���雿梶頂'");
-            log.info("撌脣�撱榛istribution_systems銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣distribution_systems銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_relations (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID'," +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
-                "parent_id BIGINT COMMENT '銝羓漣�冽�ID(null=�?'," +
-                "depth INT DEFAULT 0 COMMENT '撅�漣瘛勗漲'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "INDEX idx_system (system_id)," +
-                "INDEX idx_user (user_id)," +
-                "INDEX idx_parent (parent_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='����喟頂'");
-            log.info("撌脣�撱榛istribution_relations銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣distribution_relations銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS after_sales_requests (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID'," +
-                "order_no VARCHAR(32) NOT NULL COMMENT '霈W��?," +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
-                "type VARCHAR(32) NOT NULL COMMENT '蝐餃�: REFUND/RETURN_REFUND'," +
-                "reason VARCHAR(255) COMMENT '�笔�'," +
-                "description TEXT COMMENT '�讛膩'," +
-                "images TEXT COMMENT '�剛��曄�(JSON�啁�)'," +
-                "refund_amount INT DEFAULT 0 COMMENT '��甈暸�憸?�?'," +
-                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�? pending/approved/rejected/completed'," +
-                "reject_reason VARCHAR(255) COMMENT '撽喳��笔�'," +
-                "handled_by BIGINT COMMENT '憭��鈭截D'," +
-                "handled_at DATETIME COMMENT '憭���園𡢿'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "INDEX idx_order (order_id)," +
-                "INDEX idx_user (user_id)," +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�桀��唾窈'");
-            log.info("撌脣�撱榮fter_sales_requests銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣after_sales_requests銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_discount_rules (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "name VARCHAR(64) NOT NULL COMMENT '閫���滨妍'," +
-                "type VARCHAR(32) NOT NULL COMMENT '蝐餃�: PERCENT/FIXED/THRESHOLD'," +
-                "value INT NOT NULL COMMENT '�䀹緍�?PERCENT=�曉�瘥娍㺭摮? FIXED/THRESHOLD=�煾��?'," +
-                "threshold_amount INT COMMENT '皛∪��冽�(�?隞�HRESHOLD)'," +
-                "category_id BIGINT COMMENT '��鍂蝐餌𤌍ID(null=�券�)'," +
-                "distribution_system_id BIGINT COMMENT '��鍂雿梶頂ID(null=�券�)'," +
-                "product_ids TEXT COMMENT '��鍂���ID(�堒噡���,null=�券�)'," +
-                "start_time DATETIME COMMENT '撘�憪𧢲𧒄�?," +
-                "end_time DATETIME COMMENT '蝏𤘪��園𡢿'," +
-                "max_uses INT DEFAULT 0 COMMENT '��憭找蝙�冽活�?0=銝漤�)'," +
-                "used_count INT DEFAULT 0 COMMENT '撌脖蝙�冽活�?," +
-                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "INDEX idx_category (category_id)," +
-                "INDEX idx_enabled (enabled)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�䀹緍閫��'");
-            log.info("撌脣�撱漳hop_discount_rules銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣shop_discount_rules銵典仃韐? {}", e.getMessage());
-        }
-
-        // �萄��拙�摮埈挾 - products銵?
-        try {
-            jdbcTemplate.execute("ALTER TABLE products ADD COLUMN category_id BIGINT COMMENT '���蝐餌𤌍ID'");
-            log.info("撌脫溶�蠏ategory_id�堒�products銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE products ADD COLUMN distribution_system_id BIGINT COMMENT '���雿梶頂ID'");
-            log.info("撌脫溶�賷istribution_system_id�堒�products銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // �萄��拙�摮埈挾 - product_orders銵?
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN discount_amount INT DEFAULT 0 COMMENT '隡䀹��煾�(�?'");
-            log.info("撌脫溶�賷iscount_amount�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN coupon_id BIGINT COMMENT '隡䀹��碰D'");
-            log.info("撌脫溶�蠏oupon_id�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cancel_at DATETIME COMMENT '�𡝗��園𡢿'");
-            log.info("撌脫溶�蠏ancel_at�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN transaction_id VARCHAR(64) COMMENT '敺桐縑�臭�鈭斗��?");
-            log.info("撌脫溶�慯ransaction_id�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cover_image VARCHAR(512) COMMENT '���撠�𢒰�曉翰�?");
-            log.info("撌脫溶�蠏over_image�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN address_snapshot TEXT COMMENT '�嗉揮�啣�敹怎�(JSON)'");
-            log.info("撌脫溶�蟵ddress_snapshot�堒�product_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // �賡�瘚�偌銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS energy_log (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
-                "amount INT NOT NULL COMMENT '�睃𢆡�?甇?�瑕�,韐?瘨��?', " +
-                "balance_after INT NOT NULL COMMENT '�睃𢆡�𦒘�憸?, " +
-                "source_type VARCHAR(32) COMMENT '�交�蝐餃�: task/product/medical_report/daily_record', " +
-                "source_id BIGINT COMMENT '�交�ID', " +
-                "ref_id BIGINT COMMENT '�唾��扳�瘞富D(閬���嗆�霈?', " +
-                "expires_at DATETIME COMMENT '餈���園𡢿(蝛?瘞訾�餈��)', " +
-                "description VARCHAR(500) COMMENT '�讛膩', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_child_dim (child_id, dimension_id), " +
-                "INDEX idx_created (created_at), " +
-                "INDEX idx_source (source_type, source_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�賡�瘚�偌銵?"
-            );
-            log.info("撌脣�撱榷nergy_log銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣energy_log銵典仃韐? {}", e.getMessage());
-        }
-
-        // 蝏游漲雿䠷�銵?
-        try {
-            jdbcTemplate.execute(
-                "CREATE TABLE IF NOT EXISTS energy_balance (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
-                "balance INT DEFAULT 0 COMMENT '敶枏��賡��?�臭蛹韐?', " +
-                "total_earned INT DEFAULT 0 COMMENT '蝝航恣�瑕�', " +
-                "total_spent INT DEFAULT 0 COMMENT '蝝航恣瘨��?, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_child_dim (child_id, dimension_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏游漲雿䠷�銵?"
-            );
-            log.info("撌脣�撱榷nergy_balance銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣energy_balance銵典仃韐? {}", e.getMessage());
-        }
-
-        // 蝏游漲蝘滚��唳旿嚗���貊��? �算�撖𢞖�銵𢞖�敹��頨恬�
-        try {
-            Integer dimCount = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM energy_dimension", Integer.class);
-            if (dimCount == null || dimCount == 0) {
-                jdbcTemplate.execute("INSERT INTO energy_dimension (code, name, icon, element, sort_order, status) VALUES " +
-                    "('mind', '敹?, '�𤣳', '�?, 4, 1), " +
-                    "('body', '頨?, '��', '�?, 5, 1), " +
-                    "('wisdom', '�?, '�䈑�', '�?, 1, 1), " +
-                    "('action', '銵?, '�鈡', '�?, 3, 1), " +
-                    "('wealth', '撖?, '�佂', '瘞?, 2, 1)");
-                log.info("�賡�蝏游漲蝘滚��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𤥁��讐輕摨衣�摮鞉㺭�桀仃韐? {}", e.getMessage());
-        }
-
-        // 銝箏歇�匧�����仿�霈斗�靘钅�蝵殷�銝窰roduct.domain銝��湛�
-        try {
-            Integer productConfigCount = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM energy_source_config WHERE source_type = 'product'", Integer.class);
-            if (productConfigCount == null || productConfigCount == 0) {
-                String[][] domainMapping = {
-                    {"action", "action"}, {"mind", "mind"}, {"body", "body"},
-                    {"wisdom", "wisdom"}, {"wealth", "wealth"}
-                };
-                for (String[] mapping : domainMapping) {
-                    jdbcTemplate.execute(
-                        "INSERT INTO energy_source_config (source_type, source_id, source_name, dimension_id, ratio) " +
-                        "SELECT 'product', p.id, p.name, d.id, 10000 " +
-                        "FROM products p " +
-                        "JOIN energy_dimension d ON d.code = '" + mapping[1] + "' " +
-                        "WHERE p.domain = '" + mapping[0] + "' " +
-                        "AND NOT EXISTS (" +
-                        "  SELECT 1 FROM energy_source_config esc " +
-                        "  WHERE esc.source_type = 'product' AND esc.source_id = p.id" +
-                        ")"
-                    );
-                }
-                log.info("撌脫�����賡�瘥𥪯��滨蔭撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��硋�����𤩺�靘钅�蝵桀仃韐? {}", e.getMessage());
-        }
-
-        // ====== 蝎曉��亙� P0: health_report_survey ======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_report_survey (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                "survey_data JSON COMMENT '靚���桀㭘蝏𤘪�JSON', " +
-                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�? pending/completed', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_report (report_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙�靚���桀㭘'");
-            log.info("撌脣�撱?health_report_survey 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 health_report_survey 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 蝎曉��亙� P0: health_gut_flora + health_disease_risk ======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_gut_flora (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
-                "bacteria_name VARCHAR(100) NOT NULL COMMENT '�𣬚��滨妍', " +
-                "bacteria_value VARCHAR(50) COMMENT '�𣬚�銝啣漲�?, " +
-                "normal_range VARCHAR(100) COMMENT '甇�虜��凒', " +
-                "status VARCHAR(20) COMMENT '�嗆�? 甇�虜/�譍�/�誯�', " +
-                "category VARCHAR(50) COMMENT '��掩: �厩��?�匧拿�?銝剜�扯�', " +
-                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_report (report_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�𣬚黎璉�瘚衤�憿寞㺭�?");
-            log.info("撌脣�撱?health_gut_flora 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 health_gut_flora 銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_disease_risk (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
-                "disease_name VARCHAR(100) NOT NULL COMMENT '�曄��滨妍', " +
-                "risk_value VARCHAR(50) COMMENT '憌𡡞埯�?0-1)', " +
-                "risk_level VARCHAR(20) COMMENT '憌𡡞埯蝑厩漣: 擃㗛��?��瘜冽�/雿𡡞��?, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_report (report_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�曄�憌𡡞埯霂�摯�唳旿'");
-            log.info("撌脣�撱?health_disease_risk 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 health_disease_risk 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: health_reports 銵冽溶�䭾鰵摮埈挾 ======
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN balance_score INT DEFAULT NULL COMMENT '�𣬚黎撟唾﹛�?");
-            log.info("撌脫溶��alance_score�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN diversity_score INT DEFAULT NULL COMMENT '�𣬚黎憭𡁏甅�批�'");
-            log.info("撌脫溶�賷iversity_score�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN beneficial_score INT DEFAULT NULL COMMENT '�厩��諹��?");
-            log.info("撌脫溶��eneficial_score�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN harmful_score INT DEFAULT NULL COMMENT '�匧拿�諹��?");
-            log.info("撌脫溶�㗖armful_score�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN core_genus_score INT DEFAULT NULL COMMENT '�詨����霂��'");
-            log.info("撌脫溶�蠏ore_genus_score�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏: health_reports 銵冽溶�䭾𥁒�羓��瑕�憪枏�摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN report_number VARCHAR(50) DEFAULT NULL COMMENT '�亙�蝻硋噡'");
-            log.info("撌脫溶��eport_number�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN person_name VARCHAR(50) DEFAULT NULL COMMENT '鋡急�瘚衤犖憪枏�'");
-            log.info("撌脫溶�麖erson_name�堒�health_reports銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // ====== 餈�宏: health_gut_flora 銵冽溶�䭾鰵摮埈挾 ======
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN population_level VARCHAR(50) DEFAULT NULL COMMENT '憭��鈭箇黎%瘞游像'");
-            log.info("撌脫溶�麖opulation_level�堒�health_gut_flora銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN detection_rate VARCHAR(50) DEFAULT NULL COMMENT '%甇�虜鈭箸�璉��?");
-            log.info("撌脫溶�賷etection_rate�堒�health_gut_flora銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN description TEXT DEFAULT NULL COMMENT '�𣬚�霂湔�'");
-            log.info("撌脫溶�賷escription�堒�health_gut_flora銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN `level` VARCHAR(20) DEFAULT 'GENUS' COMMENT '蝥批�: GENUS/SPECIES'");
-            log.info("撌脫溶�饊evel�堒�health_gut_flora銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // ====== 餈�宏: guides 銵函�銝� ======
-
-        // 餈�宏: guides 瘛餃� type 摮埈挾嚗�躹����∪�蝐餃�嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN type VARCHAR(32) DEFAULT 'teacher' COMMENT '�滚𦛚��掩�? teacher/planner/activity_provider/product_supplier'");
-            log.info("撌脫溶�慯ype�堒�guides銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏: guides 瘛餃� teachers ��僎摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN teacher_no VARCHAR(20) COMMENT '�滚𦛚����?");
-            log.info("撌脫溶�慯eacher_no�堒�guides銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN title VARCHAR(50) COMMENT '�𣬚妍/蝘啣噡'");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN specialty VARCHAR(200) COMMENT '銝㯄鵭憸��'");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN bio TEXT COMMENT '蝞�隞?");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN experience_years TINYINT DEFAULT 0 COMMENT '隞𦒘�撟湧�'");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN rating INT DEFAULT 500 COMMENT '霂��(�曉�雿?500=5.00)'");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN total_appointments INT DEFAULT 0 COMMENT '�餅��⊥活�?");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
-            log.info("撌脫溶�惩𧑐��摮埈挾�迷uides銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN verified_at DATETIME COMMENT '摰⊥瓲�朞��園𡢿'");
-        } catch (Exception e) {}
-
-        // 餈�宏: 撠?teachers 銵冽㺭�桀�撟嗅� guides嚗ōype='teacher'嚗?
-        try {
-            int migrated = jdbcTemplate.update(
-                "INSERT IGNORE INTO guides (user_id, type, teacher_no, title, specialty, bio, experience_years, rating, total_appointments, " +
-                "street_id, province, city, district, street, verified_at, status, level, created_at, updated_at) " +
-                "SELECT t.user_id, 'teacher', t.teacher_no, t.title, t.specialty, t.bio, t.experience_years, t.rating, t.total_appointments, " +
-                "t.street_id, t.province, t.city, t.district, t.street, t.verified_at, " +
-                "CASE WHEN t.status = 'active' THEN 'active' ELSE 'inactive' END, " +
-                "CASE WHEN t.verification_status = 'approved' THEN 'senior' WHEN t.verification_status = 'pending' THEN 'junior' ELSE 'junior' END, " +
-                "t.created_at, t.updated_at " +
-                "FROM teachers t " +
-                "LEFT JOIN guides g ON g.user_id = t.user_id " +
-                "WHERE g.id IS NULL"
-            );
-            if (migrated > 0) {
-                log.info("撌脖� teachers 銵刻�蝘?{} �⊥㺭�桀� guides嚗ōype=teacher嚗?, migrated);
-            }
-        } catch (Exception e) {
-            log.warn("餈�宏 teachers �?guides �唳旿憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: dan_assessment_results 銵冽溶�㰘恕�亦輕摨血�畾蛛�6蝏渲恕�乩�蝟餅�撅𤏪�
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'perception_score'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
-                    "ADD COLUMN perception_score INT COMMENT '�毺䰻敺堒�', " +
-                    "ADD COLUMN spatial_score INT COMMENT '蝛粹𡢿�萘輕敺堒�', " +
-                    "ADD COLUMN processing_speed_score INT COMMENT '�惩極�笔漲敺堒�'");
-                log.info("撌脖蛹 dan_assessment_results 銵冽溶�㰘恕�亦輕摨血�畾?);
-            } else {
-                log.info("dan_assessment_results 霈斤䰻蝏游漲摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� dan_assessment_results 霈斤䰻蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: dan_assessment_results 銵冽溶�?EMI 蝏游漲摮埈挾嚗ǒ1.2 敹�惣璅∪��齿�嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'emotion_management_score'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
-                    "ADD COLUMN emotion_management_score INT COMMENT '��貌蝞∠�敺堒�(EMI)', " +
-                    "ADD COLUMN empathy_score INT COMMENT '�𣬚�敹���?EMI)', " +
-                    "ADD COLUMN social_adaptability_score INT COMMENT '蝷曆����敺堒�(EMI)', " +
-                    "ADD COLUMN self_motivation_score INT COMMENT '�芣�瞈��勗��?EMI)'");
-                log.info("撌脖蛹 dan_assessment_results 銵冽溶�?EMI 蝏游漲摮埈挾");
-            } else {
-                log.info("dan_assessment_results EMI 蝏游漲摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� dan_assessment_results EMI 蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: dan_assessment_results 銵冽溶�?EMI 敹��摮鞟輕摨血�畾?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'emotion_score'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
-                    "ADD COLUMN emotion_score INT COMMENT '��貌��㺭(0-100)', " +
-                    "ADD COLUMN resilience_score INT COMMENT '敹���?0-100)', " +
-                    "ADD COLUMN stress_coping_score INT COMMENT '�见�摨𥪜笆(0-100)', " +
-                    "ADD COLUMN self_awareness_score INT COMMENT '�芣�霈斤䰻(0-100)'");
-                log.info("撌脖蛹 dan_assessment_results 銵冽溶�?EMI 敹��摮鞟輕摨血�畾?);
-            } else {
-                log.info("dan_assessment_results EMI 敹��摮鞟輕摨血�畾萄歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� dan_assessment_results EMI 敹��摮鞟輕摨血�畾萄仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: dan_assessment_results 銵冽溶�惩之鈭𥪯犖�潛輕摨血�畾?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'openness_score'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
-                    "ADD COLUMN openness_score INT COMMENT '撘��?0-100)', " +
-                    "ADD COLUMN conscientiousness_score INT COMMENT '撠質提�?0-100)', " +
-                    "ADD COLUMN extraversion_score INT COMMENT '憭硋��?0-100)', " +
-                    "ADD COLUMN agreeableness_score INT COMMENT '摰靝犖�?0-100)', " +
-                    "ADD COLUMN neuroticism_score INT COMMENT '蟡䂿�韐?0-100)', " +
-                    "ADD COLUMN big_five_overall_score INT COMMENT '憭找�鈭箸聢蝏澆��?");
-                log.info("撌脖蛹 dan_assessment_results 銵冽溶�惩之鈭𥪯犖�潛輕摨血�畾?);
-            } else {
-                log.info("dan_assessment_results 憭找�鈭箸聢蝏游漲摮埈挾撌脣��剁�頝唾�");
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� dan_assessment_results 憭找�鈭箸聢蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: users 銵冽溶�惩枂��𧒄颲啣�畾?
-        try {
-            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birth_hour VARCHAR(10) COMMENT '�箇��嗉劓: 摮𣂷�撖�晓颲啣歲��𧊋�喲��䔶漸'");
-            log.info("撌脫溶��irth_hour�堒�users銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 餈�宏: �滚遣 family_member_attributes 銵函����v1.2 敹�惣璅∪�嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_member_attributes' AND COLUMN_NAME = 'member_id'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                // �扯”摮睃銁雿������䕘�����斗唂銵券�撱?
-                jdbcTemplate.execute("DROP TABLE IF EXISTS family_member_attributes_old");
-                jdbcTemplate.execute("RENAME TABLE family_member_attributes TO family_member_attributes_old");
-                jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_member_attributes (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "member_id BIGINT NOT NULL COMMENT '摰嗅滬�𣂼�ID嚗Ếhildren銵冽�users銵剁�', " +
-                    "member_type VARCHAR(10) NOT NULL COMMENT '�𣂼�蝐餃�: child/parent', " +
-                    "birth_datetime DATETIME COMMENT '�箇��交�嚗�移蝖桀����嚗𣬚鍂鈭𤾸�摮埈��矋�', " +
-                    "eight_characters JSON COMMENT '�怠��𥟇�JSON', " +
-                    "wuxing_elements JSON COMMENT '鈭磰��毺����JSON', " +
-                    "zodiac VARCHAR(16) COMMENT '�蠘�: rat/ox/tiger/rabbit/dragon/snake/horse/sheep/monkey/rooster/dog/pig', " +
-                    "blood_type VARCHAR(5) COMMENT '銵��? A/B/AB/O', " +
-                    "mind_base_score INT DEFAULT 0 COMMENT '敹�輕摨血抅蝖��?�曉�雿?500=5.00)', " +
-                    "wisdom_base_score INT DEFAULT 0 COMMENT '�箇輕摨血抅蝖��?�曉�雿?500=5.00)', " +
-                    "behavior_modifier JSON COMMENT '銵䔶蛹靽格迤�惩�JSON', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "UNIQUE KEY uk_member (member_id, member_type)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬�𣂼���予撅墧�扯”'");
-                log.info("撌脤�撱?family_member_attributes 銵剁�v1.2 敹�惣璅∪�嚗?);
-            } else {
-                log.info("family_member_attributes 銵典歇銝?v1.2 蝏𤘪�嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("�滚遣 family_member_attributes 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: children 銵冽溶�?show_to_family �梹�v1.3 摰嗅滬�𣂼��∴�
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'children' AND COLUMN_NAME = 'show_to_family'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE children ADD COLUMN show_to_family TINYINT DEFAULT 1 COMMENT '�臬炏撖孵振摨剜��睃虾閫? 1=�? 0=�?");
-                log.info("撌脖蛹 children 銵冽溶�?show_to_family �?);
-            } else {
-                log.info("children 銵?show_to_family �堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� children 銵?show_to_family �堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: users 銵冽溶�?show_to_family �梹�v1.3 摰嗅滬�𣂼��∴�
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'show_to_family'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN show_to_family TINYINT DEFAULT 1 COMMENT '�臬炏撖孵振摨剜��睃虾閫? 1=�? 0=�?");
-                log.info("撌脖蛹 users 銵冽溶�?show_to_family �?);
-            } else {
-                log.info("users 銵?show_to_family �堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� users 銵?show_to_family �堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: tasks 銵冽溶�?family_member_id �梹�FamilyMember 餈�宏嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'family_member_id'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN family_member_id BIGINT COMMENT '摰嗅滬�𣂼�ID嚗���?family_members.id嚗?");
-                log.info("撌脖蛹 tasks 銵冽溶�?family_member_id �?);
-            } else {
-                log.info("tasks 銵?family_member_id �堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� tasks 銵?family_member_id �堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: family_members 銵冽溶�?role_override �梹�FamilyMember 餈�宏嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = 'role_override'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN role_override VARCHAR(20) DEFAULT 'auto' COMMENT '閫坿𠧧閬��: auto/parent/child/elderly嚗𣬚征=auto'");
-                log.info("撌脖蛹 family_members 銵冽溶�?role_override �?);
-            } else {
-                log.info("family_members 銵?role_override �堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� family_members 銵?role_override �堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: family_members 銵冽溶�?id_card �梹�摮拙�頨思遢霂�噡嚗?
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = 'id_card'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN id_card VARCHAR(18) DEFAULT NULL COMMENT '頨思遢霂�噡(摮拙�)'");
-                log.info("撌脖蛹 family_members 銵冽溶�?id_card �?);
-            } else {
-                log.info("family_members 銵?id_card �堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃� family_members 銵?id_card �堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: family_members 銵冽溶�惩酋摮𣂷�撅𧼮�畾蛛��鰕hildren銵典�撟塚�
-        String[][] childColumns = {
-            {"penalty_enabled", "TINYINT DEFAULT 1 COMMENT '�臬炏���蝘臬�(0�?�?'"},
-            {"theme",           "VARCHAR(32) DEFAULT 'default' COMMENT '銝駁�'"},
-            {"system_points",   "INT DEFAULT 0 COMMENT '蝟餌�蝘臬�(撟脤�/撟喳蝱憟硋�)'"},
-            {"streak_days",     "INT DEFAULT 0 COMMENT '餈䂿賒�枏㨃憭拇㺭'"},
-            {"last_task_date",  "DATE COMMENT '銝𦠜活隞餃𦛚�交�'"},
-            {"focus_max_daily", "TINYINT DEFAULT 3 COMMENT '瘥𤩺𠯫銝𤘪釣銝𢠃�'"},
-            {"focus_remaining","TINYINT DEFAULT 3 COMMENT '隞𦠜𠯫�拐�銝𤘪釣甈⊥㺭'"},
-            {"focus_reset_date","DATE COMMENT '銝𤘪釣甈⊥㺭�滨蔭�交�'"}
-        };
-        for (String[] col : childColumns) {
-            try {
-                Integer colExists = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = ?",
-                    Integer.class, col[0]);
-                if (colExists == null || colExists == 0) {
-                    jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN " + col[0] + " " + col[1]);
-                    log.info("撌脖蛹 family_members 銵冽溶�?{} �?, col[0]);
-                }
-            } catch (Exception e) {
-                log.warn("璉��?瘛餃� family_members 銵?{} �堒仃韐? {}", col[0], e.getMessage());
-            }
-        }
-
-        // �喟頂蝐餃�銵冽溶�?default_role �梹�閫坿𠧧璅⊥踎嚗?
-        ensureColumn("relationship_types", "default_role", "VARCHAR(20) DEFAULT NULL COMMENT '暺䁅恕閫坿𠧧璅⊥踎: parent/child'");
-
-        // 摰嗅滬�𣂼�銵冽溶�?role_override �梹��踵揢�?capability_role嚗?
-        ensureColumn("family_members", "role_override", "VARCHAR(20) DEFAULT 'auto' COMMENT '閫坿𠧧閬��: auto/parent/child/elderly'");
-        try {
-            jdbcTemplate.execute("ALTER TABLE family_members DROP COLUMN capability_role");
-            log.info("撌脣��?family_members.capability_role �批�嚗�歇�?role_override �蹂誨");
-        } catch (Exception e) {
-            // �𦯀�摮睃銁�硋歇�𣳇膄嚗�蕭�仿�霂?
-        }
-
-        // activities 銵冽溶�䭾𥁒�?蝑曉��詨�摮埈挾
-        ensureColumn("activities", "require_registration", "TINYINT DEFAULT 1 COMMENT '�臬炏��閬�𥁒�? 1=��閬? 0=�湔𦻖���'");
-        ensureColumn("activities", "require_checkin_review", "TINYINT DEFAULT 1 COMMENT '�枏㨃�臬炏��閬�恣�? 1=��閬? 0=�湔𦻖�朞�'");
-        ensureColumn("activities", "energy_penalty_unregistered", "INT DEFAULT 5 COMMENT '�芣𥁒�齿��∠�銵諹��𤩺緍�?");
-
-        // family_members 銵冽溶�惩�蝟餉����畾?
-        ensureColumn("family_members", "trust_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '靽∩遙摨?0-100'");
-        ensureColumn("family_members", "intimacy_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '鈭脣�摨?0-100'");
-        ensureColumn("family_members", "communication_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '瘝罸�朞捶�?0-100'");
-        ensureColumn("family_members", "last_interaction_at", "DATETIME COMMENT '��餈睲��冽𧒄�?");
-
-        // �𥕦遣韐剔�頧西”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cart (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "product_id BIGINT NOT NULL COMMENT '���ID', " +
-                "quantity INT NOT NULL DEFAULT 1 COMMENT '�圈�', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_user_product (user_id, product_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐剔�頧?");
-            log.info("撌脣�撱?cart 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 cart 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== DanShop �萄�璅∪�撱箄” ======
-        // 1. danshop_categories (�����掩銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_categories (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "parent_id BIGINT DEFAULT NULL COMMENT '�嗅�蝐膏D嚗ěull=銝�蝥改�', " +
-                "name VARCHAR(64) NOT NULL COMMENT '��掩�滨妍', " +
-                "image VARCHAR(512) DEFAULT NULL COMMENT '��掩�暹�URL', " +
-                "sort_order INT DEFAULT 0 COMMENT '�鍦�嚗��撠讛��惩�嚗?, " +
-                "energy_dimension_id BIGINT DEFAULT NULL COMMENT '�唾�鈭𠉛輕蝏游漲ID', " +
-                "status INT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_parent (parent_id), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����掩銵?");
-            log.info("撌脣�撱?danshop_categories 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_categories 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 2. danshop_products (���銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_products (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "category_id BIGINT NOT NULL COMMENT '��撅𧼮�蝐膏D', " +
-                "name VARCHAR(128) NOT NULL COMMENT '����滨妍', " +
-                "description TEXT COMMENT '���霂衣��讛膩', " +
-                "cover_image VARCHAR(512) COMMENT '撠�𢒰�銳RL', " +
-                "images TEXT COMMENT '憭𡁜㦛(JSON�啁�)', " +
-                "price INT NOT NULL COMMENT '�桐遠(�?', " +
-                "member_price INT DEFAULT NULL COMMENT '隡𡁜�隞?�?', " +
-                "cost_price INT DEFAULT NULL COMMENT '�鞉𧋦隞?�?', " +
-                "stock INT DEFAULT 0 COMMENT '摨枏��圈�', " +
-                "sales_count INT DEFAULT 0 COMMENT '���?, " +
-                "product_type VARCHAR(32) NOT NULL COMMENT '蝐餃�: physical/virtual/coupon/course', " +
-                "vendor_id BIGINT DEFAULT NULL COMMENT '靘𥕦���D', " +
-                "vendor_name VARCHAR(64) COMMENT '靘𥕦����蝘?, " +
-                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/approved/rejected/on_shelf/off_shelf', " +
-                "reject_reason VARCHAR(255) DEFAULT NULL COMMENT '摰⊥瓲�垍��笔�', " +
-                "profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋�?bps,100=1%)', " +
-                "external_source VARCHAR(32) COMMENT '憭㚚�����交�', " +
-                "external_id VARCHAR(64) COMMENT '憭㚚����ID', " +
-                "external_data TEXT COMMENT '憭㚚����摰峕㟲�唳旿(JSON)', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_category (category_id), " +
-                "INDEX idx_vendor (vendor_id), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���銵?");
-            log.info("撌脣�撱?danshop_products 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_products 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 3. danshop_orders (銝餉恥�閗”)
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_orders (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '霈W��?DS+�園𡢿�?6雿漤��?', " +
-                "buyer_id BIGINT NOT NULL COMMENT '銋啣振ID', " +
-                "family_id BIGINT DEFAULT NULL COMMENT '摰嗅滬ID', " +
-                "total_amount INT NOT NULL COMMENT '霈W��駁�憸?�?', " +
-                "discount_amount INT DEFAULT 0 COMMENT '隡䀹��煾�(�?', " +
-                "actual_amount INT NOT NULL COMMENT '摰硺��煾�(�?', " +
-                "status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/shipped/completed/refunding/refunded/cancelled', " +
-                "payment_method VARCHAR(16) DEFAULT 'wechat' COMMENT 'wechat/alipay', " +
-                "transaction_id VARCHAR(64) DEFAULT NULL COMMENT '敺桐縑/�臭�摰苷漱�枏噡', " +
-                "paid_at DATETIME DEFAULT NULL COMMENT '�臭��園𡢿', " +
-                "shipped_at DATETIME DEFAULT NULL COMMENT '�𤏸揮�園𡢿', " +
-                "completed_at DATETIME DEFAULT NULL COMMENT '摰峕��園𡢿', " +
-                "remark VARCHAR(255) DEFAULT NULL COMMENT '銋啣振憭�釣', " +
-                "cancel_reason VARCHAR(255) DEFAULT NULL COMMENT '�𡝗��笔�', " +
-                "receiver_name VARCHAR(32) DEFAULT NULL COMMENT '�嗡辣鈭箏��?, " +
-                "receiver_phone VARCHAR(16) DEFAULT NULL COMMENT '�嗡辣鈭箇㩞霂?, " +
-                "receiver_address VARCHAR(256) DEFAULT NULL COMMENT '�嗡辣鈭箏𧑐��', " +
-                "freight INT DEFAULT 0 COMMENT '餈鞱晶(�?', " +
-                "profit_amount INT DEFAULT 0 COMMENT '��隋�煾�(�?', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_buyer (buyer_id), " +
-                "INDEX idx_family (family_id), " +
-                "INDEX idx_status (status), " +
-                "INDEX idx_order_no (order_no)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='銝餉恥�閗”'");
-            log.info("撌脣�撱?danshop_orders 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_orders 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 4. danshop_order_items (霈W��𡒊�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_order_items (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_id BIGINT NOT NULL COMMENT '��撅噼恥�𣗏D', " +
-                "product_id BIGINT NOT NULL COMMENT '���ID', " +
-                "product_name VARCHAR(128) NOT NULL COMMENT '����滨妍(敹怎�)', " +
-                "cover_image VARCHAR(512) COMMENT '撠�𢒰�?敹怎�)', " +
-                "unit_price INT NOT NULL COMMENT '�蓥遠(�?敹怎�)', " +
-                "price INT NOT NULL COMMENT '�蓥遠(�?�怠��澆捆)', " +
-                "quantity INT NOT NULL DEFAULT 1 COMMENT '韐凋僭�圈�', " +
-                "subtotal INT NOT NULL COMMENT '撠讛恣(�?', " +
-                "product_type VARCHAR(32) COMMENT '���蝐餃�(敹怎�)', " +
-                "vendor_id BIGINT COMMENT '靘𥕦���D(敹怎�)', " +
-                "vendor_name VARCHAR(64) COMMENT '靘𥕦����蝘?敹怎�)', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_order (order_id), " +
-                "INDEX idx_product (product_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霈W��𡒊�銵?");
-            log.info("撌脣�撱?danshop_order_items 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_order_items 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 5. danshop_order_logs (霈W��滢��亙�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_order_logs (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "action VARCHAR(32) NOT NULL COMMENT '�滢�: create/pay/ship/confirm/refund/cancel', " +
-                "operator_id BIGINT DEFAULT NULL COMMENT '�滢�鈭截D', " +
-                "operator_type VARCHAR(16) DEFAULT NULL COMMENT 'buyer/vendor/admin/system', " +
-                "detail TEXT DEFAULT NULL COMMENT '�滢�霂行�(JSON)', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_order (order_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霈W��滢��亙�銵?");
-            log.info("撌脣�撱?danshop_order_logs 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_order_logs 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 6. danshop_logistics (�拇�靽⊥�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_logistics (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "order_item_id BIGINT DEFAULT NULL COMMENT '霈W��𡒊�ID', " +
-                "logistics_no VARCHAR(64) NOT NULL COMMENT '�拇��訫噡', " +
-                "logistics_company VARCHAR(32) NOT NULL COMMENT '�拇��砍虬蝻𣇉�: sf/yto/zt/sto/yd/ttkd', " +
-                "logistics_name VARCHAR(32) DEFAULT NULL COMMENT '�拇��砍虬�滨妍', " +
-                "sender_name VARCHAR(32) DEFAULT NULL COMMENT '�𤏸揮鈭箏��?, " +
-                "sender_phone VARCHAR(16) DEFAULT NULL COMMENT '�𤏸揮鈭箇㩞霂?, " +
-                "sender_address VARCHAR(256) DEFAULT NULL COMMENT '�𤏸揮鈭箏𧑐��', " +
-                "receiver_name VARCHAR(32) NOT NULL COMMENT '�嗡辣鈭箏��?, " +
-                "receiver_phone VARCHAR(16) NOT NULL COMMENT '�嗡辣鈭箇㩞霂?, " +
-                "receiver_address VARCHAR(256) NOT NULL COMMENT '�嗡辣鈭箏𧑐��', " +
-                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/shipped/signing/completed', " +
-                "tracking_data TEXT DEFAULT NULL COMMENT '�拇�頧刻蕨(JSON�啁�)', " +
-                "shipped_at DATETIME DEFAULT NULL COMMENT '�𤏸揮�園𡢿', " +
-                "signed_at DATETIME DEFAULT NULL COMMENT '蝑暹𤣰�園𡢿', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_order (order_id), " +
-                "INDEX idx_logistics_no (logistics_no), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�拇�靽⊥�銵?");
-            log.info("撌脣�撱?danshop_logistics 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_logistics 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 7. danshop_profit_rules (��隋閫���滨蔭銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_profit_rules (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "rule_name VARCHAR(64) NOT NULL COMMENT '閫���滨妍', " +
-                "rule_type VARCHAR(32) NOT NULL COMMENT '閫��蝐餃�: product_category/vendor_level/global', " +
-                "target_id BIGINT DEFAULT NULL COMMENT '�唾��格�ID', " +
-                "platform_profit_rate INT NOT NULL COMMENT '撟喳蝱�拇隋�?bps,100=1%)', " +
-                "referrer_l1_rate INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箏�瘨行�靘?bps,�惩⏚瘨?)', " +
-                "referrer_l2_rate INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箏�瘨行�靘?bps,�惩⏚瘨?)', " +
-                "platform_service_rate INT DEFAULT 0 COMMENT '撟喳蝱�滚𦛚韐寧�(bps,�㰘恥�閖�憸?)', " +
-                "is_active INT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_type (rule_type, target_id), " +
-                "INDEX idx_active (is_active)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��隋閫���滨蔭銵?");
-            log.info("撌脣�撱?danshop_profit_rules 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_profit_rules 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 8. danshop_profit_logs (��隋瘚�偌銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_profit_logs (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "order_no VARCHAR(32) NOT NULL COMMENT '霈W��?, " +
-                "order_amount INT NOT NULL COMMENT '霈W�摰硺��煾�(�?', " +
-                "cost_amount INT DEFAULT 0 COMMENT '�鞉𧋦�煾�(�?', " +
-                "profit_amount INT NOT NULL COMMENT '�拇隋�煾�(�?', " +
-                "platform_retained INT NOT NULL COMMENT '撟喳蝱�坔��煾�(�?', " +
-                "vendor_income INT NOT NULL COMMENT '靘𥕦�����園�憸?�?', " +
-                "commission_l1 INT DEFAULT 0 COMMENT 'L1�刻�鈭箔膛�?�?', " +
-                "commission_l2 INT DEFAULT 0 COMMENT 'L2�刻�鈭箔膛�?�?', " +
-                "rule_id BIGINT DEFAULT NULL COMMENT '雿輻鍂���瘨西��窼D', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_order (order_id), " +
-                "INDEX idx_order_no (order_no)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��隋瘚�偌銵?");
-            log.info("撌脣�撱?danshop_profit_logs 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_profit_logs 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 9. danshop_favorites (����嗉�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_favorites (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "product_id BIGINT NOT NULL COMMENT '���ID', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "UNIQUE INDEX idx_user_product (user_id, product_id), " +
-                "INDEX idx_user (user_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='����嗉�銵?");
-            log.info("撌脣�撱?danshop_favorites 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_favorites 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 10. danshop_addresses (�嗉揮�啣�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_addresses (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "receiver_name VARCHAR(32) NOT NULL COMMENT '�嗉揮鈭箏��?, " +
-                "phone VARCHAR(16) NOT NULL COMMENT '�嗉揮鈭箇㩞霂?, " +
-                "province VARCHAR(32) NOT NULL COMMENT '��遢', " +
-                "city VARCHAR(32) NOT NULL COMMENT '�𤾸�', " +
-                "district VARCHAR(32) NOT NULL COMMENT '�箏礶', " +
-                "street VARCHAR(256) NOT NULL COMMENT '霂衣��啣�', " +
-                "is_default INT DEFAULT 0 COMMENT '�臬炏暺䁅恕�啣� 1=�?0=�?, " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_user (user_id), " +
-                "INDEX idx_user_default (user_id, is_default)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮�啣�銵?");
-            log.info("撌脣�撱?danshop_addresses 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 danshop_addresses 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: activities銵冽溶�戹isible_scope�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'visible_scope'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visible_scope VARCHAR(20) DEFAULT NULL COMMENT '�航���凒: family(摰嗅滬)/role(閫坿𠧧)/user(�冽�)' AFTER visibility");
-                log.info("撌脫溶�戹isible_scope�堒�activities銵?);
-            } else {
-                log.info("activities銵肖isible_scope�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�activities銵肖isible_scope�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: articles銵冽溶�蟵rticle_type�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'article_type'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN article_type VARCHAR(20) DEFAULT 'normal' COMMENT '���蝐餃�: normal(�?/premium(隡䁅捶)/original(�笔�)' AFTER read_time");
-                log.info("撌脫溶�蟵rticle_type�堒�articles銵?);
-            } else {
-                log.info("articles銵災rticle_type�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�articles銵災rticle_type�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: articles銵冽溶�拎ord_count�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'word_count'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN word_count INT DEFAULT 0 COMMENT '���摮埈㺭' AFTER article_type");
-                log.info("撌脫溶�拎ord_count�堒�articles銵?);
-            } else {
-                log.info("articles銵肓ord_count�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�articles銵肓ord_count�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: article_reading_records銵冽溶�慯ask_id�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'article_reading_records' AND COLUMN_NAME = 'task_id'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE article_reading_records ADD COLUMN task_id BIGINT DEFAULT NULL COMMENT '�唾���遙�!D' AFTER duration_seconds");
-                log.info("撌脫溶�慯ask_id�堒�article_reading_records銵?);
-            } else {
-                log.info("article_reading_records銵系ask_id�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�article_reading_records銵系ask_id�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: tasks銵冽溶�坟ource_type�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'source_type'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN source_type VARCHAR(20) DEFAULT NULL COMMENT '�交�蝐餃�: article/activity/manual' AFTER minigame_code");
-                log.info("撌脫溶�坟ource_type�堒�tasks銵?);
-            } else {
-                log.info("tasks銵究ource_type�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�tasks銵究ource_type�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: tasks銵冽溶�坟ource_id�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'source_id'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN source_id BIGINT DEFAULT NULL COMMENT '�交�ID' AFTER source_type");
-                log.info("撌脫溶�坟ource_id�堒�tasks銵?);
-            } else {
-                log.info("tasks銵究ource_id�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�tasks銵究ource_id�堒仃韐? {}", e.getMessage());
-        }
-
-        // ====== 餈�宏: activities銵冽溶�蠏heckin_points�?======
-        try {
-            Integer colExists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'checkin_points'",
-                Integer.class);
-            if (colExists == null || colExists == 0) {
-                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN checkin_points INT DEFAULT 0 COMMENT '蝑曉�蝘臬�(0=雿輻鍂蝟餌�暺䁅恕)' AFTER price");
-                log.info("撌脫溶�蠏heckin_points�堒�activities銵?);
-            } else {
-                log.info("activities銵牢heckin_points�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�activities銵牢heckin_points�堒仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: �𥕦遣family_invitations銵剁�摰嗅滬��霂瑚誘�䕘�
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_invitations (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
-                    "token VARCHAR(64) NOT NULL UNIQUE COMMENT '��霂瑚誘�?UUID)', " +
-                    "created_by BIGINT NOT NULL COMMENT '�𥕦遣鈭箇鍂�弒D', " +
-                    "status VARCHAR(16) DEFAULT 'active' COMMENT '�嗆�? active/used/expired/revoked', " +
-                    "expires_at DATETIME COMMENT '餈���園𡢿', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_token (token), " +
-                    "INDEX idx_status (status)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬��霂瑚誘�?");
-            log.info("撌脣�撱榻amily_invitations銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣family_invitations銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== P0 �亙�撣? nutrition_indicator_mapping ======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_indicator_mapping (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "indicator_name_pattern VARCHAR(200) NOT NULL COMMENT '����滚龪�齿芋撘?SQL LIKE霂剜�,%銝粹�𡁻�蝚?'," +
-                "nutrient VARCHAR(50) NOT NULL COMMENT '�唾��亙�蝝惩�'," +
-                "severity_weight DECIMAL(3,2) DEFAULT 1.00 COMMENT '���(0-1)'," +
-                "deficiency_symptoms TEXT COMMENT '蝻箔���𠶖�讛膩'," +
-                "excess_symptoms TEXT COMMENT '餈����𠶖�讛膩'," +
-                "food_suggestions TEXT COMMENT '�刻�憌毺�(�堒噡���)'," +
-                "sort_order INT DEFAULT 0 COMMENT '�鍦�(憭批�潔���龪�?'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
-                "INDEX idx_nutrient (nutrient)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���-�亙�蝝䭾�撠�”'");
-            log.info("撌脣�撱?nutrition_indicator_mapping 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 nutrition_indicator_mapping 銵典仃韐? {}", e.getMessage());
-        }
-
-        // P0 �亙�撣? nutrition_deficiency_record
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_deficiency_record (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID'," +
-                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID'," +
-                "nutrient VARCHAR(50) NOT NULL COMMENT '�亙�蝝惩�'," +
-                "deficiency_type VARCHAR(20) NOT NULL COMMENT 'deficiency/excess/borderline/unclassified'," +
-                "severity DECIMAL(5,2) DEFAULT 0 COMMENT '銝仿�蝔见漲(0-1)'," +
-                "indicator_name VARCHAR(100) COMMENT '�唾�����?," +
-                "indicator_value VARCHAR(50) COMMENT '���璉�瘚?," +
-                "ref_range VARCHAR(100) COMMENT '������?," +
-                "symptoms TEXT COMMENT '��𠶖�讛膩'," +
-                "food_suggestions TEXT COMMENT '�刻�憌毺�'," +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
-                "INDEX idx_child (child_id)," +
-                "INDEX idx_report (report_id)," +
-                "INDEX idx_nutrient (nutrient)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙�蝻箔����霈啣�'");
-            log.info("撌脣�撱?nutrition_deficiency_record 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 nutrition_deficiency_record 銵典仃韐? {}", e.getMessage());
-        }
-
-        // P0 �亙�撣? ���-�亙�蝝䭾�撠?蝘滚��唳旿
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM nutrition_indicator_mapping", Integer.class);
-            if (count == null || count == 0) {
-                String[][] seedData = {
-                    {"����?, "�?, "1.00", "銋誩���𢒰�脰��賬��釣�誩�銝漤�銝?, "����誩虾�賣�隡方��?, "�函��肽�,蝥Z�,�㰘�,暺烐銁�?, "10"},
-                    {"25-蝢笔抅蝏渡�蝝痃", "蝏渡�蝝痃", "1.00", "敶勗��坔𢙺�嗚��爸撉澆��?, "蝏渡�蝝痃餈���航稲擃㗛�銵��?, "銝㗇�敼?�钅�,�𤏸�,撘箏��𥕦扒", "20"},
-                    {"蝏渡�蝝痃", "蝏渡�蝝痃", "1.00", "敶勗��坔𢙺�嗚��爸撉澆��脯����怠�銝钅�", "蝏渡�蝝痃餈���航稲擃㗛�銵��?, "銝㗇�敼?�钅�,�𤏸�,撘箏��𥕦扒", "15"},
-                    {"�?, "�?, "0.80", "憌�炬�誯����㭠閫匧�撣詻����怠��滢�", "�諹��誩蔣�漤��豢𤣰", "�∟�,�𥡝�,�㛖�摮?���", "10"},
-                    {"�?, "�?, "0.80", "撉券盲�𤏸�餈毺����朣輸䔮憸?, "擃㗛�銵������蝏梶𨺗", "�𥕦扒,鞊��,�曄铜,�嗪獄�?, "10"},
-                    {"蝏渡�蝝泎12", "蝏渡�蝝泎12", "1.00", "韐怨����蝏誩��脰�蝻?, "銝��砌��栞��?, "�𥡝�,曏∟�,�𥕦扒,敼潸�", "10"},
-                    {"蝏渡�蝝蟖", "蝏渡�蝝蟖", "0.60", "�滨𢥫�𥕢��溻���樴�枂銵�", "�寞頂���蝏梶𨺗憌𡡞埯", "�閧繬獢?璈坔�,�㕑�,�埝�", "10"},
-                    {"�質��?, "�讠蒾韐?, "0.90", "�𤏸�餈毺�����㕑�蝻?, "�曇�韐��", "曏∟�,敼潸�,�𥕦扒,鞊���?, "10"},
-                    {"�餉��?, "�讠蒾韐?, "0.90", "�亙�銝滩�����怠�銝钅�", "銵�瘨脩�蝔?, "曏∟�,敼潸�,�𥕦扒,鞊���?, "9"},
-                    {"�喲�蝥斤輕", "�喲�蝥斤輕", "0.50", "靘輻�����栞�蝢文仃銵?, "�寡����靘輯�憭?, "�刻健�?�祈�,鞊�掩,瘞湔�", "10"},
-                    {"�園�", "�園�", "0.70", "韐怨�����脰�蝻?, "銝��砌��栞��?, "�㰘�,�函��肽�,鞊�掩,�烐�", "10"},
-                    {"蝏渡�蝝鼦", "蝏渡�蝝鼦", "0.70", "閫���桅���铜�文僕�乓����怠�銝钅�", "憭渡�����𤩺�隡?, "�∟��?�函��肽�,�㛖�,�㰘�", "10"},
-                    {"蝖?, "蝖?, "0.50", "�滨𢥫�𥕢��溻��睻�嗉��蠘�撘�虜", "�勗�����脰�鋆?, "撌渲正�𡁏�,瘚琿�,�𤏸�", "10"},
-                    {"�?, "�?, "0.40", "�諹��㗇���辺�𣳇䔮憸?, "�寞頂���銵��?, "�𡁏�,�刻健�?瘛梁遛�祈�", "10"},
-                    {"�羓��?", "�羓��?, "0.60", "�𣳇��𣬚黎憭梯﹛����㚚䔮憸?, "銝��砌��栞��?, "�詨扒,瘜∟�,�喳�,摨瑟芦�?, "10"}
-                };
-                for (String[] row : seedData) {
-                    jdbcTemplate.update("INSERT IGNORE INTO nutrition_indicator_mapping " +
-                        "(indicator_name_pattern, nutrient, severity_weight, deficiency_symptoms, excess_symptoms, food_suggestions, sort_order) " +
-                        "VALUES (?, ?, ?, ?, ?, ?, ?)",
-                        row[0], row[1], new java.math.BigDecimal(row[2]), row[3], row[4], row[5], Integer.parseInt(row[6]));
-                }
-                log.info("nutrition_indicator_mapping 蝘滚��唳旿撌脣�頧?(15�?");
-            } else {
-                log.info("nutrition_indicator_mapping 蝘滚��唳旿撌脣��?({}�?, 頝唾�", count);
-            }
-        } catch (Exception e) {
-            log.warn("nutrition_indicator_mapping 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // ====== 敹���?Phase 1: emotion_checkin 銵?======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS emotion_checkin (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                    "user_id BIGINT NOT NULL COMMENT '�枏㨃鈭箇鍂�弒D', " +
-                    "emotion_type INT NOT NULL COMMENT '��貌蝐餃�: 1敹思�/2撟喳�撟喲�/3撟喲�/4�厩�銝滩��?5�曉�/6�西�/7���/8�西�/9�鞉�', " +
-                    "emotion_name VARCHAR(20) COMMENT '��貌�滨妍: happy/calm/peaceful/uncomfortable/sad/irritable/angry/anxious/fearful', " +
-                    "energy_level INT NOT NULL DEFAULT 3 COMMENT '�賡��嗆�? 1敺��/2雿?3銝剔�/4擃?5敺��', " +
-                    "note TEXT COMMENT '�枏㨃憭�釣', " +
-                    "photo_url VARCHAR(500) COMMENT '�抒�URL', " +
-                    "favorite_thing VARCHAR(500) COMMENT '隞𦠜𠯫���𨀣洽���隞嗡�', " +
-                    "points_awarded INT DEFAULT 0 COMMENT '憟硋�蝘臬�', " +
-                    "parent_visible TINYINT DEFAULT 1 COMMENT '摰園鵭�航�: 1�航�/0銝滚虾閫?, " +
-                    "checkin_date DATE NOT NULL COMMENT '�枏㨃�交�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_child_id (child_id), " +
-                    "INDEX idx_user_id (user_id), " +
-                    "INDEX idx_checkin_date (checkin_date), " +
-                    "INDEX idx_child_date (child_id, checkin_date)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��貌�枏㨃銵?");
-            log.info("撌脣�撱?emotion_checkin ��貌�枏㨃銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 emotion_checkin 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 1a-2: DAN Schema 靽桀� ======
-        // v1.2 EMI 敹��摮鞟輕摨?
-        String[] danEmiFields = {"emotion_score", "resilience_score", "stress_coping_score", "self_awareness_score"};
-        for (String field : danEmiFields) {
-            try {
-                Integer exists = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
-                    Integer.class, field);
-                if (exists == null || exists == 0) {
-                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT 'EMI摮鞟輕摨?0-100'");
-                    log.info("撌脫溶�?{} �堒� dan_assessment_results 銵?, field);
-                }
-            } catch (Exception e) {
-                log.warn("璉��?瘛餃� {} �堒仃韐? {}", field, e.getMessage());
-            }
-        }
-        // 憭找�鈭箸聢蝏游漲
-        String[] danBigFiveFields = {"openness_score", "conscientiousness_score", "extraversion_score", "agreeableness_score", "neuroticism_score", "big_five_overall_score"};
-        for (String field : danBigFiveFields) {
-            try {
-                Integer exists = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
-                    Integer.class, field);
-                if (exists == null || exists == 0) {
-                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT '憭找�鈭箸聢 0-100'");
-                    log.info("撌脫溶�?{} �堒� dan_assessment_results 銵?, field);
-                }
-            } catch (Exception e) {
-                log.warn("璉��?瘛餃� {} �堒仃韐? {}", field, e.getMessage());
-            }
-        }
-        // EMI 蝏游漲嚗��蝏芸��啗�隡啣�畾蛛�
-        String[] danEmiDimFields = {"emotion_management_score", "empathy_score", "social_adaptability_score", "self_motivation_score"};
-        for (String field : danEmiDimFields) {
-            try {
-                Integer exists = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
-                    Integer.class, field);
-                if (exists == null || exists == 0) {
-                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT 'EMI蝏游漲 0-100'");
-                    log.info("撌脫溶�?{} �堒� dan_assessment_results 銵?, field);
-                }
-            } catch (Exception e) {
-                log.warn("璉��?瘛餃� {} �堒仃韐? {}", field, e.getMessage());
-            }
-        }
-
-        // ====== 1b-1: bazi_reading_template 鈭磰��賜�閫�粉銵?======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS bazi_reading_template (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "element VARCHAR(20) NOT NULL COMMENT '鈭磰�: wood/fire/earth/metal/water', " +
-                    "condition VARCHAR(20) NOT NULL COMMENT '�嗆�? strong/weak/balanced', " +
-                    "personal_trait TEXT COMMENT '�扳聢�寡捶�讛膩', " +
-                    "mind_growth_advice TEXT COMMENT '敹���鞾鵭撱箄悅', " +
-                    "daily_tip_template TEXT COMMENT '瘥𤩺𠯫摰𨅯�璅⊥踎', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "UNIQUE KEY uk_element_condition (element, condition)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鈭磰��賜�閫�粉璅⊥踎'");
-            log.info("撌脣�撱?bazi_reading_template 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 bazi_reading_template 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 1b-1: numsoul_config �笔𦶢�菜㺭�滨蔭銵?======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS numsoul_config (" +
-                    "number INT PRIMARY KEY COMMENT '�菜㺭1-9', " +
-                    "title VARCHAR(50) NOT NULL COMMENT '蝘啣噡', " +
-                    "keywords VARCHAR(200) COMMENT '�扳聢�喲睸霂?, " +
-                    "mind_growth_advice TEXT COMMENT '敹���鞾鵭撱箄悅', " +
-                    "recommended_article_tags VARCHAR(200) COMMENT '�唾������倌', " +
-                    "color_hex VARCHAR(7) COMMENT '隞�”�? " +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�笔𦶢�菜㺭�滨蔭'");
-            log.info("撌脣�撱?numsoul_config 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 numsoul_config 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 1b-1: bazi_reading_template 蝘滚��唳旿 ======
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM bazi_reading_template", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.batchUpdate(
-                    "INSERT INTO bazi_reading_template (element, condition, personal_trait, mind_growth_advice, daily_tip_template) VALUES (?, ?, ?, ?, ?)",
-                    java.util.Arrays.asList(new Object[][]{
-                        {"wood", "strong", "�扳聢�𡁻榀���餈𥕦�敹���瑟�憸�紡�𥕦�撘��梶移蟡?, "摮虫�����暹𠹭嚗屸��滩��𡁏��矋��孵�撘寞�扳�萘輕", "摰𡏭�銵䔶撓撅閗��剁�敹屸�撘箏漲�脩�"},
-                        {"wood", "weak", "皜拙��厩兮���鈭𤾸�雿頣�雿��蝑𡝗𧒄摰寞��寡惚", "憓𧼮撩�芯縑敹�悌蝏���孵��𨀣鱏�喟��賢�", "摰靝��芰��詨�嚗��餈�漲餈�停隞碶犖"},
-                        {"wood", "balanced", "�扳聢銝剖爾�匧漲嚗峕𠳿�厰榀�批��厩�瘣?, "靽脲��啁𠶖嚗屸����枏�蝷曆漱�?, "摰𨀣�憭𡝗暑�剁�敹䔶��𣂷��?},
-                        {"fire", "strong", "�剜�撘��𨰜���皛⊥暑�𨥈�撖峕�����𥕦��偦�惩�", "瘜冽���貌蝞∠�嚗屸��齿�亥��脣𢆡", "摰𨅯�瘞游�瞈��琿�嚗���湔�雴��?},
-                        {"fire", "weak", "����怨�����萘��鳴�撖寡䰾�舀��誯��毺䰻", "���銵刻噢���嚗�畺�餌冗鈭方䌊靽?, "摰𨀣萱�㚚臁隡湛�敹𣬚𡠺憭��銋?},
-                        {"fire", "balanced", "�扳聢皜拇隋�匧漲嚗峕𠳿�厩��������?, "靽脲��渲閎�勗末嚗屸��漲�枏�銵刻噢", "摰𨅯�銝𡒊冗鈭斗暑�剁�敹峕�蝏芸��?},
-                        {"earth", "strong", "蝔喲��舫����韐�遙敹���臬𣪧�煺葉��葉瘚���?, "�踹�餈�漲�踵�嚗�郎隡朞秩'銝?", "摰𣈯���餈𣂼𢆡嚗���肽�餈��"},
-                        {"earth", "weak", "�誩��见�������批撩嚗�捆�㮖�隞碶犖�詨�", "憓𧼮撩銝餉��改��孵��祉��肽����?, "摰𨀣𦻖閫行鰵鈭讠�嚗���箏�銝滚�"},
-                        {"earth", "balanced", "�扳��血����鈭讠迅憒伐�鈭粹��喟頂�諹�", "靽脲�摮虫�嚗屸����烐��芣�", "摰靝熔餈𤏸䌊�塚�敹峕𠂔擖格𠂔憌?},
-                        {"metal", "strong", "�誩��𡁜���蕭瘙��蝢𠬍��瑟��栞����銵��", "摮虫��菜暑�㗛�𡄯��踹�餈��銝亥�", "摰𡏭䰾�舫�韏𧶏�敹諹�摨行鸌霂?},
-                        {"metal", "weak", "皜拙�撖∟����鈭𤾸�曉𨯬嚗峕糓�澆�靽∟�����?, "憓𧼮撩銵刻噢���嚗�畺�餉䌊靽∪�", "摰𨅯𣪧雿𤘪暑�剁�敹諹�摨西䌊�穃��?},
-                        {"metal", "balanced", "銝箔犖甇�凒���鈭𧢲�摨佗�銝滢��娪榀銝𤾸�摰?, "靽脲�撘��曉������漲憭𡁜��穃�", "摰𣈯�霂餃郎銋𩤃�敹屸凃�𥡝�撠?},
-                        {"water", "strong", "�箸�瘛望����鈭舘��伐��瑟��箄𠧧瘣𧼮��?, "�踹�餈�漲蝻𨅯�嚗屸����暹𠹭敹��", "摰𣈯��𣂼��喉�敹峕�肽�餈�楛"},
-                        {"water", "weak", "�𤩺�蝏������𣬚�敹��撖峕��𥕢�憭抵�", "憓𧼮撩�菜��𨥈��孵���貌�?, "摰𨀣萱�𣇉㴓憓��敹��撖鍦��?},
-                        {"water", "balanced", "�扳聢�������箏��矋�憭���菜暑敺堒�", "靽脲�憟賢�敹����漲�拙�敶勗��?, "摰𨀣虜瘜單部瞉∴�敹峕�蝏芣郭�?},
-                    })
-                );
-                log.info("bazi_reading_template 蝘滚��唳旿撌脣�頧?(15�?");
-            }
-        } catch (Exception e) {
-            log.warn("bazi_reading_template 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // ====== 1b-1: numsoul_config 蝘滚��唳旿 ======
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM numsoul_config", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.batchUpdate(
-                    "INSERT INTO numsoul_config (number, title, keywords, mind_growth_advice, recommended_article_tags, color_hex) VALUES (?, ?, ?, ?, ?, ?)",
-                    java.util.Arrays.asList(new Object[][]{
-                        {1, "撘��𥡝�?, "�祉����撖潦����啜��䌊靽?, "�孵��a��譍��讛�嚗屸��滨𡠺�凋�銵?, "憸�紡�?�芯縑�孵�", "#FF4444"},
-                        {2, "��像�?, "皜拙����雿栶����麄���𣂼�", "憓𧼮撩�芣�銝餃�嚗屸��滩�摨西����鈭?, "鈭粹�鈭文�,��貌銵刻噢", "#FF8C00"},
-                        {3, "銵刻噢�?, "�𥟇���冗鈭扎���閫���”颲?, "靽脲�銝𤘪釣嚗屸��齿�撠肽�甇?, "�偦�惩�,蝷曆漱�賢�", "#FFD700"},
-                        {4, "撱箄挽�?, "�∪���迅摰𠾼���摨譌��𠹻憟?, "摮虫��㗛�𡄯��踹�餈���箸�", "銝𤘪釣�?摮虫�銋䭾�", "#4CAF50"},
-                        {5, "�芰眏�?, "�㘾埯����硔��末憟����瘣?, "�孵�����𨥈��踹�蝻箔��鍦�", "�Y揣蝎曄�,����賢�", "#2196F3"},
-                        {6, "�單���?, "韐�遙����晞����柴��像銵?, "摮虫��芣��喟�嚗屸��滩�摨虫��?, "摰嗅滬�喟頂,韐�遙敹?, "#9C27B0"},
-                        {7, "�Y揣�?, "�箸�����僐��������蝢?, "銝𦒘犖��澈閫�圾嚗屸��滩�摨血��?, "�萘輕�賢�,摮虫��?, "#673AB7"},
-                        {8, "�𣂼停�?, "�����恣�����蝑硔���憡?, "�單釣��銁�鞾鵭嚗屸��滩�鈭舘蕭瘙���冽�撠?, "�格�蝞∠�,��揣�萘輕", "#3F51B5"},
-                        {9, "�𡁶��?, "��捆��惣�扼����胯���颲?, "霈曉�銝芯犖颲寧�嚗屸��滩�摨衣䰾�?, "鈭粹��喟頂,��貌蝞∠�", "#E91E63"},
-                    })
-                );
-                log.info("numsoul_config 蝘滚��唳旿撌脣�頧?(9�?");
-            }
-} catch (Exception e) {
-            log.warn("numsoul_config 蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_address (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                    "receiver_name VARCHAR(50) NOT NULL COMMENT '�嗉揮鈭箏��?, " +
-                    "phone VARCHAR(20) NOT NULL COMMENT '�嗉揮鈭箇㩞霂?, " +
-                    "province VARCHAR(50) COMMENT '��遢', " +
-                    "city VARCHAR(50) COMMENT '�𤾸�', " +
-                    "district VARCHAR(50) COMMENT '�箏礶', " +
-                    "street VARCHAR(200) COMMENT '霂衣��啣�', " +
-                    "is_default INT DEFAULT 0 COMMENT '�臬炏暺䁅恕 1=�?0=�?, " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_user_id (user_id)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮�啣�銵?");
-            log.info("撌脣�撱?user_address 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 user_address 銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== 隡𡁜�隞瑟聢雿梶頂 ======
-
-        // 餈�宏: activities銵冽溶�𦅙ember_price�?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'member_price'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN member_price INT COMMENT '隡𡁜�隞?�?' AFTER price");
-                log.info("撌脫溶�𦅙ember_price�堒�activities銵?);
-            } else {
-                log.info("member_price�堒歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�activities.member_price憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏: �𥕦遣 member_discount_configs 銵剁���掩蝥批��䀹緍�滨蔭嚗?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS member_discount_configs (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "level_code VARCHAR(20) NOT NULL COMMENT '隡𡁜�蝑厩漣: FAMILY/PROVIDER', " +
-                "target_type VARCHAR(20) NOT NULL COMMENT '�格�蝐餃�: product/activity', " +
-                "target_id BIGINT DEFAULT NULL COMMENT '�格�ID(NULL銵函內��掩蝥批�)', " +
-                "category_id BIGINT DEFAULT NULL COMMENT '蝐餌𤌍ID(��掩蝥批��䀹緍)', " +
-                "discount_percent INT NOT NULL COMMENT '�䀹緍�曉�瘥?憒?0銵函內90%)', " +
-                "enabled TINYINT DEFAULT 1 COMMENT '�臬炏�舐鍂', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_level (level_code), " +
-                "INDEX idx_target (target_type, target_id), " +
-                "INDEX idx_category (target_type, category_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隡𡁜��䀹緍�滨蔭'");
-            log.info("撌脣�撱榦ember_discount_configs銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣member_discount_configs銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            Integer hasCap = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'relationship_types' AND COLUMN_NAME = 'capability_role'",
-                Integer.class);
-            Integer hasDefault = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'relationship_types' AND COLUMN_NAME = 'default_role'",
-                Integer.class);
-            if (hasCap != null && hasCap == 0) {
-                if (hasDefault != null && hasDefault > 0) {
-                    jdbcTemplate.execute("ALTER TABLE relationship_types CHANGE COLUMN default_role capability_role VARCHAR(20) NOT NULL COMMENT '�賢�閫坿𠧧: parent/child'");
-                    log.info("撌脣�relationship_types.default_role�滚𦶢�滢蛹capability_role");
-                } else {
-                    jdbcTemplate.execute("ALTER TABLE relationship_types ADD COLUMN capability_role VARCHAR(20) NOT NULL DEFAULT 'parent' COMMENT '�賢�閫坿𠧧: parent/child' AFTER type_name");
-                    log.info("撌脫溶�蠏apability_role�堒�relationship_types銵?);
-                }
-            }
-        } catch (Exception e) {
-            log.warn("relationship_types capability_role 餈�宏憭梯揖: {}", e.getMessage());
-        }
-
-        // 蝖桐�capability_role�厰�霈文�潘��煺漣摨栞砲�𡐓OT NULL�𣳇�霈文�潘�撖潸稲INSERT�訶ield doesn't have a default value�躰秤嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE relationship_types MODIFY COLUMN capability_role VARCHAR(20) NOT NULL DEFAULT 'parent' COMMENT '�賢�閫坿𠧧: parent/child'");
-            log.info("撌脖耨�雹elationship_types.capability_role瘛餃�暺䁅恕�?parent'");
-        } catch (Exception e) {
-            log.warn("靽格㺿relationship_types.capability_role暺䁅恕�澆仃韐? {}", e.getMessage());
-        }
-
-        // ====== 憌���刻���㺭 Phase: food_recommend_idx / food_recommend_idx_log ======
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `food_recommend_idx` (" +
-                "`id` BIGINT NOT NULL AUTO_INCREMENT, " +
-                "`user_id` BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "`food_id` BIGINT NOT NULL COMMENT '憌��ID', " +
-                "`food_name` VARCHAR(100) COMMENT '憌���滨妍', " +
-                "`index_score` INT NOT NULL DEFAULT 0 COMMENT '�刻���㺭(0-100, �亥䌊�𣬚黎璉�瘚𧢲𥁒�?', " +
-                "`health_report_id` BIGINT COMMENT '�唾��亙熒�亙�ID', " +
-                "`calculated_at` DATETIME COMMENT '霈∠��園𡢿', " +
-                "`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "PRIMARY KEY (`id`), " +
-                "INDEX `idx_fri_user` (`user_id`), " +
-                "INDEX `idx_fri_food` (`food_id`), " +
-                "UNIQUE KEY `uk_fri_user_food` (`user_id`, `food_id`) " +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='憌���刻���㺭敶枏��?");
-            log.info("撌脣�撱?蝖株恕 food_recommend_idx 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 food_recommend_idx 銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `food_recommend_idx_log` (" +
-                "`id` BIGINT NOT NULL AUTO_INCREMENT, " +
-                "`user_id` BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "`food_id` BIGINT NOT NULL COMMENT '憌��ID', " +
-                "`food_name` VARCHAR(100) COMMENT '憌���滨妍', " +
-                "`previous_index` INT COMMENT '�䀹凒�齿綫�鞉��?, " +
-                "`new_index` INT COMMENT '�䀹凒�擧綫�鞉��?, " +
-                "`health_report_id` BIGINT COMMENT '閫血����摨瑟𥁒�𠍁D', " +
-                "`change_reason` VARCHAR(200) COMMENT '�䀹凒�笔�', " +
-                "`changed_at` DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "PRIMARY KEY (`id`), " +
-                "INDEX `idx_fril_user` (`user_id`), " +
-                "INDEX `idx_fril_food` (`food_id`) " +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='憌���刻���㺭�䀹凒��蟮�亙�'");
-            log.info("撌脣�撱?蝖株恕 food_recommend_idx_log 銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣 food_recommend_idx_log 銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏25: activities銵冽溶�惩恣�貊㮾�喳�畾蛛�瘣餃𢆡撌乩�瘚��敺�恣�?撽喳�/�穃�嚗?
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audit_status VARCHAR(20) DEFAULT NULL COMMENT '摰⊥瓲�嗆���approved/pending/rejected'");
-            log.info("撌脫溶�蟵udit_status�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audit_reason VARCHAR(500) DEFAULT NULL COMMENT '撽喳��笔�'");
-            log.info("撌脫溶�蟵udit_reason�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN auditor_id BIGINT DEFAULT NULL COMMENT '摰⊥瓲鈭截D'");
-            log.info("撌脫溶�蟵uditor_id�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audited_at DATETIME DEFAULT NULL COMMENT '摰⊥瓲�園𡢿'");
-            log.info("撌脫溶�蟵udited_at�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        log.info("�唳旿摨栞�蝘餃��?);
-
-        // ====== �亙熒蝏游漲 Phase 1: health_dimension_score / health_data_source_record / health_norm_reference ======
-        migrateHealthDimensionsTable();
-        seedHealthNorms();
-    }
-
-    private void migrateHealthDimensionsTable() {
-        try {
-            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_dimension_score` TO `health_dimension_score_old`");
-        } catch (Exception e) {
-            log.warn("health_dimension_score rename skipped: {}", e.getMessage());
-        }
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_dimension_scores` (\n" +
-                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
-                "  `member_id` bigint NOT NULL COMMENT '摰嗅滬�𣂼�ID',\n" +
-                "  `dimension` varchar(20) NOT NULL COMMENT '蝏游漲: growth/sleep/vision/immunity/nutrition/gut/exercise',\n" +
-                "  `score` int NOT NULL COMMENT '0-100�?,\n" +
-                "  `percentile` int DEFAULT NULL COMMENT '鈭箇黎�曉�雿?0-100',\n" +
-                "  `data_source` varchar(20) NOT NULL COMMENT '�唳旿皞? REPORT/PHOTO/VOICE/MANUAL',\n" +
-                "  `tier` tinyint NOT NULL DEFAULT 3 COMMENT '�唳旿撅�漣: 1�芸𢆡/2霂剝𨺗/3�见𢆡',\n" +
-                "  `raw_data` json DEFAULT NULL COMMENT '�笔��唳旿敹怎�',\n" +
-                "  `assess_date` date NOT NULL COMMENT '霂�摯�交�',\n" +
-                "  `expire_date` date DEFAULT NULL COMMENT '�唳旿餈���?,\n" +
-                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
-                "  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" +
-                "  PRIMARY KEY (`id`),\n" +
-                "  UNIQUE KEY `uk_member_dim_date` (`member_id`, `dimension`, `assess_date`)\n" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒蝏游漲霂��銵?");
-        } catch (Exception e) {
-            log.warn("health_dimension_scores 銵典�撱箏仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_data_source_record` TO `health_data_source_record_old`");
-        } catch (Exception e) {
-            log.warn("health_data_source_record rename skipped: {}", e.getMessage());
-        }
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_data_sources` (\n" +
-                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
-                "  `member_id` bigint NOT NULL,\n" +
-                "  `source_type` varchar(20) NOT NULL COMMENT 'PDF/PHOTO/VOICE/MANUAL/WEIXIN_STEP',\n" +
-                "  `dimension_codes` json NOT NULL COMMENT '敶勗���輕摨血�銵?,\n" +
-                "  `parsed_result` json DEFAULT NULL COMMENT '閫��蝏𤘪��券�',\n" +
-                "  `file_url` varchar(500) DEFAULT NULL COMMENT '�笔���辣URL',\n" +
-                "  `confidence` decimal(3,2) DEFAULT NULL COMMENT 'AI閫��蝵桐縑摨?,\n" +
-                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
-                "  PRIMARY KEY (`id`),\n" +
-                "  KEY `idx_member_source` (`member_id`, `source_type`)\n" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒�唳旿皞鞱扇敶閗”'");
-        } catch (Exception e) {
-            log.warn("health_data_sources 銵典�撱箏仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_norm_reference` TO `health_norm_reference_old`");
-        } catch (Exception e) {
-            log.warn("health_norm_reference rename skipped: {}", e.getMessage());
-        }
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_norm_reference` (\n" +
-                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
-                "  `dimension` varchar(20) NOT NULL COMMENT '蝏游漲',\n" +
-                "  `gender` varchar(10) NOT NULL COMMENT 'male/female/all',\n" +
-                "  `age_min` int NOT NULL COMMENT '撟湧�銝钅�(�?',\n" +
-                "  `age_max` int NOT NULL COMMENT '撟湧�銝𢠃�(�?',\n" +
-                "  `percentile_5` int DEFAULT NULL,\n" +
-                "  `percentile_15` int DEFAULT NULL,\n" +
-                "  `percentile_25` int DEFAULT NULL,\n" +
-                "  `percentile_50` int DEFAULT NULL COMMENT '銝凋��?,\n" +
-                "  `percentile_75` int DEFAULT NULL,\n" +
-                "  `percentile_85` int DEFAULT NULL,\n" +
-                "  `percentile_95` int DEFAULT NULL,\n" +
-                "  `source` varchar(50) DEFAULT NULL COMMENT '撣豢芋�交�',\n" +
-                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
-                "  PRIMARY KEY (`id`),\n" +
-                "  UNIQUE KEY `uk_dim_gender_age` (`dimension`, `gender`, `age_min`, `age_max`)\n" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒撣豢芋撖寧�銵?");
-        } catch (Exception e) {
-            log.warn("health_norm_reference 銵券�撱箏仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("INSERT IGNORE INTO health_dimension_scores (member_id, dimension, score, data_source, tier, assess_date, created_at)\n" +
-                " SELECT member_id,\n" +
-                "  CASE dimension\n" +
-                "    WHEN 'body' THEN 'growth'\n" +
-                "    WHEN 'fitness' THEN 'exercise'\n" +
-                "    WHEN 'cardio' THEN 'exercise'\n" +
-                "    WHEN 'blood' THEN 'immunity'\n" +
-                "    WHEN 'sleep' THEN 'sleep'\n" +
-                "    WHEN 'psyche' THEN 'growth'\n" +
-                "    WHEN 'diet' THEN 'nutrition'\n" +
-                "    ELSE dimension\n" +
-                "  END,\n" +
-                "  score,\n" +
-                "  UPPER(data_source),\n" +
-                "  3,\n" +
-                "  record_date,\n" +
-                "  NOW()\n" +
-                " FROM health_dimension_score_old WHERE is_latest = 1");
-        } catch (Exception e) {
-            log.warn("�抒輕摨西���㺭�株�蝘餉歲餈? {}", e.getMessage());
-        }
-    }
-
-    private void seedHealthNorms() {
-        try {
-            int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM health_norm_reference", Integer.class);
-            if (count == 0) {
-                jdbcTemplate.execute("INSERT INTO health_norm_reference (dimension, gender, age_min, age_max, percentile_5, percentile_15, percentile_25, percentile_50, percentile_75, percentile_85, percentile_95, source) VALUES\n" +
-                    "('growth', 'male', 72, 84, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('growth', 'female', 72, 84, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('growth', 'male', 84, 96, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('growth', 'female', 84, 96, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('growth', 'male', 96, 120, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('growth', 'female', 96, 120, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
-                    "('sleep', 'all', 0, 12, 40, 50, 60, 70, 80, 88, 95, 'NSF憍游匱�輻辺�罱��曉��?),\n" +
-                    "('sleep', 'all', 12, 36, 40, 50, 60, 70, 80, 88, 95, 'NSF撟澆��∠��垍蓡���'),\n" +
-                    "('sleep', 'all', 36, 72, 40, 50, 60, 70, 80, 88, 95, 'NSF摮阡��滨辺�罱��曉��?),\n" +
-                    "('sleep', 'all', 72, 156, 40, 50, 60, 70, 80, 88, 95, 'NSF摮阡��輻咱�∠��垍蓡���'),\n" +
-                    "('vision', 'male', 72, 144, 45, 55, 65, 75, 85, 90, 95, '閫���𤏸�����垍蓡���'),\n" +
-                    "('vision', 'female', 72, 144, 45, 55, 65, 75, 85, 90, 95, '閫���𤏸�����垍蓡���'),\n" +
-                    "('immunity', 'all', 0, 72, 15, 30, 45, 65, 80, 90, 95, '撟湔���活�售��曉��?),\n" +
-                    "('immunity', 'all', 72, 192, 15, 35, 50, 70, 85, 92, 98, '撟湔���活�售��曉��?),\n" +
-                    "('nutrition', 'all', 36, 192, 20, 30, 40, 50, 60, 70, 80, '�喲�憭𡁏甅�把��曉��?),\n" +
-                    "('gut', 'all', 0, 192, 40, 50, 60, 70, 80, 85, 95, '�𣬚黎鈭箇黎���(撟喳蝱�芸遣)'),\n" +
-                    "('exercise', 'male', 72, 144, 30, 40, 50, 60, 70, 80, 90, '�賢振摮衣�雿栞捶�亙熒���'),\n" +
-                    "('exercise', 'female', 72, 144, 25, 35, 45, 55, 65, 75, 85, '�賢振摮衣�雿栞捶�亙熒���')");
-                log.info("health_norm_reference 撣豢芋蝘滚��唳旿撌脣�頧?(18�? 蝏煺�0-100�曉��?");
-            } else {
-                log.info("health_norm_reference 撣豢芋�唳旿撌脣��?({}�?, 頝唾�", count);
-            }
-        } catch (Exception e) {
-            log.warn("health_norm_reference 撣豢芋蝘滚��唳旿�嘥��硋仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏: articles銵冽溶�惩恣�詨�雿𡏭��掩�见�畾?
-        try {
-            Integer exists = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'audit_status'",
-                Integer.class);
-            if (exists == null || exists == 0) {
-                jdbcTemplate.execute("ALTER TABLE articles " +
-                    "ADD COLUMN author_type VARCHAR(20) DEFAULT 'admin' COMMENT '雿𡏭��掩�页�admin/parent/child' AFTER created_by, " +
-                    "ADD COLUMN audit_status VARCHAR(20) DEFAULT 'approved' COMMENT '摰⊥瓲�嗆���approved/pending/rejected' AFTER status, " +
-                    "ADD COLUMN audit_reason TEXT COMMENT '撽喳��笔�' AFTER audit_status, " +
-                    "ADD COLUMN auditor_id BIGINT DEFAULT 0 COMMENT '摰⊥瓲鈭?ID' AFTER audit_reason, " +
-                    "ADD COLUMN audited_at DATETIME COMMENT '摰⊥瓲�園𡢿' AFTER auditor_id");
-                log.info("撌脫溶�惩恣�詨�雿𡏭��掩�见�畾萄�articles銵?);
-            } else {
-                log.info("articles銵典恣�詨�畾萄歇摮睃銁嚗諹歲餈?);
-            }
-        } catch (Exception e) {
-            log.warn("璉��?瘛餃�articles銵典恣�詨�畾萄仃韐? {}", e.getMessage());
-        }
-    }
-
-    private void initializeDefaultData() {
-        // �嘥��㚚�霈曉��望芋�?
-        try {
-            // 璉��交糓�血歇�厰�霈曉��?
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM rewards WHERE is_template = 1", Integer.class);
-            
-if (count == null || count == 0) {
-// �鍦�憸�挽憟硋�璅⊥踎嚗Ếhild_id銝摸ULL銵函內璅⊥踎嚗?
-jdbcTemplate.execute("INSERT INTO rewards (family_id, child_id, title, points_required, category, is_template) VALUES " +
-"(0, NULL, \'�见𢆡�餌�30���\', 30, \'蝎曄�蝐蓋', 1), " +
-"(0, NULL, \'�拙像�踵虜�?0���\', 40, \'�寞�蝐蓋', 1), " +
-"(0, NULL, \'�餅虜銋𣂼㦤\', 100, \'�抵捶蝐蓋', 1), " +
-"(0, NULL, \'銋啁焵�愧', 150, \'�抵捶蝐蓋', 1), " +
-"(0, NULL, \'���瘛��\', 20, \'�抵捶蝐蓋', 1), " +
-"(0, NULL, \'�㗇𥋘�𡁻�\', 25, \'�寞�蝐蓋', 1)");
-log.info("憸�挽憟硋�璅⊥踎撌脣�憪见�");
-}
-        } catch (Exception e) {
-            log.warn("�嘥��㚚�霈曉��勗仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��硋��勗�蝐?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM reward_categories WHERE family_id = 0", Integer.class);
-            
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO reward_categories (family_id, name, icon, sort_order) VALUES " +
-                    "(0, '�抵捶蝐?, 'gift', 1), " +
-                    "(0, '蝎曄�蝐?, 'star', 2), " +
-                    "(0, '�寞�蝐?, 'crown', 3)");
-                log.info("憟硋���掩撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��硋��勗�蝐餃仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��𡝗��⊿�蝔讠�
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM streak_milestones", Integer.class);
-            
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO streak_milestones (days, reward_points) VALUES " +
-                    "(3, 5), (7, 10), (30, 30), (100, 100)");
-                log.info("�枏㨃�𣬚�蝣穃歇�嘥��?);
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𡝗��⊿�蝔讠�憭梯揖: {}", e.getMessage());
-        }
-
-        // �嘥��硋�蝡惩�銋?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM badge_definitions", Integer.class);
-            
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO badge_definitions (badge_type, name, description, icon, condition_type, condition_value, reward_points) VALUES " +
-                    "('first_task', '�脲活摰峕�隞餃𦛚', '擐𡝗活摰峕�隞餅�隞餃𦛚', 'star', 'task_count', 1, 0), " +
-                    "('streak_3', '餈䂿賒3憭?, '餈䂿賒3憭拇��嗅��𣂷遙�?, 'fire', 'streak_days', 3, 5), " +
-                    "('streak_7', '餈䂿賒7憭?, '餈䂿賒7憭拇��嗅��𣂷遙�?, 'fire', 'streak_days', 7, 10), " +
-                    "('points_50', '蝘臬�颲曆犖', '銝��刻繮敺?0蝘臬�', 'trophy', 'weekly_points', 50, 0), " +
-                    "('task_100', '隞餃𦛚颲曆犖', '摰峕�100銝芯遙�?, 'medal', 'task_count', 100, 20)");
-                log.info("�讠�摰帋�撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��硋�蝡惩�銋匧仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��硋�皜豢��唳旿
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM mini_games", Integer.class);
-            
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO mini_games (game_code, game_name, description, icon, default_duration, default_points, game_url, sort_order, status) VALUES " +
-                    "('schulte', '�鍦��寞䲮�?, '霈剔�銝𤘪釣�𥕦��澆𢆡�賢�嚗峕𪄳�?-25�厰◇摨讐��?, '�㴓', 5, 5, '/pages/games/schulte', 1, 1), " +
-                    "('1a2b', '�𨀣㺭摮?, '�𨅯笆�啣��䔶�蝵株繮敺㛖妖����餌��餉��萘輕', '�𤩎', 10, 5, '/pages/games/1a2b', 2, 1), " +
-                    "('sudoku', '�啁𡠺', '憛怠��啣�雿踵�銵峕��埈�銝芸悍�潮���鉄1-9', '�𤚗', 15, 8, '/pages/games/sudoku', 3, 1)");
-                log.info("撠𤩺虜�𤩺㺭�桀歇�嘥��?);
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��硋�皜豢��唳旿憭梯揖: {}", e.getMessage());
-        }
-
-// �嘥��㚚�霈斤恣���
-try {
-  // ����亙僎瘛餃�role�梹�憒��銝滚��剁�
-  try {
-    jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN role VARCHAR(20) DEFAULT \'admin\' AFTER email");
-    log.info("撌脫溶��ole�堒�admins銵?);
-  } catch (Exception e) {
-    // �堒歇摮睃銁嚗�蕭�仿�霂?
-  }
-
-  Integer count = jdbcTemplate.queryForObject(
-  "SELECT COUNT(*) FROM admins", Integer.class);
-
-  if (count == null || count == 0) {
-    // 暺䁅恕蝞∠��? �𧢲㦤�?13800138000, 撖�� admin123
-    String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
-    jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
-    "(\'admin\', \'" + encryptedPassword + "\', \'蝟餌�蝞∠��娫', \'13800138000\', \'admin@xzyj.com\', \'admin\', 1)");
-    log.info("暺䁅恕蝞∠��睃歇�嘥��? �𧢲㦤�?13800138000, 撖�� admin123");
-  }
-} catch (Exception e) {
-  log.warn("�嘥��㚚�霈斤恣���憭梯揖: {}", e.getMessage());
-}
-
-    // �嘥��𡝗��輯��鍦�WEB蝞∠�韐血噡
-    try {
-      Integer teacherCount = jdbcTemplate.queryForObject(
-        "SELECT COUNT(*) FROM admins WHERE username = 'teacher'", Integer.class);
-      if (teacherCount == null || teacherCount == 0) {
-        String teacherPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_teacher123".getBytes());
-        jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, role, status) VALUES " +
-          "('teacher', '" + teacherPassword + "', '�鞾鵭閫��撣?, '13800138003', 'teacher', 1)");
-        log.info("�鞾鵭閫��撣�恣��揭�瑕歇�嘥��? �冽��?teacher, 撖�� teacher123");
-      }
-    } catch (Exception e) {
-      log.warn("�嘥��𡝗��輯��鍦�蝞∠�韐血噡憭梯揖: {}", e.getMessage());
-    }
-
-        // �嘥��碶遙�⊥芋�輻內靘𧢲㺭�?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM admin_task_templates", Integer.class);
-
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO admin_task_templates (title, description, points, category, need_review, recommended_age, difficulty, is_active) VALUES " +
-                        "('摰峕�雿靝�', '�㗇𧒄摰峕�摮行嵗撣�蔭��振摨凋�銝?, 10, '摮虫�', 1, 6, 'medium', 1), " +
-                        "('��粉30���', '�芯蜓��粉霂曉�銋衣�30���', 8, '��粉', 0, 5, 'easy', 1), " +
-                        "('�渡��輸𡢿', '�嗆㗲�渡��芸楛����游�銋行�', 6, '摰嗅𦛚', 0, 6, 'easy', 1), " +
-                        "('瘣㛖�', '擖剖�撣桀�皜��擗𣂼�', 5, '摰嗅𦛚', 1, 8, 'medium', 1), " +
-                        "('�瑕�餈𣂼𢆡1撠𤩺𧒄', '餈𥡝�頝烐郊���蝐餌��瑕�餈𣂼𢆡', 12, '餈𣂼𢆡', 0, 7, 'hard', 1), " +
-                        "('蝏��銋行�', '蝏��瘥𤤿��𣇉′蝚𥪯髡瘜?0���', 7, '摮虫�', 0, 7, 'medium', 1), " +
-                        "('�拍辺�抵絲', '�帋�9�孵��∟�嚗峕𡟺銝?�孵�韏瑕�', 5, '��暑銋䭾�', 0, 5, 'easy', 1), " +
-                        "('�諹秘�方�', '�諹秘銝�擐硋𧂈霂𡑒�', 8, '摮虫�', 1, 6, 'medium', 1)");
-                log.info("隞餃𦛚璅⊥踎蝷箔��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��碶遙�⊥芋�踹仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��𤥁��𤘪㺭�桃內靘页�撟蹂���嘀撌𧼮�嚗?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM streets", Integer.class);
-
-            if (count == null || count == 0) {
-                // �?
-                jdbcTemplate.execute("INSERT INTO streets (province, province_code, full_name, level, parent_id, sort_order) VALUES " +
-                        "('撟蹂��?, '44', '撟蹂��?, 1, NULL, 1)");
-                
-                // 撣?
-                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, full_name, level, parent_id, sort_order) VALUES " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '撟蹂���嘀撌𧼮�', 2, 1, 1), " +
-                        "('撟蹂��?, '44', '瘛勗裵撣?, '4403', '撟蹂���楛�喳�', 2, 1, 2), " +
-                        "('撟蹂��?, '44', '�䭾絲撣?, '4404', '撟蹂����瘚瑕�', 2, 1, 3)");
-                
-                // �?
-                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, district, district_code, full_name, level, parent_id, sort_order) VALUES " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '憭拇眾�?, '440106', '撟蹂���嘀撌𧼮�憭拇眾�?, 3, 2, 1), " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '頞羓��?, '440104', '撟蹂���嘀撌𧼮�頞羓��?, 3, 2, 2), " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '�芰死�?, '440113', '撟蹂���嘀撌𧼮��芰死�?, 3, 2, 3), " +
-                        "('撟蹂��?, '44', '瘛勗裵撣?, '4403', '�堒控�?, '440305', '撟蹂���楛�喳��堒控�?, 3, 3, 1), " +
-                        "('撟蹂��?, '44', '瘛勗裵撣?, '4403', '蝳讐眎�?, '440304', '撟蹂���楛�喳�蝳讐眎�?, 3, 3, 2)");
-                
-                // 銵烾�
-                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, district, district_code, street, street_code, full_name, level, parent_id, sort_order) VALUES " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '憭拇眾�?, '440106', '憭拇眾�𡑒��?, '440106001', '撟蹂���嘀撌𧼮�憭拇眾�箏予瘝喳�銵烾�', 4, 4, 1), " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '憭拇眾�?, '440106', '瘝蹱眾銵烾�', '440106002', '撟蹂���嘀撌𧼮�憭拇眾�箸�瘝唾��?, 4, 4, 2), " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '頞羓��?, '440104', '銝𨅯控銵烾�', '440104001', '撟蹂���嘀撌𧼮�頞羓��箔�撅梯��?, 4, 5, 1), " +
-                        "('撟蹂��?, '44', '撟踹�撣?, '4401', '�芰死�?, '440113', '撣�‘銵烾�', '440113001', '撟蹂���嘀撌𧼮��芰死�箏�獢亥��?, 4, 6, 1), " +
-                        "('撟蹂��?, '44', '瘛勗裵撣?, '4403', '�堒控�?, '440305', '�堒控銵烾�', '440305001', '撟蹂���楛�喳��堒控�箏�撅梯��?, 4, 7, 1), " +
-                        "('撟蹂��?, '44', '瘛勗裵撣?, '4403', '蝳讐眎�?, '440304', '蝳讐眎銵烾�', '440304001', '撟蹂���楛�喳�蝳讐眎�箇��啗��?, 4, 8, 1)");
-                
-                log.info("銵烾�蝷箔��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𤥁��𤘪㺭�桀仃韐? {}", e.getMessage());
-        }
-
-try {
-  Integer count = jdbcTemplate.queryForObject(
-  "SELECT COUNT(*) FROM admins", Integer.class);
-
-  if (count == null || count == 0) {
-    // 暺䁅恕蝞∠��? �𧢲㦤�?13800138000, 撖�� admin123
-    String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
-    jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
-    "('admin', '" + encryptedPassword + "', '蝟餌�蝞∠��?, '13800138000', 'admin@xzyj.com', 'admin', 1)");
-    log.info("暺䁅恕蝞∠��睃歇�嘥��? �𧢲㦤�?13800138000, 撖�� admin123");
-  }
-} catch (Exception e) {
-  log.warn("�嘥��碶遙�⊥芋�踹仃韐? {}", e.getMessage());
-}
-
-// �嘥��?users 銵冽�霂閧鍂�?
-try {
-  // �𥕦遣暺䁅恕摰嗅滬嚗���靝�摮睃銁嚗?
-  Integer familyCount = jdbcTemplate.queryForObject(
-    "SELECT COUNT(*) FROM families WHERE id = 1", Integer.class);
-  if (familyCount == null || familyCount == 0) {
-    jdbcTemplate.execute("INSERT INTO families (id, name, invite_code) VALUES (1, '暺䁅恕摰嗅滬', '888888')");
-    log.info("暺䁅恕摰嗅滬撌脣�撱?);
-  }
-
-  // 撖���惩�: MD5("xzyj_salt_" + password)
-  String adminPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_salt_admin123".getBytes());
-  String teacherPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_salt_teacher123".getBytes());
-
-  // �𥕦遣蝞∠��条鍂�瘀�蝞∠��䁅��莎�撖�� admin123嚗?
-  Integer adminUserCount = jdbcTemplate.queryForObject(
-    "SELECT COUNT(*) FROM users WHERE phone = '13800138000'", Integer.class);
-  if (adminUserCount == null || adminUserCount == 0) {
-    jdbcTemplate.execute("INSERT INTO users (openid, family_id, role, phone, nickname, real_name, password) VALUES " +
-      "('seed_admin_13800138000', 1, 'admin', '13800138000', '蝟餌�蝞∠��?, '蝟餌�蝞∠��?, '" + adminPassword + "')");
-    log.info("瘚贝�蝞∠��条鍂�瑕歇�𥕦遣: 13800138000 (admin閫坿𠧧, 撖�� admin123)");
-  }
-
-  // �𥕦遣瘚贝��坔��冽�
-  Integer teacherUserCount = jdbcTemplate.queryForObject(
-    "SELECT COUNT(*) FROM users WHERE phone = '13800138001'", Integer.class);
-  if (teacherUserCount == null || teacherUserCount == 0) {
-    jdbcTemplate.execute("INSERT INTO users (openid, family_id, role, phone, nickname, real_name, password) VALUES " +
-      "('seed_teacher_13800138001', 1, 'teacher', '13800138001', '瘚贝��坔�', '瘚贝��坔�', '" + teacherPassword + "')");
-    log.info("瘚贝��坔��冽�撌脣�撱? 13800138001 (�坔�閫坿𠧧, 撖�� teacher123)");
-  }
-} catch (Exception e) {
-  log.warn("�嘥��𡝗�霂閧鍂�瑕仃韐? {}", e.getMessage());
-}
-
-        // �嘥��𡝗�摨折�蝵桃�摮鞉㺭�?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM zodiac_config", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO zodiac_config (zodiac_code, zodiac_name, element, start_month, start_day, end_month, end_day, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
-                    "('aries',       '�賜�摨?, '�?, 3, 21, 4, 19, 65, 70, 1.10, 1.05, 0.95), " +
-                    "('taurus',      '�𤑳�摨?, '�?, 4, 20, 5, 20, 60, 65, 1.05, 1.10, 1.15), " +
-                    "('gemini',      '���摨?, '�?, 5, 21, 6, 21, 70, 80, 0.95, 1.15, 0.90), " +
-                    "('cancer',      '撌刻畺摨?, '瘞?, 6, 22, 7, 22, 75, 60, 1.00, 0.90, 1.05), " +
-                    "('leo',         '�桀�摨?, '�?, 7, 23, 8, 22, 65, 75, 1.15, 1.00, 1.10), " +
-                    "('virgo',       '憭�戊摨?, '�?, 8, 23, 9, 22, 55, 85, 0.95, 1.05, 1.00), " +
-                    "('libra',       '憭拍坐摨?, '�?, 9, 23, 10, 23, 70, 75, 0.90, 0.95, 1.10), " +
-                    "('scorpio',     '憭抵�摨?, '瘞?, 10, 24, 11, 22, 80, 70, 1.10, 1.00, 1.15), " +
-                    "('sagittarius', '撠��摨?, '�?, 11, 23, 12, 21, 60, 65, 1.15, 1.15, 0.95), " +
-                    "('capricorn',   '�拍劑摨?, '�?, 12, 22, 1, 19, 55, 75, 1.05, 1.10, 1.20), " +
-                    "('aquarius',    '瘞渡𣂎摨?, '�?, 1, 20, 2, 18, 75, 85, 0.95, 0.90, 1.00), " +
-                    "('pisces',      '�屸掉摨?, '瘞?, 2, 19, 3, 20, 80, 60, 0.90, 0.95, 0.95)");
-                log.info("�笔漣�滨蔭蝘滚��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𡝗�摨折�蝵桀仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��硋�摮烾�蝵桃�摮鞉㺭�殷���予撟?+ ����唳𣈲嚗?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM bazi_config", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO bazi_config (stem_or_branch, type, element, yin_yang, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
-                    "('�?, 'stem', '�?, 'yang', 60, 75, 1.05, 1.10, 1.00), " +
-                    "('銋?, 'stem', '�?, 'yin',  65, 70, 0.95, 1.05, 1.00), " +
-                    "('銝?, 'stem', '�?, 'yang', 75, 65, 1.10, 1.00, 0.95), " +
-                    "('銝?, 'stem', '�?, 'yin',  70, 60, 1.05, 0.95, 1.00), " +
-                    "('�?, 'stem', '�?, 'yang', 60, 65, 1.15, 1.05, 1.10), " +
-                    "('撌?, 'stem', '�?, 'yin',  55, 60, 1.10, 1.00, 1.15), " +
-                    "('摨?, 'stem', '�?, 'yang', 65, 80, 1.05, 1.10, 1.05), " +
-                    "('颲?, 'stem', '�?, 'yin',  60, 75, 0.95, 1.00, 1.10), " +
-                    "('憯?, 'stem', '瘞?, 'yang', 70, 70, 1.00, 0.95, 1.15), " +
-                    "('�?, 'stem', '瘞?, 'yin',  75, 65, 0.95, 0.90, 1.10), " +
-                    "('摮?, 'branch', '瘞?, 'yang', 70, 65, 1.00, 0.95, 1.05), " +
-                    "('銝?, 'branch', '�?, 'yin',  55, 60, 1.10, 1.05, 1.10), " +
-                    "('撖?, 'branch', '�?, 'yang', 65, 75, 1.15, 1.10, 1.00), " +
-                    "('�?, 'branch', '�?, 'yin',  60, 70, 1.05, 1.05, 0.95), " +
-                    "('颲?, 'branch', '�?, 'yang', 60, 65, 1.10, 1.00, 1.10), " +
-                    "('撌?, 'branch', '�?, 'yin',  75, 70, 1.05, 0.95, 1.00), " +
-                    "('�?, 'branch', '�?, 'yang', 80, 65, 1.15, 1.00, 0.95), " +
-                    "('�?, 'branch', '�?, 'yin',  55, 60, 1.05, 1.00, 1.05), " +
-                    "('�?, 'branch', '�?, 'yang', 65, 80, 1.00, 1.10, 1.05), " +
-                    "('�?, 'branch', '�?, 'yin',  60, 75, 0.95, 1.05, 1.10), " +
-                    "('�?, 'branch', '�?, 'yang', 60, 65, 1.10, 1.00, 1.15), " +
-                    "('鈭?, 'branch', '瘞?, 'yin',  70, 60, 1.00, 0.95, 1.05)");
-                log.info("�怠��滨蔭蝘滚��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��硋�摮烾�蝵桀仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��𤥁��钅�蝵桃�摮鞉㺭�?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM blood_type_config", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO blood_type_config (blood_type, description, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
-                    "('A',  '霈斤�韐蠘提��艇靚函��湛�雿���西�', 70, 75, 0.95, 1.00, 1.05), " +
-                    "('B',  '銋鞱�撘��𨰜��末憟��撘綽�雿�撩銋讛�𣂼�', 65, 70, 1.05, 1.10, 0.95), " +
-                    "('AB', '���批��踺������𥕦撩嚗䔶�隡䀹�撖⊥鱏', 75, 80, 1.00, 0.95, 1.10), " +
-                    "('O',  '�芯縑�𨀣鱏����典�撘綽�雿�𤐄�批楛閫?, 60, 65, 1.15, 1.15, 1.15)");
-                log.info("銵��钅�蝵桃�摮鞉㺭�桀歇�嘥��?);
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𤥁��钅�蝵桀仃韐? {}", e.getMessage());
-        }
-
-        // �嘥��碶��惩�蝘滚��唳旿
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM coupon", Integer.class);
-            if (count == null || count == 0) {
-                jdbcTemplate.update(
-                    "INSERT INTO coupon (name, type, value, min_spend, applicable_to, valid_from, valid_until, total_count, used_count) " +
-                    "VALUES (?, ?, ?, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), ?, 0)",
-                    "�啁鍂�瑚�鈭?0���", "FIXED", 1000, 0, "ALL", 100);
-                jdbcTemplate.update(
-                    "INSERT INTO coupon (name, type, value, min_spend, applicable_to, valid_from, valid_until, total_count, used_count) " +
-                    "VALUES (?, ?, ?, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), ?, 0)",
-                    "隡𡁜���漣50���", "FIXED", 5000, 9900, "MEMBERSHIP", 50);
-                log.info("隡䀹��貊�摮鞉㺭�桀歇�嘥��?);
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��碶��惩��唳旿憭梯揖: {}", e.getMessage());
-        }
-
-        // �嘥��𡝗��輯��鍦�璅∪��詨�銵?
-        initGuideModuleTables(jdbcTemplate);
-    }
-
-    private void initGuideModuleTables(JdbcTemplate jdbcTemplate) {
-        // �滚𦛚蝐餃�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS service_types (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "name VARCHAR(100) NOT NULL COMMENT '蝐餃��滨妍', " +
-                "icon VARCHAR(50) COMMENT '�暹�', " +
-                "description VARCHAR(500) COMMENT '�讛膩', " +
-                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
-                "status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '�嗆�?ACTIVE/DISABLED', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣service_types銵典仃韐? {}", e.getMessage());
-        }
-
-        // �滚𦛚��捆銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS service_contents (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "type_id BIGINT NOT NULL COMMENT '�唾��滚𦛚蝐餃�', " +
-                "title VARCHAR(200) NOT NULL COMMENT '��捆���', " +
-                "content TEXT COMMENT '撖峕��砍�摰?, " +
-                "duration INT COMMENT '撱箄悅�園鵭(���)', " +
-                "age_range VARCHAR(50) COMMENT '��鍂撟湧�', " +
-                "price INT COMMENT '����遠�?�?', " +
-                "status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '�嗆�?DRAFT/ACTIVE', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣service_contents銵典仃韐? {}", e.getMessage());
-        }
-
-        // 憟烾�璅⊥踎銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_package_templates (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "name VARCHAR(100) NOT NULL COMMENT '璅⊥踎�滨妍', " +
-                "validity_months INT COMMENT '�㗇��?�?', " +
-                "reference_price INT COMMENT '����遠�?�?', " +
-                "min_price INT COMMENT '��雿𤾸睸隞?�?', " +
-                "description VARCHAR(500) COMMENT '霂湔�', " +
-                "status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '�嗆�?ACTIVE/DISABLED', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_package_templates銵典仃韐? {}", e.getMessage());
-        }
-
-        // 憟烾�璅⊥踎�滚𦛚憿寡”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS package_template_services (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "template_id BIGINT NOT NULL COMMENT '�唾�璅⊥踎', " +
-                "content_id BIGINT NOT NULL COMMENT '�唾��滚𦛚��捆', " +
-                "quantity INT DEFAULT 1 COMMENT '�圈�', " +
-                "unit VARCHAR(20) COMMENT '�蓥�' " +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣package_template_services銵典仃韐? {}", e.getMessage());
-        }
-
-        // �鞾鵭閫��撣��擗鞱”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_packages (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
-                "template_id BIGINT COMMENT '�唾�璅⊥踎', " +
-                "name VARCHAR(100) NOT NULL COMMENT '憟烾��滨妍', " +
-                "price INT NOT NULL COMMENT '���桐遠�?�?', " +
-                "validity_months INT COMMENT '�㗇��?�?', " +
-                "description VARCHAR(500) COMMENT '憟烾�霂湔�', " +
-                "status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '�嗆�?DRAFT/PUBLISHED/PAUSED', " +
-                "sales_count INT DEFAULT 0 COMMENT '���?, " +
-                "share_code VARCHAR(50) COMMENT '��澈�?, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_packages銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏嚗餙uide_packages 銵冽溶�删撩憭勗�
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN guide_id BIGINT COMMENT '�鞾鵭閫��撣㇆D' AFTER id");
-        } catch (Exception e) {
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN package_id BIGINT COMMENT '�唾�璅⊥踎' AFTER guide_id");
-        } catch (Exception e) {
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN commission_rate INT COMMENT '雿��瘥𥪯�(bps,100=1%)' AFTER package_id");
-        } catch (Exception e) {
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages MODIFY COLUMN teacher_id BIGINT NULL");
-        } catch (Exception e) {
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages MODIFY COLUMN template_id BIGINT NULL");
-        } catch (Exception e) {
-        }
-
-        // 餈�宏嚗餙uide_packages 銵冽溶�?level �梹�GuidePackage 摰硺���閬��
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN level VARCHAR(20) COMMENT '憟烾�蝑厩漣' AFTER name");
-        } catch (Exception e) {
-        }
-
-        // 餈�宏嚗餙uide_packages 銵冽溶�?validity_days �?
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN validity_days INT DEFAULT 0 COMMENT '�㗇��笔予�? AFTER validity_months");
-        } catch (Exception e) {
-        }
-
-        // 餈�宏嚗餙uide_packages 銵冽溶�?sort_order �?
-        try {
-            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN sort_order INT DEFAULT 0 COMMENT '�鍦�' AFTER status");
-        } catch (Exception e) {
-        }
-
-        // �鞾鵭閫��撣��擗鞉��⊿★銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_package_services (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "package_id BIGINT NOT NULL COMMENT '�唾�憟烾�', " +
-                "content_id BIGINT NOT NULL COMMENT '�唾��滚𦛚��捆', " +
-                "quantity INT DEFAULT 1 COMMENT '�圈�', " +
-                "unit VARCHAR(20) COMMENT '�蓥�' " +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_package_services銵典仃韐? {}", e.getMessage());
-        }
-
-        // 霈W�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_orders (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "order_no VARCHAR(50) NOT NULL COMMENT '霈W��?, " +
-                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
-                "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
-                "package_id BIGINT NOT NULL COMMENT '憟烾�ID', " +
-                "amount INT NOT NULL COMMENT '�煾�(�?', " +
-                "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆�?PENDING/PAID/COMPLETED/REFUNDED', " +
-                "pay_time DATETIME COMMENT '�臭��園𡢿', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_orders銵典仃韐? {}", e.getMessage());
-        }
-
-        // 雿���𡒊�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_commissions (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "amount INT NOT NULL COMMENT '雿���煾�(�?', " +
-                "rate INT COMMENT '雿��瘥𥪯�(bps,100=1%)', " +
-                "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆�?PENDING/COMPLETED', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_commissions銵典仃韐? {}", e.getMessage());
-        }
-
-        // �滚𦛚霈啣�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_service_logs (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
-                "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
-                "order_id BIGINT COMMENT '霈W�ID', " +
-                "service_content_id BIGINT NOT NULL COMMENT '�滚𦛚��捆ID', " +
-                "notes VARCHAR(500) COMMENT '�滚𦛚霈啣�', " +
-                "duration INT COMMENT '�滚𦛚�園鵭(���)', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_service_logs銵典仃韐? {}", e.getMessage());
-        }
-
-        // �鞾鵭閫��撣��霂瑞�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_invite_codes (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "guide_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣�鍂�弒D', " +
-                "code VARCHAR(50) NOT NULL UNIQUE COMMENT '��霂瑞�', " +
-                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�?, " +
-                "used_by_user_id BIGINT COMMENT '雿輻鍂霂仿�霂瑞���鍂�弒D', " +
-                "used_at DATETIME COMMENT '雿輻鍂�園𡢿', " +
-                "expire_at DATETIME COMMENT '餈���園𡢿', " +
-                "use_count INT DEFAULT 0 COMMENT '雿輻鍂甈⊥㺭', " +
-                "max_use_count INT COMMENT '��憭找蝙�冽活�?, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
-                ")");
-        } catch (Exception e) {
-            log.warn("�𥕦遣guide_invite_codes銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏29: assessment_orders銵冽溶�蟵ppointment_id摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE assessment_orders ADD COLUMN appointment_id BIGINT COMMENT '�唾����蝥匈D'");
-            log.info("撌脫溶�蟵ppointment_id�堒�assessment_orders銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // 韐W�蝏游漲: 韐W��枏㨃霈啣�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS finance_checkins (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                "checkin_type VARCHAR(20) NOT NULL COMMENT '�枏㨃蝐餃�: daily_plan/saving/expense/review', " +
-                "checkin_date DATE NOT NULL COMMENT '�枏㨃�交�', " +
-                "amount INT COMMENT '�煾�(�?�嗆𣈲霈啣�)', " +
-                "category VARCHAR(50) COMMENT '�嗆𣈲��掩', " +
-                "note VARCHAR(200) COMMENT '憭�釣', " +
-                "mood VARCHAR(20) COMMENT '敹��', " +
-                "earned_energy INT DEFAULT 0 COMMENT '�瑕�����?, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_user_date (user_id, checkin_date), " +
-                "INDEX idx_child (child_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐W��枏㨃霈啣�銵?");
-            log.info("撌脣�撱榻inance_checkins銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣finance_checkins銵典仃韐? {}", e.getMessage());
-        }
-
-        // 韐W�蝏游漲: 靽嘥�蝞∠�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS insurance_policies (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "child_id BIGINT COMMENT '�唾�摮拙�ID', " +
-                "policy_name VARCHAR(100) NOT NULL COMMENT '靽嘥��滨妍', " +
-                "insurance_company VARCHAR(100) COMMENT '靽嗪埯�砍虬', " +
-                "policy_type VARCHAR(50) COMMENT '靽嘥�蝐餃�: medical/life/accident/education/endowment', " +
-                "insured_person VARCHAR(50) NOT NULL COMMENT '鋡思�鈭箏��?, " +
-                "premium INT COMMENT '靽肽晶(�?', " +
-                "sum_insured INT COMMENT '靽嗪�(�?', " +
-                "start_date DATE COMMENT '����交�', " +
-                "end_date DATE COMMENT '�唳��交�', " +
-                "renewal_type VARCHAR(20) DEFAULT 'annual' COMMENT '蝏剛晶蝐餃�: annual/monthly/single', " +
-                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�? active/expired/cancelled', " +
-                "policy_no VARCHAR(100) COMMENT '靽嘥��?, " +
-                "remark VARCHAR(500) COMMENT '憭�釣', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_user (user_id), " +
-                "INDEX idx_child (child_id), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靽嘥�蝞∠�銵?");
-            log.info("撌脣�撱槐nsurance_policies銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣insurance_policies銵典仃韐? {}", e.getMessage());
-        }
-
-        // ====== �亙熒璉�瘚𧢲𥁒�𦠜芋�?======
-        // �亙熒�亙�銵剁�雿𤘪��亙�/�𣬚黎璉�瘚𧢲𥁒�𠺪�
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_reports (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                    "family_id BIGINT COMMENT '摰嗅滬ID', " +
-                    "report_type VARCHAR(32) NOT NULL COMMENT '�亙�蝐餃�: physical_exam(雿𤘪�)/gut_flora(�𣬚黎璉�瘚?', " +
-                    "report_date DATE COMMENT '�亙��交�', " +
-                    "overall_score INT COMMENT '�亙熒�餃�(0-100)', " +
-                    "gut_health_score INT COMMENT '�𣬚黎�亙熒�?, " +
-                    "chronic_disease_score INT COMMENT '�Y��批��?, " +
-                    "nutrition_score INT COMMENT '�亙���﹛�?, " +
-                    "gut_age VARCHAR(32) COMMENT '�𣳇�憸��撟湧�', " +
-                    "gut_type VARCHAR(50) COMMENT '�惩�', " +
-                    "file_url VARCHAR(500) COMMENT '�亙���辣URL', " +
-                    "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�? active/archived', " +
-                    "remark VARCHAR(500) COMMENT '憭�釣', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_user_id (user_id), " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_report_type (report_type)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒璉�瘚𧢲𥁒�𡃏”'");
-            log.info("撌脣�撱榴ealth_reports銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣health_reports銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �亙熒����𡒊�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_indicators (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
-                    "category VARCHAR(50) COMMENT '�����掩: �亙��嗅�/�曄�憌𡡞埯/�𣳇�撅誯�/蟡䂿��坿捶/...', " +
-                    "indicator_name VARCHAR(100) NOT NULL COMMENT '����滨妍', " +
-                    "indicator_value VARCHAR(100) COMMENT '璉�瘚?, " +
-                    "unit VARCHAR(50) COMMENT '�蓥�', " +
-                    "ref_range VARCHAR(200) COMMENT '������?, " +
-                    "status VARCHAR(50) COMMENT '霂�摯�嗆�? 甇�虜/�譍�/�誯�/餈��/瘜冽�/雿𡡞��?�芣��?, " +
-                    "sort_order INT DEFAULT 0 COMMENT '�曄內�鍦�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "INDEX idx_report_id (report_id), " +
-                    "INDEX idx_category (category)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒����𡒊�銵?");
-            log.info("撌脣�撱榴ealth_indicators銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣health_indicators銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // ---------- �亙熒�亙�銵?�啣��𣬚黎�䁅�摮埈挾 ----------
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_reports " +
-                    "ADD COLUMN gut_balance_score INT COMMENT '�𣬚黎撟唾﹛�?0-100)', " +
-                    "ADD COLUMN gut_diversity_score INT COMMENT '�𣬚黎憭𡁏甅�批�(0-100)', " +
-                    "ADD COLUMN beneficial_bacteria_score INT COMMENT '�厩����(0-100)', " +
-                    "ADD COLUMN harmful_bacteria_score INT COMMENT '�匧拿���(0-100)', " +
-                    "ADD COLUMN core_species_score INT COMMENT '�詨�����?0-100)', " +
-                    "ADD COLUMN health_rating VARCHAR(100) COMMENT '�餃�霂�漣嚗��鈭𡁜�摨?隡条�蝑?");
-            log.info("撌脖蛹health_reports銵冽溶�?銝芾�蝢斗�閬��畾?);
-        } catch (Exception e) {
-            log.warn("銝榴ealth_reports銵冽溶�惩�畾萄虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-
-        ensureColumn("health_reports", "subject_id", "BIGINT COMMENT '�亙�銝颱��冽�ID(�唾�users銵?銝槃ull銵函內�芰�摰?'");
-
-        // ---------- �亙熒���銵?�啣�symptoms摮埈挾 ----------
-        try {
-            jdbcTemplate.execute("ALTER TABLE health_indicators ADD COLUMN symptoms TEXT COMMENT '餈��/蝻箔��詨���𠶖�讛膩'");
-            log.info("撌脖蛹health_indicators銵冽溶�坟ymptoms摮埈挾");
-        } catch (Exception e) {
-            log.warn("銝榴ealth_indicators銵冽溶�坟ymptoms摮埈挾�航�撌脣��? {}", e.getMessage());
-        }
-
-        log.info("�鞾鵭閫��撣�芋�𨰜��揣撖𣬚輕摨血��亙熒璉�瘚𧢲𥁒�𦠜㺭�桀�銵典�憪见�摰峕�");
-
-        // �亙熒�枏㨃銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_checkins (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "user_id BIGINT COMMENT '�冽�ID嚗�振�選�', " +
-                    "child_id BIGINT COMMENT '摮拙�ID', " +
-                    "checkin_date DATE COMMENT '�枏㨃�交�', " +
-                    "behaviors TEXT COMMENT '�枏㨃銵䔶蛹JSON�啁�', " +
-                    "note VARCHAR(500) COMMENT '憭�釣', " +
-                    "mood VARCHAR(20) COMMENT '敹��: happy/normal/sad/angry/sick', " +
-                    "earned_energy INT DEFAULT 5 COMMENT '�瑕��賡��?, " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "INDEX idx_child_id (child_id), " +
-                    "INDEX idx_checkin_date (checkin_date)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒�枏㨃銵?");
-            log.info("撌脣�撱榴ealth_checkins銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣health_checkins銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏31: �𥕦遣�𠉛頂鈭箄”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS contacts (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "name VARCHAR(100) NOT NULL COMMENT '憪枏�', " +
-                "phone VARCHAR(20) COMMENT '�菔�', " +
-                "avatar VARCHAR(500) COMMENT '憭游�', " +
-                "relationship_type VARCHAR(20) COMMENT '�喟頂蝐餃�: family/friend/partner/colleague/other', " +
-                "known_since DATETIME COMMENT '霈方��園𡢿', " +
-                "bio VARCHAR(500) COMMENT '蝞�隞?, " +
-                "birthday DATE COMMENT '��𠯫', " +
-                "intimacy_level INT DEFAULT 0 COMMENT '鈭脣�摨?0-100)', " +
-                "contact_source VARCHAR(20) DEFAULT 'manual' COMMENT '�交�: phone/manual', " +
-                "tags VARCHAR(500) COMMENT '��倌(�堒噡���)', " +
-                "last_contact_at DATETIME COMMENT '��餈𤏸�蝟餅𧒄�?, " +
-                "contact_count INT DEFAULT 0 COMMENT '�𠉛頂甈⊥㺭', " +
-                "notes TEXT COMMENT '憭�釣', " +
-                "created_at DATETIME, " +
-                "updated_at DATETIME, " +
-                "INDEX idx_user_id (user_id)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�𠉛頂鈭箄”'");
-            log.info("撌脣�撱構ontacts�𠉛頂銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣contacts銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �𥕦遣�����粉霈啣�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_reading_records (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "user_id BIGINT COMMENT '�冽�ID', " +
-                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
-                "content VARCHAR(500) COMMENT '��粉��捆�䁅�', " +
-                "duration_seconds INT DEFAULT 0 COMMENT '��粉�園鵭(蝘?', " +
-                "read_at DATETIME COMMENT '��粉�園𡢿', " +
-                "created_at DATETIME, " +
-                "INDEX idx_child_id (child_id), " +
-                "INDEX idx_read_at (read_at)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����粉霈啣�銵?");
-            log.info("撌脣�撱榮rticle_reading_records銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣article_reading_records銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏30: activities銵冽溶�戹isibility�綋isible_to摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visibility VARCHAR(20) DEFAULT 'all' COMMENT '�航��? all/member'");
-            log.info("撌脫溶�戹isibility�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visible_to VARCHAR(255) COMMENT '�航�閫坿𠧧�𡑒”(�堒噡���)'");
-            log.info("撌脫溶�戹isible_to�堒�activities銵?);
-        } catch (Exception e) {
-            // �堒歇摮睃銁嚗�蕭�仿�霂?
-        }
-
-        // �𥕦遣蝏游漲�滨蔭銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS product_dimension_config (" +
-                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
-                "dimension_code VARCHAR(50) NOT NULL UNIQUE COMMENT '蝏游漲隞��: body/mind/wisdom/action/wealth', " +
-                "dimension_name VARCHAR(100) NOT NULL COMMENT '蝏游漲�滨妍', " +
-                "dimension_type VARCHAR(50) NOT NULL DEFAULT 'five' COMMENT '蝐餃�: five(鈭𠉛輕)/action(銵�𢆡)/other', " +
-                "parent_id BIGINT COMMENT '�嗥漣ID嚗峕��嗥漣銝摸ULL', " +
-                "sort INT DEFAULT 0 COMMENT '�鍦�', " +
-                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂: 0蝳�鍂 1�舐鍂', " +
-                "dify_dataset_id VARCHAR(100) COMMENT 'Dify Dataset ID嚗䔶�憛怠�銝滚�甇?, " +
-                "remark VARCHAR(500) COMMENT '憭�釣', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP " +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏游漲�滨蔭銵?");
-            log.info("撌脣�撱歉roduct_dimension_config銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣product_dimension_config銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �𥕦遣�亥�摨栞”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base (" +
-                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
-                "title VARCHAR(200) NOT NULL COMMENT '�亥����', " +
-                "content TEXT NOT NULL COMMENT '�亥���捆', " +
-                "sort INT DEFAULT 0 COMMENT '�鍦�', " +
-                "status TINYINT(1) DEFAULT 1 COMMENT '�嗆�? 0蝳�鍂 1�舐鍂', " +
-                "remark VARCHAR(500) COMMENT '憭�釣', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP " +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�摨栞”'");
-            log.info("撌脣�撱榛an_knowledge_base銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣dan_knowledge_base銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �𥕦遣��倌銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_tag (" +
-                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
-                "tag_name VARCHAR(100) NOT NULL UNIQUE COMMENT '��倌�?, " +
-                "tag_type VARCHAR(50) DEFAULT 'custom' COMMENT '��倌蝐餃�: custom/auto', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP " +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��倌銵?");
-            log.info("撌脣�撱榛an_knowledge_tag銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣dan_knowledge_tag銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �𥕦遣�亥�-蝏游漲�唾�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base_dimension (" +
-                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
-                "knowledge_id BIGINT NOT NULL COMMENT '�亥�摨𨧻D', " +
-                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲�滨蔭ID', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_knowledge_dimension (knowledge_id, dimension_id) " +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�-蝏游漲�唾�銵?");
-            log.info("撌脣�撱榛an_knowledge_base_dimension銵?);
-
-            // 瘛餃�憭㚚睸蝥行�嚗���祆�銵屸��𨥭REATE TABLE�嗡�韏𤥁”銝滚��剁�
-            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_dimension ADD CONSTRAINT fk_kd_knowledge FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE");
-            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_dimension ADD CONSTRAINT fk_kd_dimension FOREIGN KEY (dimension_id) REFERENCES product_dimension_config(id) ON DELETE CASCADE");
-            log.info("撌脫溶�賷an_knowledge_base_dimension憭㚚睸蝥行�");
-        } catch (Exception e) {
-            log.warn("�𥕦遣dan_knowledge_base_dimension銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // �𥕦遣�亥�-��倌�唾�銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base_tag (" +
-                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
-                "knowledge_id BIGINT NOT NULL, " +
-                "tag_id BIGINT NOT NULL, " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_knowledge_tag (knowledge_id, tag_id) " +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�-��倌�唾�銵?");
-            log.info("撌脣�撱榛an_knowledge_base_tag銵?);
-
-            // 瘛餃�憭㚚睸蝥行�
-            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_tag ADD CONSTRAINT fk_kt_knowledge FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE");
-            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_tag ADD CONSTRAINT fk_kt_tag FOREIGN KEY (tag_id) REFERENCES dan_knowledge_tag(id) ON DELETE CASCADE");
-            log.info("撌脫溶�賷an_knowledge_base_tag憭㚚睸蝥行�");
-        } catch (Exception e) {
-            log.warn("�𥕦遣dan_knowledge_base_tag銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏32: products銵冽溶�𣳇��?蝐餌𤌍/���摮埈挾嚗�����颲𤏸”�訫笆朣琜�
-        ensureColumn("products", "delivery_method", "TINYINT DEFAULT 1 COMMENT '�漤��䲮撘? 1=敹?2=�芣� 3=銝方����?");
-        ensureColumn("products", "category_id", "BIGINT COMMENT '���蝐餌𤌍ID'");
-        ensureColumn("products", "distribution_system_id", "BIGINT COMMENT '���雿梶頂ID'");
-
-        // 餈�宏33: �𥕦遣靘𥕦������雿梶頂銵?+ product_orders�拙�摮埈挾
-        ensureColumn("product_orders", "supply_system_id", "BIGINT COMMENT '��撅硺�摨𥪜�雿梶頂ID'");
-        ensureColumn("product_orders", "supplier_id", "BIGINT COMMENT '�嗆狡靘𥕦���鍂�弒D'");
-        ensureColumn("product_orders", "supply_commission", "INT COMMENT '���雿��(�?'");
-        try {
-            jdbcTemplate.execute("ALTER TABLE product_orders ADD KEY idx_supply_system_id (supply_system_id)");
-            log.info("撌脫溶�犲dx_supply_system_id蝝W��郡roduct_orders銵?);
-        } catch (Exception e) {
-            log.warn("瘛餃�idx_supply_system_id蝝W��航�撌脣��? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "name VARCHAR(100) NOT NULL COMMENT '雿梶頂�滨妍', " +
-                "admin_id BIGINT NOT NULL COMMENT '蝞∠��条鍂�弒D', " +
-                "settlement_period_days INT NOT NULL DEFAULT 30 COMMENT '韐行�嚗�予嚗?, " +
-                "platform_profit_rate DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '撟喳蝱�坔⏚瘥𥪯�(%)', " +
-                "description VARCHAR(500) COMMENT '�讛膩', " +
-                "status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '�嗆�? active/disabled', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "KEY idx_admin_id (admin_id)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝟?");
-            log.info("撌脣�撱漳upply_system銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_system銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system_member (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "role VARCHAR(20) NOT NULL DEFAULT 'member' COMMENT '閫坿𠧧: admin/member', " +
-                "status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '�嗆�? active/inactive', " +
-                "joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "UNIQUE KEY uk_system_user (system_id, user_id), " +
-                "KEY idx_user_id (user_id)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='雿梶頂�𣂼�'");
-            log.info("撌脣�撱漳upply_system_member銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_system_member銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
-                "period_start DATE NOT NULL COMMENT '蝏梶��冽�撘�憪?, " +
-                "period_end DATE NOT NULL COMMENT '蝏梶��冽�蝏𤘪�', " +
-                "total_sales INT NOT NULL DEFAULT 0 COMMENT '���格�駁�(�?', " +
-                "platform_profit INT NOT NULL DEFAULT 0 COMMENT '撟喳蝱�坔⏚�煾�(�?', " +
-                "supplier_payout INT NOT NULL DEFAULT 0 COMMENT '靘𥕦����隞?�?', " +
-                "status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '�嗆�? pending/settled', " +
-                "settled_at DATETIME COMMENT '蝏梶��園𡢿', " +
-                "remark VARCHAR(500) COMMENT '憭�釣', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "KEY idx_system_id (system_id), " +
-                "KEY idx_period (period_start, period_end)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏梶�霈啣�'");
-            log.info("撌脣�撱漳upply_settlement銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_settlement銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement_detail (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "settlement_id BIGINT NOT NULL COMMENT '蝏梶�ID', " +
-                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
-                "order_no VARCHAR(64) NOT NULL COMMENT '霈W��?, " +
-                "product_name VARCHAR(200) NOT NULL COMMENT '����滨妍', " +
-                "amount INT NOT NULL COMMENT '霈W��煾�(�?', " +
-                "platform_fee INT NOT NULL COMMENT '撟喳蝱�坔⏚(�?', " +
-                "supplier_id BIGINT COMMENT '�嗆狡靘𥕦���鍂�弒D', " +
-                "supplier_name VARCHAR(100) COMMENT '�嗆狡靘𥕦����蝘?, " +
-                "payout INT NOT NULL COMMENT '靘𥕦����隞?�?', " +
-                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
-                "KEY idx_settlement_id (settlement_id), " +
-                "KEY idx_order_id (order_id)" +
-            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏梶��𡒊�'");
-            log.info("撌脣�撱漳upply_settlement_detail銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_settlement_detail銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏: growth_records銵冽溶�䭾䔉皞鞟掩�?�駁�/銵亙�摮埈挾
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN source_type VARCHAR(20) DEFAULT 'manual' COMMENT '�交�蝐餃�: manual/platform_purchase/self_upload/supplement'");
-            log.info("撌脫溶�坟ource_type�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN source_file_url VARCHAR(500) COMMENT '�笔��亙���辣URL'");
-            log.info("撌脫溶�坟ource_file_url�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN order_id BIGINT COMMENT '�唾�霈W�ID'");
-            log.info("撌脫溶�䰄rder_id�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN report_date DATETIME COMMENT '瘚贝�/�亙��交�'");
-            log.info("撌脫溶��eport_date�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN parent_record_id BIGINT COMMENT '�唾����憪𧢲﹝獢㇆D嚗�‘��﹝獢���剁�'");
-            log.info("撌脫溶�麖arent_record_id�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN is_latest TINYINT(1) DEFAULT 1 COMMENT '�臬炏�𣬚����啗扇敶?");
-            log.info("撌脫溶�犲s_latest�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN dedup_hash VARCHAR(64) COMMENT '�駁�����?SHA256)'");
-            log.info("撌脫溶�賷edup_hash�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN parsed_data TEXT COMMENT '銝𠹺��亙���圾�鞟��?JSON)'");
-            log.info("撌脫溶�麖arsed_data�堒�growth_records銵?);
-        } catch (Exception e) {}
-
-        try {
-            jdbcTemplate.execute("CREATE UNIQUE INDEX IF NOT EXISTS uk_growth_dedup_hash ON growth_records(dedup_hash)");
-            log.info("撌脫溶�抦k_growth_dedup_hash�臭�蝝W��迷rowth_records銵?);
-        } catch (Exception e) {
-            try {
-                jdbcTemplate.execute("ALTER TABLE growth_records ADD UNIQUE INDEX uk_growth_dedup_hash (dedup_hash)");
-                log.info("撌脤�朞�ALTER TABLE瘛餃�uk_growth_dedup_hash�臭�蝝W�");
-            } catch (Exception e2) {
-                log.warn("瘛餃�uk_growth_dedup_hash蝝W��航�撌脣��? {}", e2.getMessage());
-            }
-        }
-
-        // 餈�宏: foods銵冽溶�㰘𨯫�餃�畾?
-        ensureColumn("foods", "energy_kj", "DECIMAL(8,2) COMMENT '�賡�(kJ/100g)'");
-        ensureColumn("foods", "starch", "DECIMAL(8,2) COMMENT '瘛�蝎?g/100g)'");
-        ensureColumn("foods", "cholesterol", "DECIMAL(8,2) COMMENT '��𤐄�?mg/100g)'");
-
-        // �嘥��𡝗��蹂遙�∠�摮鞉㺭�?
-        try {
-            Integer count = jdbcTemplate.queryForObject(
-                    "SELECT COUNT(*) FROM growth_task", Integer.class);
-
-            if (count == null || count == 0) {
-                jdbcTemplate.execute("INSERT INTO growth_task (type, title, description, reward_points, reward_energy, target_value, task_key, enabled, sort_order, created_at) VALUES " +
-                        "('DAILY', '瘥𤩺𠯫蝑曉�', '摰峕��亙熒�枏㨃蝑曉�', 20, 3, 1, 'DAILY_CHECKIN', 1, 1, NOW()), " +
-                        "('DAILY', '摰峕�隞餃𦛚', '摰峕�銝�銝芯遙�?, 30, 5, 1, 'DAILY_TASK', 1, 2, NOW()), " +
-                        "('DAILY', '瘥𤩺𠯫��澈', '��澈撠讐�摨讐�憟賢�', 10, 2, 1, 'DAILY_SHARE', 1, 3, NOW()), " +
-                        "('DAILY', 'AI撖寡�', '銝垾I�拇�撖寡�銝�甈?, 15, 3, 1, 'DAILY_AI', 1, 4, NOW())");
-                log.info("�鞾鵭隞餃𦛚蝘滚��唳旿撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𡝗��蹂遙�∠�摮鞉㺭�桀仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏34: dan_assessment_results銵冽溶�惩振摨剜��?EMI敹��/憭找�鈭箸聢/摮拙�敹怎�摮埈挾
-        ensureColumn("dan_assessment_results", "family_member_id", "BIGINT COMMENT '摰嗅滬�𣂼�ID'");
-        ensureColumn("dan_assessment_results", "family_member_name", "VARCHAR(50) COMMENT '�𣂼�憪枏�敹怎�'");
-        ensureColumn("dan_assessment_results", "family_member_birthday", "DATE COMMENT '�𣂼��箇��交�敹怎�'");
-        ensureColumn("dan_assessment_results", "family_member_gender", "VARCHAR(10) COMMENT '�𣂼��批�敹怎�'");
-        ensureColumn("dan_assessment_results", "family_member_age", "INT COMMENT '�𣂼�撟湧�敹怎�'");
-        ensureColumn("dan_assessment_results", "emotion_score", "INT COMMENT '��貌��㺭(EMI)'");
-        ensureColumn("dan_assessment_results", "resilience_score", "INT COMMENT '敹���扳�?EMI)'");
-        ensureColumn("dan_assessment_results", "stress_coping_score", "INT COMMENT '�见�摨𥪜笆(EMI)'");
-        ensureColumn("dan_assessment_results", "self_awareness_score", "INT COMMENT '�芣�霈斤䰻(EMI)'");
-        ensureColumn("dan_assessment_results", "openness_score", "INT COMMENT '撘��暹�?憭找�鈭箸聢)'");
-        ensureColumn("dan_assessment_results", "conscientiousness_score", "INT COMMENT '撠質提�?憭找�鈭箸聢)'");
-        ensureColumn("dan_assessment_results", "extraversion_score", "INT COMMENT '憭硋��?憭找�鈭箸聢)'");
-        ensureColumn("dan_assessment_results", "agreeableness_score", "INT COMMENT '摰靝犖�?憭找�鈭箸聢)'");
-        ensureColumn("dan_assessment_results", "neuroticism_score", "INT COMMENT '蟡䂿�韐?憭找�鈭箸聢)'");
-        ensureColumn("dan_assessment_results", "big_five_overall_score", "INT COMMENT '憭找�鈭箸聢蝏澆��?");
-        ensureColumn("dan_assessment_results", "child_name", "VARCHAR(50) COMMENT '摮拙�憪枏�敹怎�'");
-        ensureColumn("dan_assessment_results", "child_birthday", "DATE COMMENT '�箇��交�敹怎�'");
-        ensureColumn("dan_assessment_results", "child_gender", "VARCHAR(10) COMMENT '�批�敹怎�'");
-        ensureColumn("dan_assessment_results", "child_age", "INT COMMENT '撟湧�敹怎�'");
-        ensureColumn("dan_assessment_results", "school", "VARCHAR(100) COMMENT '摮行嵗敹怎�'");
-        ensureColumn("dan_assessment_results", "grade", "VARCHAR(20) COMMENT '撟渡漣敹怎�'");
-        ensureColumn("dan_assessment_results", "grade_class", "VARCHAR(20) COMMENT '�剔漣敹怎�'");
-        ensureColumn("dan_assessment_results", "height", "INT COMMENT '頨恍�(CM)敹怎�'");
-        ensureColumn("dan_assessment_results", "weight", "INT COMMENT '雿㯄�(KG)敹怎�'");
-        ensureColumn("dan_assessment_results", "family_status", "VARCHAR(50) COMMENT '摰嗅滬�嗅�敹怎�'");
-        ensureColumn("dan_assessment_results", "parent_degree", "VARCHAR(50) COMMENT '�嗆���擃睃郎��翰�?");
-        ensureColumn("dan_assessment_results", "nation", "VARCHAR(20) COMMENT '瘞烐�敹怎�'");
-        ensureColumn("dan_assessment_results", "province", "VARCHAR(50) COMMENT '��翰�?");
-        ensureColumn("dan_assessment_results", "city", "VARCHAR(50) COMMENT '撣�翰�?");
-        ensureColumn("dan_assessment_results", "district", "VARCHAR(50) COMMENT '�箏翰�?");
-        ensureColumn("dan_assessment_results", "address", "VARCHAR(200) COMMENT '霂衣��啣�敹怎�'");
-        ensureColumn("dan_assessment_results", "single_child", "VARCHAR(10) COMMENT '�臬炏�祉�摮𣂼戊敹怎�'");
-        ensureColumn("dan_assessment_results", "school_score", "VARCHAR(20) COMMENT '�冽嵗�鞟貍敹怎�'");
-        ensureColumn("dan_assessment_results", "urgent_name", "VARCHAR(50) COMMENT '蝝扳�亥�蝟颱犖憪枏�'");
-        ensureColumn("dan_assessment_results", "urgent_phone", "VARCHAR(20) COMMENT '蝝扳�亥�蝟颱犖�菔�'");
-        ensureColumn("dan_assessment_results", "pics", "TEXT COMMENT '�曄�IDs'");
-        ensureColumn("dan_assessment_results", "videos", "TEXT COMMENT '閫��IDs'");
-        ensureColumn("dan_assessment_results", "audio", "VARCHAR(100) COMMENT '�喲�ID'");
-        ensureColumn("dan_assessment_results", "audio_url", "VARCHAR(255) COMMENT '�喲�URL'");
-        ensureColumn("dan_assessment_results", "process_desc", "TEXT COMMENT '餈���讛膩'");
-        ensureColumn("dan_assessment_results", "result_desc", "TEXT COMMENT '蝏𤘪�蝞�霂?");
-
-        // 餈�宏35: points_log銵冽溶�霡amily_member_id�梹�EnergyService.calcChildWealth摰嗅滬�賡�霈∠���閬��
-        ensureColumn("points_log", "family_member_id", "BIGINT COMMENT '摰嗅滬�𣂼�ID'");
-
-        // 餈�宏36: family_members銵冽溶�鮰eneration + is_spouse�梹�颲���齿�嚗?
-        ensureColumn("family_members", "generation", "INT COMMENT '颲���潘�0=摰嗅滬�𥕦遣���+n=�睲�n隞��-n=�睲�n隞��'");
-        ensureColumn("family_members", "is_spouse", "TINYINT(1) DEFAULT 0 COMMENT '�臬炏�滚�嚗��颲��'");
-
-        // 餈�宏37: �扳㺭�射eneration韏见�潘��箔�relationship_type�惩�嚗?
-        try {
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0, is_spouse = 1 WHERE relationship_type = 'spouse'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 1 WHERE relationship_type = 'parent'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = -1 WHERE relationship_type IN ('child')");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE relationship_type = 'sibling'");
-            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE generation IS NULL AND relationship_type IS NOT NULL");
-            log.info("撌脰�蝘蜻amily_members.generation�唳旿");
-        } catch (Exception e) {
-            log.warn("餈�宏family_members.generation�唳旿憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏38: product_orders銵冽溶�麖oints_used/points_cost/money_amount�梹�瘛瑕��臭��舀�嚗?
-        ensureColumn("product_orders", "points_used", "INT DEFAULT 0 COMMENT '雿輻鍂��妖��㺭�?");
-        ensureColumn("product_orders", "points_cost", "INT DEFAULT 0 COMMENT '蝘臬��菜緍�煾�(�?'");
-        ensureColumn("product_orders", "money_amount", "INT DEFAULT 0 COMMENT '�圈��臭��煾�(�?'");
-
-        // 餈�宏39: �𥕦遣靘𥕦����蝟餌㮾�唾”
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "name VARCHAR(100) NOT NULL COMMENT '雿梶頂�滨妍', " +
-                "admin_id BIGINT COMMENT '蝞∠��条鍂�弒D', " +
-                "settlement_period_days INT DEFAULT 30 COMMENT '韐行�憭拇㺭', " +
-                "platform_profit_rate DECIMAL(10,2) DEFAULT 0.00 COMMENT '撟喳蝱�坔⏚瘥𥪯�(%)', " +
-                "description VARCHAR(500) COMMENT '�讛膩', " +
-                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�?active/disabled', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                "INDEX idx_admin (admin_id), " +
-                "INDEX idx_status (status)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝟?");
-            log.info("撌脣�撱漳upply_system銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_system銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system_member (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
-                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
-                "role VARCHAR(20) DEFAULT 'member' COMMENT '閫坿𠧧 admin/member', " +
-                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�?active/disabled', " +
-                "joined_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_system (system_id), " +
-                "INDEX idx_user (user_id), " +
-                "UNIQUE INDEX idx_system_user (system_id, user_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝟餅��?");
-            log.info("撌脣�撱漳upply_system_member銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_system_member銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
-                "period_start DATE COMMENT '蝏梶��冽�撘�憪?, " +
-                "period_end DATE COMMENT '蝏梶��冽�蝏𤘪�', " +
-                "total_sales INT DEFAULT 0 COMMENT '���格�駁�(�?', " +
-                "platform_profit INT DEFAULT 0 COMMENT '撟喳蝱�坔⏚(�?', " +
-                "supplier_payout INT DEFAULT 0 COMMENT '靘𥕦����隞?�?', " +
-                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�?pending/settled', " +
-                "settled_at DATETIME COMMENT '蝏梶��園𡢿', " +
-                "remark VARCHAR(500) COMMENT '憭�釣', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_system (system_id), " +
-                "INDEX idx_status (status), " +
-                "INDEX idx_period (period_start, period_end)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝞堒�'");
-            log.info("撌脣�撱漳upply_settlement銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_settlement銵典仃韐? {}", e.getMessage());
-        }
-
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement_detail (" +
-                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                "settlement_id BIGINT NOT NULL COMMENT '蝏梶��𣗏D', " +
-                "order_id BIGINT COMMENT '霈W�ID', " +
-                "order_no VARCHAR(64) COMMENT '霈W��?, " +
-                "product_name VARCHAR(200) COMMENT '����滨妍', " +
-                "amount INT DEFAULT 0 COMMENT '霈W��煾�(�?', " +
-                "platform_fee INT DEFAULT 0 COMMENT '撟喳蝱�坔⏚(�?', " +
-                "supplier_id BIGINT COMMENT '�嗆狡靘𥕦���D', " +
-                "supplier_name VARCHAR(100) COMMENT '�嗆狡靘𥕦����蝘?, " +
-                "payout INT DEFAULT 0 COMMENT '摰硺�(�?', " +
-                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                "INDEX idx_settlement (settlement_id), " +
-                "INDEX idx_order (order_id)" +
-                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝞埈�蝏?");
-            log.info("撌脣�撱漳upply_settlement_detail銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣supply_settlement_detail銵典仃韐? {}", e.getMessage());
-        }
-
-        // 餈�宏40: 瘛餃�supplier_admin閫坿𠧧�酌sers.role ENUM
-        try {
-            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent','child','teacher','supplier_admin') NOT NULL DEFAULT 'parent' COMMENT '敶枏�瘣餉�閫坿𠧧'");
-            log.info("撌脫溶�坟upplier_admin�酌sers.role ENUM");
-        } catch (Exception e) {
-            log.warn("瘛餃�supplier_admin�酌sers.role ENUM憭梯揖: {}", e.getMessage());
-        }
-
-        // 餈�宏40: users銵冽溶�𦅙ascot摮埈挾嚗㇁I�拇�敶Z情: xibao瘚惩�/fubao蝳誩�嚗?
-        ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI�拇�敶Z情: xibao(瘚惩�)/fubao(蝳誩�)'");
-
-
-        // family_relationships 銵剁�餈𦦵��啣�嚗?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_relationships (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "family_id BIGINT NOT NULL COMMENT '��撅𧼮振摨背D', " +
-                    "from_member_id BIGINT NOT NULL COMMENT '�喟頂韏瑞��𣂼�ID', " +
-                    "to_member_id BIGINT NOT NULL COMMENT '�喟頂蝏���𣂼�ID', " +
-                    "generation_value INT NOT NULL COMMENT '颲���? -1=摮𣂼戊, 0=�諹�, 1=�嗆�, 2=蟡𣇉�瘥? 3=�曄��嗆�', " +
-                    "relationship_key VARCHAR(50) COMMENT '�喟頂��倌key嚗��雿嗵鍂鈭擧遬蝷綽�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "UNIQUE KEY uk_from_to (from_member_id, to_member_id), " +
-                    "INDEX idx_family_id (family_id), " +
-                    "INDEX idx_from (from_member_id), " +
-                    "INDEX idx_to (to_member_id)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬�𣂼�����喟頂銵?");
-            log.info("撌脣�撱榻amily_relationships銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣family_relationships銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-
-        // 餈�宏41: �嘥��碶�蝏渡䰻霂�葉敹��蝡惩�蝐餃�蝘滚����
-        try {
-            Integer catCount = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM article_categories WHERE name IN ('頨?, '�?, '敹?, '銵?, '撖?)", Integer.class);
-            if (catCount == null || catCount == 0) {
-                jdbcTemplate.execute("INSERT IGNORE INTO article_categories (name, icon, color, sort_order, status) VALUES " +
-                    "('頨?, 'health', '#FF8C42', 1, 1), " +
-                    "('�?, 'wisdom', '#6366F1', 2, 1), " +
-                    "('敹?, 'love', '#FF6B9D', 3, 1), " +
-                    "('銵?, 'action', '#10B981', 4, 1), " +
-                    "('撖?, 'wealth', '#F59E0B', 5, 1)");
-                log.info("鈭𠉛輕�����掩撌脣�憪见�");
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𡝗�蝡惩�蝐餃仃韐? {}", e.getMessage());
-        }
-
-        try {
-            Integer articleCount = jdbcTemplate.queryForObject(
-                "SELECT COUNT(*) FROM articles WHERE created_by = 0 AND status = 'published'", Integer.class);
-            if (articleCount != null && articleCount > 0) {
-                log.info("蝘滚����撌脣��剁�頝唾��嘥��?);
-            } else {
-                Map<String, Long> catIdMap = new HashMap<>();
-                jdbcTemplate.query(
-                    "SELECT id, name FROM article_categories WHERE name IN ('頨?, '�?, '敹?, '銵?, '撖?)",
-                    (rs) -> {
-                        catIdMap.put(rs.getString("name"), rs.getLong("id"));
-                    });
-
-                if (catIdMap.size() == 5) {
-                    long bodyCatId = catIdMap.get("頨?);
-                    long mindCatId = catIdMap.get("�?);
-                    long heartCatId = catIdMap.get("敹?);
-                    long actionCatId = catIdMap.get("銵?);
-                    long wealthCatId = catIdMap.get("撖?);
-
-                    insertSeedArticle("憟賣偌�颱犖嚗𡁜振摨剖�摨瑚�銝��臬末瘞游�憪?,
-                        "瘞湔糓�笔𦶢銋𧢲�嚗䔶�雿删�����脲偌�梹�隞擧偌韐券�㗇𥋘�圈幼瘞港��荔��祆�撠�蒂雿牐�閫��雿閖�朞�銝��臬末瘞湔��餃�摰嗡犖�?,
-                        "瘞渲◤敹質���𨯫�餌���銁�亙�摮虫葉嚗峕偌鋡怎妍銝暝"蝚砌�憭扯𨯫�餌�\"嚗𣬚���之憭𡁏㺭鈭箏蘨�單釣���銋���游蕭�乩��苷�銋���犖雿梶�60%�舀偌嚗諹�瘨脩�90%�舀偌嚗�之�𤑳�75%�舀偌��偌��捶�𧶏��湔𦻖�喳�鈭�澈雿梶�餈鞱蓮�����末瘞渡����嚗𡁜��冽糓蝚砌�雿滨�嚗�予�嗥��輻�韐典鉄�𤩺糓�惩�憿嫘���銝芸振摨剜��睃笆瘞渡���瘙���䕘�隞𦒘�憭拙�憪页�銝箏振鈭箏�憭���臬末瘞湛�撠望糓��蝞��閧��亙熒�閗��?,
-                        "瘚㰘𪄳蝳?, 6, "body", 1);
-
-                    insertSeedArticle("�輻咱雿栞捶靚������烐�嚗䔶��㮖�鈭��嚗?,
-                        "銝剖龫霈淚"�亦�憭誯鵭嚗𣬚��嗅��蕚"嚗��蝡亦�雿栞捶靚��銋���園��烐𧒄�麄��𧋦����亙�����具��辺�牐�銝芰輕摨佗��𡃏�雿惩�雿蓥蛹摮拙��㮖��𡁜����摨瑕抅蝖��?,
-                        "雿栞捶靚��嚗䔶�鈭�圾撘�憪卝���銝芸酋摮𣂼予�煺�韐其��䕘�鈭�圾摮拙����韐函掩�页��航����蝚砌�甇乓���雿譍�銝芷��烐�嚗?-3撗�抅蝖��滨𢥫���瘥滢像����𣂷�憭拍��𦯀�嚗?-7撗��������嚗��憌毺��瑯����嗅��𧶏�7-12撗���踹��脫�嚗屸�閬��頞喟��讠蒾韐具����𣬚輕�毺�D��振摨剛����韐游ㄚ嚗𡁏膥韏瑟��𠰴�撘箏��怠�嚗𣬚辺�齿部�帋�餈𥡝�瘨脣儐�荔����靚��靚�㟲擖桅��䔶��?,
-                        "瘚㰘𪄳蝳?, 8, "body", 1);
-
-                    insertSeedArticle("鈭𠉛輕�亙熒�拚�嚗朞悟摮拙�銝�憭拙�瘞娍說皛?,
-                        "銝��乩�霈∪銁鈭擧膥嚗峕𡟺擗鞟�韐券��湔𦻖敶勗�摮拙�銝�憭拍�摮虫�����諹澈雿梶𠶖�����隞質��碶�蝏渲𨯫�餌��拚�嚗諹悟摮拙�隞擧𡟺銝𠰴停��說�賡��?,
-                        "銝箔�銋�𡟺擗𣂼�甇日�閬���𠉛弦銵冽�嚗���拚���酋摮𣂼銁瘜冽��䜘��扇敹������惩��寥𢒰�賣��曆�鈭𦒘���𡟺擗鞟�摮拙����蝏渲𨯫�餅𡟺擗𣂼�撘𧶏�隡䁅捶蝣單偌�𣂷���賒�賡�嚗䔶�韐刻��賣糓頨思�靽桀���抅蝖�嚗𣬚輕�毺��𣬚𣳽�抵捶憓𧼮撩�滨𢥫�𨥈��亙熒���靽��憭扯��𤏸�嚗𣬚��蠘��菜擪�𣳇��亙熒����鞱�敺讠��拚�銋䭾�嚗峕糓蝏坔酋摮鞉�憟賜��亙熒蝷潛��?,
-                        "瘚㰘𪄳蝳?, 5, "body", 0);
-
-                    insertSeedArticle("DAN瘚贝�嚗𡁜��啣酋摮𣂷�隡𦯀��𣬚�憭抵�撖��",
-                        "瘥譍葵摮拙��賣糓�砌��牐�����AN憭𡁶輕霈斤䰻瘚贝�隞𤾸�憭抒輕摨血��Z圾霂餃酋摮鞟�霈斤䰻�寧�嚗�葬�拙振�踵𪄳�唳����摮拙�����輯楝敺��?,
-                        "隞�銋�糓DAN瘚贝�嚗屓AN瘚贝��臭�憟堒抅鈭舘恕�亙���郎���撅訫���郎��捏���蝏渲�隡唬�蝟鳴�隞擧釣�誩���扇敹�����餉��萘輕��征�湔��乓��祗閮��賢��峕�蝏芰�閫��銝芰輕摨佗��券𢒰�讐�摮拙���恕�亙�撅訫㦛靚晞���霂���桃�銝齿糓蝏坔酋摮鞱斐��倌嚗諹�峕糓銝箏振�踵�靘𥕢�撟�"霈斤䰻�啣㦛\"���鈭��撘惩𧑐�橘�雿惩停�臭誑�㗇𥋘���摮拙�霈斤䰻�寧���郎銋䭾䲮瘜𤏪��𤑳緵瞏𨅯銁��予韏钅��笔�隞亙畺�鳴���笆�批𧑐霈剔���摹�航��?,
-                        "瘚㰘𪄳蝳?, 7, "mind", 1);
-
-                    insertSeedArticle("�鞾鵭�𧢲�萘輕嚗𡁶�摮拙�銝��笔��函�敹��韏�𧋦",
-                        "�臬繿蝳誩之摮血���郎�蹱��∠�撠碍瑕噸�血��𠉛弦�𤑳緵嚗峕𥅾�㗇��踹��萘輕��酋摮鞉凒�踵��亙��烐�嚗屸𢒰撖寞𤨓�䀹𧒄�湔��扳�扼���雿訫畺�餃酋摮鞟��鞾鵭�𧢲�萘輕嚗?,
-                        "�箏��𧢲�萘輕��酋摮鞱恕銝暝"�賢��臬予�毺�嚗峕㺿�䀝�鈭�"嚗屸��啣𤌴�曉捆�𤘪𦆮撘����峕��踹��萘輕��酋摮鞟㮾靽﹏"�賢��臭誑�朞��芸��𣂼�\"嚗峕��烐�閫�蛹�鞾鵭��㦤隡𠾼���蝛嗅��堆�餈嗘舅蝘齿�萘輕璅∪�撖孵酋摮鞟�摮虫��𣂼停��犖���蝟餌��單𧊋�亦��䔶��穃��賣�瘛梯�敶勗����摮拙�摰峕�銝�隞嗡��塚�雿删��漤��孵��喳��滩�嚗朞”�砍𠜱�𥡝�屸��芣�嚗��瘜刻�甇亥�屸�蝏𤘪�嚗峕�憭梯揖�䀹�摮虫��箔��?,
-                        "瘚㰘𪄳蝳?, 6, "mind", 0);
-
-                    insertSeedArticle("銝𤘪釣�𨥈��喳�摮拙�摮虫��������株��?,
-                        "�其縑�舐��貊��嗡誨嚗䔶�瘜典��𣂷蛹��蝔�蝻箇��賢���𧋦����𤑳�摮西�摨西圾霂颱�瘜典���𧋦韐剁�撟嗥��箸���酋摮𣂷�瘜典�����冽䲮瘜𨰻?,
-                        "���憭批郎���憿寥鵭颲?5撟渡�餈質葵�𠉛弦�𤑳緵嚗��摰帋�銝芯犖�𣂼�����舀惣����峕糓銝𤘪釣�𥕦��芣綉�䜘��酋摮鞟�銝𤘪釣�𥟇糓�讐�撟湧��鞉��穃����3撗�酋摮鞱�銝𤘪釣5-10���嚗?撗�酋摮鞱�銝𤘪釣15-20���嚗?0撗�誑銝𠰴虾隞乩�瘜?5-30�����聦�誩酋摮𣂷�瘜典����銝芯��荔�憸𤑳��𤘪鱏���隞餃𦛚撟嗉����摨血�瞈�������瘜典�����冽䲮瘜𤏪��芾�撌乩�瘜?5���銝𤘪釣�?���隡烐�嚗諹�撠𠉛鸌�寞聢瘥誩予5���霈剔�閫��銝𤘪釣嚗���喟�銋䭾�憭?-5�����迤敹萄鐤�?,
-                        "瘚㰘𪄳蝳?, 7, "mind", 0);
-
-                    insertSeedArticle("霂餅�摮拙����蝏芸����鈭脣�瘝罸�𡁶��箸钟",
-                        "摮拙��剝𣵛����暹����暺䀝�霂凌�色�行�銝芣�蝏芾��𡡞��劐�銝芣𧊋鋡急說頞喟���瘙���郎隡𡁜�曉𨯬摮拙����蝏芾祗閮�嚗峕糓撱箇�鈭脣�靽∩遙��洵銝�甇?,
-                        "��貌�臬酋摮鞉��笔���祗閮���笆鈭舘祗閮�銵刻噢�賢�撠𡁏𧊋�鞟���酋摮鞉䔉霂湛���貌�臭�隞祆��湔𦻖����𡁏䲮撘譌���摮拙��𤏸�瘞娍𧒄嚗䔶�����閬��銝齿糓鋡怠�甇g��峕糓鋡怎�閫����蝏芣𦻖蝥喳�甇交�嚗𡁜�銝𧢲䔉頩脖��乩�摮拙�撟唾�嚗�葬摮拙�蝏蹱�蝏芯�銝芸�摮梹�霈拙酋摮鞟䰻�𤘪��㗇�蝏芷��航◤��捂���銝�韏瑕粉�暹凒�����銵刻噢�孵����朞�蝏䀹𧋦���撣桀𨭌摮拙�霈方���貌嚗峕糓敺�末���蝏芸鍳�蹱䲮撘?,
-                        "瘚㰘𪄳蝳?, 6, "wisdom", 1);
-
-                    insertSeedArticle("摰嗅滬瘞𥕦凒嚗𡁜酋摮𣂼����摨瑞�蝚砌��笔ㄓ",
-                        "銝�銝芣萱�硔��迅摰𠾼���皛∠���振摨剔㴓憓���臬酋摮𣂼����摨瑟��𡁜�����栶��𧋦��䔝霈典�雿閗𨯫�删妖���摨瑞�摰嗅滬瘞𥕦凒嚗諹悟�勗銁摰嗅滬銝剜��?,
-                        "<h2>摰嗅滬瘞𥕦凒���敶W��?/h2><p>敹��摮衣�蝛嗉”�𠬍�摰嗅滬瘞𥕦凒撖孵�蝡乩犖�澆�撅閧�敶勗�頞��鈭�郎�⊥��脣�蝷曆��臬���酋摮𣂼停�譍��埈絲蝏蛛��䭾𧒄�惩�銝滚銁�豢𤣰��摰嗅滬銝剔���貌�賡��?/p><p>憒��摰嗅滬瘞𥕦凒�舀萱�硔����整���摰寧�嚗�酋摮𣂼停隡𡁜�撅訫枂摰匧��麄��䌊靽∪��峕䔝蝝V��𣬚�������銋页�憒��摰嗅滬銝剖�皛∩�鈭匧閠���瞍惩��寡�嚗�酋摮𣂼停隡𡁜�敺㛖��㻫����蝻拇��偦���?/p><h2>�仿�删妖��振摨剜��渡�銝㕑�蝝?/h2><p><b>1. �㕑�敺讠�隞芸��?/b>����其�甈∠�摰嗅滬隡朞悅����𡁶�鈭脣���粉�園𡢿��𪂹�怎��瑕�瘣餃𢆡�婙�磰�鈭𥕦𤐄摰𡁶�隞芸�霈拙振摨剜��䀝��游遣蝡𧢲��蠘��?/p><p><b>2. 蝘舀�瘝罸�𡁶�霂剛�銋䭾�</b>����沔"�髢"摮堒蘂銵刻噢�笔�嚗Ě"�烐��唳��寧敞\"嚗㚁�撠𤑳鍂\"雿癧"摮堒蘂��提嚗Ě"雿䭾�餅糓餈蹱甅\"嚗剹���憭抵秐撠𤏸秩�箔�隞嗅�澆��������?/p><p><b>3. ��貌靽桀�����?/b>���蝒���舫��㵪��滩���糓�脩��𡒊�靽桀����霂𡁶��𤘪�嚗Ě"�𡁏�憒��撖嫣��𤏸�瘞𥪯�嚗�笆銝滩絲\"嚗㗇�摰𣬚�����脫凒�滩��?/p><h2>�嗆����蝟餅糓摰嗅滬���瘚瑞��?/h2><p>撖孵酋摮鞉䔉霂湛��笔��啁�瘥滨㮾�梧�瘥𥪯遙雿閙��脤��滩����靚鞟�憭怠氖�喟頂嚗�停�舐�摮拙���憟賜�敹��蝷潛��?/p>",
-                        "瘚㰘𪄳蝳?, 7, "wisdom", 0);
-
-                    insertSeedArticle("瘥譍葵摮拙��賣糓憭拐蝙嚗𡁜銁銝滚�蝢𦒘葉�𤑳緵摰𣬚�",
-                        "�睲賑�餅糓�刻蕭瘙�"摰𣬚�撠誩酋\"嚗�㭂敹賜裦鈭��銝芸酋摮鞱澈銝𢠃�鈭𤤿𡠺�寧��㕑���郎隡𡁏𦻖蝥喳酋摮鞟�銝滚�蝢𠬍�銋蠘捂�舀�隞祈�蝏嗘�隞祉���憟賜��?,
-                        "<h2>�曆�\"�思犖摰嗅酋摮𪀔"���敹?/h2><p>\"雿删��衤犖摰嗅��𠬍�瘥𤩺活����賣糓蝚砌���"餈坔蘂霂嘥虾�賢銁敺��鈭箇�蝡亙僑�𣬚�銝贝��游蔣���隞砌�颲孵��蠘䌊撌梯◤瘥磰�嚗䔶�颲孵��其��芾��唳�颲�䌊撌梁�摮拙��?/p><p>瘥譍葵摮拙��賣��芸楛����輯�憟譌�����酋摮鞱祗閮��𤏸��抬��厩�餈𣂼𢆡�賢�撘綽��厩��函冗鈭斗䲮�W予韏见�蝳���鍂蝏煺������縧銵⊿�銝滚���酋摮琜�撠勗��函��𤑳��賢��餉�隞瑚��⊿掉�?/p><h2>�贝�摮拙���迤��甅摮?/h2><p>霂閧��嗘�敹�䔉嚗諹�撖煺���酋摮琜�隞碶�瘜冽𧒄�臭�銋�甅摮琜�隞硋�敹�𧒄�舀�𦒘�銵刻噢���隞㚚��啣𤌴�暹𧒄�臭�銋��摨䈑�敶㮖��曆����嚗䔶��滩���迤�贝��婙�娪�銝芰𡠺銝��牐�����笔𦶢�?/p><p>銋蠘捂隞𡝗㺭摮虫�憟踝�雿���厩�敹��銋蠘捂隞硋末�典�銝滢�嚗䔶���說�偦�惩�嚗𥕢�霈訾����銝滨�霂渲�嚗䔶�敹��萘��餃�閫�犖�?/p><h2>�亦熙�舀�憟賜��躰�</h2><p>敶枏酋摮鞉��堒�鋡怠��冽𦻖蝥喇�婙�𥪜��砌�����孵�蝻箇��婙�𥪯�撠曹�撱箇�韏瑕��函�摰匧��麄���蝘滚��冽�嚗峕糓隞𡝗䔝蝝V��䎚��𢒰撖寞��条�摨閙���迤憒����郎摰嗆萱撠潛��寞�霂湛�\"摮拙�銝漤�閬��蝢𡒊��嗆�嚗�蘨��閬�"頞喳�憟穀"���瘥溻��"</p>",
-                        "瘚㰘𪄳蝳?, 5, "wisdom", 0);
-
-                    // 銵䕘�鈭粹��諹�嚗?
-                    insertSeedArticle("鈭脣��喟頂���銝芷��烐��?,
-                        "憟賜�鈭脣��喟頂�𡏭�隞颱��躰��寞���𧋦���餌�鈭��銝芰�餈��頝菟�霂��鈭脣��喟頂瘜訫�嚗�葬�拐�銝𤾸酋摮𣂼遣蝡𧢲楛�𡁶����餈墧𦻖�?,
-                        "<h2>瘜訫�銝�嚗𡁻臁隡湔糓��憟賜�蝷潛�</h2><p>銝齿糓\"�其�韏愧"撠望糓�芯撈���韐券���臁隡湧�閬��蟡噼敞瘜兩�婙�娍𦆮銝𧢲��綽�頩脖��伐�餈𥕦�摮拙�����䎚���憭?5��������臁隡湛��𡏭�銝��游予��澈�典�銝滚銁�?/p><h2>瘜訫�鈭䕘�撠𢠃��舐����?/h2><p>撠𢠃�摮拙��誩㭠��嚗朞恕�笔笆敺������梹�銝滩蝠閫�����瘙��撠𢠃�隞𣇉�������隞𡝗��啗◤撠𢠃�嚗䔶��滢�摮虫�撠𢠃��思犖�?/p><h2>瘜訫�銝㚁��屸��舐���擪�?/h2><p>�曹�蝑劐�瘝⊥��屸�����啜����氬������閫��霈拙酋摮鞉��啣��具��瓷�㗇擪�讐�頝荔�摮拙�銝齿佅韏堆��㗇擪�讐�頝荔�摮拙��滩��芰眏憟磰��?/p><h2>瘜訫��𨥈��曉𨯬瘥磰秩�䠷�閬?/h2><p>敶枏酋摮鞉�霂渲��塚��曆�霂湔����嚗�蘨�航恕�笔𧑐�研���憭𡁏𧒄�辷�摮拙�銝漤�閬�����獢��隞硋蘨��閬�◤�祈��?/p><h2>瘜訫�鈭䈑��躰秤�舀��輻��箔�</h2><p>瘝⊥�鈭箸糓摰𣬚����瘥㵪�銋�瓷�匧�蝢𡒊�摮拙���塳�嗘��舀�𤏪��滩���糓隞𡡞�霂臭葉摮虫����雿㰘��衣��W笆�芸楛���霂荔�摮拙�銋煺�摮虫���佅�W笆隞𣇉�銝滚�蝢汿?/p>",
-                        "瘚㰘𪄳蝳?, 5, "action", 1);
-
-                    insertSeedArticle("憭怠氖�喟頂嚗𡁜振摨剖兢蝳讐�蝚砌�憸埈緍摮?,
-                        "憒���𠰴振摨剜�雿靝�隞嗉﹝�㵪�憭怠氖�喟頂撠望糓蝚砌�憸埈緍摮僐��洵銝�憸埈緍摮鞉緍撖嫣�嚗���Y�����芰�撠梢◇鈭����憟賜�憭怠氖�喟頂嚗峕糓蝏坔酋摮鞉�憟賜��鞾鵭蝷潛��?,
-                        "<h2>銝箔�銋�井憒餃�蝟餅�鈭脣��喟頂�湧�閬?/h2><p>�典振摨剔頂蝏煺葉嚗�井憒餃�蝟餅糓�詨�嚗䔶熔摮𣂼�蝟餅糓隞𤾸��喟頂���摨瑞�摰嗅滬璅∪�摨磰砲�荔�憭怠氖�喟頂 > 鈭脣��喟頂 > �毺�摰嗅滬�喟頂�?/p><p>敶枏井憒餃�蝟餌迅�綽�摮拙�隡帋��嗆�頨思�摮虫��啣�雿閧�鈭箝���雿閙��𠾼���雿訫����蝒����鈭偦��扳��莎�瘥𥪯遙雿閗紋蝔钅��滩��?/p><h2>蝏讛𨯫憭怠氖�喟頂���銝芸�銋䭾�</h2><p><b>1. 瘥誩予15�����"憭怠氖�園𡢿\"</b>��酋摮𣂼��∪�嚗峕𦆮銝见振�∪��𧢲㦤嚗�蘨�航��𠰴予���靚�酋摮琜��芾�敶潭迨�?/p><p><b>2. 瘥誩𪂹銝�甈﹏"蝥虫�\"</b>����典����嚗䔶舅銝芯犖銝�韏瑟袇甇乓����箇㩞敶晞���憿輸平嚗峕𪄳�墧��望𧒄���閫?/p><p><b>3. �典酋摮鞾𢒰�㙡"蝘��拍�\"</b>��悟摮拙��见��嗆��交���秩\"�𤑳�雿癧"����豢�靚U����舀�憟賜��梁��躰��?/p><h2>�脩�銋�糓�鞾鵭��㦤隡?/h2><p>�踹��脩�銝齿糓�亙熒���憪颯���閬���臬�雿閗圾�喳�蝒��銝滨蕃�扯揭���鈭箄澈�餃稬����瑟����甈⊥��毺��脩�閫��嚗䔶�霈拙�蝟餅凒�牐熔撖��?/p>",
-                        "瘚㰘𪄳蝳?, 6, "action", 0);
-
-                    insertSeedArticle("憒��撣桀𨭌摮拙�撱箇��亙熒��冗鈭文�",
-                        "蝷曆漱�賢��臬酋摮鞉𧊋�交��毺��詨��賢�銋衤����摰嗅滬�啣郎�∴�隞𡒊瑪銝𠰴�蝥蹂�嚗峕𧋦���靘𥕢�憟㛖頂蝏毺��輻咱蝷曆漱�賢��孵��寞��?,
-                        "<h2>蝷曆漱�賢�隞𤾸振摨剖�憪?/h2><p>摮拙���洵銝�銝芰冗鈭文��臬振摨准��銁摰嗅滬銝剖郎隡𡁶�瘝罸�𡁏䲮撘譌���鈭怎移蟡𧼮���貌蝞∠�嚗䔶��湔𦻖餈�宏�啣郎�∪�蝷曆���冗鈭支葉�?/p><p>�嗆�閬����糓嚗帋蛹摮拙��偦�惩��函�蝷曆漱蝏���臬�嚗諹�䔶��舀𤜯隞𤥁圾�喲䔮憸?/p><h2>��僑樴�挾蝷曆漱�孵��滨�</h2><p><b>3-5撗��摮虫���澈�諹蔭瘚?/b>���朞�皜豢��峕𠯫撣豢暑�剁�霈拙酋摮𣂷�撉��鈭怎�敹思����撘箄翰��澈嚗諹�峕糓撘訫紡摮拙���圾\"頧格�\"���敹?/p><p><b>6-8撗��摮虫�閫���脩�</b>���摮拙��峕��见��毺��暹𧒄嚗��撖潔�銵刻噢�芸楛����梹��曉𨯬撖寞䲮���瘜𤏪�銝�韏瑕粉�曇圾�單䲮獢��?/p><p><b>9-12撗���孵��a����</b>����勗��惩𣪧�蠘��典�撠讐�憿寧𤌍嚗�郎銋惩銁�a�銝剖��亥䌊撌梁�隡睃飵嚗𣬚�閫��撠𢠃�隞碶犖����?/p><h2>敶枏酋摮鞾��啁冗鈭文𤌴�暹𧒄</h2><p>憒��摮拙��典郎�⊥��啣迨�祆�鋡急��歹�</p><ul><li>霈斤��曉𨯬隞𣇉��笔�嚗䔶�閬��乩�蝏坔遣霈?/li><li>撣桀𨭌隞硋��啗䌊撌梁�隡睃飵嚗�遣蝡贝䌊靽∪�</li><li>�偦�㰘紋憭𣇉冗鈭斗㦤隡𡄯�憒��頞�号��冗�箸暑�?/li><li>敹���嗡����瘝罸�𡄯�鈭�圾摮行嵗�𣬚����</li></ul>",
-                        "瘚㰘𪄳蝳?, 7, "action", 0);
-
-                    // 撖䕘��拐��𥕦�嚗?
-                    insertSeedArticle("摮拙���揣��鍳�辷�隞𡡞妟�梢兝撘�憪?,
-                        "韐W��躰�銝齿糓�坔酋摮𪀔"韏𡁻兝\"嚗諹�峕糓�孵�隞𣇉恣���皞鞟��箸��諹��䜘��妟�梢兝�臭�銝芰�雿喟��躰�撌亙�嚗諹悟摮拙��典�頝萎葉摮虫�閫����������澈�?,
-                        "<h2>銝箔�銋�揣����脣��滩�</h2><p>韐W�嚗㇅inancial Quotient, FQ嚗劐��箏������僎�𦯀蛹�唬誨蝷曆�銝匧之�詨�蝝㰘捶��揣����脖��舀�摮拙��笔⏚嚗諹�峕糓�嗘�憒��銝舘�皞𣂼遣蝡见�摨瑞��喟頂�婙�𥪜�雿閗��鉝���雿閖�㗇𥋘���雿訫辣餈�說頞喋���雿閙��拙���澈�?/p><h2>�嗉��勗�摨衣�暺��瘜訫�</h2><p><b>1. 摰𡁏𧒄蝏辷�銝滚�憸?/b>����冽�瘥𤩺��箏��園𡢿�烐𦆮嚗䔶��煾�銝滚�餈��嚗諹悟摮拙�摮虫��冽��鞟�韏��銝剖��㗇𥋘�?/p><p><b>2. 銝劐葵摮睃�蝵鞉��?/b>���憭��銝芰�摮琜�\"�刻�蝵𪀔"嚗��韏瑟䔉隞亙��剁���"瘨�晶蝵𪀔"嚗�虾隞仿��嗉������"��澈蝵𪀔"嚗����閬�葬�拍�鈭箸�銋啁兮�抬����銝�甈∪��圈妟�梢兝嚗峕��扳�靘见��?/p><p><b>3. ��捂�舫�</b>��酋摮𣂼虾�賭��𢠃兝銝�甈⊥�扯��㚁�餈蹱糓隞硋郎銋删��箔����閬�悌�伐��峕糓�䔶�銝�韏瑕��矋�\"憒��銝𧢲活�齿䔉銝�甈∴�雿牐��𦒘��𡄯�\"</p><h2>�冽��曄�嚗峕�隞祈��瑕�</h2><p>�冽��曄�撟喳蝱嚗�酋摮𣂼虾隞仿�朞�摰峕�隞餃𦛚�������∟繮敺㛖妖����芸楛�喳�憒��雿輻鍂蝘臬��烐揢憟硋����蝘㙡"隞睃枂�坿繮敺轁��㗇𥋘\"��𡡒�荔�霈拙酋摮𣂼銁�笔��箸艶銝剝𤫇�潸揣���?/p>",
-                        "瘚㰘𪄳蝳?, 6, "wealth", 1);
-
-                    insertSeedArticle("摰嗅滬��揣�仿秄嚗𡁶鍂�梁恣��振摨剛揣撖?,
-                        "摰嗅滬��揣銝滚蘨�舐恣�梧��湔糓蝞∠�摰嗅滬��兢蝳誩�摰匧��麄���銝芸�摨瑞�摰嗅滬韐W𦛚雿梶頂嚗諹悟瘥譍葵摰嗅滬�𣂼��質�摰匧�餈賣�璇行��?,
-                        "<h2>摰嗅滬��揣��𧋦韐?/h2><p>敺��鈭箄�敺㛖�韐W停�舀�韏�����梧�雿��摰𧼮振摨剔�韐Y��祈捶�荔��冽��鞟�韏��嚗���啣振摨剜�憭抒�撟貊������鉄�𥕢葵撅�𢒰嚗帋��栶���韐嫘������憓𧼮�?/p><h2>摰嗅滬��揣�𥟇郊瘜?/h2><p><b>蝚砌�甇伐�撱箇�摰嗅滬韐行𧋦</b>��扇敶蓥�銝芣���𤣰�荔��墧�璆𡁻兝�勗銁�芷���綫�𣂷蝙�沔"銝劐葵韐行�\"瘜𤏪��亙虜撘���韐行�������韏�揭�瑯��迂銋鞉��輯揭�?/p><p><b>蝚砌�甇伐�撱箇�摨娍�亙抅�?/b>���憭?-6銝芣����瘣餉晶嚗峕𦆮�券��嗅虾�𣇉��唳䲮���蝚娪兝�臬振摨剔�\"摰匧��俞"�?/p><p><b>蝚砌�甇伐�������瘨�晶</b>���銝芣��嗅��啗揭�𠬍�����梧��嗅��?0%-30%嚗㚁��滚��埝�韐嫘����臭�蝘滚撩�嗅����銋䭾��?/p><p><b>蝚砍�甇伐��閗�摮拙���𧊋�?/b>��膄鈭���脣�����湧�閬���舀�韏�銁摮拙�����𥕦畺�颱��婙�娪�霂颯��䔝蝝U���撉?/p><h2>蝏坔酋摮鞟�韐W�閫?/h2><p>隞𤾸��孵�甇�&��揣撖諹�嚗𡁻兝�臬極�瘀�銝齿糓�桃�嚗𥡝揣撖峕䔉皞𣂷��偦�牐遠�潘���澈霈抵揣撖峕凒�㗇�銋剹���鈭𥡝�敹萎�敶勗�摮拙�銝��毺�韐W�銋贝楝�?/p>",
-                        "瘚㰘𪄳蝳?, 6, "wealth", 0);
-
-                    insertSeedArticle("�𥕦恥�鞾鵭霈∪�嚗𡁜銁�拐�銝剜�撠梯䌊�?,
-                        "瘚㰘𪄳蝳誩�摰Z恣�雴蛹瘥譍葵摰嗅滬�𣂷�鈭���冽����摰X㦤隡𠾼��銁餈䠷�嚗䔶�銝滢��賢��瑕�憸嘥��嗅�嚗峕凒�賢銁撣桀𨭌隞碶犖���蝔衤葉摰䂿緵�芣��鞾鵭�?,
-                        "<h2>隞�銋�糓�𥕦恥�鞾鵭霈∪�</h2><p>�𥕦恥�鞾鵭霈∪��舀��曄��㯄�删��拐��𥕦��������隞祉㮾靽∴���憟賜����璅∪��珮"�拐�\"�婙�娪�朞���澈隡䁅捶��漣����滚𦛚嚗�葬�拇凒憭𡁜振摨剛繮敺堒兢蝳𧶏��峕𧒄銋笔��啗䌊頨怎�隞瑕�?/p><h2>銝箔�銋��㗇𥋘�𣂷蛹�𥕦恥</h2><p><b>雿𡡞秄瑽𥕦鍳�?/b>嚗帋���閬�之�讛��𡢅�銝漤�閬�𥿢韐改��芷�閬��憸埈��誩�鈭怎�敹��?/p><p><b>�鞾鵭雿梶頂摰��</b>嚗帋��萘漣�𥕦恥�圈�蝥批�隡嗘犖嚗峕�銝�甇仿��㗇��啁��鞾鵭頝臬��屸�憟堒畺霈?/p><p><b>�拐��喳⏚撌?/b>嚗𡁜�雿䭾�憟賜�鈭批��峕��∪�鈭怎�頨怨器����页�撣桀𨭌隞碶賑�孵�摰嗅滬�亙熒�𣬚�瘣餃�韐剁�餈嗵�隞瑕�潭��祈澈撠望糓��憭抒��墧𥁒�?/p><h2>�𥕦恥���憭?/h2><p>�拇膥嚗䔶��冽��见���澈鈭��蝭��鈭𤾸�蝡亥𨯫�餌�憟賣�蝡𩤃�銝剖�嚗峕��见�蝘�縑�刻砭雿惩�鈭𤾸酋摮𣂷�韐刻����撱箄悅嚗𥕢����雿惩銁�𥕦恥蝷曄黎���鈭���箇瑪銝𠰴畺霈哨��帋�嚗䔶��嗉繮鈭��隞質恥�訫�皛⊥說���撠望��?/p><p>餈坔停�臬�摰Y���暑�婙�𥪜銁摮虫����鈭思葉嚗���啣振摨凋�鈭衤�����齿��?/p>",
-                        "瘚㰘𪄳蝳?, 5, "wealth", 0);
-
-                    log.info("鈭𠉛輕蝘滚����撌脣�憪见�嚗��15蝭��");
-                } else {
-                    log.warn("�����掩銝滚��湛�頝唾�蝘滚�����嘥��?);
-                }
-            }
-        } catch (Exception e) {
-            log.warn("�嘥��𣇉�摮鞉�蝡惩仃韐? {}", e.getMessage());
-        }
-    }
-
-    private void insertSeedArticle(String title, String summary, String content,
-                                    String author, int readTime, String dimensionCode, int isFeatured) {
-        try {
-            // �亥砭��掩ID
-            String dimCatMap = dimensionCode.equals("body") ? "頨?
-                : dimensionCode.equals("mind") ? "�?
-                : dimensionCode.equals("wisdom") ? "敹?
-                : dimensionCode.equals("action") ? "銵?
-                : dimensionCode.equals("wealth") ? "撖? : "頨?;
-            Long categoryId = jdbcTemplate.queryForObject(
-                "SELECT id FROM article_categories WHERE name = ?", Long.class, dimCatMap);
-
-            if (categoryId == null) {
-                log.warn("�芣𪄳�啣�蝐? {}, 頝唾����: {}", dimCatMap, title);
-                return;
-            }
-
-            jdbcTemplate.update(
-                "INSERT INTO articles (category_id, title, summary, content, author, read_time, " +
-                "related_dimensions, status, audit_status, is_featured, visibility, content_type, " +
-                "article_type, word_count, published_at, created_by, created_at, updated_at) " +
-                "VALUES (?, ?, ?, ?, ?, ?, ?, 'published', 'approved', ?, 'public', 'article', " +
-                "'original', ?, NOW(), 0, NOW(), NOW())",
-                categoryId, title, summary, content, author, readTime,
-                dimensionCode, isFeatured, content.length()
-            );
-            log.info("撌脣�撱箇�摮鞉�蝡? {}", title);
-        } catch (Exception e) {
-            log.warn("�𥕦遣蝘滚����憭梯揖 [{}]: {}", title, e.getMessage());
-        }
-
-        // 餈�宏42: �𥕦遣�嗉揮鈭箄”嚗�鉄韐凋僭�����寞�靽⊥�嚗?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS consignees (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "user_id BIGINT NOT NULL COMMENT '��撅䂿鍂�弒D', " +
-                    "name VARCHAR(100) NOT NULL COMMENT '�嗉揮鈭箏��?, " +
-                    "phone VARCHAR(20) COMMENT '�𧢲㦤�?, " +
-                    "id_card VARCHAR(20) COMMENT '頨思遢霂�噡', " +
-                    "hand_signature TEXT COMMENT '�讠倌�?base64�曄��𨯅RL)', " +
-                    "ethnicity VARCHAR(20) COMMENT '瘞烐�', " +
-                    "blood_type VARCHAR(20) COMMENT '銵��?, " +
-                    "address VARCHAR(500) COMMENT '�嗉揮�啣�', " +
-                    "is_default TINYINT(1) DEFAULT 0 COMMENT '�臬炏暺䁅恕�嗉揮鈭?, " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
-                    "INDEX idx_user_id (user_id)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮鈭箔縑�荔��怨揚銋唳����寞�靽⊥�嚗?");
-            log.info("撌脣�撱構onsignees銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣consignees銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏42: �𥕦遣���韐凋僭靽⊥�摮埈挾�滨蔭銵?
-        try {
-            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS product_purchase_fields (" +
-                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
-                    "product_id BIGINT NOT NULL COMMENT '���ID', " +
-                    "field_key VARCHAR(50) NOT NULL COMMENT '摮埈挾���', " +
-                    "field_name VARCHAR(100) NOT NULL COMMENT '�曄內�?, " +
-                    "is_required TINYINT(1) DEFAULT 1 COMMENT '�臬炏敹�‵', " +
-                    "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
-                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
-                    "INDEX idx_product_id (product_id), " +
-                    "UNIQUE KEY uk_product_field (product_id, field_key)" +
-                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���韐凋僭靽⊥�摮埈挾�滨蔭'");
-            log.info("撌脣�撱歉roduct_purchase_fields銵?);
-        } catch (Exception e) {
-            log.warn("�𥕦遣product_purchase_fields銵典虾�賢歇摮睃銁: {}", e.getMessage());
-        }
-
-        // 餈�宏42: product_orders銵冽溶�蠏onsignee_id�俰urchase_info摮埈挾
-        ensureColumn("product_orders", "consignee_id", "BIGINT COMMENT '�嗉揮鈭截D'");
-        ensureColumn("product_orders", "purchase_info", "TEXT COMMENT '韐凋僭靽⊥�JSON: {id_card, hand_signature, ...}'");
-
-    }
-
-    private void insertSysConfigSeed(String key, String value, String desc) {
-        Integer count = jdbcTemplate.queryForObject(
-            "SELECT COUNT(*) FROM sys_config WHERE config_key = ?", Integer.class, key);
-        if (count == null || count == 0) {
-            jdbcTemplate.update(
-                "INSERT INTO sys_config (config_key, config_value, description, updated_at) VALUES (?, ?, ?, NOW())",
-                key, value, desc);
-        }
-    }
-
-    private void initFoodTables() {
-        log.info("撘�憪见�憪见�憌笔��詨�銵?..");
-
-        // 4撘䭾鰵銵?(CREATE TABLE IF NOT EXISTS)
-        String[] ddl = {
-            "CREATE TABLE IF NOT EXISTS foods ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
-            + "category VARCHAR(50) COMMENT '��掩: �祈�/瘞湔�/�厩汗/瘞港漣/�见扒/鞊�掩/靚瑞�/靚�㭠/�嗡�', "
-            + "unit VARCHAR(20) DEFAULT 'g' COMMENT '霈⊿��蓥�', "
-            + "calories DECIMAL(8,2) COMMENT '�剝�(kcal/100g)', "
-            + "protein DECIMAL(8,2) COMMENT '�讠蒾韐?g/100g)', "
-            + "fat DECIMAL(8,2) COMMENT '���(g/100g)', "
-            + "carbs DECIMAL(8,2) COMMENT '蝣單偌(g/100g)', "
-            + "fiber DECIMAL(8,2) COMMENT '�喲�蝥斤輕(g/100g)', "
-            + "price_level TINYINT COMMENT '隞瑟聢蝑厩漣 1-5', "
-            + "nutrition_tags VARCHAR(500) COMMENT '�亙���倌JSON', "
-            + "suitable_for VARCHAR(200) COMMENT '���鈭箇黎JSON', "
-            + "allergens VARCHAR(200) COMMENT '餈���𠴨SON', "
-            + "external_source VARCHAR(100) COMMENT '�唳旿�交�', "
-            + "external_id VARCHAR(100) COMMENT '憭㚚�ID', "
-            + "cover_image VARCHAR(500) COMMENT '憌���曄�', "
-            + "status VARCHAR(20) DEFAULT 'active', "
-            + "sort_order INT DEFAULT 0, "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "INDEX idx_category (category), "
-            + "INDEX idx_price (price_level)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS recipes ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "name VARCHAR(200) NOT NULL COMMENT '憌蠘停�滨妍', "
-            + "meal_type VARCHAR(20) COMMENT '�拚�/���/�𡁻�/�𣳇�', "
-            + "description TEXT COMMENT '蝞�隞?, "
-            + "ingredients TEXT NOT NULL COMMENT '憌��皜��JSON', "
-            + "steps TEXT COMMENT '�寥左甇仿炊JSON', "
-            + "cook_time INT COMMENT '�寥左�園𡢿(���)', "
-            + "difficulty VARCHAR(20) COMMENT '�曉漲: 蝞��?銝剔�/�圈𠗕', "
-            + "total_calories DECIMAL(8,2) COMMENT '�餌��?, "
-            + "total_protein DECIMAL(8,2) COMMENT '�餉��質捶', "
-            + "total_fat DECIMAL(8,2) COMMENT '�餉��?, "
-            + "total_carbs DECIMAL(8,2) COMMENT '�餌4瘞?, "
-            + "total_fiber DECIMAL(8,2) COMMENT '�餉�憌毺漱蝏?, "
-            + "suitable_for VARCHAR(200) COMMENT '����箸艶', "
-            + "nutrition_tags VARCHAR(500) COMMENT '�亙���倌', "
-            + "external_source VARCHAR(100), "
-            + "external_id VARCHAR(100), "
-            + "cover_image VARCHAR(500), "
-            + "status VARCHAR(20) DEFAULT 'active', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "INDEX idx_meal_type (meal_type), "
-            + "INDEX idx_cook_time (cook_time)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS seasonal_foods ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "food_id BIGINT NOT NULL COMMENT '�唾�foods.id', "
-            + "month TINYINT NOT NULL COMMENT '��遢 1-12', "
-            + "region VARCHAR(50) DEFAULT '�典𤙴' COMMENT '鈭批𧑐', "
-            + "peak_flag TINYINT DEFAULT 0 COMMENT '�𥕢漣���', "
-            + "sort_order INT DEFAULT 0, "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "INDEX idx_food_month (food_id, month), "
-            + "INDEX idx_month (month)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS meal_logs ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
-            + "child_id BIGINT COMMENT '摮拙�ID', "
-            + "meal_type VARCHAR(20) NOT NULL COMMENT '�拚�/���/�𡁻�/�𣳇�', "
-            + "meal_date DATE NOT NULL COMMENT '�券��交�', "
-            + "meal_time DATETIME COMMENT '�瑚��園𡢿', "
-            + "foods TEXT NOT NULL COMMENT '憌毺�皜��JSON', "
-            + "total_calories DECIMAL(8,2) COMMENT '�餌��?, "
-            + "total_protein DECIMAL(8,2) COMMENT '�餉��質捶', "
-            + "total_fat DECIMAL(8,2) COMMENT '�餉��?, "
-            + "total_carbs DECIMAL(8,2) COMMENT '�餌4瘞?, "
-            + "total_fiber DECIMAL(8,2) COMMENT '�餉�憌毺漱蝏?, "
-            + "note TEXT COMMENT '憭�釣', "
-            + "images VARCHAR(1000) COMMENT '�曄�JSON', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "INDEX idx_user_date (user_id, meal_date), "
-            + "INDEX idx_child_date (child_id, meal_date)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS report_food_suitability ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "report_id BIGINT NOT NULL COMMENT '�亙熒�亙�ID', "
-            + "food_id BIGINT COMMENT '憌��ID', "
-            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
-            + "category VARCHAR(50) COMMENT '��掩', "
-            + "score INT NOT NULL COMMENT '���摨西��?, "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "INDEX idx_report (report_id), "
-            + "INDEX idx_food (food_id)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS user_food_preference ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
-            + "food_id BIGINT COMMENT '憌��ID', "
-            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
-            + "score INT NOT NULL DEFAULT 0 COMMENT '霂��', "
-            + "reason VARCHAR(500) COMMENT '�笔�', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "INDEX idx_user (user_id)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS food_nutrients ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "food_id BIGINT NOT NULL COMMENT '憌��ID', "
-            + "nutrient_code VARCHAR(20) NOT NULL COMMENT '�亙�蝝删��?, "
-            + "amount_per_100g DECIMAL(10,4) NOT NULL COMMENT '瘥?00g�恍�', "
-            + "unit VARCHAR(20) NOT NULL COMMENT '�蓥�', "
-            + "source VARCHAR(50) DEFAULT 'importer' COMMENT '�唳旿�交�', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "UNIQUE KEY uk_food_nutrient (food_id, nutrient_code), "
-            + "INDEX idx_nutrient (nutrient_code)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS rdi_standards ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "nutrient_code VARCHAR(20) NOT NULL COMMENT '�亙�蝝删��?, "
-            + "age_group VARCHAR(10) NOT NULL COMMENT '撟湧�畾?, "
-            + "gender VARCHAR(6) DEFAULT 'all' COMMENT '�批�', "
-            + "rdi_type VARCHAR(10) NOT NULL COMMENT '����掩�?, "
-            + "amount DECIMAL(10,4) NOT NULL COMMENT '�刻��?, "
-            + "unit VARCHAR(20) NOT NULL COMMENT '�蓥�', "
-            + "source VARCHAR(100) COMMENT '�唳旿�交�', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "UNIQUE KEY uk_rdi (nutrient_code, age_group, gender, rdi_type), "
-            + "INDEX idx_age (age_group)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS shopping_lists ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
-            + "child_id BIGINT COMMENT '摮拙�ID', "
-            + "report_id BIGINT COMMENT '�亙熒�亙�ID', "
-            + "title VARCHAR(200) COMMENT '���', "
-            + "source VARCHAR(20) NOT NULL COMMENT '�交�', "
-            + "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�?, "
-            + "total_items INT DEFAULT 0 COMMENT '�駁★�?, "
-            + "purchased_items INT DEFAULT 0 COMMENT '撌脰揚憿寞㺭', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "INDEX idx_user (user_id), "
-            + "INDEX idx_report (report_id), "
-            + "INDEX idx_status (status)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS shopping_list_items ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "list_id BIGINT NOT NULL COMMENT '韐剔�皜��ID', "
-            + "food_id BIGINT COMMENT '憌��ID', "
-            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
-            + "category VARCHAR(50) COMMENT '��掩', "
-            + "quantity DECIMAL(8,2) DEFAULT 1 COMMENT '�圈�', "
-            + "unit VARCHAR(20) DEFAULT '隞? COMMENT '�蓥�', "
-            + "priority VARCHAR(10) DEFAULT 'medium' COMMENT '隡睃�蝥?, "
-            + "reason VARCHAR(200) COMMENT '�刻��笔�', "
-            + "score INT COMMENT '霂��', "
-            + "source VARCHAR(20) COMMENT '�交�', "
-            + "purchased TINYINT DEFAULT 0 COMMENT '�臬炏撌脰揚', "
-            + "purchased_at DATETIME COMMENT '韐凋僭�園𡢿', "
-            + "sort_order INT DEFAULT 0 COMMENT '�鍦�', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "INDEX idx_list (list_id), "
-            + "INDEX idx_purchased (purchased)"
-            + ");",
-
-            "CREATE TABLE IF NOT EXISTS follow_up ("
-            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
-            + "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', "
-            + "child_id BIGINT COMMENT '摮拙�ID', "
-            + "teacher_id BIGINT COMMENT '閫��撣㇆D', "
-            + "deficiency_id BIGINT COMMENT '蝻箔�憿遐D', "
-            + "message_id BIGINT COMMENT '瘨��ID', "
-            + "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�?, "
-            + "priority VARCHAR(10) DEFAULT 'medium' COMMENT '隡睃�蝥?, "
-            + "description VARCHAR(500) COMMENT '�讛膩', "
-            + "parent_feedback TEXT COMMENT '摰園鵭�漤�', "
-            + "teacher_review VARCHAR(500) COMMENT '閫��撣��霂?, "
-            + "due_date DATETIME COMMENT '�芣迫�交�', "
-            + "completed_at DATETIME COMMENT '摰峕��園𡢿', "
-            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
-            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-            + "INDEX idx_family (family_id), "
-            + "INDEX idx_teacher (teacher_id), "
-            + "INDEX idx_status (status), "
-            + "INDEX idx_due (due_date)"
-            + ");"
-        };
-
-        for (String sql : ddl) {
-            try {
-                jdbcTemplate.execute(sql);
-            } catch (Exception e) {
-                log.warn("憌笔�銵求DL�扯�憭梯揖(�航�撌脣��?: {}", e.getMessage());
-            }
-        }
-
-        // �拙� user_nutrition_profile嚗���𡏭”銝滚��典�頝唾�嚗?
-        ensureColumn("user_nutrition_profile", "budget_monthly", "INT COMMENT '������蝞?�?'");
-        ensureColumn("user_nutrition_profile", "family_taste_preferences", "TEXT COMMENT '摰嗅滬�𣂼���㭠�誩末JSON'");
-        ensureColumn("user_nutrition_profile", "cuisine_style", "VARCHAR(100) COMMENT '�誩末�𦦵頂'");
-        ensureColumn("user_nutrition_profile", "meal_count", "INT DEFAULT 3 COMMENT '瘥𤩺𠯫擗鞉㺭'");
-        ensureColumn("user_nutrition_profile", "cooking_ability", "VARCHAR(20) DEFAULT 'simple' COMMENT '�寥左�賢�: simple/medium/advanced'");
-
-        log.info("憌笔��詨�銵典�憪见�摰峕�");
-    }
-
-    private void ensureColumn(String table, String column, String definition) {
-        try {
-            jdbcTemplate.execute("ALTER TABLE " + table + " ADD COLUMN " + column + " " + definition);
-            log.info("撌脫溶�惩� {}.{}", table, column);
-        } catch (Exception e) {
-            if (e.getMessage() != null && e.getMessage().contains("Duplicate column")) {
-                log.info("�?{}.{} 撌脣��剁�頝唾�", table, column);
-            } else {
-                log.warn("瘛餃��?{}.{} 憭梯揖: {}", table, column, e.getMessage());
-            }
-        }
-    }
-
-    private void insertProductSeed(String name, String desc, String type,
-                                Integer price,
-                                String domain, String memberEligible) {
-        Integer count = jdbcTemplate.queryForObject(
-            "SELECT COUNT(*) FROM products WHERE name = ? AND product_type = ?", Integer.class, name, type);
-        if (count == null || count == 0) {
-            jdbcTemplate.update(
-                "INSERT INTO products (name, description, price, product_type, vendor_id, vendor_name, status, domain, member_eligible, created_at, updated_at) " +
-                "VALUES (?, ?, ?, ?, NULL, '撟喳蝱摰䀹䲮', 'on_shelf', ?, ?, NOW(), NOW())",
-                name, desc, price, type, domain, memberEligible);
-        }
-    }
-
-    private void insertContentSectionSeed(String pageKey, String sectionKey, String title,
-                                        String allowedRoles, int sortOrder) {
-        Integer count = jdbcTemplate.queryForObject(
-            "SELECT COUNT(*) FROM content_sections WHERE page_key = ? AND section_key = ?",
-            Integer.class, pageKey, sectionKey);
-        if (count == null || count == 0) {
-            jdbcTemplate.update(
-                "INSERT INTO content_sections (page_key, section_key, title, allowed_roles, sort_order, status, created_at, updated_at) " +
-                "VALUES (?, ?, ?, ?, ?, 'active', NOW(), NOW())",
-                pageKey, sectionKey, title, allowedRoles, sortOrder);
-        }
-    }
-}
+package com.etotem.cfc.config;
+
+import com.etotem.cfc.mapper.*;
+import lombok.extern.slf4j.Slf4j;
+import javax.annotation.Resource;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StreamUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Component
+public class DatabaseInitializer implements CommandLineRunner {
+
+    @Resource
+    private JdbcTemplate jdbcTemplate;
+
+    @Resource
+    private ResourceLoader resourceLoader;
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("撘�憪见�憪见��唳旿...");
+
+        // 1. 璉��亙僎�𥕦遣�唳旿摨
+        initializeDatabase();
+
+        // 2. 璉��亙僎�𥕦遣銵
+        initializeTables();
+
+        // 3. �扯��唳旿摨栞�蝘鳴�瘛餃��啣�嚗
+        runMigrations();
+
+        // 4. �嘥��㚚�霈斗㺭�
+        initializeDefaultData();
+
+        // 5. �嘥��㚚���㮾�唾”
+        initFoodTables();
+
+        log.info("�唳旿摨枏�憪见�摰峕�");
+    }
+
+    private void initializeDatabase() {
+        try {
+            // 撠肽�餈墧𦻖�唳旿摨橒�憒��銝滚��典��𥕦遣
+            jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS xzyj DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
+            log.info("�唳旿摨𤘪��亙���");
+        } catch (Exception e) {
+            log.warn("�𥕦遣�唳旿摨枏仃韐� {}", e.getMessage());
+        }
+    }
+
+    private void initializeTables() {
+        try {
+            org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:schema.sql");
+            String content;
+            try (java.io.InputStream is = resource.getInputStream()) {
+                content = new String(StreamUtils.copyToByteArray(is), StandardCharsets.UTF_8);
+            }
+
+            // Remove SQL single-line comments
+            content = content.replaceAll("(?m)^\\s*--.*$", "");
+
+            // Extract all CREATE TABLE IF NOT EXISTS statements
+            Pattern pattern = Pattern.compile(
+                "CREATE\\s+TABLE\\s+IF\\s+NOT\\s+EXISTS\\s+.*?;",
+                Pattern.CASE_INSENSITIVE | Pattern.DOTALL
+            );
+            Matcher matcher = pattern.matcher(content);
+
+            List<String> createTableSQLs = new ArrayList<>();
+            while (matcher.find()) {
+                String sql = matcher.group().trim();
+                if (!sql.isEmpty()) {
+                    createTableSQLs.add(sql);
+                }
+            }
+
+            log.info("schema.sql �㰘蝸{} 銝芸遣銵刻祗, createTableSQLs.size());
+
+            for (String sql : createTableSQLs) {
+                try {
+                    jdbcTemplate.execute(sql);
+                } catch (Exception e) {
+                    log.warn("�𥕦遣銵典仃韐� {}", e.getMessage());
+                }
+            }
+
+            log.info("�唳旿銵冽��亙���");
+        } catch (Exception e) {
+            log.error("霂餃� schema.sql 憭梯揖", e);
+        }
+    }
+
+    private void runMigrations() {
+        // 餈�宏1: 隞餃𦛚銵冽溶�䭾�銵諹���畾
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN executor_type ENUM('child', 'parent') DEFAULT 'child' COMMENT '�扯���掩��'");
+            log.info("撌脫溶�猬xecutor_type�堒�tasks銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN executor_id BIGINT COMMENT '�扯���D'");
+            log.info("撌脫溶�猬xecutor_id�堒�tasks銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD INDEX idx_executor (executor_type, executor_id)");
+            log.info("撌脫溶�犲dx_executor蝝W��配asks銵�");
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏2: �冽�銵冽溶�㰘��脣�蝘臬�摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN roles VARCHAR(100) COMMENT '閫坿𠧧�𡑒”'");
+            log.info("撌脫溶��oles�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_points INT DEFAULT 0 COMMENT '摰園鵭�餌妖��'");
+            log.info("撌脫溶�慯otal_points�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_roles (roles(20))");
+            log.info("撌脫溶�犲dx_roles蝝W��酌sers銵�");
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏3: users銵冽溶�䭾鰵摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN id_card VARCHAR(18) COMMENT '頨思遢霂�噡'");
+            log.info("撌脫溶�犲d_card�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN real_name VARCHAR(50) COMMENT '�笔�憪枏�'");
+            log.info("撌脫溶��eal_name�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN phone VARCHAR(11) COMMENT '�𧢲㦤��'");
+            log.info("撌脫溶�麖hone�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birthday DATE COMMENT '��𠯫'");
+            log.info("撌脫溶��irthday�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN gender ENUM('male', 'female') COMMENT '�批�'");
+            log.info("撌脫溶�鮰ender�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_phone (phone)");
+            log.info("撌脫溶�犲dx_phone蝝W��酌sers銵�");
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏4: children銵冽溶�䭾鰵摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE children ADD COLUMN birthday DATE COMMENT '��𠯫'");
+            log.info("撌脫溶��irthday�堒�children銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE children ADD COLUMN gender ENUM('male', 'female') COMMENT '�批�'");
+            log.info("撌脫溶�鮰ender�堒�children);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏5: 靽格㺿users.role銝箸𣈲��eacher
+        try {
+            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent', 'child', 'teacher') NOT NULL");
+            log.info("撌脫凒�酌sers.role摮埈挾�舀�teacher閫坿𠧧");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏5.1: 靽格㺿users.role銝箸𣈲��dmin
+        try {
+            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent', 'child', 'teacher', 'admin') NOT NULL");
+            log.info("撌脫凒�酌sers.role摮埈挾�舀�admin閫坿𠧧");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏5.2: 蝖桐�蝞∠��䁅��脖蛹admin嚗�耨憭齿唂�唳旿�㛖��桅�
+        try {
+            int updated = jdbcTemplate.update("UPDATE admins SET role = 'admin' WHERE username = 'admin'");
+            if (updated > 0) {
+                log.info("撌脖耨甇�恣���閫坿𠧧銝榮dmin");
+            }
+        } catch (Exception e) {
+            // �湔鰵憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏6: �𥕦遣streets銵剁�銵烾��啣�蝏游漲銵剁�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS streets (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "province VARCHAR(50) COMMENT '��遢', " +
+                    "province_code VARCHAR(20) COMMENT '��遢蝻𣇉�', " +
+                    "city VARCHAR(50) COMMENT '�𤾸�', " +
+                    "city_code VARCHAR(20) COMMENT '�𤾸�蝻𣇉�', " +
+                    "district VARCHAR(50) COMMENT '�箏礶', " +
+                    "district_code VARCHAR(20) COMMENT '�箏礶蝻𣇉�', " +
+                    "street VARCHAR(100) COMMENT '銵烾�', " +
+                    "street_code VARCHAR(20) COMMENT '銵烾�蝻𣇉�', " +
+                    "full_name VARCHAR(200) COMMENT '摰峕㟲�啣�', " +
+                    "level INT COMMENT '撅�漣:1銵烾�', " +
+                    "parent_id BIGINT COMMENT '�嗥漣ID', " +
+                    "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_level (level), " +
+                    "INDEX idx_parent_id (parent_id), " +
+                    "INDEX idx_street_code (street_code), " +
+                    "INDEX idx_full_name (full_name(50))" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+            log.info("撌脣�撱漳treets);
+        } catch (Exception e) {
+            // 銵典歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏7: families銵冽溶�惩𧑐��摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
+            log.info("撌脫溶�坟treet_id�堒�families);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
+            log.info("撌脫溶�惩𧑐��摮埈挾�逆amilies);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD INDEX idx_street_id (street_id)");
+            log.info("撌脫溶�犲dx_street_id蝝W��逆amilies);
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏7b: families銵冽溶�慯eacher_id�稪reator_id摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN teacher_id BIGINT COMMENT '蝏穃�����輯��鍦�ID'");
+            log.info("撌脫溶�慯eacher_id�堒�families);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN creator_id BIGINT COMMENT '摰嗅滬�𥕦遣��D'");
+            log.info("撌脫溶�蠏reator_id�堒�families);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏8: teachers銵冽溶�惩𧑐��摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
+            log.info("撌脫溶�坟treet_id�堒�teachers);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
+            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
+            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
+            jdbcTemplate.execute("ALTER TABLE teachers ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
+            log.info("撌脫溶�惩𧑐��摮埈挾�配eachers);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE teachers ADD INDEX idx_street_id (street_id)");
+            log.info("撌脫溶�犲dx_street_id蝝W��配eachers銵�");
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏9: users銵冽溶�䭾��輯��鍦��詨�摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_no VARCHAR(50) COMMENT '�鞾鵭閫��撣��銋血噡'");
+            log.info("撌脫溶�慯eacher_no�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_photo VARCHAR(500) COMMENT '�鞾鵭閫��撣����'");
+            log.info("撌脫溶�慯eacher_photo�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN certificate_image VARCHAR(500) COMMENT '�鞾鵭閫��撣��銋衣���'");
+            log.info("撌脫溶�蠏ertificate_image�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_status VARCHAR(20) DEFAULT 'pending' COMMENT '�鞾鵭閫��撣�恣�貊𠶖��'");
+            log.info("撌脫溶�慯eacher_status�堒�users銵�");
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_teacher_status (teacher_status)");
+            log.info("撌脫溶�犲dx_teacher_status蝝W��酌sers銵�");
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏10: users銵冽溶�慯eacherFamilyIds摮埈挾嚗���輯��鍦��唾���振摨背D�𡑒”嚗
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN teacher_family_ids VARCHAR(500) COMMENT '�鞾鵭閫��撣���𠉛�摰嗅滬ID�𡑒”(�堒噡���)'");
+            log.info("撌脫溶�慯eacher_family_ids�堒�users);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏11: families銵冽溶�慯eacherId摮埈挾嚗��摰𡁶��鞾鵭閫��撣㇆D
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD COLUMN teacher_id BIGINT COMMENT '蝏穃�����輯��鍦�ID'");
+            log.info("撌脫溶�慯eacher_id�堒�families);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE families ADD INDEX idx_teacher_id (teacher_id)");
+            log.info("撌脫溶�犲dx_teacher_id蝝W��逆amilies);
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        // 餈�宏12: �𥕦遣 teacher_messages 銵剁�摰園鵭�刻砭�鞾鵭閫��撣��
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS teacher_messages (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
+                    "parent_id BIGINT NOT NULL COMMENT '摰園鵭�冽�ID', " +
+                    "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣�鍂�弒D', " +
+                    "content TEXT NOT NULL COMMENT '瘨����捆', " +
+                    "reply_content TEXT COMMENT '�𧼮���捆', " +
+                    "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆��ending(敺��/replied(撌脣�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "replied_at DATETIME COMMENT '�𧼮��園𡢿', " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_teacher_id (teacher_id), " +
+                    "INDEX idx_parent_id (parent_id), " +
+                    "INDEX idx_status (status)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+            log.info("撌脣�撱演eacher_messages);
+        } catch (Exception e) {
+            // 銵典歇摮睃銁嚗�蕭�仿�霂
+        }
+
+// 餈�宏13: admin_task_templates銵冽溶�慯eacher_id摮埈挾
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN teacher_id BIGINT COMMENT '�鞾鵭閫��撣㇆D'");
+log.info("撌脫溶�慯eacher_id�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏13b: admin_task_templates銵冽溶�䭾鰵摮埈挾
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN complete_types VARCHAR(100) COMMENT '摰峕��孵�JSON'");
+log.info("撌脫溶�蠏omplete_types�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN duration INT COMMENT '憸�恣摰峕��園鵭(���)'");
+log.info("撌脫溶�賷uration�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN review_type VARCHAR(20) COMMENT '摰⊥瓲鈭箇掩 creator/parent/teacher/ai'");
+log.info("撌脫溶��eview_type�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN task_type VARCHAR(20) COMMENT '隞餃𦛚�扯捶: onetime/recurring'");
+log.info("撌脫溶�慯ask_type�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN frequency VARCHAR(20) COMMENT '憸𤑳�: daily/weekly/monthly'");
+log.info("撌脫溶�霡requency�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+try {
+jdbcTemplate.execute("ALTER TABLE admin_task_templates ADD COLUMN max_frequency INT COMMENT '�冽����憭𡁜��鞉活");
+log.info("撌脫溶�𦅙ax_frequency�堒�admin_task_templates);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏14: rewards銵牢hild_id摮埈挾��捂NULL嚗�芋�踹��曹���閬�hild_id
+        try {
+            jdbcTemplate.execute("ALTER TABLE rewards MODIFY COLUMN child_id BIGINT NULL COMMENT '摮拙�ID嚗峕芋�踹��曹蛹NULL'");
+            log.info("撌脖耨�雹ewards.child_id摮埈挾��捂NULL");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏15: admins銵冽溶�删撩憭勗�
+        try {
+            jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN nickname VARCHAR(50) DEFAULT NULL AFTER password");
+            log.info("撌脫溶�慙ickname�堒�admins);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN email VARCHAR(100) DEFAULT NULL AFTER phone");
+            log.info("撌脫溶�猬mail�堒�admins);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE admins MODIFY COLUMN status VARCHAR(20) DEFAULT 'active'");
+            log.info("撌脖耨�鈴dmins.status摮埈挾蝐餃�");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏16: �𥕦遣�冽��滢��亙�
+try {
+jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_operation_logs (" +
+"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+"user_id BIGINT COMMENT \'�冽�ID\', " +
+"nickname VARCHAR(50) COMMENT \'�冽��萇妍\', " +
+"operation_type VARCHAR(20) NOT NULL COMMENT \'�滢�蝐餃�: login/logout/create/update/delete/query蝑声', " +
+"description VARCHAR(500) COMMENT \'�滢��讛膩\', " +
+"request_path VARCHAR(200) COMMENT \'霂瑟�頝臬�\', " +
+"request_method VARCHAR(10) COMMENT \'霂瑟��寞�\', " +
+"request_params TEXT COMMENT \'霂瑟���㺭嚗���𧶏�\', " +
+"response_status INT COMMENT \'�滚��嗆���\', " +
+"client_ip VARCHAR(50) COMMENT \'摰X�蝡涅P\', " +
+"user_agent VARCHAR(500) COMMENT \'User-Agent\', " +
+"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+"INDEX idx_user_id (user_id), " +
+"INDEX idx_operation_type (operation_type), " +
+"INDEX idx_created_at (created_at)" +
+") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+log.info("撌脣�撱滾ser_operation_logs);
+} catch (Exception e) {
+// 銵典歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏16: tasks銵冽溶��onus_rule摮埈挾嚗㇊OINT-002: 頞��蝘臬�閫��
+try {
+jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN bonus_rule VARCHAR(500) COMMENT \'頞��蝘臬�閫��JSON\'");
+log.info("撌脫溶��onus_rule�堒�tasks);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏17: tasks銵冽溶�麖oints_expire_days摮埈挾嚗㇊OINT-009: 蝘臬��㗇����
+try {
+jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN points_expire_days INT DEFAULT 0 COMMENT \'蝘臬��㗇��笔予�堆�0銵函內瘞訾��㗇�\'");
+log.info("撌脫溶�麖oints_expire_days�堒�tasks);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏18: points_log銵冽溶�猬xpire_at摮埈挾嚗㇊OINT-009: 蝘臬��㗇����
+try {
+jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN expire_at DATE COMMENT \'蝘臬�餈���交�\'");
+log.info("撌脫溶�猬xpire_at�堒�points_log);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏19: points_log銵冽溶�猬xpired摮埈挾嚗㇊OINT-009: 餈���嗆���霈堆�
+try {
+jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN expired TINYINT DEFAULT 0 COMMENT \'�臬炏撌脰� 0�珮'");
+log.info("撌脫溶�猬xpired�堒�points_log);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+// 餈�宏20: tasks銵冽溶�慯emplate_id摮埈挾嚗㇍ASK-004: �滚�隞餃𦛚璅⊥踎餈質葵
+try {
+jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN template_id BIGINT COMMENT \'璅⊥踎隞餃𦛚ID\'");
+log.info("撌脫溶�慯emplate_id�堒�tasks);
+} catch (Exception e) {
+// �堒歇摮睃銁嚗�蕭�仿�霂
+}
+
+        // 餈�宏21: tasks銵冽溶�犲s_template摮埈挾嚗㇍ASK-004: ��扇璅⊥踎隞餃𦛚
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN is_template TINYINT DEFAULT 0 COMMENT '�臬炏銝箸芋�蹂遙");
+            log.info("撌脫溶�犲s_template�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏22: 靽桀�tasks銵牢hild_id�𩥇eadline��捂NULL嚗�𣈲���摮拙���振�蹂遙�∴�
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks MODIFY COLUMN child_id BIGINT NULL COMMENT '�扯���D'");
+            log.info("撌脖耨�靖asks.child_id��捂NULL");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks MODIFY COLUMN deadline DATETIME NULL COMMENT '�芣迫�園𡢿'");
+            log.info("撌脖耨�靖asks.deadline��捂NULL");
+        } catch (Exception e) {
+            // 靽格㺿憭梯揖嚗�蕭�仿�霂
+        }
+
+        // 餈�宏23: tasks銵冽溶�䭾鰵摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN task_type VARCHAR(20) COMMENT '隞餃𦛚�扯捶: onetime/recurring'");
+            log.info("撌脫溶�慯ask_type�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN frequency VARCHAR(20) COMMENT '憸𤑳�: daily/weekly/monthly'");
+            log.info("撌脫溶�霡requency�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN max_frequency INT COMMENT '�冽����憭𡁜��鞉活");
+            log.info("撌脫溶�𦅙ax_frequency�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN complete_types VARCHAR(100) COMMENT '摰峕��孵�JSON'");
+            log.info("撌脫溶�蠏omplete_types�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN review_type VARCHAR(20) COMMENT '摰⊥瓲鈭箇掩 creator/parent/teacher/ai'");
+            log.info("撌脫溶��eview_type�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN earliest_start DATETIME COMMENT '���拙�憪𧢲𧒄");
+            log.info("撌脫溶�猬arliest_start�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN latest_end DATETIME COMMENT '���𡁶���𧒄");
+            log.info("撌脫溶�饊atest_end�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏24: tasks銵冽溶�𦅙inigame_code摮埈挾嚗��皜豢�隞餃𦛚
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN minigame_code VARCHAR(50) DEFAULT NULL COMMENT '撠𤩺虜�譍誨 schulte/1a2b/sudoku'");
+            log.info("撌脫溶�𦅙inigame_code�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏25: tasks銵冽溶�賷uration摮埈挾嚗㇍ASK-011: 隞餃𦛚憸�恣�園鵭
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN duration INT DEFAULT 0 COMMENT '憸�恣�園鵭嚗�����'");
+            log.info("撌脫溶�賷uration�堒�tasks);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE tasks ADD INDEX idx_minigame (minigame_code) WHERE minigame_code IS NOT NULL");
+            log.info("撌脫溶�犲dx_minigame蝝W��配asks);
+        } catch (Exception e) {
+            // 蝝W�撌脣��剁�敹賜裦�躰秤
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS trial_memberships (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
+                    "start_date DATETIME NOT NULL COMMENT '霂閧鍂撘�憪𧢲𧒄, " +
+                    "end_date DATETIME NOT NULL COMMENT '霂閧鍂蝏𤘪��園𡢿', " +
+                    "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆��ENDING/ACTIVE/EXPIRED/CONVERTED', " +
+                    "trial_days INT DEFAULT 7 COMMENT '霂閧鍂憭拇㺭', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_user_id (user_id), " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_status (status), " +
+                    "INDEX idx_end_date (end_date)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+            log.info("撌脣�撱演rial_memberships);
+        } catch (Exception e) {
+            log.warn("�𥕦遣trial_memberships銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // assessment_appointments �啣�畾
+        try {
+            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN user_id BIGINT COMMENT '�冽�ID'");
+        } catch (Exception e) {
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN guide_id BIGINT COMMENT '�鞾鵭閫��撣㇆D'");
+        } catch (Exception e) {
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN package_id BIGINT COMMENT '憟烾�ID'");
+        } catch (Exception e) {
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE assessment_appointments ADD COLUMN remark VARCHAR(500) COMMENT '憭�釣'");
+        } catch (Exception e) {
+        }
+
+        // assessment_orders 
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS assessment_orders (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "order_no VARCHAR(64) NOT NULL UNIQUE, " +
+                    "family_id BIGINT NOT NULL, " +
+                    "user_id BIGINT NOT NULL, " +
+                    "child_id BIGINT, " +
+                    "guide_id BIGINT NOT NULL, " +
+                    "package_id BIGINT NOT NULL, " +
+                    "guide_name VARCHAR(50), " +
+                    "package_name VARCHAR(100), " +
+                    "total_price BIGINT DEFAULT 0, " +
+                    "discount_amount BIGINT DEFAULT 0, " +
+                    "actual_price BIGINT DEFAULT 0, " +
+                    "status VARCHAR(20) DEFAULT 'pending', " +
+                    "pay_time VARCHAR(50), " +
+                    "pay_type VARCHAR(20), " +
+                    "transaction_id VARCHAR(64), " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_family (family_id), " +
+                    "INDEX idx_guide (guide_id), " +
+                    "INDEX idx_status (status)) " +
+                    "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霂�摯霈W�");
+        } catch (Exception e) {
+        }
+
+        // 餈�宏26: guide_applications銵冽溶�蟵ddress�𠩯ank_card摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN address VARCHAR(500) COMMENT '�啣�'");
+            log.info("撌脫溶�蟵ddress�堒�guide_applications);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN bank_card VARCHAR(50) COMMENT '�嗉��∪噡'");
+            log.info("撌脫溶��ank_card�堒�guide_applications);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_applications ADD COLUMN bank_name VARCHAR(100) COMMENT '撘��瑁�'");
+            log.info("撌脫溶��ank_name�堒�guide_applications);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏27: users銵冽溶�蟵ddress摮埈挾嚗���輯��鍦��啣�
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN address VARCHAR(500) COMMENT '�啣�'");
+            log.info("撌脫溶�蟵ddress�堒�users);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏28: �𥕦遣guide_application_records銵剁��唾窈餈��霈啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_application_records (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "application_id BIGINT NOT NULL COMMENT '�唾��唾窈ID', " +
+                    "user_id BIGINT NOT NULL COMMENT '�滢�鈭箇鍂�弒D', " +
+                    "action VARCHAR(50) NOT NULL COMMENT '�滢�: submit/approve/reject/withdraw/resubmit', " +
+                    "from_status VARCHAR(20) COMMENT '�滢��滨𠶖��, " +
+                    "to_status VARCHAR(20) NOT NULL COMMENT '�滢��𡒊𠶖��, " +
+                    "remark VARCHAR(500) COMMENT '憭�釣/�笔�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_application_id (application_id), " +
+                    "INDEX idx_user_id (user_id), " +
+                    "INDEX idx_action (action)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�鞾鵭閫��撣�𤚗霂瑁�蝔贝扇敶閗”'");
+            log.info("撌脣�撱榫uide_application_records);
+        } catch (Exception e) {
+            // 銵典歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏20: children銵冽溶�坟ystem_points摮埈挾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'children' AND COLUMN_NAME = 'system_points'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE children ADD COLUMN system_points INT DEFAULT 0 COMMENT '蝟餌�蝘臬�'");
+                log.info("撌脫溶�坟ystem_points�堒�children);
+            } else {
+                log.info("system_points�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�坟ystem_points�堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏21: points_log銵冽溶�蠏ategory摮埈挾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'points_log' AND COLUMN_NAME = 'category'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE points_log ADD COLUMN category VARCHAR(20) DEFAULT 'task' COMMENT '蝘臬���掩: task隞餃𦛚蝘臬�, system蝟餌�蝘臬�'");
+                log.info("撌脫溶�蠏ategory�堒�points_log);
+            } else {
+                log.info("category�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蠏ategory�堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏22: �𥕦遣invite_card
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS invite_card (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "type VARCHAR(20) NOT NULL COMMENT 'child/family/guide', " +
+                    "code VARCHAR(64) NOT NULL UNIQUE COMMENT '��霂瑞�', " +
+                    "ref_id BIGINT NOT NULL COMMENT '�唾�ID(childId/familyId)', " +
+                    "creator_id BIGINT NOT NULL COMMENT '�𥕦遣, " +
+                    "expires_at DATETIME NOT NULL, " +
+                    "used TINYINT DEFAULT 0, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_code (code), " +
+                    "INDEX idx_ref_type (ref_id, type)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��霂瑕㨃");
+            log.info("撌脣�撱槐nvite_card);
+        } catch (Exception e) {
+            // 銵典歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏23: �𥕦遣wishes
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS wishes (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT COMMENT '摰嗅滬ID', " +
+                    "child_id BIGINT COMMENT '�格�摮拙�ID', " +
+                    "created_by BIGINT COMMENT '�𥕦遣��鍂�弒D', " +
+                    "creator_type VARCHAR(20) COMMENT '�𥕦遣��掩 child/parent', " +
+                    "title VARCHAR(200) NOT NULL COMMENT '敹�����', " +
+                    "description VARCHAR(500) COMMENT '敹���讛膩', " +
+                    "category VARCHAR(32) COMMENT '敹����掩', " +
+                    "points_required INT COMMENT '����蝘臬�', " +
+                    "points_set_by BIGINT COMMENT '摰帋遠��D', " +
+                    "points_set_at DATETIME COMMENT '摰帋遠�園𡢿', " +
+                    "status VARCHAR(32) DEFAULT 'active' COMMENT '�嗆� draft/active/pending_exchange/approved/exchanging/fulfilled/cancelled/rejected', " +
+                    "exchange_requested_at DATETIME COMMENT '�唾窈�烐揢�園𡢿', " +
+                    "exchange_approved_by BIGINT COMMENT '�孵���D', " +
+                    "exchange_approved_at DATETIME COMMENT '�孵��園𡢿', " +
+                    "points_deducted_at DATETIME COMMENT '��妖��𧒄, " +
+                    "fulfilled_by BIGINT COMMENT '�𤑳緵��D', " +
+                    "fulfilled_at DATETIME COMMENT '�𤑳緵�園𡢿', " +
+                    "child_confirmed_at DATETIME COMMENT '摮拙�蝖株恕�嗉揮�園𡢿', " +
+                    "rejected_by BIGINT COMMENT '�垍���D', " +
+                    "rejected_at DATETIME COMMENT '�垍��園𡢿', " +
+                    "reject_reason VARCHAR(500) COMMENT '�垍��笔�', " +
+                    "reject_count INT DEFAULT 0 COMMENT '鋡急�蝏脲活, " +
+                    "cancelled_by BIGINT COMMENT '�𡝗���D', " +
+                    "cancelled_at DATETIME COMMENT '�𡝗��園𡢿', " +
+                    "cancel_reason VARCHAR(500) COMMENT '�𡝗��笔�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_child_id (child_id), " +
+                    "INDEX idx_status (status)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='敹���閗”'");
+            log.info("撌脣�撱滴ishes);
+        } catch (Exception e) {
+            log.warn("�𥕦遣wishes銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏24: users銵冽溶�牐葵鈭箔縑�航‘���畾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'ethnicity'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE users " +
+                    "ADD COLUMN ethnicity VARCHAR(32) DEFAULT NULL COMMENT '瘞烐�', " +
+                    "ADD COLUMN blood_type VARCHAR(16) DEFAULT NULL COMMENT '銵�, " +
+                    "ADD COLUMN highest_education VARCHAR(32) DEFAULT NULL COMMENT '��擃睃郎, " +
+                    "ADD COLUMN marital_status VARCHAR(16) DEFAULT NULL COMMENT '憍𡁜宏�嗆��, " +
+                    "ADD COLUMN family_role VARCHAR(16) DEFAULT NULL COMMENT '摰園鵭頨思遢: �貊�/憒��/�瑞�/憟嗅扒/憪亦�/憪亙坏/�嗡�'");
+                log.info("撌脫溶�牐葵鈭箔縑�航‘���畾萄�users);
+            } else {
+                log.info("銝芯犖靽⊥�銵亙�摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�牐葵鈭箔縑�航‘���畾萄仃韐�: {}", e.getMessage());
+        }
+
+        // Phase 0: 瘚㰘𪄳蝳譍膨銋鞾� �滚𦛚���畾�
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'vendor_type'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_type VARCHAR(32) DEFAULT NULL COMMENT '�滚𦛚��掩 planner/activity_provider/product_supplier'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_status VARCHAR(16) DEFAULT NULL COMMENT '�滚𦛚��恣�貊𠶖�� pending/approved/rejected'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_reject_reason VARCHAR(500) DEFAULT NULL COMMENT '摰⊥瓲�垍��笔�'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN is_family_admin TINYINT DEFAULT 0 COMMENT '�臬炏摰嗅滬蝞∠�");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN vendor_info VARCHAR(2000) DEFAULT NULL COMMENT '�滚𦛚���韐其縑JSON)'");
+                log.info("撌脫溶�䭾��曄�靽曹��冽��∪�摮埈挾�酌sers);
+            } else {
+                log.info("瘚㰘𪄳蝳譍膨銋鞾��滚𦛚���畾萄歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�䭾��∪�摮埈挾憭梯揖 {}", e.getMessage());
+        }
+
+        // Phase 0: 餈�宏撌脫�閫��撣���滚𦛚���
+        try {
+            int updated = jdbcTemplate.update(
+                "UPDATE users SET vendor_type = 'planner', vendor_status = 'approved' WHERE teacher_status = 'approved' AND vendor_type IS NULL"
+            );
+            if (updated > 0) {
+                log.info("撌脰�蝘} �滩��鍦��唳��∪�雿梶頂", updated);
+            }
+        } catch (Exception e) {
+            log.warn("餈�宏閫��撣���滚𦛚���蝟餃仃韐� {}", e.getMessage());
+        }
+
+        // ====== Phase 1: 瘚㰘𪄳蝳譍膨銋鞾����蝟餌� ======
+
+        // ���
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS products (" +
+                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "  name VARCHAR(200) NOT NULL," +
+                "  description VARCHAR(1000)," +
+                "  intro TEXT," +
+                "  cover_image VARCHAR(500)," +
+                "  images TEXT," +
+                "  price INT NOT NULL DEFAULT 0 COMMENT '隞瑟聢('," +
+                "  stock INT NOT NULL DEFAULT 0," +
+                "  sales_count INT NOT NULL DEFAULT 0," +
+                "  product_type VARCHAR(32) NOT NULL COMMENT 'activity/course/physical/digital/service'," +
+                "  vendor_id BIGINT," +
+                "  vendor_name VARCHAR(100)," +
+                "  status VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/pending/approved/rejected/on_shelf/off_shelf'," +
+                "  reject_reason VARCHAR(500)," +
+                "  member_price INT COMMENT '隡𡁜�'," +
+                "  profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋���'," +
+                "  member_eligible VARCHAR(32) DEFAULT 'none' COMMENT 'all/budget/none'," +
+                "  domain VARCHAR(32) COMMENT 'action/mind/body/wisdom/wealth'," +
+                "  external_source VARCHAR(64)," +
+                "  external_id VARCHAR(128)," +
+                "  external_data TEXT," +
+                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")"
+            );
+        } catch (Exception e) {
+            log.warn("�𥕦遣products銵典仃韐� {}", e.getMessage());
+        }
+
+        // ���SKU
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS product_skus (" +
+                "  id INT NOT NULL AUTO_INCREMENT," +
+                "  product_id INT NOT NULL COMMENT '���ID'," +
+                "  sku_code VARCHAR(64) NOT NULL COMMENT 'SKU蝻𣇉�'," +
+                "  specs JSON NOT NULL COMMENT '閫�聢JSON'," +
+                "  price DECIMAL(10,2) NOT NULL COMMENT 'SKU隞瑟聢'," +
+                "  stock INT NOT NULL DEFAULT 0 COMMENT '摨枏�'," +
+                "  original_price DECIMAL(10,2) COMMENT '�煺遠/�垍瑪," +
+                "  image VARCHAR(512) COMMENT 'SKU�曄�'," +
+                "  enabled TINYINT(1) NOT NULL DEFAULT 1," +
+                "  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," +
+                "  update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "  PRIMARY KEY (id)," +
+                "  KEY idx_product_id (product_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���SKU'"
+            );
+            log.info("撌脣�撱歉roduct_skus);
+        } catch (Exception e) {
+            log.warn("�𥕦遣product_skus銵典仃韐� {}", e.getMessage());
+        }
+
+        // 霈W�
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS product_orders (" +
+                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "  order_no VARCHAR(64) NOT NULL UNIQUE," +
+                "  product_id BIGINT NOT NULL," +
+                "  product_name VARCHAR(200)," +
+                "  product_type VARCHAR(32)," +
+                "  buyer_id BIGINT NOT NULL," +
+                "  family_id BIGINT," +
+                "  quantity INT NOT NULL DEFAULT 1," +
+                "  unit_price INT NOT NULL COMMENT '�蓥遠('," +
+                "  total_amount INT NOT NULL COMMENT '�駁�'," +
+                "  status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/completed/cancelled/refunded'," +
+                "  payment_method VARCHAR(32) COMMENT 'wechat/points/membership'," +
+                "  remark VARCHAR(500)," +
+                "  paid_at DATETIME," +
+                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")"
+            );
+        } catch (Exception e) {
+            log.warn("�𥕦遣product_orders銵典仃韐� {}", e.getMessage());
+        }
+
+        // 蝟餌��滨蔭
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS sys_config (" +
+                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "  config_key VARCHAR(64) NOT NULL UNIQUE," +
+                "  config_value TEXT," +
+                "  description VARCHAR(500)," +
+                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")"
+            );
+        } catch (Exception e) {
+            log.warn("�𥕦遣sys_config銵典仃韐� {}", e.getMessage());
+        }
+
+        // Migration: product_orders add logistics fields
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_no VARCHAR(64) COMMENT '�拇��訫噡'");
+            log.info("撌脫溶�饊ogistics_no�堒�product_orders);
+        } catch (Exception e) { }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_company VARCHAR(100) COMMENT '�拇��砍虬'");
+            log.info("撌脫溶�饊ogistics_company�堒�product_orders);
+        } catch (Exception e) { }
+
+        // SysConfig 蝘滚��唳旿
+        try {
+            insertSysConfigSeed("points_exchange_rate", "1", "蝘臬��烐揢瘙��蝘臬�=1���.01���");
+            insertSysConfigSeed("points_deduct_cap", "0.5", "蝘臬��菜緍銝𢠃�0%);
+            insertSysConfigSeed("member_fee_standard", "1314", "���隡𡁜�撟渲晶嚗��);
+            insertSysConfigSeed("member_fee_premium", "3650", "擃条漣隡𡁜�撟渲晶嚗��);
+            insertSysConfigSeed("member_eligible_budget", "1314", "蝑匧�澆����㗇𥋘憸��銝𢠃�嚗��);
+            insertSysConfigSeed("renewal_discount_rate", "0.85", "蝏剛晶�䀹緍);
+            insertSysConfigSeed("member_discount_standard", "0.9", "���隡𡁜��䀹緍);
+            insertSysConfigSeed("member_discount_premium", "0.8", "擃条漣隡𡁜��䀹緍);
+            insertSysConfigSeed("member_fee_family", "36500", "摰嗅滬隡𡁜�撟渲晶嚗��);
+            insertSysConfigSeed("member_upgrade_threshold", "131400", "�芸𢆡��漣摰嗅滬隡𡁜�蝝航恣瘨�晶�冽�嚗��);
+            insertSysConfigSeed("member_discount_family", "9000", "摰嗅滬隡𡁜�����䀹緍(bps)");
+            insertSysConfigSeed("commission_member_l1_rate", "2000", "�刻�摰嗅滬隡𡁜�L1雿��bps)");
+            insertSysConfigSeed("commission_member_l2_rate", "500", "�刻�摰嗅滬隡𡁜�L2雿��bps)");
+            insertSysConfigSeed("commission_product_profit_share", "1000", "銝讠瑪���韐凋僭�拇隋���(bps)");
+            insertSysConfigSeed("commission_service_rate", "1000", "銝讠瑪�滚𦛚韐凋僭雿��bps)");
+            insertSysConfigSeed("commission_event_fixed", "2000", "�刻��啁鍂�瑟𥁒�齿暑�典𤐄摰帋膛");
+            insertSysConfigSeed("withdraw_min_amount", "10000", "��雿擧��圈�");
+            insertSysConfigSeed("withdraw_tax_rate", "2000", "雿��蝔𡒊�(bps)");
+            insertSysConfigSeed("withdraw_fee_free_threshold", "80000", "�滨�憸嘥漲(");
+            insertSysConfigSeed("article_energy_rate_normal", "1", "�桅�𡁏�蝡㰘��𤩺�00");
+            insertSysConfigSeed("article_energy_rate_premium", "2", "隡䁅捶����賡�瘙��(00");
+            insertSysConfigSeed("article_energy_rate_original", "3", "�笔�����賡�瘙��(00");
+            insertSysConfigSeed("article_reading_min_seconds", "60", "�����粉颲暹���撠𤑳�);
+            insertSysConfigSeed("activity_checkin_default_points", "5", "瘣餃𢆡蝑曉�暺䁅恕蝘臬�");
+            insertSysConfigSeed("health_checkin_points", "5", "�亙熒�枏㨃蝘臬�");
+            insertSysConfigSeed("finance_checkin_points", "5", "��揣�枏㨃蝘臬�");
+            insertSysConfigSeed("trial_enabled", "true", "�臬炏�舐鍂隡𡁜�霂閧鍂");
+            insertSysConfigSeed("trial_days", "7", "霂閧鍂憭拇㺭");
+            insertSysConfigSeed("trial_features", "[\"free_activities\",\"free_courses\",\"teacher_consultation\"]", "霂閧鍂�罸𡢿�舐鍂�蠘�");
+            insertSysConfigSeed("health_dimension_weights", "{\"growth\":0.20,\"sleep\":0.15,\"vision\":0.10,\"immunity\":0.15,\"nutrition\":0.15,\"gut\":0.10,\"exercise\":0.15}", "7蝏游�摨猾�頨怨��𤩺��漤�);
+            insertSysConfigSeed("health_dimension_sync_factor", "0.5", "7蝏游�摨瑕�甇亥秐頨怨��讐頂);
+            log.info("SysConfig 蝘滚��唳旿撌脣�頧�);
+        } catch (Exception e) {
+            log.warn("SysConfig 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // Product 蝘滚��唳旿 銝芰內靘见����閬���券� 5 productType
+        try {
+            insertProductSeed("鈭脣��喟頂撌乩�, "蝥蹂��𦠜𠯫撌乩��𠺪��滚遣摰嗅滬撖寡�璅∪�", "activity", 38800, "action", "all");
+            insertProductSeed("��貌蝞∠�21憭抵悌蝏�𨯫", "21憭抵�憸𤏸紋蝔页�霂��撟嗥恣���, "course", 19900, "mind", "all");
+            insertProductSeed("�𣳇��𣬚黎璉�瘚见�, "摰嗥鍂璉���+ �亙�閫�粉", "physical", 59900, "body", "budget");
+            insertProductSeed("�輻咱憭𡁏芋��恕�交�, "�函瑪瘚贝� + 銝芣�批�撱箄悅", "digital", 9900, "wisdom", "none");
+            insertProductSeed("�鞾鵭閫���刻砭", "60���銝㮖�閫��", "service", 50000, "wealth", "budget");
+            log.info("Product 蝘滚��唳旿撌脣�頧�);
+        } catch (Exception e) {
+            log.warn("Product 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // ====== Phase 2: ��捆�箏��航��折�======
+
+        // ��捆�箏��滨蔭
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS content_sections (" +
+                "  id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "  page_key VARCHAR(50) NOT NULL," +
+                "  section_key VARCHAR(50) NOT NULL," +
+                "  title VARCHAR(100)," +
+                "  allowed_roles VARCHAR(255) DEFAULT '[\"anonymous\"]'," +
+                "  sort_order INT DEFAULT 0," +
+                "  status VARCHAR(20) DEFAULT 'active'," +
+                "  created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")"
+            );
+            log.info("content_sections 銵典歇�𥕦遣");
+        } catch (Exception e) {
+            log.warn("�𥕦遣 content_sections 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ContentSection 蝘滚��唳旿
+        try {
+            insertContentSectionSeed("mind", "func_entries", "�蠘��亙藁", "[\"anonymous\"]", 1);
+            insertContentSectionSeed("mind", "daily_tip", "瘥𤩺𠯫敹��", "[\"anonymous\"]", 2);
+            insertContentSectionSeed("mind", "recommended_reading", "�刻���粉", "[\"anonymous\"]", 3);
+            insertContentSectionSeed("mind", "premium_content", "隡𡁜�銝枏���捆", "[\"parent\",\"teacher\"]", 4);
+            insertContentSectionSeed("mind", "mind_tasks", "敹�惣隞餃𦛚", "[\"parent\",\"child\"]", 5);
+            insertContentSectionSeed("mind", "related_activities", "�詨�瘣餃𢆡", "[\"parent\",\"child\"]", 6);
+            insertContentSectionSeed("mind", "purchased_courses", "撌脰揚霂曄�", "[\"parent\",\"child\"]", 7);
+            insertContentSectionSeed("body", "func_entries", "�蠘��亙藁", "[\"anonymous\"]", 1);
+            insertContentSectionSeed("body", "daily_stats", "隞𦠜𠯫�唳旿", "[\"anonymous\"]", 2);
+            insertContentSectionSeed("body", "health_tips", "�亙熒撠讛斐, "[\"anonymous\"]", 3);
+            insertContentSectionSeed("body", "teacher_tips", "閫��撣�綫, "[\"teacher\"]", 4);
+            log.info("ContentSection 蝘滚��唳旿撌脣�頧�);
+        } catch (Exception e) {
+            log.warn("ContentSection 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // ====== �����捆蝟餌�蝘滚��唳旿 ======
+
+        // �����掩蝘滚��唳旿
+        try {
+            Integer catCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM article_categories WHERE id IN (1,2,3,4,5)", Integer.class);
+            if (catCount == null || catCount == 0) {
+                jdbcTemplate.execute("INSERT IGNORE INTO article_categories (id, name, icon, color, sort_order, status) VALUES " +
+                    "(1, '敹���亙熒', '��', '#5B9BD5', 1, 1), " +
+                    "(2, '��貌蝞∠�', '��', '#FF6B35', 2, 1), " +
+                    "(3, '鈭脣��躰�', '�𪂹�㵵�抽�㵵�把��, '#4CAF50', 3, 1), " +
+                    "(4, '摮虫�, '��', '#FFD700', 4, 1), " +
+                    "(5, '銝𤘪釣, '�㴓', '#8D6E63', 5, 1)");
+                log.info("�����掩蝘滚��唳旿撌脣�頧�);
+            }
+        } catch (Exception e) {
+            log.warn("�����掩蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // ====== ��膛鋆��蝟餌� ======
+        
+        // 餈�宏: users銵冽溶�䭾綫�𣂷犖摮埈挾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'referrer_id'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN referrer_id BIGINT DEFAULT NULL COMMENT '�刻�鈭截D'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN referral_code VARCHAR(32) DEFAULT NULL COMMENT '銝芯犖��霂瑞�'");
+                jdbcTemplate.execute("ALTER TABLE users ADD INDEX idx_referral_code (referral_code)");
+                log.info("撌脫溶�惩�雿��畾萄�users);
+            } else {
+                log.info("��膛�穃�畾萄歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�惩�雿��摮埈挾憭梯揖 {}", e.getMessage());
+        }
+
+        // 餈�宏: products銵冽溶�惩⏚瘨衣�摮埈挾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'products' AND COLUMN_NAME = 'profit_rate'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE products ADD COLUMN profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋bps,100=1%)'");
+                log.info("撌脫溶�麖rofit_rate�堒�products);
+            } else {
+                log.info("profit_rate�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�麖rofit_rate�堒仃韐� {}", e.getMessage());
+        }
+
+        // �啗”: commission_records (雿��霈啣�)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS commission_records (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "order_type VARCHAR(32) NOT NULL COMMENT '霈W�蝐餃�: membership/product/assessment/package', " +
+                "referrer_id BIGINT NOT NULL COMMENT '�刻�鈭截D', " +
+                "buyer_id BIGINT NOT NULL COMMENT '韐凋僭鈭截D', " +
+                "commission_type VARCHAR(16) NOT NULL COMMENT '雿��蝐餃�: member/profit', " +
+                "order_amount INT NOT NULL COMMENT '霈W��煾�(', " +
+                "profit_rate INT DEFAULT 0 COMMENT '�拇隋bps,100=1%)', " +
+                "commission_amount INT NOT NULL COMMENT '雿���煾�(', " +
+                "status VARCHAR(16) NOT NULL DEFAULT 'settled' COMMENT '�嗆�� pending/settled', " +
+                "remark VARCHAR(255) DEFAULT NULL, " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_referrer (referrer_id), " +
+                "INDEX idx_buyer (buyer_id), " +
+                "INDEX idx_order (order_id, order_type)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+            log.info("撌脣�撱構ommission_records);
+        } catch (Exception e) {
+            log.warn("�𥕦遣commission_records銵典仃韐� {}", e.getMessage());
+        }
+
+        // �啗”: withdrawal_requests (�鞟緵�唾窈)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS withdrawal_requests (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "amount INT NOT NULL COMMENT '�鞟緵�煾�(', " +
+                "account_info TEXT COMMENT '韐行�靽⊥�(JSON)', " +
+                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '�嗆�� pending/approved/rejected', " +
+                "audit_by BIGINT DEFAULT NULL COMMENT '摰⊥瓲鈭截D', " +
+                "audit_at DATETIME DEFAULT NULL COMMENT '摰⊥瓲�園𡢿', " +
+                "remark VARCHAR(255) DEFAULT NULL COMMENT '摰⊥瓲憭�釣', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_user (user_id), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+            log.info("撌脣�撱滴ithdrawal_requests);
+        } catch (Exception e) {
+            log.warn("�𥕦遣withdrawal_requests銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 隡𡁜�雿梶頂 & ��膛�拙� ======
+
+        // 餈�宏: users銵冽溶�牐��睃�畾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'member_level'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN member_level VARCHAR(20) DEFAULT 'FREE' COMMENT '隡𡁜�蝑厩漣: FREE/FAMILY/PROVIDER'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN member_expire_time DATETIME DEFAULT NULL COMMENT '摰嗅滬隡𡁜��唳��園𡢿'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_consumption BIGINT DEFAULT 0 COMMENT '蝝航恣瘨�晶�煾�嚗��");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN upgrade_from_consumption TINYINT DEFAULT 0 COMMENT '�臬炏�朞�蝝航恣瘨�晶�芸𢆡��漣'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN direct_count INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箸㺭'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN indirect_count INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箸㺭'");
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN total_commission_earned BIGINT DEFAULT 0 COMMENT '蝝航恣�瑕�雿��嚗��");
+                log.info("撌脫溶�牐��睃�畾萄�users);
+            } else {
+                log.info("隡𡁜�摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�牐��睃�畾萄仃韐�: {}", e.getMessage());
+        }
+
+        // 餈�宏: commission_records銵冽溶�䭾�撅訫�畾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'commission_records' AND COLUMN_NAME = 'level'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN level INT DEFAULT 1 COMMENT '雿��撅�漣: 1=�湔𦻖�刻�, 2=�湔𦻖�刻�'");
+                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN settled_at DATETIME DEFAULT NULL COMMENT '蝏梶��園𡢿'");
+                jdbcTemplate.execute("ALTER TABLE commission_records ADD COLUMN withdrawn_at DATETIME DEFAULT NULL COMMENT '�鞟緵�園𡢿'");
+                log.info("撌脫溶�䭾�撅訫�畾萄�commission_records);
+            } else {
+                log.info("commission_records�拙�摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蠏ommission_records�拙�摮埈挾憭梯揖: {}", e.getMessage());
+        }
+
+        // �啗”: member_upgrade_records (隡𡁜���漣霈啣�)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS member_upgrade_records (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "from_level VARCHAR(20) NOT NULL COMMENT '��漣�滨�, " +
+                "to_level VARCHAR(20) NOT NULL COMMENT '��漣�𡒊�, " +
+                "upgrade_type VARCHAR(20) NOT NULL COMMENT '��漣蝐餃�: pay/consumption/admin', " +
+                "order_id BIGINT DEFAULT NULL COMMENT '�唾��臭�霈W�ID', " +
+                "consumption_amount BIGINT DEFAULT NULL COMMENT '閫血���漣��敞霈⊥�韐寥�, " +
+                "expire_time DATETIME DEFAULT NULL COMMENT '摰嗅滬隡𡁜��唳��園𡢿', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_user (user_id), " +
+                "INDEX idx_order (order_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隡𡁜���漣霈啣�'");
+            log.info("撌脣�撱榦ember_upgrade_records);
+        } catch (Exception e) {
+            log.warn("�𥕦遣member_upgrade_records銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== �����捆蝟餌� ======
+
+        // �����掩
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_categories (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "name VARCHAR(50) NOT NULL COMMENT '��掩, " +
+                "icon VARCHAR(20) DEFAULT '' COMMENT '�暹�emoji', " +
+                "color VARCHAR(20) DEFAULT '#5B9BD5' COMMENT '���, " +
+                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
+                "status TINYINT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂'" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����掩'");
+            log.info("撌脣�撱榮rticle_categories);
+        } catch (Exception e) {
+            log.warn("�𥕦遣article_categories銵典仃韐� {}", e.getMessage());
+        }
+
+        // ���
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS articles (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "category_id BIGINT DEFAULT 0 COMMENT '��撅𧼮�蝐膏D', " +
+                "title VARCHAR(200) NOT NULL COMMENT '���', " +
+                "summary VARCHAR(500) DEFAULT '' COMMENT '�䁅�', " +
+                "cover_image VARCHAR(500) DEFAULT '' COMMENT '撠�𢒰�銳RL', " +
+                "content LONGTEXT COMMENT '撖峕��砍�, " +
+                "tags VARCHAR(200) DEFAULT '' COMMENT '��倌JSON�啁�', " +
+                "author VARCHAR(100) DEFAULT '瘚㰘𪄳 COMMENT '雿�, " +
+                "read_time INT DEFAULT 0 COMMENT '憸�恣��粉���, " +
+                "related_dimensions VARCHAR(100) DEFAULT '' COMMENT '�唾�鈭𠉛輕JSON�啁�', " +
+                "visibility VARCHAR(20) DEFAULT 'public' COMMENT '瘚讛����:public/login/private', " +
+                "visible_to TEXT COMMENT '蝘�����鈭箇黎JSON', " +
+                "status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/published/archived', " +
+                "is_featured TINYINT DEFAULT 0 COMMENT '1蝎�0��, " +
+                "published_at DATETIME DEFAULT NULL COMMENT '�穃��園𡢿', " +
+                "view_count INT DEFAULT 0 COMMENT '瘚讛�甈⊥㺭', " +
+                "created_by BIGINT DEFAULT 0 COMMENT '�穃�鈭榮dminID', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���'");
+            log.info("撌脣�撱榮rticles);
+        } catch (Exception e) {
+            log.warn("�𥕦遣articles銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: articles銵刻‘��鰵摮埈挾嚗��摰寞唂銵剁�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'visibility'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN visibility VARCHAR(20) DEFAULT 'public' COMMENT '瘚讛����:public/login/private' AFTER related_dimensions");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN visible_to TEXT COMMENT '蝘�����鈭箇黎JSON' AFTER visibility");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN tags VARCHAR(200) DEFAULT '' COMMENT '��倌JSON�啁�' AFTER content");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN related_dimensions VARCHAR(100) DEFAULT '' COMMENT '�唾�鈭𠉛輕JSON�啁�' AFTER read_time");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN is_featured TINYINT DEFAULT 0 COMMENT '1蝎�0�� AFTER status");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN published_at DATETIME DEFAULT NULL COMMENT '�穃��園𡢿' AFTER is_featured");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN view_count INT DEFAULT 0 COMMENT '瘚讛�甈⊥㺭' AFTER published_at");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN created_by BIGINT DEFAULT 0 COMMENT '�穃�鈭榮dminID' AFTER view_count");
+                log.info("撌脰�蝘蒼rticles銵刻‘���畾�);
+            } else {
+                log.info("articles銵典�畾萄歇摰峕㟲嚗諹歲餈��蝘�);
+            }
+        } catch (Exception e) {
+            log.warn("articles銵典�畾菔�蝘餃仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: articles銵刻‘��䰻霂�葉敹�鰵摮埈挾嚗Ếontent_type/difficulty_level/dimension_ids
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'content_type'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN content_type VARCHAR(20) DEFAULT 'article' COMMENT '��捆蝐餃�: article/knowledge/course/tip' AFTER article_type");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN difficulty_level TINYINT DEFAULT 0 COMMENT '�曉漲蝑厩漣 1-5' AFTER content_type");
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN dimension_ids TEXT COMMENT '�唾�蝏游漲ID�𡑒”JSON' AFTER related_dimensions");
+                log.info("撌脰�蝘蒼rticles銵函䰻霂�葉敹�鰵摮埈挾");
+            } else {
+                log.info("articles銵函䰻霂�葉敹��畾萄歇摰峕㟲嚗諹歲餈��蝘�);
+            }
+        } catch (Exception e) {
+            log.warn("articles銵函䰻霂�葉敹��畾菔�蝘餃仃韐� {}", e.getMessage());
+        }
+
+        // �����倌�唾�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_tags (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "article_id BIGINT NOT NULL COMMENT '���ID', " +
+                "tag_id BIGINT NOT NULL COMMENT '��倌ID嚗���㺱an_knowledge_tag.id, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_article_tag (article_id, tag_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���-��倌�唾�");
+            log.info("撌脣�撱榮rticle_tags);
+        } catch (Exception e) {
+            log.warn("�𥕦遣article_tags銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 鈭𠉛輕�賡�蝟餌�嚗�揭�祆芋撘𧶏� ======
+
+        // 蝏游漲摰帋�
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS energy_dimension (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "code VARCHAR(16) NOT NULL UNIQUE COMMENT '蝏游漲隞��: body/mind/wisdom/action/wealth', " +
+                "name VARCHAR(20) NOT NULL COMMENT '蝏游漲�滨妍: , " +
+                "icon VARCHAR(16) COMMENT '�暹�emoji', " +
+                "element VARCHAR(10) COMMENT '鈭磰����: , " +
+                "sort_order INT DEFAULT 0 COMMENT '�曄內憿箏�', " +
+                "status TINYINT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�賡�蝏游漲摰帋�"
+            );
+            log.info("撌脣�撱榷nergy_dimension);
+        } catch (Exception e) {
+            log.warn("�𥕦遣energy_dimension銵典仃韐� {}", e.getMessage());
+        }
+
+        // �滚𦛚-蝏游漲瘥𥪯��滨蔭
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS energy_source_config (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "source_type VARCHAR(32) NOT NULL COMMENT '�交�蝐餃�: task/activity/course/product/consultation', " +
+                "source_id BIGINT NOT NULL COMMENT '�交�銝𡁜𦛚銵沉D', " +
+                "source_name VARCHAR(200) COMMENT '�𦯀��滨妍', " +
+                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
+                "ratio INT NOT NULL COMMENT '�䭾�(bps,10000=100%)', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_source (source_type, source_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�滚𦛚-蝏游漲瘥𥪯��滨蔭"
+            );
+            log.info("撌脣�撱榷nergy_source_config);
+        } catch (Exception e) {
+            log.warn("�𥕦遣energy_source_config銵典仃韐� {}", e.getMessage());
+        }
+
+        // 韐剔�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cart_items (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
+                "product_id BIGINT NOT NULL COMMENT '���ID'," +
+                "quantity INT DEFAULT 1 COMMENT '�圈�'," +
+                "selected TINYINT(1) DEFAULT 1 COMMENT '�臬炏�劐葉'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "INDEX idx_user (user_id)," +
+                "INDEX idx_product (product_id)," +
+                "UNIQUE KEY uk_user_product (user_id, product_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐剔�");
+            log.info("撌脣�撱構art_items);
+        } catch (Exception e) {
+            log.warn("�𥕦遣cart_items銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_categories (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "name VARCHAR(64) NOT NULL COMMENT '��掩�滨妍'," +
+                "parent_id BIGINT DEFAULT 0 COMMENT '�嗅�蝐膏D(0=�寡�'," +
+                "level INT DEFAULT 0 COMMENT '撅�漣(0/1/2/3)'," +
+                "sort INT DEFAULT 0 COMMENT '�鍦�'," +
+                "image VARCHAR(512) COMMENT '��掩�暹�'," +
+                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
+                "dimension_codes VARCHAR(128) COMMENT '蝏游漲蝻𣇉�(�堒噡���: body,mind,heart)'," +
+                "product_types VARCHAR(128) COMMENT '���蝐餃�(�堒噡���: PHYSICAL,COURSE,ASSESSMENT)'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "INDEX idx_parent (parent_id)," +
+                "INDEX idx_sort (sort)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���蝐餌𤌍'");
+            log.info("撌脣�撱漳hop_categories);
+        } catch (Exception e) {
+            log.warn("�𥕦遣shop_categories銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_systems (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "name VARCHAR(64) NOT NULL COMMENT '雿梶頂�滨妍'," +
+                "description VARCHAR(255) COMMENT '�讛膩'," +
+                "owner_id BIGINT COMMENT '�𥕦遣��D'," +
+                "profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋���'," +
+                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���雿梶頂'");
+            log.info("撌脣�撱榛istribution_systems);
+        } catch (Exception e) {
+            log.warn("�𥕦遣distribution_systems銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_relations (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID'," +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
+                "parent_id BIGINT COMMENT '銝羓漣�冽�ID(null='," +
+                "depth INT DEFAULT 0 COMMENT '撅�漣瘛勗漲'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "INDEX idx_system (system_id)," +
+                "INDEX idx_user (user_id)," +
+                "INDEX idx_parent (parent_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='����喟頂'");
+            log.info("撌脣�撱榛istribution_relations);
+        } catch (Exception e) {
+            log.warn("�𥕦遣distribution_relations銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS after_sales_requests (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID'," +
+                "order_no VARCHAR(32) NOT NULL COMMENT '霈W�," +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID'," +
+                "type VARCHAR(32) NOT NULL COMMENT '蝐餃�: REFUND/RETURN_REFUND'," +
+                "reason VARCHAR(255) COMMENT '�笔�'," +
+                "description TEXT COMMENT '�讛膩'," +
+                "images TEXT COMMENT '�剛��曄�(JSON�啁�)'," +
+                "refund_amount INT DEFAULT 0 COMMENT '��甈暸�'," +
+                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�� pending/approved/rejected/completed'," +
+                "reject_reason VARCHAR(255) COMMENT '撽喳��笔�'," +
+                "handled_by BIGINT COMMENT '憭��鈭截D'," +
+                "handled_at DATETIME COMMENT '憭���園𡢿'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "INDEX idx_order (order_id)," +
+                "INDEX idx_user (user_id)," +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�桀��唾窈'");
+            log.info("撌脣�撱榮fter_sales_requests);
+        } catch (Exception e) {
+            log.warn("�𥕦遣after_sales_requests銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_discount_rules (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "name VARCHAR(64) NOT NULL COMMENT '閫���滨妍'," +
+                "type VARCHAR(32) NOT NULL COMMENT '蝐餃�: PERCENT/FIXED/THRESHOLD'," +
+                "value INT NOT NULL COMMENT '�䀹緍PERCENT=�曉�瘥娍㺭�� FIXED/THRESHOLD=�煾�'," +
+                "threshold_amount INT COMMENT '皛∪��冽�(隞�HRESHOLD)'," +
+                "category_id BIGINT COMMENT '��鍂蝐餌𤌍ID(null=�券�)'," +
+                "distribution_system_id BIGINT COMMENT '��鍂雿梶頂ID(null=�券�)'," +
+                "product_ids TEXT COMMENT '��鍂���ID(�堒噡���,null=�券�)'," +
+                "start_time DATETIME COMMENT '撘�憪𧢲𧒄," +
+                "end_time DATETIME COMMENT '蝏𤘪��園𡢿'," +
+                "max_uses INT DEFAULT 0 COMMENT '��憭找蝙�冽活0=銝漤�)'," +
+                "used_count INT DEFAULT 0 COMMENT '撌脖蝙�冽活," +
+                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "INDEX idx_category (category_id)," +
+                "INDEX idx_enabled (enabled)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�䀹緍閫��'");
+            log.info("撌脣�撱漳hop_discount_rules);
+        } catch (Exception e) {
+            log.warn("�𥕦遣shop_discount_rules銵典仃韐� {}", e.getMessage());
+        }
+
+        // �萄��拙�摮埈挾 - products
+        try {
+            jdbcTemplate.execute("ALTER TABLE products ADD COLUMN category_id BIGINT COMMENT '���蝐餌𤌍ID'");
+            log.info("撌脫溶�蠏ategory_id�堒�products);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE products ADD COLUMN distribution_system_id BIGINT COMMENT '���雿梶頂ID'");
+            log.info("撌脫溶�賷istribution_system_id�堒�products);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // �萄��拙�摮埈挾 - product_orders
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN discount_amount INT DEFAULT 0 COMMENT '隡䀹��煾�('");
+            log.info("撌脫溶�賷iscount_amount�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN coupon_id BIGINT COMMENT '隡䀹��碰D'");
+            log.info("撌脫溶�蠏oupon_id�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cancel_at DATETIME COMMENT '�𡝗��園𡢿'");
+            log.info("撌脫溶�蠏ancel_at�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN transaction_id VARCHAR(64) COMMENT '敺桐縑�臭�鈭斗�");
+            log.info("撌脫溶�慯ransaction_id�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cover_image VARCHAR(512) COMMENT '���撠�𢒰�曉翰");
+            log.info("撌脫溶�蠏over_image�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN address_snapshot TEXT COMMENT '�嗉揮�啣�敹怎�(JSON)'");
+            log.info("撌脫溶�蟵ddress_snapshot�堒�product_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // �賡�瘚�偌
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS energy_log (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
+                "amount INT NOT NULL COMMENT '�睃𢆡�瑕�,瘨�', " +
+                "balance_after INT NOT NULL COMMENT '�睃𢆡�𦒘�, " +
+                "source_type VARCHAR(32) COMMENT '�交�蝐餃�: task/product/medical_report/daily_record', " +
+                "source_id BIGINT COMMENT '�交�ID', " +
+                "ref_id BIGINT COMMENT '�唾��扳�瘞富D(閬���嗆�', " +
+                "expires_at DATETIME COMMENT '餈���園𡢿(瘞訾�餈��)', " +
+                "description VARCHAR(500) COMMENT '�讛膩', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_child_dim (child_id, dimension_id), " +
+                "INDEX idx_created (created_at), " +
+                "INDEX idx_source (source_type, source_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�賡�瘚�偌"
+            );
+            log.info("撌脣�撱榷nergy_log);
+        } catch (Exception e) {
+            log.warn("�𥕦遣energy_log銵典仃韐� {}", e.getMessage());
+        }
+
+        // 蝏游漲雿䠷�
+        try {
+            jdbcTemplate.execute(
+                "CREATE TABLE IF NOT EXISTS energy_balance (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲ID', " +
+                "balance INT DEFAULT 0 COMMENT '敶枏��賡��臭蛹', " +
+                "total_earned INT DEFAULT 0 COMMENT '蝝航恣�瑕�', " +
+                "total_spent INT DEFAULT 0 COMMENT '蝝航恣瘨�, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_child_dim (child_id, dimension_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏游漲雿䠷�"
+            );
+            log.info("撌脣�撱榷nergy_balance);
+        } catch (Exception e) {
+            log.warn("�𥕦遣energy_balance銵典仃韐� {}", e.getMessage());
+        }
+
+        // 蝏游漲蝘滚��唳旿嚗���貊� �算�撖𢞖�銵𢞖�敹��頨恬�
+        try {
+            Integer dimCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM energy_dimension", Integer.class);
+            if (dimCount == null || dimCount == 0) {
+                jdbcTemplate.execute("INSERT INTO energy_dimension (code, name, icon, element, sort_order, status) VALUES " +
+                    "('mind', ', '�𤣳', ', 4, 1), " +
+                    "('body', ', '��', ', 5, 1), " +
+                    "('wisdom', ', '�䈑�', ', 1, 1), " +
+                    "('action', ', '�鈡', ', 3, 1), " +
+                    "('wealth', ', '�佂', ', 2, 1)");
+                log.info("�賡�蝏游漲蝘滚��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𤥁��讐輕摨衣�摮鞉㺭�桀仃韐� {}", e.getMessage());
+        }
+
+        // 銝箏歇�匧�����仿�霈斗�靘钅�蝵殷�銝窰roduct.domain銝��湛�
+        try {
+            Integer productConfigCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM energy_source_config WHERE source_type = 'product'", Integer.class);
+            if (productConfigCount == null || productConfigCount == 0) {
+                String[][] domainMapping = {
+                    {"action", "action"}, {"mind", "mind"}, {"body", "body"},
+                    {"wisdom", "wisdom"}, {"wealth", "wealth"}
+                };
+                for (String[] mapping : domainMapping) {
+                    jdbcTemplate.execute(
+                        "INSERT INTO energy_source_config (source_type, source_id, source_name, dimension_id, ratio) " +
+                        "SELECT 'product', p.id, p.name, d.id, 10000 " +
+                        "FROM products p " +
+                        "JOIN energy_dimension d ON d.code = '" + mapping[1] + "' " +
+                        "WHERE p.domain = '" + mapping[0] + "' " +
+                        "AND NOT EXISTS (" +
+                        "  SELECT 1 FROM energy_source_config esc " +
+                        "  WHERE esc.source_type = 'product' AND esc.source_id = p.id" +
+                        ")"
+                    );
+                }
+                log.info("撌脫�����賡�瘥𥪯��滨蔭撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��硋�����𤩺�靘钅�蝵桀仃韐� {}", e.getMessage());
+        }
+
+        // ====== 蝎曉��亙� P0: health_report_survey ======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_report_survey (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                "survey_data JSON COMMENT '靚���桀㭘蝏𤘪�JSON', " +
+                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆�� pending/completed', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_report (report_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙�靚���桀㭘'");
+            log.info("撌脣�撱榴ealth_report_survey );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 health_report_survey 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 蝎曉��亙� P0: health_gut_flora + health_disease_risk ======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_gut_flora (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
+                "bacteria_name VARCHAR(100) NOT NULL COMMENT '�𣬚��滨妍', " +
+                "bacteria_value VARCHAR(50) COMMENT '�𣬚�銝啣漲, " +
+                "normal_range VARCHAR(100) COMMENT '甇�虜��凒', " +
+                "status VARCHAR(20) COMMENT '�嗆�� 甇�虜/�譍�/�誯�', " +
+                "category VARCHAR(50) COMMENT '��掩: �厩��匧拿銝剜�扯�', " +
+                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_report (report_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�𣬚黎璉�瘚衤�憿寞㺭��");
+            log.info("撌脣�撱榴ealth_gut_flora );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 health_gut_flora 銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_disease_risk (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
+                "disease_name VARCHAR(100) NOT NULL COMMENT '�曄��滨妍', " +
+                "risk_value VARCHAR(50) COMMENT '憌𡡞埯0-1)', " +
+                "risk_level VARCHAR(20) COMMENT '憌𡡞埯蝑厩漣: 擃㗛���瘜冽�/雿𡡞�, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_report (report_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�曄�憌𡡞埯霂�摯�唳旿'");
+            log.info("撌脣�撱榴ealth_disease_risk );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 health_disease_risk 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: health_reports 銵冽溶�䭾鰵摮埈挾 ======
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN balance_score INT DEFAULT NULL COMMENT '�𣬚黎撟唾﹛");
+            log.info("撌脫溶��alance_score�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN diversity_score INT DEFAULT NULL COMMENT '�𣬚黎憭𡁏甅�批�'");
+            log.info("撌脫溶�賷iversity_score�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN beneficial_score INT DEFAULT NULL COMMENT '�厩��諹�");
+            log.info("撌脫溶��eneficial_score�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN harmful_score INT DEFAULT NULL COMMENT '�匧拿�諹�");
+            log.info("撌脫溶�㗖armful_score�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN core_genus_score INT DEFAULT NULL COMMENT '�詨����霂��'");
+            log.info("撌脫溶�蠏ore_genus_score�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏: health_reports 銵冽溶�䭾𥁒�羓��瑕�憪枏�摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN report_number VARCHAR(50) DEFAULT NULL COMMENT '�亙�蝻硋噡'");
+            log.info("撌脫溶��eport_number�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports ADD COLUMN person_name VARCHAR(50) DEFAULT NULL COMMENT '鋡急�瘚衤犖憪枏�'");
+            log.info("撌脫溶�麖erson_name�堒�health_reports);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // ====== 餈�宏: health_gut_flora 銵冽溶�䭾鰵摮埈挾 ======
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN population_level VARCHAR(50) DEFAULT NULL COMMENT '憭��鈭箇黎%瘞游像'");
+            log.info("撌脫溶�麖opulation_level�堒�health_gut_flora);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN detection_rate VARCHAR(50) DEFAULT NULL COMMENT '%甇�虜鈭箸�璉���");
+            log.info("撌脫溶�賷etection_rate�堒�health_gut_flora);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN description TEXT DEFAULT NULL COMMENT '�𣬚�霂湔�'");
+            log.info("撌脫溶�賷escription�堒�health_gut_flora);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_gut_flora ADD COLUMN `level` VARCHAR(20) DEFAULT 'GENUS' COMMENT '蝥批�: GENUS/SPECIES'");
+            log.info("撌脫溶�饊evel�堒�health_gut_flora);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // ====== 餈�宏: guides 銵函�銝� ======
+
+        // 餈�宏: guides 瘛餃� type 摮埈挾嚗�躹����∪�蝐餃�
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN type VARCHAR(32) DEFAULT 'teacher' COMMENT '�滚𦛚��掩 teacher/planner/activity_provider/product_supplier'");
+            log.info("撌脫溶�慯ype�堒�guides);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏: guides 瘛餃� teachers ��僎摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN teacher_no VARCHAR(20) COMMENT '�滚𦛚���");
+            log.info("撌脫溶�慯eacher_no�堒�guides);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN title VARCHAR(50) COMMENT '�𣬚妍/蝘啣噡'");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN specialty VARCHAR(200) COMMENT '銝㯄鵭憸��'");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN bio TEXT COMMENT '蝞�");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN experience_years TINYINT DEFAULT 0 COMMENT '隞𦒘�撟湧�'");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN rating INT DEFAULT 500 COMMENT '霂��(�曉�500=5.00)'");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN total_appointments INT DEFAULT 0 COMMENT '�餅��⊥活");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN street_id BIGINT COMMENT '銵烾�ID'");
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN province VARCHAR(50) COMMENT '��遢'");
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN city VARCHAR(50) COMMENT '�𤾸�'");
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN district VARCHAR(50) COMMENT '�箏礶'");
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN street VARCHAR(100) COMMENT '銵烾�'");
+            log.info("撌脫溶�惩𧑐��摮埈挾�迷uides);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN verified_at DATETIME COMMENT '摰⊥瓲�朞��園𡢿'");
+        } catch (Exception e) {}
+
+        // 餈�宏: teachers 銵冽㺭�桀�撟嗅� guides嚗ōype='teacher'
+        try {
+            int migrated = jdbcTemplate.update(
+                "INSERT IGNORE INTO guides (user_id, type, teacher_no, title, specialty, bio, experience_years, rating, total_appointments, " +
+                "street_id, province, city, district, street, verified_at, status, level, created_at, updated_at) " +
+                "SELECT t.user_id, 'teacher', t.teacher_no, t.title, t.specialty, t.bio, t.experience_years, t.rating, t.total_appointments, " +
+                "t.street_id, t.province, t.city, t.district, t.street, t.verified_at, " +
+                "CASE WHEN t.status = 'active' THEN 'active' ELSE 'inactive' END, " +
+                "CASE WHEN t.verification_status = 'approved' THEN 'senior' WHEN t.verification_status = 'pending' THEN 'junior' ELSE 'junior' END, " +
+                "t.created_at, t.updated_at " +
+                "FROM teachers t " +
+                "LEFT JOIN guides g ON g.user_id = t.user_id " +
+                "WHERE g.id IS NULL"
+            );
+            if (migrated > 0) {
+                log.info("撌脖� teachers 銵刻�蝘認} �⊥㺭�桀� guides嚗ōype=teacher, migrated);
+            }
+        } catch (Exception e) {
+            log.warn("餈�宏 teachers guides �唳旿憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏: dan_assessment_results 銵冽溶�㰘恕�亦輕摨血�畾蛛�6蝏渲恕�乩�蝟餅�撅𤏪�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'perception_score'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
+                    "ADD COLUMN perception_score INT COMMENT '�毺䰻敺堒�', " +
+                    "ADD COLUMN spatial_score INT COMMENT '蝛粹𡢿�萘輕敺堒�', " +
+                    "ADD COLUMN processing_speed_score INT COMMENT '�惩極�笔漲敺堒�'");
+                log.info("撌脖蛹 dan_assessment_results 銵冽溶�㰘恕�亦輕摨血�畾�);
+            } else {
+                log.info("dan_assessment_results 霈斤䰻蝏游漲摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� dan_assessment_results 霈斤䰻蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏: dan_assessment_results 銵冽溶�𪊲MI 蝏游漲摮埈挾嚗ǒ1.2 敹�惣璅∪��齿�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'emotion_management_score'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
+                    "ADD COLUMN emotion_management_score INT COMMENT '��貌蝞∠�敺堒�(EMI)', " +
+                    "ADD COLUMN empathy_score INT COMMENT '�𣬚�敹��EMI)', " +
+                    "ADD COLUMN social_adaptability_score INT COMMENT '蝷曆����敺堒�(EMI)', " +
+                    "ADD COLUMN self_motivation_score INT COMMENT '�芣�瞈��勗�EMI)'");
+                log.info("撌脖蛹 dan_assessment_results 銵冽溶�𪊲MI 蝏游漲摮埈挾");
+            } else {
+                log.info("dan_assessment_results EMI 蝏游漲摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� dan_assessment_results EMI 蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏: dan_assessment_results 銵冽溶�𪊲MI 敹��摮鞟輕摨血�畾�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'emotion_score'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
+                    "ADD COLUMN emotion_score INT COMMENT '��貌��㺭(0-100)', " +
+                    "ADD COLUMN resilience_score INT COMMENT '敹����0-100)', " +
+                    "ADD COLUMN stress_coping_score INT COMMENT '�见�摨𥪜笆(0-100)', " +
+                    "ADD COLUMN self_awareness_score INT COMMENT '�芣�霈斤䰻(0-100)'");
+                log.info("撌脖蛹 dan_assessment_results 銵冽溶�𪊲MI 敹��摮鞟輕摨血�畾�);
+            } else {
+                log.info("dan_assessment_results EMI 敹��摮鞟輕摨血�畾萄歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� dan_assessment_results EMI 敹��摮鞟輕摨血�畾萄仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: dan_assessment_results 銵冽溶�惩之鈭𥪯犖�潛輕摨血�畾
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'openness_score'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
+                    "ADD COLUMN openness_score INT COMMENT '撘���0-100)', " +
+                    "ADD COLUMN conscientiousness_score INT COMMENT '撠質提0-100)', " +
+                    "ADD COLUMN extraversion_score INT COMMENT '憭硋�0-100)', " +
+                    "ADD COLUMN agreeableness_score INT COMMENT '摰靝犖0-100)', " +
+                    "ADD COLUMN neuroticism_score INT COMMENT '蟡䂿�0-100)', " +
+                    "ADD COLUMN big_five_overall_score INT COMMENT '憭找�鈭箸聢蝏澆�");
+                log.info("撌脖蛹 dan_assessment_results 銵冽溶�惩之鈭𥪯犖�潛輕摨血�畾�);
+            } else {
+                log.info("dan_assessment_results 憭找�鈭箸聢蝏游漲摮埈挾撌脣��剁�頝唾�");
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� dan_assessment_results 憭找�鈭箸聢蝏游漲摮埈挾憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏: users 銵冽溶�惩枂��𧒄颲啣�畾
+        try {
+            jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birth_hour VARCHAR(10) COMMENT '�箇��嗉劓: 摮𣂷�撖�晓颲啣歲��𧊋�喲��䔶漸'");
+            log.info("撌脫溶��irth_hour�堒�users);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 餈�宏: �滚遣 family_member_attributes 銵函����v1.2 敹�惣璅∪�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_member_attributes' AND COLUMN_NAME = 'member_id'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                // �扯”摮睃銁雿������䕘�����斗唂銵券�
+                jdbcTemplate.execute("DROP TABLE IF EXISTS family_member_attributes_old");
+                jdbcTemplate.execute("RENAME TABLE family_member_attributes TO family_member_attributes_old");
+                jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_member_attributes (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "member_id BIGINT NOT NULL COMMENT '摰嗅滬�𣂼�ID嚗Ếhildren銵冽�users銵剁�', " +
+                    "member_type VARCHAR(10) NOT NULL COMMENT '�𣂼�蝐餃�: child/parent', " +
+                    "birth_datetime DATETIME COMMENT '�箇��交�嚗�移蝖桀����嚗𣬚鍂鈭𤾸�摮埈��矋�', " +
+                    "eight_characters JSON COMMENT '�怠��𥟇�JSON', " +
+                    "wuxing_elements JSON COMMENT '鈭磰��毺����JSON', " +
+                    "zodiac VARCHAR(16) COMMENT '�蠘�: rat/ox/tiger/rabbit/dragon/snake/horse/sheep/monkey/rooster/dog/pig', " +
+                    "blood_type VARCHAR(5) COMMENT '銵� A/B/AB/O', " +
+                    "mind_base_score INT DEFAULT 0 COMMENT '敹�輕摨血抅蝖��曉�500=5.00)', " +
+                    "wisdom_base_score INT DEFAULT 0 COMMENT '�箇輕摨血抅蝖��曉�500=5.00)', " +
+                    "behavior_modifier JSON COMMENT '銵䔶蛹靽格迤�惩�JSON', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY uk_member (member_id, member_type)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬�𣂼���予撅墧�扯”'");
+                log.info("撌脤�family_member_attributes 銵剁�v1.2 敹�惣璅∪�);
+            } else {
+                log.info("family_member_attributes 銵典歇v1.2 蝏𤘪�嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("�滚遣 family_member_attributes 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: children 銵冽溶�how_to_family �梹�v1.3 摰嗅滬�𣂼��∴�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'children' AND COLUMN_NAME = 'show_to_family'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE children ADD COLUMN show_to_family TINYINT DEFAULT 1 COMMENT '�臬炏撖孵振摨剜��睃虾 1= 0=");
+                log.info("撌脖蛹 children 銵冽溶�坟how_to_family );
+            } else {
+                log.info("children show_to_family �堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� children show_to_family �堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: users 銵冽溶�how_to_family �梹�v1.3 摰嗅滬�𣂼��∴�
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'show_to_family'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE users ADD COLUMN show_to_family TINYINT DEFAULT 1 COMMENT '�臬炏撖孵振摨剜��睃虾 1= 0=");
+                log.info("撌脖蛹 users 銵冽溶�坟how_to_family );
+            } else {
+                log.info("users show_to_family �堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� users show_to_family �堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: tasks 銵冽溶�霡amily_member_id �梹�FamilyMember 餈�宏
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'family_member_id'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN family_member_id BIGINT COMMENT '摰嗅滬�𣂼�ID嚗��family_members.id");
+                log.info("撌脖蛹 tasks 銵冽溶�霡amily_member_id );
+            } else {
+                log.info("tasks family_member_id �堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� tasks family_member_id �堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: family_members 銵冽溶��ole_override �梹�FamilyMember 餈�宏
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = 'role_override'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN role_override VARCHAR(20) DEFAULT 'auto' COMMENT '閫坿𠧧閬��: auto/parent/child/elderly嚗𣬚征=auto'");
+                log.info("撌脖蛹 family_members 銵冽溶��ole_override );
+            } else {
+                log.info("family_members role_override �堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� family_members role_override �堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: family_members 銵冽溶�犲d_card �梹�摮拙�頨思遢霂�噡
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = 'id_card'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN id_card VARCHAR(18) DEFAULT NULL COMMENT '頨思遢霂�噡(摮拙�)'");
+                log.info("撌脖蛹 family_members 銵冽溶�犲d_card );
+            } else {
+                log.info("family_members id_card �堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�� family_members id_card �堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: family_members 銵冽溶�惩酋摮𣂷�撅𧼮�畾蛛��鰕hildren銵典�撟塚�
+        String[][] childColumns = {
+            {"penalty_enabled", "TINYINT DEFAULT 1 COMMENT '�臬炏���蝘臬�(0'"},
+            {"theme",           "VARCHAR(32) DEFAULT 'default' COMMENT '銝駁�'"},
+            {"system_points",   "INT DEFAULT 0 COMMENT '蝟餌�蝘臬�(撟脤�/撟喳蝱憟硋�)'"},
+            {"streak_days",     "INT DEFAULT 0 COMMENT '餈䂿賒�枏㨃憭拇㺭'"},
+            {"last_task_date",  "DATE COMMENT '銝𦠜活隞餃𦛚�交�'"},
+            {"focus_max_daily", "TINYINT DEFAULT 3 COMMENT '瘥𤩺𠯫銝𤘪釣銝𢠃�'"},
+            {"focus_remaining","TINYINT DEFAULT 3 COMMENT '隞𦠜𠯫�拐�銝𤘪釣甈⊥㺭'"},
+            {"focus_reset_date","DATE COMMENT '銝𤘪釣甈⊥㺭�滨蔭�交�'"}
+        };
+        for (String[] col : childColumns) {
+            try {
+                Integer colExists = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'family_members' AND COLUMN_NAME = ?",
+                    Integer.class, col[0]);
+                if (colExists == null || colExists == 0) {
+                    jdbcTemplate.execute("ALTER TABLE family_members ADD COLUMN " + col[0] + " " + col[1]);
+                    log.info("撌脖蛹 family_members 銵冽溶�𣏵} , col[0]);
+                }
+            } catch (Exception e) {
+                log.warn("璉��交溶�� family_members {} �堒仃韐� {}", col[0], e.getMessage());
+            }
+        }
+
+        // �喟頂蝐餃�銵冽溶�賷efault_role �梹�閫坿𠧧璅⊥踎
+        ensureColumn("relationship_types", "default_role", "VARCHAR(20) DEFAULT NULL COMMENT '暺䁅恕閫坿𠧧璅⊥踎: parent/child'");
+
+        // 摰嗅滬�𣂼�銵冽溶��ole_override �梹��踵揢capability_role
+        ensureColumn("family_members", "role_override", "VARCHAR(20) DEFAULT 'auto' COMMENT '閫坿𠧧閬��: auto/parent/child/elderly'");
+        try {
+            jdbcTemplate.execute("ALTER TABLE family_members DROP COLUMN capability_role");
+            log.info("撌脣�family_members.capability_role �批�嚗�歇role_override �蹂誨");
+        } catch (Exception e) {
+            // �𦯀�摮睃銁�硋歇�𣳇膄嚗�蕭�仿�霂
+        }
+
+        // activities 銵冽溶�䭾𥁒蝑曉��詨�摮埈挾
+        ensureColumn("activities", "require_registration", "TINYINT DEFAULT 1 COMMENT '�臬炏��閬�𥁒 1=�� 0=�湔𦻖���'");
+        ensureColumn("activities", "require_checkin_review", "TINYINT DEFAULT 1 COMMENT '�枏㨃�臬炏��閬�恣 1=�� 0=�湔𦻖�朞�'");
+        ensureColumn("activities", "energy_penalty_unregistered", "INT DEFAULT 5 COMMENT '�芣𥁒�齿��∠�銵諹��𤩺緍��");
+
+        // family_members 銵冽溶�惩�蝟餉����畾
+        ensureColumn("family_members", "trust_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '靽∩遙0-100'");
+        ensureColumn("family_members", "intimacy_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '鈭脣�0-100'");
+        ensureColumn("family_members", "communication_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '瘝罸�朞捶0-100'");
+        ensureColumn("family_members", "last_interaction_at", "DATETIME COMMENT '��餈睲��冽𧒄");
+
+        // �𥕦遣韐剔�頧西”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cart (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "product_id BIGINT NOT NULL COMMENT '���ID', " +
+                "quantity INT NOT NULL DEFAULT 1 COMMENT '�圈�', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_user_product (user_id, product_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐剔�");
+            log.info("撌脣�撱構art );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 cart 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== DanShop �萄�璅∪�撱箄” ======
+        // 1. danshop_categories (�����掩
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_categories (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "parent_id BIGINT DEFAULT NULL COMMENT '�嗅�蝐膏D嚗ěull=銝�蝥改�', " +
+                "name VARCHAR(64) NOT NULL COMMENT '��掩�滨妍', " +
+                "image VARCHAR(512) DEFAULT NULL COMMENT '��掩�暹�URL', " +
+                "sort_order INT DEFAULT 0 COMMENT '�鍦�嚗��撠讛��惩�, " +
+                "energy_dimension_id BIGINT DEFAULT NULL COMMENT '�唾�鈭𠉛輕蝏游漲ID', " +
+                "status INT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_parent (parent_id), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����掩");
+            log.info("撌脣�撱榛anshop_categories );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_categories 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 2. danshop_products (���
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_products (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "category_id BIGINT NOT NULL COMMENT '��撅𧼮�蝐膏D', " +
+                "name VARCHAR(128) NOT NULL COMMENT '����滨妍', " +
+                "description TEXT COMMENT '���霂衣��讛膩', " +
+                "cover_image VARCHAR(512) COMMENT '撠�𢒰�銳RL', " +
+                "images TEXT COMMENT '憭𡁜㦛(JSON�啁�)', " +
+                "price INT NOT NULL COMMENT '�桐遠(', " +
+                "member_price INT DEFAULT NULL COMMENT '隡𡁜�', " +
+                "cost_price INT DEFAULT NULL COMMENT '�鞉𧋦', " +
+                "stock INT DEFAULT 0 COMMENT '摨枏��圈�', " +
+                "sales_count INT DEFAULT 0 COMMENT '��, " +
+                "product_type VARCHAR(32) NOT NULL COMMENT '蝐餃�: physical/virtual/coupon/course', " +
+                "vendor_id BIGINT DEFAULT NULL COMMENT '靘𥕦���D', " +
+                "vendor_name VARCHAR(64) COMMENT '靘𥕦����, " +
+                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/approved/rejected/on_shelf/off_shelf', " +
+                "reject_reason VARCHAR(255) DEFAULT NULL COMMENT '摰⊥瓲�垍��笔�', " +
+                "profit_rate INT DEFAULT 0 COMMENT '撟喳蝱�拇隋bps,100=1%)', " +
+                "external_source VARCHAR(32) COMMENT '憭㚚�����交�', " +
+                "external_id VARCHAR(64) COMMENT '憭㚚����ID', " +
+                "external_data TEXT COMMENT '憭㚚����摰峕㟲�唳旿(JSON)', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_category (category_id), " +
+                "INDEX idx_vendor (vendor_id), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���");
+            log.info("撌脣�撱榛anshop_products );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_products 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 3. danshop_orders (銝餉恥�閗”)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_orders (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '霈W�DS+�園𡢿6雿漤�', " +
+                "buyer_id BIGINT NOT NULL COMMENT '銋啣振ID', " +
+                "family_id BIGINT DEFAULT NULL COMMENT '摰嗅滬ID', " +
+                "total_amount INT NOT NULL COMMENT '霈W��駁�', " +
+                "discount_amount INT DEFAULT 0 COMMENT '隡䀹��煾�(', " +
+                "actual_amount INT NOT NULL COMMENT '摰硺��煾�(', " +
+                "status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/shipped/completed/refunding/refunded/cancelled', " +
+                "payment_method VARCHAR(16) DEFAULT 'wechat' COMMENT 'wechat/alipay', " +
+                "transaction_id VARCHAR(64) DEFAULT NULL COMMENT '敺桐縑/�臭�摰苷漱�枏噡', " +
+                "paid_at DATETIME DEFAULT NULL COMMENT '�臭��園𡢿', " +
+                "shipped_at DATETIME DEFAULT NULL COMMENT '�𤏸揮�園𡢿', " +
+                "completed_at DATETIME DEFAULT NULL COMMENT '摰峕��園𡢿', " +
+                "remark VARCHAR(255) DEFAULT NULL COMMENT '銋啣振憭�釣', " +
+                "cancel_reason VARCHAR(255) DEFAULT NULL COMMENT '�𡝗��笔�', " +
+                "receiver_name VARCHAR(32) DEFAULT NULL COMMENT '�嗡辣鈭箏�, " +
+                "receiver_phone VARCHAR(16) DEFAULT NULL COMMENT '�嗡辣鈭箇㩞, " +
+                "receiver_address VARCHAR(256) DEFAULT NULL COMMENT '�嗡辣鈭箏𧑐��', " +
+                "freight INT DEFAULT 0 COMMENT '餈鞱晶(', " +
+                "profit_amount INT DEFAULT 0 COMMENT '��隋�煾�(', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_buyer (buyer_id), " +
+                "INDEX idx_family (family_id), " +
+                "INDEX idx_status (status), " +
+                "INDEX idx_order_no (order_no)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='銝餉恥�閗”'");
+            log.info("撌脣�撱榛anshop_orders );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_orders 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 4. danshop_order_items (霈W��𡒊�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_order_items (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_id BIGINT NOT NULL COMMENT '��撅噼恥�𣗏D', " +
+                "product_id BIGINT NOT NULL COMMENT '���ID', " +
+                "product_name VARCHAR(128) NOT NULL COMMENT '����滨妍(敹怎�)', " +
+                "cover_image VARCHAR(512) COMMENT '撠�𢒰敹怎�)', " +
+                "unit_price INT NOT NULL COMMENT '�蓥遠(敹怎�)', " +
+                "price INT NOT NULL COMMENT '�蓥遠(�怠��澆捆)', " +
+                "quantity INT NOT NULL DEFAULT 1 COMMENT '韐凋僭�圈�', " +
+                "subtotal INT NOT NULL COMMENT '撠讛恣(', " +
+                "product_type VARCHAR(32) COMMENT '���蝐餃�(敹怎�)', " +
+                "vendor_id BIGINT COMMENT '靘𥕦���D(敹怎�)', " +
+                "vendor_name VARCHAR(64) COMMENT '靘𥕦����敹怎�)', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_order (order_id), " +
+                "INDEX idx_product (product_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霈W��𡒊�");
+            log.info("撌脣�撱榛anshop_order_items );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_order_items 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 5. danshop_order_logs (霈W��滢��亙�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_order_logs (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "action VARCHAR(32) NOT NULL COMMENT '�滢�: create/pay/ship/confirm/refund/cancel', " +
+                "operator_id BIGINT DEFAULT NULL COMMENT '�滢�鈭截D', " +
+                "operator_type VARCHAR(16) DEFAULT NULL COMMENT 'buyer/vendor/admin/system', " +
+                "detail TEXT DEFAULT NULL COMMENT '�滢�霂行�(JSON)', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_order (order_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='霈W��滢��亙�");
+            log.info("撌脣�撱榛anshop_order_logs );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_order_logs 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 6. danshop_logistics (�拇�靽⊥�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_logistics (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "order_item_id BIGINT DEFAULT NULL COMMENT '霈W��𡒊�ID', " +
+                "logistics_no VARCHAR(64) NOT NULL COMMENT '�拇��訫噡', " +
+                "logistics_company VARCHAR(32) NOT NULL COMMENT '�拇��砍虬蝻𣇉�: sf/yto/zt/sto/yd/ttkd', " +
+                "logistics_name VARCHAR(32) DEFAULT NULL COMMENT '�拇��砍虬�滨妍', " +
+                "sender_name VARCHAR(32) DEFAULT NULL COMMENT '�𤏸揮鈭箏�, " +
+                "sender_phone VARCHAR(16) DEFAULT NULL COMMENT '�𤏸揮鈭箇㩞, " +
+                "sender_address VARCHAR(256) DEFAULT NULL COMMENT '�𤏸揮鈭箏𧑐��', " +
+                "receiver_name VARCHAR(32) NOT NULL COMMENT '�嗡辣鈭箏�, " +
+                "receiver_phone VARCHAR(16) NOT NULL COMMENT '�嗡辣鈭箇㩞, " +
+                "receiver_address VARCHAR(256) NOT NULL COMMENT '�嗡辣鈭箏𧑐��', " +
+                "status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/shipped/signing/completed', " +
+                "tracking_data TEXT DEFAULT NULL COMMENT '�拇�頧刻蕨(JSON�啁�)', " +
+                "shipped_at DATETIME DEFAULT NULL COMMENT '�𤏸揮�園𡢿', " +
+                "signed_at DATETIME DEFAULT NULL COMMENT '蝑暹𤣰�園𡢿', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_order (order_id), " +
+                "INDEX idx_logistics_no (logistics_no), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�拇�靽⊥�");
+            log.info("撌脣�撱榛anshop_logistics );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_logistics 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 7. danshop_profit_rules (��隋閫���滨蔭
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_profit_rules (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "rule_name VARCHAR(64) NOT NULL COMMENT '閫���滨妍', " +
+                "rule_type VARCHAR(32) NOT NULL COMMENT '閫��蝐餃�: product_category/vendor_level/global', " +
+                "target_id BIGINT DEFAULT NULL COMMENT '�唾��格�ID', " +
+                "platform_profit_rate INT NOT NULL COMMENT '撟喳蝱�拇隋bps,100=1%)', " +
+                "referrer_l1_rate INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箏�瘨行�bps,�惩⏚)', " +
+                "referrer_l2_rate INT DEFAULT 0 COMMENT '�湔𦻖�刻�鈭箏�瘨行�bps,�惩⏚)', " +
+                "platform_service_rate INT DEFAULT 0 COMMENT '撟喳蝱�滚𦛚韐寧�(bps,�㰘恥�閖�)', " +
+                "is_active INT DEFAULT 1 COMMENT '1�舐鍂/0蝳�鍂', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_type (rule_type, target_id), " +
+                "INDEX idx_active (is_active)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��隋閫���滨蔭");
+            log.info("撌脣�撱榛anshop_profit_rules );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_profit_rules 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 8. danshop_profit_logs (��隋瘚�偌
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_profit_logs (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "order_no VARCHAR(32) NOT NULL COMMENT '霈W�, " +
+                "order_amount INT NOT NULL COMMENT '霈W�摰硺��煾�(', " +
+                "cost_amount INT DEFAULT 0 COMMENT '�鞉𧋦�煾�(', " +
+                "profit_amount INT NOT NULL COMMENT '�拇隋�煾�(', " +
+                "platform_retained INT NOT NULL COMMENT '撟喳蝱�坔��煾�(', " +
+                "vendor_income INT NOT NULL COMMENT '靘𥕦�����園�', " +
+                "commission_l1 INT DEFAULT 0 COMMENT 'L1�刻�鈭箔膛', " +
+                "commission_l2 INT DEFAULT 0 COMMENT 'L2�刻�鈭箔膛', " +
+                "rule_id BIGINT DEFAULT NULL COMMENT '雿輻鍂���瘨西��窼D', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_order (order_id), " +
+                "INDEX idx_order_no (order_no)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��隋瘚�偌");
+            log.info("撌脣�撱榛anshop_profit_logs );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_profit_logs 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 9. danshop_favorites (����嗉�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_favorites (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "product_id BIGINT NOT NULL COMMENT '���ID', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "UNIQUE INDEX idx_user_product (user_id, product_id), " +
+                "INDEX idx_user (user_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='����嗉�");
+            log.info("撌脣�撱榛anshop_favorites );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_favorites 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 10. danshop_addresses (�嗉揮�啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS danshop_addresses (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "receiver_name VARCHAR(32) NOT NULL COMMENT '�嗉揮鈭箏�, " +
+                "phone VARCHAR(16) NOT NULL COMMENT '�嗉揮鈭箇㩞, " +
+                "province VARCHAR(32) NOT NULL COMMENT '��遢', " +
+                "city VARCHAR(32) NOT NULL COMMENT '�𤾸�', " +
+                "district VARCHAR(32) NOT NULL COMMENT '�箏礶', " +
+                "street VARCHAR(256) NOT NULL COMMENT '霂衣��啣�', " +
+                "is_default INT DEFAULT 0 COMMENT '�臬炏暺䁅恕�啣� 1=0=, " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_user (user_id), " +
+                "INDEX idx_user_default (user_id, is_default)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮�啣�");
+            log.info("撌脣�撱榛anshop_addresses );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 danshop_addresses 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: activities銵冽溶�戹isible_scope======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'visible_scope'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visible_scope VARCHAR(20) DEFAULT NULL COMMENT '�航���凒: family(摰嗅滬)/role(閫坿𠧧)/user(�冽�)' AFTER visibility");
+                log.info("撌脫溶�戹isible_scope�堒�activities);
+            } else {
+                log.info("activities銵肖isible_scope�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵ctivities銵肖isible_scope�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: articles銵冽溶�蟵rticle_type======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'article_type'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN article_type VARCHAR(20) DEFAULT 'normal' COMMENT '���蝐餃�: normal(��/premium(隡䁅捶)/original(�笔�)' AFTER read_time");
+                log.info("撌脫溶�蟵rticle_type�堒�articles);
+            } else {
+                log.info("articles銵災rticle_type�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵rticles銵災rticle_type�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: articles銵冽溶�拎ord_count======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'word_count'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE articles ADD COLUMN word_count INT DEFAULT 0 COMMENT '���摮埈㺭' AFTER article_type");
+                log.info("撌脫溶�拎ord_count�堒�articles);
+            } else {
+                log.info("articles銵肓ord_count�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵rticles銵肓ord_count�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: article_reading_records銵冽溶�慯ask_id======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'article_reading_records' AND COLUMN_NAME = 'task_id'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE article_reading_records ADD COLUMN task_id BIGINT DEFAULT NULL COMMENT '�唾���遙�!D' AFTER duration_seconds");
+                log.info("撌脫溶�慯ask_id�堒�article_reading_records);
+            } else {
+                log.info("article_reading_records銵系ask_id�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵rticle_reading_records銵系ask_id�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: tasks銵冽溶�坟ource_type======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'source_type'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN source_type VARCHAR(20) DEFAULT NULL COMMENT '�交�蝐餃�: article/activity/manual' AFTER minigame_code");
+                log.info("撌脫溶�坟ource_type�堒�tasks);
+            } else {
+                log.info("tasks銵究ource_type�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�慯asks銵究ource_type�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: tasks銵冽溶�坟ource_id======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tasks' AND COLUMN_NAME = 'source_id'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE tasks ADD COLUMN source_id BIGINT DEFAULT NULL COMMENT '�交�ID' AFTER source_type");
+                log.info("撌脫溶�坟ource_id�堒�tasks);
+            } else {
+                log.info("tasks銵究ource_id�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�慯asks銵究ource_id�堒仃韐� {}", e.getMessage());
+        }
+
+        // ====== 餈�宏: activities銵冽溶�蠏heckin_points======
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'checkin_points'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN checkin_points INT DEFAULT 0 COMMENT '蝑曉�蝘臬�(0=雿輻鍂蝟餌�暺䁅恕)' AFTER price");
+                log.info("撌脫溶�蠏heckin_points�堒�activities);
+            } else {
+                log.info("activities銵牢heckin_points�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵ctivities銵牢heckin_points�堒仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: �𥕦遣family_invitations銵剁�摰嗅滬��霂瑚誘�䕘�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_invitations (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
+                    "token VARCHAR(64) NOT NULL UNIQUE COMMENT '��霂瑚誘UUID)', " +
+                    "created_by BIGINT NOT NULL COMMENT '�𥕦遣鈭箇鍂�弒D', " +
+                    "status VARCHAR(16) DEFAULT 'active' COMMENT '�嗆�� active/used/expired/revoked', " +
+                    "expires_at DATETIME COMMENT '餈���園𡢿', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_token (token), " +
+                    "INDEX idx_status (status)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬��霂瑚誘");
+            log.info("撌脣�撱榻amily_invitations);
+        } catch (Exception e) {
+            log.warn("�𥕦遣family_invitations銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== P0 �亙� nutrition_indicator_mapping ======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_indicator_mapping (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "indicator_name_pattern VARCHAR(200) NOT NULL COMMENT '����滚龪�齿芋SQL LIKE霂剜�,%銝粹�𡁻�'," +
+                "nutrient VARCHAR(50) NOT NULL COMMENT '�唾��亙�蝝惩�'," +
+                "severity_weight DECIMAL(3,2) DEFAULT 1.00 COMMENT '���(0-1)'," +
+                "deficiency_symptoms TEXT COMMENT '蝻箔���𠶖�讛膩'," +
+                "excess_symptoms TEXT COMMENT '餈����𠶖�讛膩'," +
+                "food_suggestions TEXT COMMENT '�刻�憌毺�(�堒噡���)'," +
+                "sort_order INT DEFAULT 0 COMMENT '�鍦�(憭批�潔���龪'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
+                "INDEX idx_nutrient (nutrient)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���-�亙�蝝䭾�撠�”'");
+            log.info("撌脣�撱槃utrition_indicator_mapping );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 nutrition_indicator_mapping 銵典仃韐� {}", e.getMessage());
+        }
+
+        // P0 �亙� nutrition_deficiency_record
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_deficiency_record (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID'," +
+                "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID'," +
+                "nutrient VARCHAR(50) NOT NULL COMMENT '�亙�蝝惩�'," +
+                "deficiency_type VARCHAR(20) NOT NULL COMMENT 'deficiency/excess/borderline/unclassified'," +
+                "severity DECIMAL(5,2) DEFAULT 0 COMMENT '銝仿�蝔见漲(0-1)'," +
+                "indicator_name VARCHAR(100) COMMENT '�唾����," +
+                "indicator_value VARCHAR(50) COMMENT '���璉�瘚�," +
+                "ref_range VARCHAR(100) COMMENT '�����," +
+                "symptoms TEXT COMMENT '��𠶖�讛膩'," +
+                "food_suggestions TEXT COMMENT '�刻�憌毺�'," +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
+                "INDEX idx_child (child_id)," +
+                "INDEX idx_report (report_id)," +
+                "INDEX idx_nutrient (nutrient)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙�蝻箔����霈啣�'");
+            log.info("撌脣�撱槃utrition_deficiency_record );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 nutrition_deficiency_record 銵典仃韐� {}", e.getMessage());
+        }
+
+        // P0 �亙� ���-�亙�蝝䭾�蝘滚��唳旿
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM nutrition_indicator_mapping", Integer.class);
+            if (count == null || count == 0) {
+                String[][] seedData = {
+                    {"���, ", "1.00", "銋誩���𢒰�脰��賬��釣�誩�銝漤�, "����誩虾�賣�隡方�, "�函��肽�,蝥Z�,�㰘�,暺烐銁, "10"},
+                    {"25-蝢笔抅蝏渡�蝝痃", "蝏渡�蝝痃", "1.00", "敶勗��坔𢙺�嗚��爸撉澆�, "蝏渡�蝝痃餈���航稲擃㗛�銵�, "銝㗇��钅�,�𤏸�,撘箏��𥕦扒", "20"},
+                    {"蝏渡�蝝痃", "蝏渡�蝝痃", "1.00", "敶勗��坔𢙺�嗚��爸撉澆��脯����怠�銝钅�", "蝏渡�蝝痃餈���航稲擃㗛�銵�, "銝㗇��钅�,�𤏸�,撘箏��𥕦扒", "15"},
+                    {", ", "0.80", "憌�炬�誯����㭠閫匧�撣詻����怠��滢�", "�諹��誩蔣�漤��豢𤣰", "�∟�,�𥡝�,�㛖����", "10"},
+                    {", ", "0.80", "撉券盲�𤏸�餈毺����朣輸䔮, "擃㗛�銵������蝏梶𨺗", "�𥕦扒,鞊��,�曄铜,�嗪獄, "10"},
+                    {"蝏渡�蝝泎12", "蝏渡�蝝泎12", "1.00", "韐怨����蝏誩��脰�, "銝��砌��栞�, "�𥡝�,曏∟�,�𥕦扒,敼潸�", "10"},
+                    {"蝏渡�蝝蟖", "蝏渡�蝝蟖", "0.60", "�滨𢥫�𥕢��溻���樴�枂銵�", "�寞頂���蝏梶𨺗憌𡡞埯", "�閧繬璈坔�,�㕑�,�埝�", "10"},
+                    {"�質�, "�讠蒾, "0.90", "�𤏸�餈毺�����㕑�, "�曇�韐��", "曏∟�,敼潸�,�𥕦扒,鞊��, "10"},
+                    {"�餉�, "�讠蒾, "0.90", "�亙�銝滩�����怠�銝钅�", "銵�瘨脩�, "曏∟�,敼潸�,�𥕦扒,鞊��, "9"},
+                    {"�喲�蝥斤輕", "�喲�蝥斤輕", "0.50", "靘輻�����栞�蝢文仃韐�, "�寡����靘輯�, "�刻健�祈�,鞊�掩,瘞湔�", "10"},
+                    {"�園�", "�園�", "0.70", "韐怨�����脰�, "銝��砌��栞�, "�㰘�,�函��肽�,鞊�掩,�烐�", "10"},
+                    {"蝏渡�蝝鼦", "蝏渡�蝝鼦", "0.70", "閫���桅���铜�文僕�乓����怠�銝钅�", "憭渡�����𤩺�, "�∟��函��肽�,�㛖�,�㰘�", "10"},
+                    {", ", "0.50", "�滨𢥫�𥕢��溻��睻�嗉��蠘�撘�虜", "�勗�����脰�, "撌渲正�𡁏�,瘚琿�,�𤏸�", "10"},
+                    {", ", "0.40", "�諹��㗇���辺�𣳇䔮, "�寞頂���銵�, "�𡁏�,�刻健瘛梁遛�祈�", "10"},
+                    {"�羓�", "�羓�, "0.60", "�𣳇��𣬚黎憭梯﹛����㚚䔮, "銝��砌��栞�, "�詨扒,瘜∟�,�喳�,摨瑟芦, "10"}
+                };
+                for (String[] row : seedData) {
+                    jdbcTemplate.update("INSERT IGNORE INTO nutrition_indicator_mapping " +
+                        "(indicator_name_pattern, nutrient, severity_weight, deficiency_symptoms, excess_symptoms, food_suggestions, sort_order) " +
+                        "VALUES (?, ?, ?, ?, ?, ?, ?)",
+                        row[0], row[1], new java.math.BigDecimal(row[2]), row[3], row[4], row[5], Integer.parseInt(row[6]));
+                }
+                log.info("nutrition_indicator_mapping 蝘滚��唳旿撌脣�頧�(15");
+            } else {
+                log.info("nutrition_indicator_mapping 蝘滚��唳旿撌脣���({}, 頝唾�", count);
+            }
+        } catch (Exception e) {
+            log.warn("nutrition_indicator_mapping 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // ====== 敹��Phase 1: emotion_checkin ======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS emotion_checkin (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                    "user_id BIGINT NOT NULL COMMENT '�枏㨃鈭箇鍂�弒D', " +
+                    "emotion_type INT NOT NULL COMMENT '��貌蝐餃�: 1敹思�/2撟喳�撟喲�/3撟喲�/4�厩�銝滩�5�曉�/6�西�/7���/8�西�/9�鞉�', " +
+                    "emotion_name VARCHAR(20) COMMENT '��貌�滨妍: happy/calm/peaceful/uncomfortable/sad/irritable/angry/anxious/fearful', " +
+                    "energy_level INT NOT NULL DEFAULT 3 COMMENT '�賡��嗆�� 1敺��/23銝剔�/45敺��', " +
+                    "note TEXT COMMENT '�枏㨃憭�釣', " +
+                    "photo_url VARCHAR(500) COMMENT '�抒�URL', " +
+                    "favorite_thing VARCHAR(500) COMMENT '隞𦠜𠯫���𨀣洽���隞嗡�', " +
+                    "points_awarded INT DEFAULT 0 COMMENT '憟硋�蝘臬�', " +
+                    "parent_visible TINYINT DEFAULT 1 COMMENT '摰園鵭�航�: 1�航�/0銝滚虾, " +
+                    "checkin_date DATE NOT NULL COMMENT '�枏㨃�交�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_child_id (child_id), " +
+                    "INDEX idx_user_id (user_id), " +
+                    "INDEX idx_checkin_date (checkin_date), " +
+                    "INDEX idx_child_date (child_id, checkin_date)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��貌�枏㨃");
+            log.info("撌脣�撱榷motion_checkin ��貌�枏㨃);
+        } catch (Exception e) {
+            log.warn("�𥕦遣 emotion_checkin 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 1a-2: DAN Schema 靽桀� ======
+        // v1.2 EMI 敹��摮鞟輕
+        String[] danEmiFields = {"emotion_score", "resilience_score", "stress_coping_score", "self_awareness_score"};
+        for (String field : danEmiFields) {
+            try {
+                Integer exists = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
+                    Integer.class, field);
+                if (exists == null || exists == 0) {
+                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT 'EMI摮鞟輕0-100'");
+                    log.info("撌脫溶�𣏵} �堒� dan_assessment_results , field);
+                }
+            } catch (Exception e) {
+                log.warn("璉��交溶�� {} �堒仃韐� {}", field, e.getMessage());
+            }
+        }
+        // 憭找�鈭箸聢蝏游漲
+        String[] danBigFiveFields = {"openness_score", "conscientiousness_score", "extraversion_score", "agreeableness_score", "neuroticism_score", "big_five_overall_score"};
+        for (String field : danBigFiveFields) {
+            try {
+                Integer exists = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
+                    Integer.class, field);
+                if (exists == null || exists == 0) {
+                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT '憭找�鈭箸聢 0-100'");
+                    log.info("撌脫溶�𣏵} �堒� dan_assessment_results , field);
+                }
+            } catch (Exception e) {
+                log.warn("璉��交溶�� {} �堒仃韐� {}", field, e.getMessage());
+            }
+        }
+        // EMI 蝏游漲嚗��蝏芸��啗�隡啣�畾蛛�
+        String[] danEmiDimFields = {"emotion_management_score", "empathy_score", "social_adaptability_score", "self_motivation_score"};
+        for (String field : danEmiDimFields) {
+            try {
+                Integer exists = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = ?",
+                    Integer.class, field);
+                if (exists == null || exists == 0) {
+                    jdbcTemplate.execute("ALTER TABLE dan_assessment_results ADD COLUMN " + field + " INT DEFAULT NULL COMMENT 'EMI蝏游漲 0-100'");
+                    log.info("撌脫溶�𣏵} �堒� dan_assessment_results , field);
+                }
+            } catch (Exception e) {
+                log.warn("璉��交溶�� {} �堒仃韐� {}", field, e.getMessage());
+            }
+        }
+
+        // ====== 1b-1: bazi_reading_template 鈭磰��賜�閫�粉======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS bazi_reading_template (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "element VARCHAR(20) NOT NULL COMMENT '鈭磰�: wood/fire/earth/metal/water', " +
+                    "condition VARCHAR(20) NOT NULL COMMENT '�嗆�� strong/weak/balanced', " +
+                    "personal_trait TEXT COMMENT '�扳聢�寡捶�讛膩', " +
+                    "mind_growth_advice TEXT COMMENT '敹���鞾鵭撱箄悅', " +
+                    "daily_tip_template TEXT COMMENT '瘥𤩺𠯫摰𨅯�璅⊥踎', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY uk_element_condition (element, condition)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鈭磰��賜�閫�粉璅⊥踎'");
+            log.info("撌脣�撱槓azi_reading_template );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 bazi_reading_template 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 1b-1: numsoul_config �笔𦶢�菜㺭�滨蔭======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS numsoul_config (" +
+                    "number INT PRIMARY KEY COMMENT '�菜㺭1-9', " +
+                    "title VARCHAR(50) NOT NULL COMMENT '蝘啣噡', " +
+                    "keywords VARCHAR(200) COMMENT '�扳聢�喲睸, " +
+                    "mind_growth_advice TEXT COMMENT '敹���鞾鵭撱箄悅', " +
+                    "recommended_article_tags VARCHAR(200) COMMENT '�唾������倌', " +
+                    "color_hex VARCHAR(7) COMMENT '隞�” " +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�笔𦶢�菜㺭�滨蔭'");
+            log.info("撌脣�撱槃umsoul_config );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 numsoul_config 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 1b-1: bazi_reading_template 蝘滚��唳旿 ======
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM bazi_reading_template", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.batchUpdate(
+                    "INSERT INTO bazi_reading_template (element, condition, personal_trait, mind_growth_advice, daily_tip_template) VALUES (?, ?, ?, ?, ?)",
+                    java.util.Arrays.asList(new Object[][]{
+                        {"wood", "strong", "�扳聢�𡁻榀���餈𥕦�敹���瑟�憸�紡�𥕦�撘��梶移, "摮虫�����暹𠹭嚗屸��滩��𡁏��矋��孵�撘寞�扳�萘輕", "摰𡏭�銵䔶撓撅閗��剁�敹屸�撘箏漲�脩�"},
+                        {"wood", "weak", "皜拙��厩兮���鈭𤾸�雿頣�雿��蝑𡝗𧒄摰寞��寡惚", "憓𧼮撩�芯縑敹�悌蝏���孵��𨀣鱏�喟��賢�", "摰靝��芰��詨�嚗��餈�漲餈�停隞碶犖"},
+                        {"wood", "balanced", "�扳聢銝剖爾�匧漲嚗峕𠳿�厰榀�批��厩�瘣�, "靽脲��啁𠶖嚗屸����枏�蝷曆漱, "摰𨀣�憭𡝗暑�剁�敹䔶��𣂷�},
+                        {"fire", "strong", "�剜�撘��𨰜���皛⊥暑�𨥈�撖峕�����𥕦��偦�惩�", "瘜冽���貌蝞∠�嚗屸��齿�亥��脣𢆡", "摰𨅯�瘞游�瞈��琿�嚗���湔�雴�},
+                        {"fire", "weak", "����怨�����萘��鳴�撖寡䰾�舀��誯��毺䰻", "���銵刻噢���嚗�畺�餌冗鈭方䌊, "摰𨀣萱�㚚臁隡湛�敹𣬚𡠺憭��},
+                        {"fire", "balanced", "�扳聢皜拇隋�匧漲嚗峕𠳿�厩�������, "靽脲��渲閎�勗末嚗屸��漲�枏�銵刻噢", "摰𨅯�銝𡒊冗鈭斗暑�剁�敹峕�蝏芸�},
+                        {"earth", "strong", "蝔喲��舫����韐�遙敹���臬𣪧�煺葉��葉瘚��, "�踹�餈�漲�踵�嚗�郎隡朞秩'", "摰𣈯���餈𣂼𢆡嚗���肽�餈��"},
+                        {"earth", "weak", "�誩��见�������批撩嚗�捆�㮖�隞碶犖�詨�", "憓𧼮撩銝餉��改��孵��祉��肽���, "摰𨀣𦻖閫行鰵鈭讠�嚗���箏�銝滚�"},
+                        {"earth", "balanced", "�扳��血����鈭讠迅憒伐�鈭粹��喟頂�諹�", "靽脲�摮虫�嚗屸����烐��芣�", "摰靝熔餈𤏸䌊�塚�敹峕𠂔擖格𠂔},
+                        {"metal", "strong", "�誩��𡁜���蕭瘙��蝢𠬍��瑟��栞����銵��", "摮虫��菜暑�㗛�𡄯��踹�餈��銝亥�", "摰𡏭䰾�舫�韏𧶏�敹諹�摨行鸌},
+                        {"metal", "weak", "皜拙�撖∟����鈭𤾸�曉𨯬嚗峕糓�澆�靽∟����, "憓𧼮撩銵刻噢���嚗�畺�餉䌊靽∪�", "摰𨅯𣪧雿𤘪暑�剁�敹諹�摨西䌊�穃�},
+                        {"metal", "balanced", "銝箔犖甇�凒���鈭𧢲�摨佗�銝滢��娪榀銝𤾸�, "靽脲�撘��曉������漲憭𡁜��穃�", "摰𣈯�霂餃郎銋𩤃�敹屸凃�𥡝�},
+                        {"water", "strong", "�箸�瘛望����鈭舘��伐��瑟��箄𠧧瘣𧼮�, "�踹�餈�漲蝻𨅯�嚗屸����暹𠹭敹��", "摰𣈯��𣂼��喉�敹峕�肽�餈�楛"},
+                        {"water", "weak", "�𤩺�蝏������𣬚�敹��撖峕��𥕢�憭抵�", "憓𧼮撩�菜��𨥈��孵���貌��, "摰𨀣萱�𣇉㴓憓��敹��撖鍦�},
+                        {"water", "balanced", "�扳聢�������箏��矋�憭���菜暑敺堒�", "靽脲�憟賢�敹����漲�拙�敶勗�, "摰𨀣虜瘜單部瞉∴�敹峕�蝏芣郭},
+                    })
+                );
+                log.info("bazi_reading_template 蝘滚��唳旿撌脣�頧�(15");
+            }
+        } catch (Exception e) {
+            log.warn("bazi_reading_template 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // ====== 1b-1: numsoul_config 蝘滚��唳旿 ======
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM numsoul_config", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.batchUpdate(
+                    "INSERT INTO numsoul_config (number, title, keywords, mind_growth_advice, recommended_article_tags, color_hex) VALUES (?, ?, ?, ?, ?, ?)",
+                    java.util.Arrays.asList(new Object[][]{
+                        {1, "撘��𥕦遣, "�祉����撖潦����啜��䌊, "�孵��a��譍��讛�嚗屸��滨𡠺�凋�, "憸�紡�芯縑�孵�", "#FF4444"},
+                        {2, "��像, "皜拙����雿栶����麄���𣂼�", "憓𧼮撩�芣�銝餃�嚗屸��滩�摨西����, "鈭粹�鈭文�,��貌銵刻噢", "#FF8C00"},
+                        {3, "銵刻噢, "�𥟇���冗鈭扎���閫���”, "靽脲�銝𤘪釣嚗屸��齿�撠肽�, "�偦�惩�,蝷曆漱�賢�", "#FFD700"},
+                        {4, "撱箄挽, "�∪���迅摰𠾼���摨譌��𠹻, "摮虫��㗛�𡄯��踹�餈���箸�", "銝𤘪釣摮虫�銋䭾�", "#4CAF50"},
+                        {5, "�芰眏, "�㘾埯����硔��末憟����, "�孵�����𨥈��踹�蝻箔��鍦�", "�Y揣蝎曄�,����賢�", "#2196F3"},
+                        {6, "�單��, "韐�遙����晞����柴��像, "摮虫��芣��喟�嚗屸��滩�摨虫�, "摰嗅滬�喟頂,韐�遙, "#9C27B0"},
+                        {7, "�Y揣, "�箸�����僐����������, "銝𦒘犖��澈閫�圾嚗屸��滩�摨血�, "�萘輕�賢�,摮虫�, "#673AB7"},
+                        {8, "�𣂼停, "�����恣�����蝑硔���, "�單釣��銁�鞾鵭嚗屸��滩�鈭舘蕭瘙���冽�, "�格�蝞∠�,��揣�萘輕", "#3F51B5"},
+                        {9, "�𡁶�, "��捆��惣�扼����胯���, "霈曉�銝芯犖颲寧�嚗屸��滩�摨衣䰾, "鈭粹��喟頂,��貌蝞∠�", "#E91E63"},
+                    })
+                );
+                log.info("numsoul_config 蝘滚��唳旿撌脣�頧�(9");
+            }
+} catch (Exception e) {
+            log.warn("numsoul_config 蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_address (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                    "receiver_name VARCHAR(50) NOT NULL COMMENT '�嗉揮鈭箏�, " +
+                    "phone VARCHAR(20) NOT NULL COMMENT '�嗉揮鈭箇㩞, " +
+                    "province VARCHAR(50) COMMENT '��遢', " +
+                    "city VARCHAR(50) COMMENT '�𤾸�', " +
+                    "district VARCHAR(50) COMMENT '�箏礶', " +
+                    "street VARCHAR(200) COMMENT '霂衣��啣�', " +
+                    "is_default INT DEFAULT 0 COMMENT '�臬炏暺䁅恕 1=0=, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_user_id (user_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮�啣�");
+            log.info("撌脣�撱滾ser_address );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 user_address 銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== 隡𡁜�隞瑟聢雿梶頂 ======
+
+        // 餈�宏: activities銵冽溶�𦅙ember_price
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'member_price'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN member_price INT COMMENT '隡𡁜�' AFTER price");
+                log.info("撌脫溶�𦅙ember_price�堒�activities);
+            } else {
+                log.info("member_price�堒歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵ctivities.member_price憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏: �𥕦遣 member_discount_configs 銵剁���掩蝥批��䀹緍�滨蔭
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS member_discount_configs (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "level_code VARCHAR(20) NOT NULL COMMENT '隡𡁜�蝑厩漣: FAMILY/PROVIDER', " +
+                "target_type VARCHAR(20) NOT NULL COMMENT '�格�蝐餃�: product/activity', " +
+                "target_id BIGINT DEFAULT NULL COMMENT '�格�ID(NULL銵函內��掩蝥批�)', " +
+                "category_id BIGINT DEFAULT NULL COMMENT '蝐餌𤌍ID(��掩蝥批��䀹緍)', " +
+                "discount_percent INT NOT NULL COMMENT '�䀹緍�曉�0銵函內90%)', " +
+                "enabled TINYINT DEFAULT 1 COMMENT '�臬炏�舐鍂', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_level (level_code), " +
+                "INDEX idx_target (target_type, target_id), " +
+                "INDEX idx_category (target_type, category_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隡𡁜��䀹緍�滨蔭'");
+            log.info("撌脣�撱榦ember_discount_configs);
+        } catch (Exception e) {
+            log.warn("�𥕦遣member_discount_configs銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            Integer hasCap = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'relationship_types' AND COLUMN_NAME = 'capability_role'",
+                Integer.class);
+            Integer hasDefault = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'relationship_types' AND COLUMN_NAME = 'default_role'",
+                Integer.class);
+            if (hasCap != null && hasCap == 0) {
+                if (hasDefault != null && hasDefault > 0) {
+                    jdbcTemplate.execute("ALTER TABLE relationship_types CHANGE COLUMN default_role capability_role VARCHAR(20) NOT NULL COMMENT '�賢�閫坿𠧧: parent/child'");
+                    log.info("撌脣�relationship_types.default_role�滚𦶢�滢蛹capability_role");
+                } else {
+                    jdbcTemplate.execute("ALTER TABLE relationship_types ADD COLUMN capability_role VARCHAR(20) NOT NULL DEFAULT 'parent' COMMENT '�賢�閫坿𠧧: parent/child' AFTER type_name");
+                    log.info("撌脫溶�蠏apability_role�堒�relationship_types);
+                }
+            }
+        } catch (Exception e) {
+            log.warn("relationship_types capability_role 餈�宏憭梯揖: {}", e.getMessage());
+        }
+
+        // 蝖桐�capability_role�厰�霈文�潘��煺漣摨栞砲�𡐓OT NULL�𣳇�霈文�潘�撖潸稲INSERT�訶ield doesn't have a default value�躰秤
+        try {
+            jdbcTemplate.execute("ALTER TABLE relationship_types MODIFY COLUMN capability_role VARCHAR(20) NOT NULL DEFAULT 'parent' COMMENT '�賢�閫坿𠧧: parent/child'");
+            log.info("撌脖耨�雹elationship_types.capability_role瘛餃�暺䁅恕parent'");
+        } catch (Exception e) {
+            log.warn("靽格㺿relationship_types.capability_role暺䁅恕�澆仃韐� {}", e.getMessage());
+        }
+
+        // ====== 憌���刻���㺭 Phase: food_recommend_idx / food_recommend_idx_log ======
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `food_recommend_idx` (" +
+                "`id` BIGINT NOT NULL AUTO_INCREMENT, " +
+                "`user_id` BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "`food_id` BIGINT NOT NULL COMMENT '憌��ID', " +
+                "`food_name` VARCHAR(100) COMMENT '憌���滨妍', " +
+                "`index_score` INT NOT NULL DEFAULT 0 COMMENT '�刻���㺭(0-100, �亥䌊�𣬚黎璉�瘚𧢲𥁒', " +
+                "`health_report_id` BIGINT COMMENT '�唾��亙熒�亙�ID', " +
+                "`calculated_at` DATETIME COMMENT '霈∠��園𡢿', " +
+                "`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "PRIMARY KEY (`id`), " +
+                "INDEX `idx_fri_user` (`user_id`), " +
+                "INDEX `idx_fri_food` (`food_id`), " +
+                "UNIQUE KEY `uk_fri_user_food` (`user_id`, `food_id`) " +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='憌���刻���㺭敶枏�");
+            log.info("撌脣�撱箇&霈� food_recommend_idx );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 food_recommend_idx 銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `food_recommend_idx_log` (" +
+                "`id` BIGINT NOT NULL AUTO_INCREMENT, " +
+                "`user_id` BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "`food_id` BIGINT NOT NULL COMMENT '憌��ID', " +
+                "`food_name` VARCHAR(100) COMMENT '憌���滨妍', " +
+                "`previous_index` INT COMMENT '�䀹凒�齿綫�鞉�, " +
+                "`new_index` INT COMMENT '�䀹凒�擧綫�鞉�, " +
+                "`health_report_id` BIGINT COMMENT '閫血����摨瑟𥁒�𠍁D', " +
+                "`change_reason` VARCHAR(200) COMMENT '�䀹凒�笔�', " +
+                "`changed_at` DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "PRIMARY KEY (`id`), " +
+                "INDEX `idx_fril_user` (`user_id`), " +
+                "INDEX `idx_fril_food` (`food_id`) " +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='憌���刻���㺭�䀹凒��蟮�亙�'");
+            log.info("撌脣�撱箇&霈� food_recommend_idx_log );
+        } catch (Exception e) {
+            log.warn("�𥕦遣 food_recommend_idx_log 銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏25: activities銵冽溶�惩恣�貊㮾�喳�畾蛛�瘣餃𢆡撌乩�瘚��敺�恣撽喳�/�穃�
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audit_status VARCHAR(20) DEFAULT NULL COMMENT '摰⊥瓲�嗆���approved/pending/rejected'");
+            log.info("撌脫溶�蟵udit_status�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audit_reason VARCHAR(500) DEFAULT NULL COMMENT '撽喳��笔�'");
+            log.info("撌脫溶�蟵udit_reason�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN auditor_id BIGINT DEFAULT NULL COMMENT '摰⊥瓲鈭截D'");
+            log.info("撌脫溶�蟵uditor_id�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN audited_at DATETIME DEFAULT NULL COMMENT '摰⊥瓲�園𡢿'");
+            log.info("撌脫溶�蟵udited_at�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        log.info("�唳旿摨栞�蝘餃���);
+
+        // ====== �亙熒蝏游漲 Phase 1: health_dimension_score / health_data_source_record / health_norm_reference ======
+        migrateHealthDimensionsTable();
+        seedHealthNorms();
+    }
+
+    private void migrateHealthDimensionsTable() {
+        try {
+            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_dimension_score` TO `health_dimension_score_old`");
+        } catch (Exception e) {
+            log.warn("health_dimension_score rename skipped: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_dimension_scores` (\n" +
+                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
+                "  `member_id` bigint NOT NULL COMMENT '摰嗅滬�𣂼�ID',\n" +
+                "  `dimension` varchar(20) NOT NULL COMMENT '蝏游漲: growth/sleep/vision/immunity/nutrition/gut/exercise',\n" +
+                "  `score` int NOT NULL COMMENT '0-100,\n" +
+                "  `percentile` int DEFAULT NULL COMMENT '鈭箇黎�曉�0-100',\n" +
+                "  `data_source` varchar(20) NOT NULL COMMENT '�唳旿 REPORT/PHOTO/VOICE/MANUAL',\n" +
+                "  `tier` tinyint NOT NULL DEFAULT 3 COMMENT '�唳旿撅�漣: 1�芸𢆡/2霂剝𨺗/3�见𢆡',\n" +
+                "  `raw_data` json DEFAULT NULL COMMENT '�笔��唳旿敹怎�',\n" +
+                "  `assess_date` date NOT NULL COMMENT '霂�摯�交�',\n" +
+                "  `expire_date` date DEFAULT NULL COMMENT '�唳旿餈��,\n" +
+                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
+                "  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" +
+                "  PRIMARY KEY (`id`),\n" +
+                "  UNIQUE KEY `uk_member_dim_date` (`member_id`, `dimension`, `assess_date`)\n" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒蝏游漲霂��");
+        } catch (Exception e) {
+            log.warn("health_dimension_scores 銵典�撱箏仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_data_source_record` TO `health_data_source_record_old`");
+        } catch (Exception e) {
+            log.warn("health_data_source_record rename skipped: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_data_sources` (\n" +
+                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
+                "  `member_id` bigint NOT NULL,\n" +
+                "  `source_type` varchar(20) NOT NULL COMMENT 'PDF/PHOTO/VOICE/MANUAL/WEIXIN_STEP',\n" +
+                "  `dimension_codes` json NOT NULL COMMENT '敶勗���輕摨血�,\n" +
+                "  `parsed_result` json DEFAULT NULL COMMENT '閫��蝏𤘪��券�',\n" +
+                "  `file_url` varchar(500) DEFAULT NULL COMMENT '�笔���辣URL',\n" +
+                "  `confidence` decimal(3,2) DEFAULT NULL COMMENT 'AI閫��蝵桐縑,\n" +
+                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
+                "  PRIMARY KEY (`id`),\n" +
+                "  KEY `idx_member_source` (`member_id`, `source_type`)\n" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒�唳旿皞鞱扇敶閗”'");
+        } catch (Exception e) {
+            log.warn("health_data_sources 銵典�撱箏仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("RENAME TABLE IF EXISTS `health_norm_reference` TO `health_norm_reference_old`");
+        } catch (Exception e) {
+            log.warn("health_norm_reference rename skipped: {}", e.getMessage());
+        }
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_norm_reference` (\n" +
+                "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
+                "  `dimension` varchar(20) NOT NULL COMMENT '蝏游漲',\n" +
+                "  `gender` varchar(10) NOT NULL COMMENT 'male/female/all',\n" +
+                "  `age_min` int NOT NULL COMMENT '撟湧�銝钅�(',\n" +
+                "  `age_max` int NOT NULL COMMENT '撟湧�銝𢠃�(',\n" +
+                "  `percentile_5` int DEFAULT NULL,\n" +
+                "  `percentile_15` int DEFAULT NULL,\n" +
+                "  `percentile_25` int DEFAULT NULL,\n" +
+                "  `percentile_50` int DEFAULT NULL COMMENT '銝凋�,\n" +
+                "  `percentile_75` int DEFAULT NULL,\n" +
+                "  `percentile_85` int DEFAULT NULL,\n" +
+                "  `percentile_95` int DEFAULT NULL,\n" +
+                "  `source` varchar(50) DEFAULT NULL COMMENT '撣豢芋�交�',\n" +
+                "  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\n" +
+                "  PRIMARY KEY (`id`),\n" +
+                "  UNIQUE KEY `uk_dim_gender_age` (`dimension`, `gender`, `age_min`, `age_max`)\n" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒撣豢芋撖寧�");
+        } catch (Exception e) {
+            log.warn("health_norm_reference 銵券�撱箏仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("INSERT IGNORE INTO health_dimension_scores (member_id, dimension, score, data_source, tier, assess_date, created_at)\n" +
+                " SELECT member_id,\n" +
+                "  CASE dimension\n" +
+                "    WHEN 'body' THEN 'growth'\n" +
+                "    WHEN 'fitness' THEN 'exercise'\n" +
+                "    WHEN 'cardio' THEN 'exercise'\n" +
+                "    WHEN 'blood' THEN 'immunity'\n" +
+                "    WHEN 'sleep' THEN 'sleep'\n" +
+                "    WHEN 'psyche' THEN 'growth'\n" +
+                "    WHEN 'diet' THEN 'nutrition'\n" +
+                "    ELSE dimension\n" +
+                "  END,\n" +
+                "  score,\n" +
+                "  UPPER(data_source),\n" +
+                "  3,\n" +
+                "  record_date,\n" +
+                "  NOW()\n" +
+                " FROM health_dimension_score_old WHERE is_latest = 1");
+        } catch (Exception e) {
+            log.warn("�抒輕摨西���㺭�株�蝘餉歲餈� {}", e.getMessage());
+        }
+    }
+
+    private void seedHealthNorms() {
+        try {
+            int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM health_norm_reference", Integer.class);
+            if (count == 0) {
+                jdbcTemplate.execute("INSERT INTO health_norm_reference (dimension, gender, age_min, age_max, percentile_5, percentile_15, percentile_25, percentile_50, percentile_75, percentile_85, percentile_95, source) VALUES\n" +
+                    "('growth', 'male', 72, 84, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('growth', 'female', 72, 84, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('growth', 'male', 84, 96, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('growth', 'female', 84, 96, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('growth', 'male', 96, 120, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('growth', 'female', 96, 120, 25, 35, 45, 55, 70, 80, 90, 'BMI-for-age�垍蓡���'),\n" +
+                    "('sleep', 'all', 0, 12, 40, 50, 60, 70, 80, 88, 95, 'NSF憍游匱�輻辺�罱��曉�),\n" +
+                    "('sleep', 'all', 12, 36, 40, 50, 60, 70, 80, 88, 95, 'NSF撟澆��∠��垍蓡���'),\n" +
+                    "('sleep', 'all', 36, 72, 40, 50, 60, 70, 80, 88, 95, 'NSF摮阡��滨辺�罱��曉�),\n" +
+                    "('sleep', 'all', 72, 156, 40, 50, 60, 70, 80, 88, 95, 'NSF摮阡��輻咱�∠��垍蓡���'),\n" +
+                    "('vision', 'male', 72, 144, 45, 55, 65, 75, 85, 90, 95, '閫���𤏸�����垍蓡���'),\n" +
+                    "('vision', 'female', 72, 144, 45, 55, 65, 75, 85, 90, 95, '閫���𤏸�����垍蓡���'),\n" +
+                    "('immunity', 'all', 0, 72, 15, 30, 45, 65, 80, 90, 95, '撟湔���活�售��曉�),\n" +
+                    "('immunity', 'all', 72, 192, 15, 35, 50, 70, 85, 92, 98, '撟湔���活�售��曉�),\n" +
+                    "('nutrition', 'all', 36, 192, 20, 30, 40, 50, 60, 70, 80, '�喲�憭𡁏甅�把��曉�),\n" +
+                    "('gut', 'all', 0, 192, 40, 50, 60, 70, 80, 85, 95, '�𣬚黎鈭箇黎���(撟喳蝱�芸遣)'),\n" +
+                    "('exercise', 'male', 72, 144, 30, 40, 50, 60, 70, 80, 90, '�賢振摮衣�雿栞捶�亙熒���'),\n" +
+                    "('exercise', 'female', 72, 144, 25, 35, 45, 55, 65, 75, 85, '�賢振摮衣�雿栞捶�亙熒���')");
+                log.info("health_norm_reference 撣豢芋蝘滚��唳旿撌脣�頧�(18 蝏煺�0-100�曉�");
+            } else {
+                log.info("health_norm_reference 撣豢芋�唳旿撌脣���({}, 頝唾�", count);
+            }
+        } catch (Exception e) {
+            log.warn("health_norm_reference 撣豢芋蝘滚��唳旿�嘥��硋仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏: articles銵冽溶�惩恣�詨�雿𡏭��掩�见�畾
+        try {
+            Integer exists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'articles' AND COLUMN_NAME = 'audit_status'",
+                Integer.class);
+            if (exists == null || exists == 0) {
+                jdbcTemplate.execute("ALTER TABLE articles " +
+                    "ADD COLUMN author_type VARCHAR(20) DEFAULT 'admin' COMMENT '雿𡏭��掩�页�admin/parent/child' AFTER created_by, " +
+                    "ADD COLUMN audit_status VARCHAR(20) DEFAULT 'approved' COMMENT '摰⊥瓲�嗆���approved/pending/rejected' AFTER status, " +
+                    "ADD COLUMN audit_reason TEXT COMMENT '撽喳��笔�' AFTER audit_status, " +
+                    "ADD COLUMN auditor_id BIGINT DEFAULT 0 COMMENT '摰⊥瓲ID' AFTER audit_reason, " +
+                    "ADD COLUMN audited_at DATETIME COMMENT '摰⊥瓲�園𡢿' AFTER auditor_id");
+                log.info("撌脫溶�惩恣�詨�雿𡏭��掩�见�畾萄�articles);
+            } else {
+                log.info("articles銵典恣�詨�畾萄歇摮睃銁嚗諹歲餈�);
+            }
+        } catch (Exception e) {
+            log.warn("璉��交溶�蟵rticles銵典恣�詨�畾萄仃韐� {}", e.getMessage());
+        }
+    }
+
+    private void initializeDefaultData() {
+        // �嘥��㚚�霈曉��望芋
+        try {
+            // 璉��交糓�血歇�厰�霈曉�
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM rewards WHERE is_template = 1", Integer.class);
+            
+if (count == null || count == 0) {
+// �鍦�憸�挽憟硋�璅⊥踎嚗Ếhild_id銝摸ULL銵函內璅⊥踎
+jdbcTemplate.execute("INSERT INTO rewards (family_id, child_id, title, points_required, category, is_template) VALUES " +
+"(0, NULL, \'�见𢆡�餌�30���\', 30, \'蝎曄�蝐蓋', 1), " +
+"(0, NULL, \'�拙像�踵虜0���\', 40, \'�寞�蝐蓋', 1), " +
+"(0, NULL, \'�餅虜銋𣂼㦤\', 100, \'�抵捶蝐蓋', 1), " +
+"(0, NULL, \'銋啁焵�愧', 150, \'�抵捶蝐蓋', 1), " +
+"(0, NULL, \'���瘛��\', 20, \'�抵捶蝐蓋', 1), " +
+"(0, NULL, \'�㗇𥋘�𡁻�\', 25, \'�寞�蝐蓋', 1)");
+log.info("憸�挽憟硋�璅⊥踎撌脣�憪见�");
+}
+        } catch (Exception e) {
+            log.warn("�嘥��㚚�霈曉��勗仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��硋��勗�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM reward_categories WHERE family_id = 0", Integer.class);
+            
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO reward_categories (family_id, name, icon, sort_order) VALUES " +
+                    "(0, '�抵捶, 'gift', 1), " +
+                    "(0, '蝎曄�, 'star', 2), " +
+                    "(0, '�寞�, 'crown', 3)");
+                log.info("憟硋���掩撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��硋��勗�蝐餃仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��𡝗��⊿�蝔讠�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM streak_milestones", Integer.class);
+            
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO streak_milestones (days, reward_points) VALUES " +
+                    "(3, 5), (7, 10), (30, 30), (100, 100)");
+                log.info("�枏㨃�𣬚�蝣穃歇�嘥�);
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𡝗��⊿�蝔讠�憭梯揖: {}", e.getMessage());
+        }
+
+        // �嘥��硋�蝡惩�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM badge_definitions", Integer.class);
+            
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO badge_definitions (badge_type, name, description, icon, condition_type, condition_value, reward_points) VALUES " +
+                    "('first_task', '�脲活摰峕�隞餃𦛚', '擐𡝗活摰峕�隞餅�隞餃𦛚', 'star', 'task_count', 1, 0), " +
+                    "('streak_3', '餈䂿賒3, '餈䂿賒3憭拇��嗅��𣂷遙, 'fire', 'streak_days', 3, 5), " +
+                    "('streak_7', '餈䂿賒7, '餈䂿賒7憭拇��嗅��𣂷遙, 'fire', 'streak_days', 7, 10), " +
+                    "('points_50', '蝘臬�颲曆犖', '銝��刻繮0蝘臬�', 'trophy', 'weekly_points', 50, 0), " +
+                    "('task_100', '隞餃𦛚颲曆犖', '摰峕�100銝芯遙, 'medal', 'task_count', 100, 20)");
+                log.info("�讠�摰帋�撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��硋�蝡惩�銋匧仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��硋�皜豢��唳旿
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM mini_games", Integer.class);
+            
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO mini_games (game_code, game_name, description, icon, default_duration, default_points, game_url, sort_order, status) VALUES " +
+                    "('schulte', '�鍦��寞䲮, '霈剔�銝𤘪釣�𥕦��澆𢆡�賢�嚗峕𪄳-25�厰◇摨讐�, '�㴓', 5, 5, '/pages/games/schulte', 1, 1), " +
+                    "('1a2b', '�𨀣㺭��, '�𨅯笆�啣��䔶�蝵株繮敺㛖妖����餌��餉��萘輕', '�𤩎', 10, 5, '/pages/games/1a2b', 2, 1), " +
+                    "('sudoku', '�啁𡠺', '憛怠��啣�雿踵�銵峕��埈�銝芸悍�潮���鉄1-9', '�𤚗', 15, 8, '/pages/games/sudoku', 3, 1)");
+                log.info("撠𤩺虜�𤩺㺭�桀歇�嘥�);
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��硋�皜豢��唳旿憭梯揖: {}", e.getMessage());
+        }
+
+// �嘥��㚚�霈斤恣���
+try {
+  // ����亙僎瘛餃�role�梹�憒��銝滚��剁�
+  try {
+    jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN role VARCHAR(20) DEFAULT \'admin\' AFTER email");
+    log.info("撌脫溶��ole�堒�admins);
+  } catch (Exception e) {
+    // �堒歇摮睃銁嚗�蕭�仿�霂
+  }
+
+  Integer count = jdbcTemplate.queryForObject(
+  "SELECT COUNT(*) FROM admins", Integer.class);
+
+  if (count == null || count == 0) {
+    // 暺䁅恕蝞∠� �𧢲㦤13800138000, 撖�� admin123
+    String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
+    jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
+    "(\'admin\', \'" + encryptedPassword + "\', \'蝟餌�蝞∠��娫', \'13800138000\', \'admin@xzyj.com\', \'admin\', 1)");
+    log.info("暺䁅恕蝞∠��睃歇�嘥� �𧢲㦤13800138000, 撖�� admin123");
+  }
+} catch (Exception e) {
+  log.warn("�嘥��㚚�霈斤恣���憭梯揖: {}", e.getMessage());
+}
+
+    // �嘥��𡝗��輯��鍦�WEB蝞∠�韐血噡
+    try {
+      Integer teacherCount = jdbcTemplate.queryForObject(
+        "SELECT COUNT(*) FROM admins WHERE username = 'teacher'", Integer.class);
+      if (teacherCount == null || teacherCount == 0) {
+        String teacherPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_teacher123".getBytes());
+        jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, role, status) VALUES " +
+          "('teacher', '" + teacherPassword + "', '�鞾鵭閫��, '13800138003', 'teacher', 1)");
+        log.info("�鞾鵭閫��撣�恣��揭�瑕歇�嘥� �冽�teacher, 撖�� teacher123");
+      }
+    } catch (Exception e) {
+      log.warn("�嘥��𡝗��輯��鍦�蝞∠�韐血噡憭梯揖: {}", e.getMessage());
+    }
+
+        // �嘥��碶遙�⊥芋�輻內靘𧢲㺭�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM admin_task_templates", Integer.class);
+
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO admin_task_templates (title, description, points, category, need_review, recommended_age, difficulty, is_active) VALUES " +
+                        "('摰峕�雿靝�', '�㗇𧒄摰峕�摮行嵗撣�蔭��振摨凋�, 10, '摮虫�', 1, 6, 'medium', 1), " +
+                        "('��粉30���', '�芯蜓��粉霂曉�銋衣�30���', 8, '��粉', 0, 5, 'easy', 1), " +
+                        "('�渡��輸𡢿', '�嗆㗲�渡��芸楛����游�銋行�', 6, '摰嗅𦛚', 0, 6, 'easy', 1), " +
+                        "('瘣㛖�', '擖剖�撣桀�皜��擗𣂼�', 5, '摰嗅𦛚', 1, 8, 'medium', 1), " +
+                        "('�瑕�餈𣂼𢆡1撠𤩺𧒄', '餈𥡝�頝烐郊���蝐餌��瑕�餈𣂼𢆡', 12, '餈𣂼𢆡', 0, 7, 'hard', 1), " +
+                        "('蝏��銋行�', '蝏��瘥𤤿��𣇉′蝚𥪯髡0���', 7, '摮虫�', 0, 7, 'medium', 1), " +
+                        "('�拍辺�抵絲', '�帋�9�孵��∟�嚗峕𡟺�孵�韏瑕�', 5, '��暑銋䭾�', 0, 5, 'easy', 1), " +
+                        "('�諹秘�方�', '�諹秘銝�擐硋𧂈霂𡑒�', 8, '摮虫�', 1, 6, 'medium', 1)");
+                log.info("隞餃𦛚璅⊥踎蝷箔��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��碶遙�⊥芋�踹仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��𤥁��𤘪㺭�桃內靘页�撟蹂���嘀撌𧼮�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM streets", Integer.class);
+
+            if (count == null || count == 0) {
+                // 
+                jdbcTemplate.execute("INSERT INTO streets (province, province_code, full_name, level, parent_id, sort_order) VALUES " +
+                        "('撟蹂�, '44', '撟蹂�, 1, NULL, 1)");
+                
+                // 
+                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, full_name, level, parent_id, sort_order) VALUES " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '撟蹂���嘀撌𧼮�', 2, 1, 1), " +
+                        "('撟蹂�, '44', '瘛勗裵, '4403', '撟蹂���楛�喳�', 2, 1, 2), " +
+                        "('撟蹂�, '44', '�䭾絲, '4404', '撟蹂����瘚瑕�', 2, 1, 3)");
+                
+                // 
+                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, district, district_code, full_name, level, parent_id, sort_order) VALUES " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '憭拇眾, '440106', '撟蹂���嘀撌𧼮�憭拇眾, 3, 2, 1), " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '頞羓�, '440104', '撟蹂���嘀撌𧼮�頞羓�, 3, 2, 2), " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '�芰死, '440113', '撟蹂���嘀撌𧼮��芰死, 3, 2, 3), " +
+                        "('撟蹂�, '44', '瘛勗裵, '4403', '�堒控, '440305', '撟蹂���楛�喳��堒控, 3, 3, 1), " +
+                        "('撟蹂�, '44', '瘛勗裵, '4403', '蝳讐眎, '440304', '撟蹂���楛�喳�蝳讐眎, 3, 3, 2)");
+                
+                // 銵烾�
+                jdbcTemplate.execute("INSERT INTO streets (province, province_code, city, city_code, district, district_code, street, street_code, full_name, level, parent_id, sort_order) VALUES " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '憭拇眾, '440106', '憭拇眾�𡑒�, '440106001', '撟蹂���嘀撌𧼮�憭拇眾�箏予瘝喳�銵烾�', 4, 4, 1), " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '憭拇眾, '440106', '瘝蹱眾銵烾�', '440106002', '撟蹂���嘀撌𧼮�憭拇眾�箸�瘝唾�, 4, 4, 2), " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '頞羓�, '440104', '銝𨅯控銵烾�', '440104001', '撟蹂���嘀撌𧼮�頞羓��箔�撅梯�, 4, 5, 1), " +
+                        "('撟蹂�, '44', '撟踹�, '4401', '�芰死, '440113', '撣�‘銵烾�', '440113001', '撟蹂���嘀撌𧼮��芰死�箏�獢亥�, 4, 6, 1), " +
+                        "('撟蹂�, '44', '瘛勗裵, '4403', '�堒控, '440305', '�堒控銵烾�', '440305001', '撟蹂���楛�喳��堒控�箏�撅梯�, 4, 7, 1), " +
+                        "('撟蹂�, '44', '瘛勗裵, '4403', '蝳讐眎, '440304', '蝳讐眎銵烾�', '440304001', '撟蹂���楛�喳�蝳讐眎�箇��啗�, 4, 8, 1)");
+                
+                log.info("銵烾�蝷箔��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𤥁��𤘪㺭�桀仃韐� {}", e.getMessage());
+        }
+
+try {
+  Integer count = jdbcTemplate.queryForObject(
+  "SELECT COUNT(*) FROM admins", Integer.class);
+
+  if (count == null || count == 0) {
+    // 暺䁅恕蝞∠� �𧢲㦤13800138000, 撖�� admin123
+    String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
+    jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
+    "('admin', '" + encryptedPassword + "', '蝟餌�蝞∠�, '13800138000', 'admin@xzyj.com', 'admin', 1)");
+    log.info("暺䁅恕蝞∠��睃歇�嘥� �𧢲㦤13800138000, 撖�� admin123");
+  }
+} catch (Exception e) {
+  log.warn("�嘥��碶遙�⊥芋�踹仃韐� {}", e.getMessage());
+}
+
+// �嘥�users 銵冽�霂閧鍂
+try {
+  // �𥕦遣暺䁅恕摰嗅滬嚗���靝�摮睃銁
+  Integer familyCount = jdbcTemplate.queryForObject(
+    "SELECT COUNT(*) FROM families WHERE id = 1", Integer.class);
+  if (familyCount == null || familyCount == 0) {
+    jdbcTemplate.execute("INSERT INTO families (id, name, invite_code) VALUES (1, '暺䁅恕摰嗅滬', '888888')");
+    log.info("暺䁅恕摰嗅滬撌脣�撱�);
+  }
+
+  // 撖���惩�: MD5("xzyj_salt_" + password)
+  String adminPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_salt_admin123".getBytes());
+  String teacherPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_salt_teacher123".getBytes());
+
+  // �𥕦遣蝞∠��条鍂�瘀�蝞∠��䁅��莎�撖�� admin123
+  Integer adminUserCount = jdbcTemplate.queryForObject(
+    "SELECT COUNT(*) FROM users WHERE phone = '13800138000'", Integer.class);
+  if (adminUserCount == null || adminUserCount == 0) {
+    jdbcTemplate.execute("INSERT INTO users (openid, family_id, role, phone, nickname, real_name, password) VALUES " +
+      "('seed_admin_13800138000', 1, 'admin', '13800138000', '蝟餌�蝞∠�, '蝟餌�蝞∠�, '" + adminPassword + "')");
+    log.info("瘚贝�蝞∠��条鍂�瑕歇�𥕦遣: 13800138000 (admin閫坿𠧧, 撖�� admin123)");
+  }
+
+  // �𥕦遣瘚贝��坔��冽�
+  Integer teacherUserCount = jdbcTemplate.queryForObject(
+    "SELECT COUNT(*) FROM users WHERE phone = '13800138001'", Integer.class);
+  if (teacherUserCount == null || teacherUserCount == 0) {
+    jdbcTemplate.execute("INSERT INTO users (openid, family_id, role, phone, nickname, real_name, password) VALUES " +
+      "('seed_teacher_13800138001', 1, 'teacher', '13800138001', '瘚贝��坔�', '瘚贝��坔�', '" + teacherPassword + "')");
+    log.info("瘚贝��坔��冽�撌脣�撱 13800138001 (�坔�閫坿𠧧, 撖�� teacher123)");
+  }
+} catch (Exception e) {
+  log.warn("�嘥��𡝗�霂閧鍂�瑕仃韐� {}", e.getMessage());
+}
+
+        // �嘥��𡝗�摨折�蝵桃�摮鞉㺭�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM zodiac_config", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO zodiac_config (zodiac_code, zodiac_name, element, start_month, start_day, end_month, end_day, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
+                    "('aries',       '�賜�, ', 3, 21, 4, 19, 65, 70, 1.10, 1.05, 0.95), " +
+                    "('taurus',      '�𤑳�, ', 4, 20, 5, 20, 60, 65, 1.05, 1.10, 1.15), " +
+                    "('gemini',      '���, ', 5, 21, 6, 21, 70, 80, 0.95, 1.15, 0.90), " +
+                    "('cancer',      '撌刻畺, ', 6, 22, 7, 22, 75, 60, 1.00, 0.90, 1.05), " +
+                    "('leo',         '�桀�, ', 7, 23, 8, 22, 65, 75, 1.15, 1.00, 1.10), " +
+                    "('virgo',       '憭�戊, ', 8, 23, 9, 22, 55, 85, 0.95, 1.05, 1.00), " +
+                    "('libra',       '憭拍坐, ', 9, 23, 10, 23, 70, 75, 0.90, 0.95, 1.10), " +
+                    "('scorpio',     '憭抵�, ', 10, 24, 11, 22, 80, 70, 1.10, 1.00, 1.15), " +
+                    "('sagittarius', '撠��, ', 11, 23, 12, 21, 60, 65, 1.15, 1.15, 0.95), " +
+                    "('capricorn',   '�拍劑, ', 12, 22, 1, 19, 55, 75, 1.05, 1.10, 1.20), " +
+                    "('aquarius',    '瘞渡𣂎, ', 1, 20, 2, 18, 75, 85, 0.95, 0.90, 1.00), " +
+                    "('pisces',      '�屸掉, ', 2, 19, 3, 20, 80, 60, 0.90, 0.95, 0.95)");
+                log.info("�笔漣�滨蔭蝘滚��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𡝗�摨折�蝵桀仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��硋�摮烾�蝵桃�摮鞉㺭�殷���予+ ����唳𣈲
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM bazi_config", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO bazi_config (stem_or_branch, type, element, yin_yang, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
+                    "(', 'stem', ', 'yang', 60, 75, 1.05, 1.10, 1.00), " +
+                    "(', 'stem', ', 'yin',  65, 70, 0.95, 1.05, 1.00), " +
+                    "(', 'stem', ', 'yang', 75, 65, 1.10, 1.00, 0.95), " +
+                    "(', 'stem', ', 'yin',  70, 60, 1.05, 0.95, 1.00), " +
+                    "(', 'stem', ', 'yang', 60, 65, 1.15, 1.05, 1.10), " +
+                    "(', 'stem', ', 'yin',  55, 60, 1.10, 1.00, 1.15), " +
+                    "(', 'stem', ', 'yang', 65, 80, 1.05, 1.10, 1.05), " +
+                    "(', 'stem', ', 'yin',  60, 75, 0.95, 1.00, 1.10), " +
+                    "(', 'stem', ', 'yang', 70, 70, 1.00, 0.95, 1.15), " +
+                    "(', 'stem', ', 'yin',  75, 65, 0.95, 0.90, 1.10), " +
+                    "(', 'branch', ', 'yang', 70, 65, 1.00, 0.95, 1.05), " +
+                    "(', 'branch', ', 'yin',  55, 60, 1.10, 1.05, 1.10), " +
+                    "(', 'branch', ', 'yang', 65, 75, 1.15, 1.10, 1.00), " +
+                    "(', 'branch', ', 'yin',  60, 70, 1.05, 1.05, 0.95), " +
+                    "(', 'branch', ', 'yang', 60, 65, 1.10, 1.00, 1.10), " +
+                    "(', 'branch', ', 'yin',  75, 70, 1.05, 0.95, 1.00), " +
+                    "(', 'branch', ', 'yang', 80, 65, 1.15, 1.00, 0.95), " +
+                    "(', 'branch', ', 'yin',  55, 60, 1.05, 1.00, 1.05), " +
+                    "(', 'branch', ', 'yang', 65, 80, 1.00, 1.10, 1.05), " +
+                    "(', 'branch', ', 'yin',  60, 75, 0.95, 1.05, 1.10), " +
+                    "(', 'branch', ', 'yang', 60, 65, 1.10, 1.00, 1.15), " +
+                    "(', 'branch', ', 'yin',  70, 60, 1.00, 0.95, 1.05)");
+                log.info("�怠��滨蔭蝘滚��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��硋�摮烾�蝵桀仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��𤥁��钅�蝵桃�摮鞉㺭�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM blood_type_config", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO blood_type_config (blood_type, description, mind_base, wisdom_base, body_modifier, action_modifier, wealth_modifier) VALUES " +
+                    "('A',  '霈斤�韐蠘提��艇靚函��湛�雿���西�', 70, 75, 0.95, 1.00, 1.05), " +
+                    "('B',  '銋鞱�撘��𨰜��末憟��撘綽�雿�撩銋讛�𣂼�', 65, 70, 1.05, 1.10, 0.95), " +
+                    "('AB', '���批��踺������𥕦撩嚗䔶�隡䀹�撖⊥鱏', 75, 80, 1.00, 0.95, 1.10), " +
+                    "('O',  '�芯縑�𨀣鱏����典�撘綽�雿�𤐄�批楛, 60, 65, 1.15, 1.15, 1.15)");
+                log.info("銵��钅�蝵桃�摮鞉㺭�桀歇�嘥�);
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𤥁��钅�蝵桀仃韐� {}", e.getMessage());
+        }
+
+        // �嘥��碶��惩�蝘滚��唳旿
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM coupon", Integer.class);
+            if (count == null || count == 0) {
+                jdbcTemplate.update(
+                    "INSERT INTO coupon (name, type, value, min_spend, applicable_to, valid_from, valid_until, total_count, used_count) " +
+                    "VALUES (?, ?, ?, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), ?, 0)",
+                    "�啁鍂�瑚�0���", "FIXED", 1000, 0, "ALL", 100);
+                jdbcTemplate.update(
+                    "INSERT INTO coupon (name, type, value, min_spend, applicable_to, valid_from, valid_until, total_count, used_count) " +
+                    "VALUES (?, ?, ?, ?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), ?, 0)",
+                    "隡𡁜���漣50���", "FIXED", 5000, 9900, "MEMBERSHIP", 50);
+                log.info("隡䀹��貊�摮鞉㺭�桀歇�嘥�);
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��碶��惩��唳旿憭梯揖: {}", e.getMessage());
+        }
+
+        // �嘥��𡝗��輯��鍦�璅∪��詨�
+        initGuideModuleTables(jdbcTemplate);
+    }
+
+    private void initGuideModuleTables(JdbcTemplate jdbcTemplate) {
+        // �滚𦛚蝐餃�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS service_types (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "name VARCHAR(100) NOT NULL COMMENT '蝐餃��滨妍', " +
+                "icon VARCHAR(50) COMMENT '�暹�', " +
+                "description VARCHAR(500) COMMENT '�讛膩', " +
+                "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
+                "status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '�嗆��CTIVE/DISABLED', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣service_types銵典仃韐� {}", e.getMessage());
+        }
+
+        // �滚𦛚��捆
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS service_contents (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "type_id BIGINT NOT NULL COMMENT '�唾��滚𦛚蝐餃�', " +
+                "title VARCHAR(200) NOT NULL COMMENT '��捆���', " +
+                "content TEXT COMMENT '撖峕��砍�, " +
+                "duration INT COMMENT '撱箄悅�園鵭(���)', " +
+                "age_range VARCHAR(50) COMMENT '��鍂撟湧�', " +
+                "price INT COMMENT '����遠', " +
+                "status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '�嗆��RAFT/ACTIVE', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣service_contents銵典仃韐� {}", e.getMessage());
+        }
+
+        // 憟烾�璅⊥踎
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_package_templates (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "name VARCHAR(100) NOT NULL COMMENT '璅⊥踎�滨妍', " +
+                "validity_months INT COMMENT '�㗇�', " +
+                "reference_price INT COMMENT '����遠', " +
+                "min_price INT COMMENT '��雿𤾸睸', " +
+                "description VARCHAR(500) COMMENT '霂湔�', " +
+                "status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '�嗆��CTIVE/DISABLED', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_package_templates銵典仃韐� {}", e.getMessage());
+        }
+
+        // 憟烾�璅⊥踎�滚𦛚憿寡”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS package_template_services (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "template_id BIGINT NOT NULL COMMENT '�唾�璅⊥踎', " +
+                "content_id BIGINT NOT NULL COMMENT '�唾��滚𦛚��捆', " +
+                "quantity INT DEFAULT 1 COMMENT '�圈�', " +
+                "unit VARCHAR(20) COMMENT '�蓥�' " +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣package_template_services銵典仃韐� {}", e.getMessage());
+        }
+
+        // �鞾鵭閫��撣��擗鞱”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_packages (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
+                "template_id BIGINT COMMENT '�唾�璅⊥踎', " +
+                "name VARCHAR(100) NOT NULL COMMENT '憟烾��滨妍', " +
+                "price INT NOT NULL COMMENT '���桐遠', " +
+                "validity_months INT COMMENT '�㗇�', " +
+                "description VARCHAR(500) COMMENT '憟烾�霂湔�', " +
+                "status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '�嗆��RAFT/PUBLISHED/PAUSED', " +
+                "sales_count INT DEFAULT 0 COMMENT '��, " +
+                "share_code VARCHAR(50) COMMENT '��澈, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_packages銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏嚗餙uide_packages 銵冽溶�删撩憭勗�
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN guide_id BIGINT COMMENT '�鞾鵭閫��撣㇆D' AFTER id");
+        } catch (Exception e) {
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN package_id BIGINT COMMENT '�唾�璅⊥踎' AFTER guide_id");
+        } catch (Exception e) {
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN commission_rate INT COMMENT '雿��瘥𥪯�(bps,100=1%)' AFTER package_id");
+        } catch (Exception e) {
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages MODIFY COLUMN teacher_id BIGINT NULL");
+        } catch (Exception e) {
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages MODIFY COLUMN template_id BIGINT NULL");
+        } catch (Exception e) {
+        }
+
+        // 餈�宏嚗餙uide_packages 銵冽溶�evel �梹�GuidePackage 摰硺���閬��
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN level VARCHAR(20) COMMENT '憟烾�蝑厩漣' AFTER name");
+        } catch (Exception e) {
+        }
+
+        // 餈�宏嚗餙uide_packages 銵冽溶�戹alidity_days 
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN validity_days INT DEFAULT 0 COMMENT '�㗇��笔予 AFTER validity_months");
+        } catch (Exception e) {
+        }
+
+        // 餈�宏嚗餙uide_packages 銵冽溶�坟ort_order 
+        try {
+            jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN sort_order INT DEFAULT 0 COMMENT '�鍦�' AFTER status");
+        } catch (Exception e) {
+        }
+
+        // �鞾鵭閫��撣��擗鞉��⊿★
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_package_services (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "package_id BIGINT NOT NULL COMMENT '�唾�憟烾�', " +
+                "content_id BIGINT NOT NULL COMMENT '�唾��滚𦛚��捆', " +
+                "quantity INT DEFAULT 1 COMMENT '�圈�', " +
+                "unit VARCHAR(20) COMMENT '�蓥�' " +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_package_services銵典仃韐� {}", e.getMessage());
+        }
+
+        // 霈W�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_orders (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "order_no VARCHAR(50) NOT NULL COMMENT '霈W�, " +
+                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
+                "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
+                "package_id BIGINT NOT NULL COMMENT '憟烾�ID', " +
+                "amount INT NOT NULL COMMENT '�煾�(', " +
+                "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆��ENDING/PAID/COMPLETED/REFUNDED', " +
+                "pay_time DATETIME COMMENT '�臭��園𡢿', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_orders銵典仃韐� {}", e.getMessage());
+        }
+
+        // 雿���𡒊�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_commissions (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "amount INT NOT NULL COMMENT '雿���煾�(', " +
+                "rate INT COMMENT '雿��瘥𥪯�(bps,100=1%)', " +
+                "status VARCHAR(20) DEFAULT 'PENDING' COMMENT '�嗆��ENDING/COMPLETED', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_commissions銵典仃韐� {}", e.getMessage());
+        }
+
+        // �滚𦛚霈啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_service_logs (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "teacher_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣㇆D', " +
+                "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', " +
+                "order_id BIGINT COMMENT '霈W�ID', " +
+                "service_content_id BIGINT NOT NULL COMMENT '�滚𦛚��捆ID', " +
+                "notes VARCHAR(500) COMMENT '�滚𦛚霈啣�', " +
+                "duration INT COMMENT '�滚𦛚�園鵭(���)', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_service_logs銵典仃韐� {}", e.getMessage());
+        }
+
+        // �鞾鵭閫��撣��霂瑞�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS guide_invite_codes (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "guide_id BIGINT NOT NULL COMMENT '�鞾鵭閫��撣�鍂�弒D', " +
+                "code VARCHAR(50) NOT NULL UNIQUE COMMENT '��霂瑞�', " +
+                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆��, " +
+                "used_by_user_id BIGINT COMMENT '雿輻鍂霂仿�霂瑞���鍂�弒D', " +
+                "used_at DATETIME COMMENT '雿輻鍂�園𡢿', " +
+                "expire_at DATETIME COMMENT '餈���園𡢿', " +
+                "use_count INT DEFAULT 0 COMMENT '雿輻鍂甈⊥㺭', " +
+                "max_use_count INT COMMENT '��憭找蝙�冽活, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                ")");
+        } catch (Exception e) {
+            log.warn("�𥕦遣guide_invite_codes銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏29: assessment_orders銵冽溶�蟵ppointment_id摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE assessment_orders ADD COLUMN appointment_id BIGINT COMMENT '�唾����蝥匈D'");
+            log.info("撌脫溶�蟵ppointment_id�堒�assessment_orders);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // 韐W�蝏游漲: 韐W��枏㨃霈啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS finance_checkins (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                "checkin_type VARCHAR(20) NOT NULL COMMENT '�枏㨃蝐餃�: daily_plan/saving/expense/review', " +
+                "checkin_date DATE NOT NULL COMMENT '�枏㨃�交�', " +
+                "amount INT COMMENT '�煾�(�嗆𣈲霈啣�)', " +
+                "category VARCHAR(50) COMMENT '�嗆𣈲��掩', " +
+                "note VARCHAR(200) COMMENT '憭�釣', " +
+                "mood VARCHAR(20) COMMENT '敹��', " +
+                "earned_energy INT DEFAULT 0 COMMENT '�瑕������, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_user_date (user_id, checkin_date), " +
+                "INDEX idx_child (child_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='韐W��枏㨃霈啣�");
+            log.info("撌脣�撱榻inance_checkins);
+        } catch (Exception e) {
+            log.warn("�𥕦遣finance_checkins銵典仃韐� {}", e.getMessage());
+        }
+
+        // 韐W�蝏游漲: 靽嘥�蝞∠�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS insurance_policies (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "child_id BIGINT COMMENT '�唾�摮拙�ID', " +
+                "policy_name VARCHAR(100) NOT NULL COMMENT '靽嘥��滨妍', " +
+                "insurance_company VARCHAR(100) COMMENT '靽嗪埯�砍虬', " +
+                "policy_type VARCHAR(50) COMMENT '靽嘥�蝐餃�: medical/life/accident/education/endowment', " +
+                "insured_person VARCHAR(50) NOT NULL COMMENT '鋡思�鈭箏�, " +
+                "premium INT COMMENT '靽肽晶(', " +
+                "sum_insured INT COMMENT '靽嗪�(', " +
+                "start_date DATE COMMENT '����交�', " +
+                "end_date DATE COMMENT '�唳��交�', " +
+                "renewal_type VARCHAR(20) DEFAULT 'annual' COMMENT '蝏剛晶蝐餃�: annual/monthly/single', " +
+                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�� active/expired/cancelled', " +
+                "policy_no VARCHAR(100) COMMENT '靽嘥�, " +
+                "remark VARCHAR(500) COMMENT '憭�釣', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_user (user_id), " +
+                "INDEX idx_child (child_id), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靽嘥�蝞∠�");
+            log.info("撌脣�撱槐nsurance_policies);
+        } catch (Exception e) {
+            log.warn("�𥕦遣insurance_policies銵典仃韐� {}", e.getMessage());
+        }
+
+        // ====== �亙熒璉�瘚𧢲𥁒�𦠜芋======
+        // �亙熒�亙�銵剁�雿𤘪��亙�/�𣬚黎璉�瘚𧢲𥁒�𠺪�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_reports (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                    "family_id BIGINT COMMENT '摰嗅滬ID', " +
+                    "report_type VARCHAR(32) NOT NULL COMMENT '�亙�蝐餃�: physical_exam(雿𤘪�)/gut_flora(�𣬚黎璉���', " +
+                    "report_date DATE COMMENT '�亙��交�', " +
+                    "overall_score INT COMMENT '�亙熒�餃�(0-100)', " +
+                    "gut_health_score INT COMMENT '�𣬚黎�亙熒, " +
+                    "chronic_disease_score INT COMMENT '�Y��批�, " +
+                    "nutrition_score INT COMMENT '�亙���﹛, " +
+                    "gut_age VARCHAR(32) COMMENT '�𣳇�憸��撟湧�', " +
+                    "gut_type VARCHAR(50) COMMENT '�惩�', " +
+                    "file_url VARCHAR(500) COMMENT '�亙���辣URL', " +
+                    "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆�� active/archived', " +
+                    "remark VARCHAR(500) COMMENT '憭�釣', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_user_id (user_id), " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_report_type (report_type)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒璉�瘚𧢲𥁒�𡃏”'");
+            log.info("撌脣�撱榴ealth_reports);
+        } catch (Exception e) {
+            log.warn("�𥕦遣health_reports銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �亙熒����𡒊�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_indicators (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "report_id BIGINT NOT NULL COMMENT '�唾��亙�ID', " +
+                    "category VARCHAR(50) COMMENT '�����掩: �亙��嗅�/�曄�憌𡡞埯/�𣳇�撅誯�/蟡䂿��坿捶/...', " +
+                    "indicator_name VARCHAR(100) NOT NULL COMMENT '����滨妍', " +
+                    "indicator_value VARCHAR(100) COMMENT '璉�瘚�, " +
+                    "unit VARCHAR(50) COMMENT '�蓥�', " +
+                    "ref_range VARCHAR(200) COMMENT '�����, " +
+                    "status VARCHAR(50) COMMENT '霂�摯�嗆�� 甇�虜/�譍�/�誯�/餈��/瘜冽�/雿𡡞��芣���, " +
+                    "sort_order INT DEFAULT 0 COMMENT '�曄內�鍦�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_report_id (report_id), " +
+                    "INDEX idx_category (category)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒����𡒊�");
+            log.info("撌脣�撱榴ealth_indicators);
+        } catch (Exception e) {
+            log.warn("�𥕦遣health_indicators銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // ---------- �亙熒�亙��啣��𣬚黎�䁅�摮埈挾 ----------
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_reports " +
+                    "ADD COLUMN gut_balance_score INT COMMENT '�𣬚黎撟唾﹛0-100)', " +
+                    "ADD COLUMN gut_diversity_score INT COMMENT '�𣬚黎憭𡁏甅�批�(0-100)', " +
+                    "ADD COLUMN beneficial_bacteria_score INT COMMENT '�厩����(0-100)', " +
+                    "ADD COLUMN harmful_bacteria_score INT COMMENT '�匧拿���(0-100)', " +
+                    "ADD COLUMN core_species_score INT COMMENT '�詨����0-100)', " +
+                    "ADD COLUMN health_rating VARCHAR(100) COMMENT '�餃�霂�漣嚗��鈭𡁜�隡条�");
+            log.info("撌脖蛹health_reports銵冽溶�牐葵�𣬚黎�䁅�摮埈挾);
+        } catch (Exception e) {
+            log.warn("銝榴ealth_reports銵冽溶�惩�畾萄虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+
+        ensureColumn("health_reports", "subject_id", "BIGINT COMMENT '�亙�銝颱��冽�ID(�唾�users銝槃ull銵函內�芰�'");
+
+        // ---------- �亙熒����啣�symptoms摮埈挾 ----------
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_indicators ADD COLUMN symptoms TEXT COMMENT '餈��/蝻箔��詨���𠶖�讛膩'");
+            log.info("撌脖蛹health_indicators銵冽溶�坟ymptoms摮埈挾");
+        } catch (Exception e) {
+            log.warn("銝榴ealth_indicators銵冽溶�坟ymptoms摮埈挾�航�撌脣��� {}", e.getMessage());
+        }
+
+        log.info("�鞾鵭閫��撣�芋�𨰜��揣撖𣬚輕摨血��亙熒璉�瘚𧢲𥁒�𦠜㺭�桀�銵典�憪见�摰峕�");
+
+        // �亙熒�枏㨃
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_checkins (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT COMMENT '�冽�ID嚗�振�選�', " +
+                    "child_id BIGINT COMMENT '摮拙�ID', " +
+                    "checkin_date DATE COMMENT '�枏㨃�交�', " +
+                    "behaviors TEXT COMMENT '�枏㨃銵䔶蛹JSON�啁�', " +
+                    "note VARCHAR(500) COMMENT '憭�釣', " +
+                    "mood VARCHAR(20) COMMENT '敹��: happy/normal/sad/angry/sick', " +
+                    "earned_energy INT DEFAULT 5 COMMENT '�瑕��賡�, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_child_id (child_id), " +
+                    "INDEX idx_checkin_date (checkin_date)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亙熒�枏㨃");
+            log.info("撌脣�撱榴ealth_checkins);
+        } catch (Exception e) {
+            log.warn("�𥕦遣health_checkins銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏31: �𥕦遣�𠉛頂鈭箄”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS contacts (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "name VARCHAR(100) NOT NULL COMMENT '憪枏�', " +
+                "phone VARCHAR(20) COMMENT '�菔�', " +
+                "avatar VARCHAR(500) COMMENT '憭游�', " +
+                "relationship_type VARCHAR(20) COMMENT '�喟頂蝐餃�: family/friend/partner/colleague/other', " +
+                "known_since DATETIME COMMENT '霈方��園𡢿', " +
+                "bio VARCHAR(500) COMMENT '蝞�, " +
+                "birthday DATE COMMENT '��𠯫', " +
+                "intimacy_level INT DEFAULT 0 COMMENT '鈭脣�0-100)', " +
+                "contact_source VARCHAR(20) DEFAULT 'manual' COMMENT '�交�: phone/manual', " +
+                "tags VARCHAR(500) COMMENT '��倌(�堒噡���)', " +
+                "last_contact_at DATETIME COMMENT '��餈𤏸�蝟餅𧒄, " +
+                "contact_count INT DEFAULT 0 COMMENT '�𠉛頂甈⊥㺭', " +
+                "notes TEXT COMMENT '憭�釣', " +
+                "created_at DATETIME, " +
+                "updated_at DATETIME, " +
+                "INDEX idx_user_id (user_id)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�𠉛頂鈭箄”'");
+            log.info("撌脣�撱構ontacts�𠉛頂);
+        } catch (Exception e) {
+            log.warn("�𥕦遣contacts銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �𥕦遣�����粉霈啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_reading_records (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "user_id BIGINT COMMENT '�冽�ID', " +
+                "child_id BIGINT NOT NULL COMMENT '摮拙�ID', " +
+                "content VARCHAR(500) COMMENT '��粉��捆�䁅�', " +
+                "duration_seconds INT DEFAULT 0 COMMENT '��粉�園鵭(', " +
+                "read_at DATETIME COMMENT '��粉�園𡢿', " +
+                "created_at DATETIME, " +
+                "INDEX idx_child_id (child_id), " +
+                "INDEX idx_read_at (read_at)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�����粉霈啣�");
+            log.info("撌脣�撱榮rticle_reading_records);
+        } catch (Exception e) {
+            log.warn("�𥕦遣article_reading_records銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏30: activities銵冽溶�戹isibility�綋isible_to摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visibility VARCHAR(20) DEFAULT 'all' COMMENT '�航� all/member'");
+            log.info("撌脫溶�戹isibility�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visible_to VARCHAR(255) COMMENT '�航�閫坿𠧧�𡑒”(�堒噡���)'");
+            log.info("撌脫溶�戹isible_to�堒�activities);
+        } catch (Exception e) {
+            // �堒歇摮睃銁嚗�蕭�仿�霂
+        }
+
+        // �𥕦遣蝏游漲�滨蔭
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS product_dimension_config (" +
+                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
+                "dimension_code VARCHAR(50) NOT NULL UNIQUE COMMENT '蝏游漲隞��: body/mind/wisdom/action/wealth', " +
+                "dimension_name VARCHAR(100) NOT NULL COMMENT '蝏游漲�滨妍', " +
+                "dimension_type VARCHAR(50) NOT NULL DEFAULT 'five' COMMENT '蝐餃�: five(鈭𠉛輕)/action(銵�𢆡)/other', " +
+                "parent_id BIGINT COMMENT '�嗥漣ID嚗峕��嗥漣銝摸ULL', " +
+                "sort INT DEFAULT 0 COMMENT '�鍦�', " +
+                "enabled TINYINT(1) DEFAULT 1 COMMENT '�舐鍂: 0蝳�鍂 1�舐鍂', " +
+                "dify_dataset_id VARCHAR(100) COMMENT 'Dify Dataset ID嚗䔶�憛怠�銝滚�, " +
+                "remark VARCHAR(500) COMMENT '憭�釣', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP " +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏游漲�滨蔭");
+            log.info("撌脣�撱歉roduct_dimension_config);
+        } catch (Exception e) {
+            log.warn("�𥕦遣product_dimension_config銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �𥕦遣�亥�摨栞”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base (" +
+                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
+                "title VARCHAR(200) NOT NULL COMMENT '�亥����', " +
+                "content TEXT NOT NULL COMMENT '�亥���捆', " +
+                "sort INT DEFAULT 0 COMMENT '�鍦�', " +
+                "status TINYINT(1) DEFAULT 1 COMMENT '�嗆�� 0蝳�鍂 1�舐鍂', " +
+                "remark VARCHAR(500) COMMENT '憭�釣', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP " +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�摨栞”'");
+            log.info("撌脣�撱榛an_knowledge_base);
+        } catch (Exception e) {
+            log.warn("�𥕦遣dan_knowledge_base銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �𥕦遣��倌
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_tag (" +
+                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
+                "tag_name VARCHAR(100) NOT NULL UNIQUE COMMENT '��倌, " +
+                "tag_type VARCHAR(50) DEFAULT 'custom' COMMENT '��倌蝐餃�: custom/auto', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP " +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='��倌");
+            log.info("撌脣�撱榛an_knowledge_tag);
+        } catch (Exception e) {
+            log.warn("�𥕦遣dan_knowledge_tag銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �𥕦遣�亥�-蝏游漲�唾�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base_dimension (" +
+                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
+                "knowledge_id BIGINT NOT NULL COMMENT '�亥�摨𨧻D', " +
+                "dimension_id BIGINT NOT NULL COMMENT '蝏游漲�滨蔭ID', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_knowledge_dimension (knowledge_id, dimension_id) " +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�-蝏游漲�唾�");
+            log.info("撌脣�撱榛an_knowledge_base_dimension);
+
+            // 瘛餃�憭㚚睸蝥行�嚗���祆�銵屸��𨥭REATE TABLE�嗡�韏𤥁”銝滚��剁�
+            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_dimension ADD CONSTRAINT fk_kd_knowledge FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE");
+            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_dimension ADD CONSTRAINT fk_kd_dimension FOREIGN KEY (dimension_id) REFERENCES product_dimension_config(id) ON DELETE CASCADE");
+            log.info("撌脫溶�賷an_knowledge_base_dimension憭㚚睸蝥行�");
+        } catch (Exception e) {
+            log.warn("�𥕦遣dan_knowledge_base_dimension銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // �𥕦遣�亥�-��倌�唾�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS dan_knowledge_base_tag (" +
+                "id BIGINT PRIMARY KEY AUTO_INCREMENT, " +
+                "knowledge_id BIGINT NOT NULL, " +
+                "tag_id BIGINT NOT NULL, " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_knowledge_tag (knowledge_id, tag_id) " +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�亥�-��倌�唾�");
+            log.info("撌脣�撱榛an_knowledge_base_tag);
+
+            // 瘛餃�憭㚚睸蝥行�
+            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_tag ADD CONSTRAINT fk_kt_knowledge FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE");
+            jdbcTemplate.execute("ALTER TABLE dan_knowledge_base_tag ADD CONSTRAINT fk_kt_tag FOREIGN KEY (tag_id) REFERENCES dan_knowledge_tag(id) ON DELETE CASCADE");
+            log.info("撌脫溶�賷an_knowledge_base_tag憭㚚睸蝥行�");
+        } catch (Exception e) {
+            log.warn("�𥕦遣dan_knowledge_base_tag銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏32: products銵冽溶�𣳇�蝐餌𤌍/���摮埈挾嚗�����颲𤏸”�訫笆朣琜�
+        ensureColumn("products", "delivery_method", "TINYINT DEFAULT 1 COMMENT '�漤��䲮 1=敹�2=�芣� 3=銝方���");
+        ensureColumn("products", "category_id", "BIGINT COMMENT '���蝐餌𤌍ID'");
+        ensureColumn("products", "distribution_system_id", "BIGINT COMMENT '���雿梶頂ID'");
+
+        // 餈�宏33: �𥕦遣靘𥕦������雿梶頂+ product_orders�拙�摮埈挾
+        ensureColumn("product_orders", "supply_system_id", "BIGINT COMMENT '��撅硺�摨𥪜�雿梶頂ID'");
+        ensureColumn("product_orders", "supplier_id", "BIGINT COMMENT '�嗆狡靘𥕦���鍂�弒D'");
+        ensureColumn("product_orders", "supply_commission", "INT COMMENT '���雿��('");
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD KEY idx_supply_system_id (supply_system_id)");
+            log.info("撌脫溶�犲dx_supply_system_id蝝W��郡roduct_orders);
+        } catch (Exception e) {
+            log.warn("瘛餃�idx_supply_system_id蝝W��航�撌脣��� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "name VARCHAR(100) NOT NULL COMMENT '雿梶頂�滨妍', " +
+                "admin_id BIGINT NOT NULL COMMENT '蝞∠��条鍂�弒D', " +
+                "settlement_period_days INT NOT NULL DEFAULT 30 COMMENT '韐行�嚗�予, " +
+                "platform_profit_rate DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '撟喳蝱�坔⏚瘥𥪯�(%)', " +
+                "description VARCHAR(500) COMMENT '�讛膩', " +
+                "status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '�嗆�� active/disabled', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "KEY idx_admin_id (admin_id)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����");
+            log.info("撌脣�撱漳upply_system);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_system銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system_member (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "role VARCHAR(20) NOT NULL DEFAULT 'member' COMMENT '閫坿𠧧: admin/member', " +
+                "status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '�嗆�� active/inactive', " +
+                "joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "UNIQUE KEY uk_system_user (system_id, user_id), " +
+                "KEY idx_user_id (user_id)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='雿梶頂�𣂼�'");
+            log.info("撌脣�撱漳upply_system_member);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_system_member銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
+                "period_start DATE NOT NULL COMMENT '蝏梶��冽�撘�, " +
+                "period_end DATE NOT NULL COMMENT '蝏梶��冽�蝏𤘪�', " +
+                "total_sales INT NOT NULL DEFAULT 0 COMMENT '���格�駁�(', " +
+                "platform_profit INT NOT NULL DEFAULT 0 COMMENT '撟喳蝱�坔⏚�煾�(', " +
+                "supplier_payout INT NOT NULL DEFAULT 0 COMMENT '靘𥕦����', " +
+                "status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '�嗆�� pending/settled', " +
+                "settled_at DATETIME COMMENT '蝏梶��園𡢿', " +
+                "remark VARCHAR(500) COMMENT '憭�釣', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "KEY idx_system_id (system_id), " +
+                "KEY idx_period (period_start, period_end)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏梶�霈啣�'");
+            log.info("撌脣�撱漳upply_settlement);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_settlement銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement_detail (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "settlement_id BIGINT NOT NULL COMMENT '蝏梶�ID', " +
+                "order_id BIGINT NOT NULL COMMENT '霈W�ID', " +
+                "order_no VARCHAR(64) NOT NULL COMMENT '霈W�, " +
+                "product_name VARCHAR(200) NOT NULL COMMENT '����滨妍', " +
+                "amount INT NOT NULL COMMENT '霈W��煾�(', " +
+                "platform_fee INT NOT NULL COMMENT '撟喳蝱�坔⏚(', " +
+                "supplier_id BIGINT COMMENT '�嗆狡靘𥕦���鍂�弒D', " +
+                "supplier_name VARCHAR(100) COMMENT '�嗆狡靘𥕦����, " +
+                "payout INT NOT NULL COMMENT '靘𥕦����', " +
+                "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+                "KEY idx_settlement_id (settlement_id), " +
+                "KEY idx_order_id (order_id)" +
+            ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='蝏梶��𡒊�'");
+            log.info("撌脣�撱漳upply_settlement_detail);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_settlement_detail銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏: growth_records銵冽溶�䭾䔉皞鞟掩�駁�/銵亙�摮埈挾
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN source_type VARCHAR(20) DEFAULT 'manual' COMMENT '�交�蝐餃�: manual/platform_purchase/self_upload/supplement'");
+            log.info("撌脫溶�坟ource_type�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN source_file_url VARCHAR(500) COMMENT '�笔��亙���辣URL'");
+            log.info("撌脫溶�坟ource_file_url�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN order_id BIGINT COMMENT '�唾�霈W�ID'");
+            log.info("撌脫溶�䰄rder_id�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN report_date DATETIME COMMENT '瘚贝�/�亙��交�'");
+            log.info("撌脫溶��eport_date�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN parent_record_id BIGINT COMMENT '�唾����憪𧢲﹝獢㇆D嚗�‘��﹝獢���剁�'");
+            log.info("撌脫溶�麖arent_record_id�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN is_latest TINYINT(1) DEFAULT 1 COMMENT '�臬炏�𣬚����啗扇");
+            log.info("撌脫溶�犲s_latest�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN dedup_hash VARCHAR(64) COMMENT '�駁����SHA256)'");
+            log.info("撌脫溶�賷edup_hash�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("ALTER TABLE growth_records ADD COLUMN parsed_data TEXT COMMENT '銝𠹺��亙���圾�鞟�JSON)'");
+            log.info("撌脫溶�麖arsed_data�堒�growth_records);
+        } catch (Exception e) {}
+
+        try {
+            jdbcTemplate.execute("CREATE UNIQUE INDEX IF NOT EXISTS uk_growth_dedup_hash ON growth_records(dedup_hash)");
+            log.info("撌脫溶�抦k_growth_dedup_hash�臭�蝝W��迷rowth_records);
+        } catch (Exception e) {
+            try {
+                jdbcTemplate.execute("ALTER TABLE growth_records ADD UNIQUE INDEX uk_growth_dedup_hash (dedup_hash)");
+                log.info("撌脤�朞�ALTER TABLE瘛餃�uk_growth_dedup_hash�臭�蝝W�");
+            } catch (Exception e2) {
+                log.warn("瘛餃�uk_growth_dedup_hash蝝W��航�撌脣��� {}", e2.getMessage());
+            }
+        }
+
+        // 餈�宏: foods銵冽溶�㰘𨯫�餃�畾
+        ensureColumn("foods", "energy_kj", "DECIMAL(8,2) COMMENT '�賡�(kJ/100g)'");
+        ensureColumn("foods", "starch", "DECIMAL(8,2) COMMENT '瘛�g/100g)'");
+        ensureColumn("foods", "cholesterol", "DECIMAL(8,2) COMMENT '��𤐄mg/100g)'");
+
+        // �嘥��𡝗��蹂遙�∠�摮鞉㺭�
+        try {
+            Integer count = jdbcTemplate.queryForObject(
+                    "SELECT COUNT(*) FROM growth_task", Integer.class);
+
+            if (count == null || count == 0) {
+                jdbcTemplate.execute("INSERT INTO growth_task (type, title, description, reward_points, reward_energy, target_value, task_key, enabled, sort_order, created_at) VALUES " +
+                        "('DAILY', '瘥𤩺𠯫蝑曉�', '摰峕��亙熒�枏㨃蝑曉�', 20, 3, 1, 'DAILY_CHECKIN', 1, 1, NOW()), " +
+                        "('DAILY', '摰峕�隞餃𦛚', '摰峕�銝�銝芯遙, 30, 5, 1, 'DAILY_TASK', 1, 2, NOW()), " +
+                        "('DAILY', '瘥𤩺𠯫��澈', '��澈撠讐�摨讐�憟賢�', 10, 2, 1, 'DAILY_SHARE', 1, 3, NOW()), " +
+                        "('DAILY', 'AI撖寡�', '銝垾I�拇�撖寡�銝�, 15, 3, 1, 'DAILY_AI', 1, 4, NOW())");
+                log.info("�鞾鵭隞餃𦛚蝘滚��唳旿撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𡝗��蹂遙�∠�摮鞉㺭�桀仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏34: dan_assessment_results銵冽溶�惩振摨剜�EMI敹��/憭找�鈭箸聢/摮拙�敹怎�摮埈挾
+        ensureColumn("dan_assessment_results", "family_member_id", "BIGINT COMMENT '摰嗅滬�𣂼�ID'");
+        ensureColumn("dan_assessment_results", "family_member_name", "VARCHAR(50) COMMENT '�𣂼�憪枏�敹怎�'");
+        ensureColumn("dan_assessment_results", "family_member_birthday", "DATE COMMENT '�𣂼��箇��交�敹怎�'");
+        ensureColumn("dan_assessment_results", "family_member_gender", "VARCHAR(10) COMMENT '�𣂼��批�敹怎�'");
+        ensureColumn("dan_assessment_results", "family_member_age", "INT COMMENT '�𣂼�撟湧�敹怎�'");
+        ensureColumn("dan_assessment_results", "emotion_score", "INT COMMENT '��貌��㺭(EMI)'");
+        ensureColumn("dan_assessment_results", "resilience_score", "INT COMMENT '敹���余MI)'");
+        ensureColumn("dan_assessment_results", "stress_coping_score", "INT COMMENT '�见�摨𥪜笆(EMI)'");
+        ensureColumn("dan_assessment_results", "self_awareness_score", "INT COMMENT '�芣�霈斤䰻(EMI)'");
+        ensureColumn("dan_assessment_results", "openness_score", "INT COMMENT '撘��曉之鈭𥪯犖��)'");
+        ensureColumn("dan_assessment_results", "conscientiousness_score", "INT COMMENT '撠質提憭找�鈭箸聢)'");
+        ensureColumn("dan_assessment_results", "extraversion_score", "INT COMMENT '憭硋�憭找�鈭箸聢)'");
+        ensureColumn("dan_assessment_results", "agreeableness_score", "INT COMMENT '摰靝犖憭找�鈭箸聢)'");
+        ensureColumn("dan_assessment_results", "neuroticism_score", "INT COMMENT '蟡䂿�憭找�鈭箸聢)'");
+        ensureColumn("dan_assessment_results", "big_five_overall_score", "INT COMMENT '憭找�鈭箸聢蝏澆�");
+        ensureColumn("dan_assessment_results", "child_name", "VARCHAR(50) COMMENT '摮拙�憪枏�敹怎�'");
+        ensureColumn("dan_assessment_results", "child_birthday", "DATE COMMENT '�箇��交�敹怎�'");
+        ensureColumn("dan_assessment_results", "child_gender", "VARCHAR(10) COMMENT '�批�敹怎�'");
+        ensureColumn("dan_assessment_results", "child_age", "INT COMMENT '撟湧�敹怎�'");
+        ensureColumn("dan_assessment_results", "school", "VARCHAR(100) COMMENT '摮行嵗敹怎�'");
+        ensureColumn("dan_assessment_results", "grade", "VARCHAR(20) COMMENT '撟渡漣敹怎�'");
+        ensureColumn("dan_assessment_results", "grade_class", "VARCHAR(20) COMMENT '�剔漣敹怎�'");
+        ensureColumn("dan_assessment_results", "height", "INT COMMENT '頨恍�(CM)敹怎�'");
+        ensureColumn("dan_assessment_results", "weight", "INT COMMENT '雿㯄�(KG)敹怎�'");
+        ensureColumn("dan_assessment_results", "family_status", "VARCHAR(50) COMMENT '摰嗅滬�嗅�敹怎�'");
+        ensureColumn("dan_assessment_results", "parent_degree", "VARCHAR(50) COMMENT '�嗆���擃睃郎��翰");
+        ensureColumn("dan_assessment_results", "nation", "VARCHAR(20) COMMENT '瘞烐�敹怎�'");
+        ensureColumn("dan_assessment_results", "province", "VARCHAR(50) COMMENT '��翰");
+        ensureColumn("dan_assessment_results", "city", "VARCHAR(50) COMMENT '撣�翰");
+        ensureColumn("dan_assessment_results", "district", "VARCHAR(50) COMMENT '�箏翰");
+        ensureColumn("dan_assessment_results", "address", "VARCHAR(200) COMMENT '霂衣��啣�敹怎�'");
+        ensureColumn("dan_assessment_results", "single_child", "VARCHAR(10) COMMENT '�臬炏�祉�摮𣂼戊敹怎�'");
+        ensureColumn("dan_assessment_results", "school_score", "VARCHAR(20) COMMENT '�冽嵗�鞟貍敹怎�'");
+        ensureColumn("dan_assessment_results", "urgent_name", "VARCHAR(50) COMMENT '蝝扳�亥�蝟颱犖憪枏�'");
+        ensureColumn("dan_assessment_results", "urgent_phone", "VARCHAR(20) COMMENT '蝝扳�亥�蝟颱犖�菔�'");
+        ensureColumn("dan_assessment_results", "pics", "TEXT COMMENT '�曄�IDs'");
+        ensureColumn("dan_assessment_results", "videos", "TEXT COMMENT '閫��IDs'");
+        ensureColumn("dan_assessment_results", "audio", "VARCHAR(100) COMMENT '�喲�ID'");
+        ensureColumn("dan_assessment_results", "audio_url", "VARCHAR(255) COMMENT '�喲�URL'");
+        ensureColumn("dan_assessment_results", "process_desc", "TEXT COMMENT '餈���讛膩'");
+        ensureColumn("dan_assessment_results", "result_desc", "TEXT COMMENT '蝏𤘪�蝞�");
+
+        // 餈�宏35: points_log銵冽溶�霡amily_member_id�梹�EnergyService.calcChildWealth摰嗅滬�賡�霈∠���閬��
+        ensureColumn("points_log", "family_member_id", "BIGINT COMMENT '摰嗅滬�𣂼�ID'");
+
+        // 餈�宏36: family_members銵冽溶�鮰eneration + is_spouse�梹�颲���齿�
+        ensureColumn("family_members", "generation", "INT COMMENT '颲���潘�0=摰嗅滬�𥕦遣���+n=�睲�n隞��-n=�睲�n隞��'");
+        ensureColumn("family_members", "is_spouse", "TINYINT(1) DEFAULT 0 COMMENT '�臬炏�滚�嚗��颲��'");
+
+        // 餈�宏37: �扳㺭�射eneration韏见�潘��箔�relationship_type�惩�
+        try {
+            jdbcTemplate.execute("UPDATE family_members SET generation = 0, is_spouse = 1 WHERE relationship_type = 'spouse'");
+            jdbcTemplate.execute("UPDATE family_members SET generation = 1 WHERE relationship_type = 'parent'");
+            jdbcTemplate.execute("UPDATE family_members SET generation = -1 WHERE relationship_type IN ('child')");
+            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE relationship_type = 'sibling'");
+            jdbcTemplate.execute("UPDATE family_members SET generation = 0 WHERE generation IS NULL AND relationship_type IS NOT NULL");
+            log.info("撌脰�蝘蜻amily_members.generation�唳旿");
+        } catch (Exception e) {
+            log.warn("餈�宏family_members.generation�唳旿憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏38: product_orders銵冽溶�麖oints_used/points_cost/money_amount�梹�瘛瑕��臭��舀�
+        ensureColumn("product_orders", "points_used", "INT DEFAULT 0 COMMENT '雿輻鍂��妖��㺭��");
+        ensureColumn("product_orders", "points_cost", "INT DEFAULT 0 COMMENT '蝘臬��菜緍�煾�('");
+        ensureColumn("product_orders", "money_amount", "INT DEFAULT 0 COMMENT '�圈��臭��煾�('");
+
+        // 餈�宏39: �𥕦遣靘𥕦����蝟餌㮾�唾”
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "name VARCHAR(100) NOT NULL COMMENT '雿梶頂�滨妍', " +
+                "admin_id BIGINT COMMENT '蝞∠��条鍂�弒D', " +
+                "settlement_period_days INT DEFAULT 30 COMMENT '韐行�憭拇㺭', " +
+                "platform_profit_rate DECIMAL(10,2) DEFAULT 0.00 COMMENT '撟喳蝱�坔⏚瘥𥪯�(%)', " +
+                "description VARCHAR(500) COMMENT '�讛膩', " +
+                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆��ctive/disabled', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                "INDEX idx_admin (admin_id), " +
+                "INDEX idx_status (status)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����");
+            log.info("撌脣�撱漳upply_system);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_system銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_system_member (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
+                "user_id BIGINT NOT NULL COMMENT '�冽�ID', " +
+                "role VARCHAR(20) DEFAULT 'member' COMMENT '閫坿𠧧 admin/member', " +
+                "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆��ctive/disabled', " +
+                "joined_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_system (system_id), " +
+                "INDEX idx_user (user_id), " +
+                "UNIQUE INDEX idx_system_user (system_id, user_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝟餅�");
+            log.info("撌脣�撱漳upply_system_member);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_system_member銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "system_id BIGINT NOT NULL COMMENT '雿梶頂ID', " +
+                "period_start DATE COMMENT '蝏梶��冽�撘�, " +
+                "period_end DATE COMMENT '蝏梶��冽�蝏𤘪�', " +
+                "total_sales INT DEFAULT 0 COMMENT '���格�駁�(', " +
+                "platform_profit INT DEFAULT 0 COMMENT '撟喳蝱�坔⏚(', " +
+                "supplier_payout INT DEFAULT 0 COMMENT '靘𥕦����', " +
+                "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆��ending/settled', " +
+                "settled_at DATETIME COMMENT '蝏梶��園𡢿', " +
+                "remark VARCHAR(500) COMMENT '憭�釣', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_system (system_id), " +
+                "INDEX idx_status (status), " +
+                "INDEX idx_period (period_start, period_end)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝞堒�'");
+            log.info("撌脣�撱漳upply_settlement);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_settlement銵典仃韐� {}", e.getMessage());
+        }
+
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS supply_settlement_detail (" +
+                "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                "settlement_id BIGINT NOT NULL COMMENT '蝏梶��𣗏D', " +
+                "order_id BIGINT COMMENT '霈W�ID', " +
+                "order_no VARCHAR(64) COMMENT '霈W�, " +
+                "product_name VARCHAR(200) COMMENT '����滨妍', " +
+                "amount INT DEFAULT 0 COMMENT '霈W��煾�(', " +
+                "platform_fee INT DEFAULT 0 COMMENT '撟喳蝱�坔⏚(', " +
+                "supplier_id BIGINT COMMENT '�嗆狡靘𥕦���D', " +
+                "supplier_name VARCHAR(100) COMMENT '�嗆狡靘𥕦����, " +
+                "payout INT DEFAULT 0 COMMENT '摰硺�(', " +
+                "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                "INDEX idx_settlement (settlement_id), " +
+                "INDEX idx_order (order_id)" +
+                ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='靘𥕦����蝞埈�");
+            log.info("撌脣�撱漳upply_settlement_detail);
+        } catch (Exception e) {
+            log.warn("�𥕦遣supply_settlement_detail銵典仃韐� {}", e.getMessage());
+        }
+
+        // 餈�宏40: 瘛餃�supplier_admin閫坿𠧧�酌sers.role ENUM
+        try {
+            jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent','child','teacher','supplier_admin') NOT NULL DEFAULT 'parent' COMMENT '敶枏�瘣餉�閫坿𠧧'");
+            log.info("撌脫溶�坟upplier_admin�酌sers.role ENUM");
+        } catch (Exception e) {
+            log.warn("瘛餃�supplier_admin�酌sers.role ENUM憭梯揖: {}", e.getMessage());
+        }
+
+        // 餈�宏40: users銵冽溶�𦅙ascot摮埈挾嚗㇁I�拇�敶Z情: xibao瘚惩�/fubao蝳誩�
+        ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI�拇�敶Z情: xibao(瘚惩�)/fubao(蝳誩�)'");
+
+
+        // family_relationships 銵剁�餈𦦵��啣�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_relationships (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL COMMENT '��撅𧼮振摨背D', " +
+                    "from_member_id BIGINT NOT NULL COMMENT '�喟頂韏瑞��𣂼�ID', " +
+                    "to_member_id BIGINT NOT NULL COMMENT '�喟頂蝏���𣂼�ID', " +
+                    "generation_value INT NOT NULL COMMENT '颲�� -1=摮𣂼戊, 0=�諹�, 1=�嗆�, 2=蟡𣇉� 3=�曄��嗆�', " +
+                    "relationship_key VARCHAR(50) COMMENT '�喟頂��倌key嚗��雿嗵鍂鈭擧遬蝷綽�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY uk_from_to (from_member_id, to_member_id), " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_from (from_member_id), " +
+                    "INDEX idx_to (to_member_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='摰嗅滬�𣂼�����喟頂");
+            log.info("撌脣�撱榻amily_relationships);
+        } catch (Exception e) {
+            log.warn("�𥕦遣family_relationships銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+
+        // 餈�宏41: �嘥��碶�蝏渡䰻霂�葉敹��蝡惩�蝐餃�蝘滚����
+        try {
+            Integer catCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM article_categories WHERE name IN (', ', ', ', ')", Integer.class);
+            if (catCount == null || catCount == 0) {
+                jdbcTemplate.execute("INSERT IGNORE INTO article_categories (name, icon, color, sort_order, status) VALUES " +
+                    "(', 'health', '#FF8C42', 1, 1), " +
+                    "(', 'wisdom', '#6366F1', 2, 1), " +
+                    "(', 'love', '#FF6B9D', 3, 1), " +
+                    "(', 'action', '#10B981', 4, 1), " +
+                    "(', 'wealth', '#F59E0B', 5, 1)");
+                log.info("鈭𠉛輕�����掩撌脣�憪见�");
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𡝗�蝡惩�蝐餃仃韐� {}", e.getMessage());
+        }
+
+        try {
+            Integer articleCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM articles WHERE created_by = 0 AND status = 'published'", Integer.class);
+            if (articleCount != null && articleCount > 0) {
+                log.info("蝘滚����撌脣��剁�頝唾��嘥�);
+            } else {
+                Map<String, Long> catIdMap = new HashMap<>();
+                jdbcTemplate.query(
+                    "SELECT id, name FROM article_categories WHERE name IN (', ', ', ', ')",
+                    (rs) -> {
+                        catIdMap.put(rs.getString("name"), rs.getLong("id"));
+                    });
+
+                if (catIdMap.size() == 5) {
+                    long bodyCatId = catIdMap.get(");
+                    long mindCatId = catIdMap.get(");
+                    long heartCatId = catIdMap.get(");
+                    long actionCatId = catIdMap.get(");
+                    long wealthCatId = catIdMap.get(");
+
+                    insertSeedArticle("憟賣偌�颱犖嚗𡁜振摨剖�摨瑚�銝��臬末瘞游�,
+                        "瘞湔糓�笔𦶢銋𧢲�嚗䔶�雿删�����脲偌�梹�隞擧偌韐券�㗇𥋘�圈幼瘞港��荔��祆�撠�蒂雿牐�閫��雿閖�朞�銝��臬末瘞湔��餃�摰嗡犖,
+                        "瘞渲◤敹質���𨯫�餌���銁�亙�摮虫葉嚗峕偌鋡怎妍銝暝"蝚砌�憭扯𨯫�餌�\"嚗𣬚���之憭𡁏㺭鈭箏蘨�單釣���銋���游蕭�乩��苷�銋���犖雿梶�60%�舀偌嚗諹�瘨脩�90%�舀偌嚗�之�𤑳�75%�舀偌��偌��捶�𧶏��湔𦻖�喳�鈭�澈雿梶�餈鞱蓮�����末瘞渡����嚗𡁜��冽糓蝚砌�雿滨�嚗�予�嗥��輻�韐典鉄�𤩺糓�惩�憿嫘���銝芸振摨剜��睃笆瘞渡���瘙���䕘�隞𦒘�憭拙�憪页�銝箏振鈭箏�憭���臬末瘞湛�撠望糓��蝞��閧��亙熒�閗�,
+                        "瘚㰘𪄳, 6, "body", 1);
+
+                    insertSeedArticle("�輻咱雿栞捶靚������烐�嚗䔶��㮖�鈭��,
+                        "銝剖龫霈淚"�亦�憭誯鵭嚗𣬚��嗅��蕚"嚗��蝡亦�雿栞捶靚��銋���園��烐𧒄�麄��𧋦����亙�����具��辺�牐�銝芰輕摨佗��𡃏�雿惩�雿蓥蛹摮拙��㮖��𡁜����摨瑕抅蝖�,
+                        "雿栞捶靚��嚗䔶�鈭�圾撘�憪卝���銝芸酋摮𣂼予�煺�韐其��䕘�鈭�圾摮拙����韐函掩�页��航����蝚砌�甇乓���雿譍�銝芷��烐�-3撗�抅蝖��滨𢥫���瘥滢像����𣂷�憭拍��𦯀�-7撗��������嚗��憌毺��瑯����嗅��𧶏�7-12撗���踹��脫�嚗屸�閬��頞喟��讠蒾韐具����𣬚輕�毺�D��振摨剛����韐游ㄚ嚗𡁏膥韏瑟��𠰴�撘箏��怠�嚗𣬚辺�齿部�帋�餈𥡝�瘨脣儐�荔����靚��靚�㟲擖桅��䔶���,
+                        "瘚㰘𪄳, 8, "body", 1);
+
+                    insertSeedArticle("鈭𠉛輕�亙熒�拚�嚗朞悟摮拙�銝�憭拙�瘞娍說,
+                        "銝��乩�霈∪銁鈭擧膥嚗峕𡟺擗鞟�韐券��湔𦻖敶勗�摮拙�銝�憭拍�摮虫�����諹澈雿梶𠶖�����隞質��碶�蝏渲𨯫�餌��拚�嚗諹悟摮拙�隞擧𡟺銝𠰴停��說�賡�,
+                        "銝箔�銋�𡟺擗𣂼�甇日�閬���𠉛弦銵冽�嚗���拚���酋摮𣂼銁瘜冽��䜘��扇敹������惩��寥𢒰�賣��曆�鈭𦒘���𡟺擗鞟�摮拙����蝏渲𨯫�餅𡟺擗𣂼�撘𧶏�隡䁅捶蝣單偌�𣂷���賒�賡�嚗䔶�韐刻��賣糓頨思�靽桀���抅蝖�嚗𣬚輕�毺��𣬚𣳽�抵捶憓𧼮撩�滨𢥫�𨥈��亙熒���靽��憭扯��𤏸�嚗𣬚��蠘��菜擪�𣳇��亙熒����鞱�敺讠��拚�銋䭾�嚗峕糓蝏坔酋摮鞉�憟賜��亙熒蝷潛�,
+                        "瘚㰘𪄳, 5, "body", 0);
+
+                    insertSeedArticle("DAN瘚贝�嚗𡁜��啣酋摮𣂷�隡𦯀��𣬚�憭抵�撖��",
+                        "瘥譍葵摮拙��賣糓�砌��牐�����AN憭𡁶輕霈斤䰻瘚贝�隞𤾸�憭抒輕摨血��Z圾霂餃酋摮鞟�霈斤䰻�寧�嚗�葬�拙振�踵𪄳�唳����摮拙�����輯楝敺�,
+                        "隞�銋�糓DAN瘚贝�嚗屓AN瘚贝��臭�憟堒抅鈭舘恕�亙���郎���撅訫���郎��捏���蝏渲�隡唬�蝟鳴�隞擧釣�誩���扇敹�����餉��萘輕��征�湔��乓��祗閮��賢��峕�蝏芰�閫��銝芰輕摨佗��券𢒰�讐�摮拙���恕�亙�撅訫㦛靚晞���霂���桃�銝齿糓蝏坔酋摮鞱斐��倌嚗諹�峕糓銝箏振�踵�靘𥕢�撟�"霈斤䰻�啣㦛\"���鈭��撘惩𧑐�橘�雿惩停�臭誑�㗇𥋘���摮拙�霈斤䰻�寧���郎銋䭾䲮瘜𤏪��𤑳緵瞏𨅯銁��予韏钅��笔�隞亙畺�鳴���笆�批𧑐霈剔���摹�航�,
+                        "瘚㰘𪄳, 7, "mind", 1);
+
+                    insertSeedArticle("�鞾鵭�𧢲�萘輕嚗𡁶�摮拙�銝��笔��函�敹��韏�𧋦",
+                        "�臬繿蝳誩之摮血���郎�蹱��∠�撠碍瑕噸�血��𠉛弦�𤑳緵嚗峕𥅾�㗇��踹��萘輕��酋摮鞉凒�踵��亙��烐�嚗屸𢒰撖寞𤨓�䀹𧒄�湔��扳�扼���雿訫畺�餃酋摮鞟��鞾鵭�𧢲�萘輕,
+                        "�箏��𧢲�萘輕��酋摮鞱恕銝暝"�賢��臬予�毺�嚗峕㺿�䀝�鈭�"嚗屸��啣𤌴�曉捆�𤘪𦆮撘����峕��踹��萘輕��酋摮鞟㮾靽﹏"�賢��臭誑�朞��芸��𣂼�\"嚗峕��烐�閫�蛹�鞾鵭��㦤隡𠾼���蝛嗅��堆�餈嗘舅蝘齿�萘輕璅∪�撖孵酋摮鞟�摮虫��𣂼停��犖���蝟餌��單𧊋�亦��䔶��穃��賣�瘛梯�敶勗����摮拙�摰峕�銝�隞嗡��塚�雿删��漤��孵��喳��滩�嚗朞”�砍𠜱�𥡝�屸��芣�嚗��瘜刻�甇亥�屸�蝏𤘪�嚗峕�憭梯揖�䀹�摮虫��箔�,
+                        "瘚㰘𪄳, 6, "mind", 0);
+
+                    insertSeedArticle("銝𤘪釣�𨥈��喳�摮拙�摮虫��������株�,
+                        "�其縑�舐��貊��嗡誨嚗䔶�瘜典��𣂷蛹��蝔�蝻箇��賢���𧋦����𤑳�摮西�摨西圾霂颱�瘜典���𧋦韐剁�撟嗥��箸���酋摮𣂷�瘜典�����冽䲮瘜�,
+                        "���憭批郎���憿寥鵭5撟渡�餈質葵�𠉛弦�𤑳緵嚗��摰帋�銝芯犖�𣂼�����舀惣����峕糓銝𤘪釣�𥕦��芣綉�䜘��酋摮鞟�銝𤘪釣�𥟇糓�讐�撟湧��鞉��穃����3撗�酋摮鞱�銝𤘪釣5-10���撗�酋摮鞱�銝𤘪釣15-20���0撗�誑銝𠰴虾隞乩�5-30�����聦�誩酋摮𣂷�瘜典����銝芯��荔�憸𤑳��𤘪鱏���隞餃𦛚撟嗉����摨血�瞈�������瘜典�����冽䲮瘜𤏪��芾�撌乩�5���銝𤘪釣���隡烐�嚗諹�撠𠉛鸌�寞聢瘥誩予5���霈剔�閫��銝𤘪釣嚗���喟�銋䭾�-5�����迤敹萄鐤��,
+                        "瘚㰘𪄳, 7, "mind", 0);
+
+                    insertSeedArticle("霂餅�摮拙����蝏芸����鈭脣�瘝罸�𡁶��箸钟",
+                        "摮拙��剝𣵛����暹����暺䀝�霂凌�色�行�銝芣�蝏芾��𡡞��劐�銝芣𧊋鋡急說頞喟���瘙���郎隡𡁜�曉𨯬摮拙����蝏芾祗閮�嚗峕糓撱箇�鈭脣�靽∩遙��洵銝�甇�,
+                        "��貌�臬酋摮鞉��笔���祗閮���笆鈭舘祗閮�銵刻噢�賢�撠𡁏𧊋�鞟���酋摮鞉䔉霂湛���貌�臭�隞祆��湔𦻖����𡁏䲮撘譌���摮拙��𤏸�瘞娍𧒄嚗䔶�����閬��銝齿糓鋡怠�甇g��峕糓鋡怎�閫����蝏芣𦻖蝥喳�甇交�嚗𡁜�銝𧢲䔉頩脖��乩�摮拙�撟唾�嚗�葬摮拙�蝏蹱�蝏芯�銝芸�摮梹�霈拙酋摮鞟䰻�𤘪��㗇�蝏芷��航◤��捂���銝�韏瑕粉�暹凒�����銵刻噢�孵����朞�蝏䀹𧋦���撣桀𨭌摮拙�霈方���貌嚗峕糓敺�末���蝏芸鍳�蹱䲮撘�,
+                        "瘚㰘𪄳, 6, "wisdom", 1);
+
+                    insertSeedArticle("摰嗅滬瘞𥕦凒嚗𡁜酋摮𣂼����摨瑞�蝚砌��笔ㄓ",
+                        "銝�銝芣萱�硔��迅摰𠾼���皛∠���振摨剔㴓憓���臬酋摮𣂼����摨瑟��𡁜�����栶��𧋦��䔝霈典�雿閗𨯫�删妖���摨瑞�摰嗅滬瘞𥕦凒嚗諹悟�勗銁摰嗅滬銝剜���,
+                        "<h2>摰嗅滬瘞𥕦凒���敶W�/h2><p>敹��摮衣�蝛嗉”�𠬍�摰嗅滬瘞𥕦凒撖孵�蝡乩犖�澆�撅閧�敶勗�頞��鈭�郎�⊥��脣�蝷曆��臬���酋摮𣂼停�譍��埈絲蝏蛛��䭾𧒄�惩�銝滚銁�豢𤣰��摰嗅滬銝剔���貌�賡�/p><p>憒��摰嗅滬瘞𥕦凒�舀萱�硔����整���摰寧�嚗�酋摮𣂼停隡𡁜�撅訫枂摰匧��麄��䌊靽∪��峕䔝蝝V��𣬚�������銋页�憒��摰嗅滬銝剖�皛∩�鈭匧閠���瞍惩��寡�嚗�酋摮𣂼停隡𡁜�敺㛖��㻫����蝻拇��偦��/p><h2>�仿�删妖��振摨剜��渡�銝㕑�/h2><p><b>1. �㕑�敺讠�隞芸�/b>����其�甈∠�摰嗅滬隡朞悅����𡁶�鈭脣���粉�園𡢿��𪂹�怎��瑕�瘣餃𢆡�婙�磰�鈭𥕦𤐄摰𡁶�隞芸�霈拙振摨剜��䀝��游遣蝡𧢲��蠘���/p><p><b>2. 蝘舀�瘝罸�𡁶�霂剛�銋䭾�</b>����沔"�髢"摮堒蘂銵刻噢�笔�嚗Ě"�烐��唳��寧敞\"嚗㚁�撠𤑳鍂\"雿癧"摮堒蘂��提嚗Ě"雿䭾�餅糓餈蹱甅\"嚗剹���憭抵秐撠𤏸秩�箔�隞嗅�澆�������/p><p><b>3. ��貌靽桀����/b>���蝒���舫��㵪��滩���糓�脩��𡒊�靽桀����霂𡁶��𤘪�嚗Ě"�𡁏�憒��撖嫣��𤏸�瘞𥪯�嚗�笆銝滩絲\"嚗㗇�摰𣬚�����脫凒�滩�/p><h2>�嗆����蝟餅糓摰嗅滬���瘚瑞�/h2><p>撖孵酋摮鞉䔉霂湛��笔��啁�瘥滨㮾�梧�瘥𥪯遙雿閙��脤��滩����靚鞟�憭怠氖�喟頂嚗�停�舐�摮拙���憟賜�敹��蝷潛�/p>",
+                        "瘚㰘𪄳, 7, "wisdom", 0);
+
+                    insertSeedArticle("瘥譍葵摮拙��賣糓憭拐蝙嚗𡁜銁銝滚�蝢𦒘葉�𤑳緵摰𣬚�",
+                        "�睲賑�餅糓�刻蕭瘙�"摰𣬚�撠誩酋\"嚗�㭂敹賜裦鈭��銝芸酋摮鞱澈銝𢠃�鈭𤤿𡠺�寧��㕑���郎隡𡁏𦻖蝥喳酋摮鞟�銝滚�蝢𠬍�銋蠘捂�舀�隞祈�蝏嗘�隞祉���憟賜���,
+                        "<h2>�曆�\"�思犖摰嗅酋摮𪀔"���/h2><p>\"雿删��衤犖摰嗅��𠬍�瘥𤩺活����賣糓蝚砌���"餈坔蘂霂嘥虾�賢銁敺��鈭箇�蝡亙僑�𣬚�銝贝��游蔣���隞砌�颲孵��蠘䌊撌梯◤瘥磰�嚗䔶�颲孵��其��芾��唳�颲�䌊撌梁�摮拙�/p><p>瘥譍葵摮拙��賣��芸楛����輯�憟譌�����酋摮鞱祗閮��𤏸��抬��厩�餈𣂼𢆡�賢�撘綽��厩��函冗鈭斗䲮�W予韏见�蝳���鍂蝏煺������縧銵⊿�銝滚���酋摮琜�撠勗��函��𤑳��賢��餉�隞瑚��⊿掉/p><h2>�贝�摮拙���迤��甅/h2><p>霂閧��嗘�敹�䔉嚗諹�撖煺���酋摮琜�隞碶�瘜冽𧒄�臭�銋�甅摮琜�隞硋�敹�𧒄�舀�𦒘�銵刻噢���隞㚚��啣𤌴�暹𧒄�臭�銋��摨䈑�敶㮖��曆����嚗䔶��滩���迤�贝��婙�娪�銝芰𡠺銝��牐�����笔𦶢/p><p>銋蠘捂隞𡝗㺭摮虫�憟踝�雿���厩�敹��銋蠘捂隞硋末�典�銝滢�嚗䔶���說�偦�惩�嚗𥕢�霈訾����銝滨�霂渲�嚗䔶�敹��萘��餃�閫�犖��/p><h2>�亦熙�舀�憟賜��躰�</h2><p>敶枏酋摮鞉��堒�鋡怠��冽𦻖蝥喇�婙�𥪜��砌�����孵�蝻箇��婙�𥪯�撠曹�撱箇�韏瑕��函�摰匧��麄���蝘滚��冽�嚗峕糓隞𡝗䔝蝝V��䎚��𢒰撖寞��条�摨閙���迤憒����郎摰嗆萱撠潛��寞�霂湛�\"摮拙�銝漤�閬��蝢𡒊��嗆�嚗�蘨��閬�"頞喳�憟穀"���瘥溻��"</p>",
+                        "瘚㰘𪄳, 5, "wisdom", 0);
+
+                    // 銵䕘�鈭粹��諹�
+                    insertSeedArticle("鈭脣��喟頂���銝芷��烐�,
+                        "憟賜�鈭脣��喟頂�𡏭�隞颱��躰��寞���𧋦���餌�鈭��銝芰�餈��頝菟�霂��鈭脣��喟頂瘜訫�嚗�葬�拐�銝𤾸酋摮𣂼遣蝡𧢲楛�𡁶����餈墧𦻖,
+                        "<h2>瘜訫�銝�嚗𡁻臁隡湔糓��憟賜�蝷潛�</h2><p>銝齿糓\"�其�韏愧"撠望糓�芯撈���韐券���臁隡湧�閬��蟡噼敞瘜兩�婙�娍𦆮銝𧢲��綽�頩脖��伐�餈𥕦�摮拙�����䎚���5��������臁隡湛��𡏭�銝��游予��澈�典�銝滚銁/p><h2>瘜訫�鈭䕘�撠𢠃��舐����/h2><p>撠𢠃�摮拙��誩㭠��嚗朞恕�笔笆敺������梹�銝滩蝠閫�����瘙��撠𢠃�隞𣇉�������隞𡝗��啗◤撠𢠃�嚗䔶��滢�摮虫�撠𢠃��思犖/p><h2>瘜訫�銝㚁��屸��舐���擪/h2><p>�曹�蝑劐�瘝⊥��屸�����啜����氬������閫��霈拙酋摮鞉��啣��具��瓷�㗇擪�讐�頝荔�摮拙�銝齿佅韏堆��㗇擪�讐�頝荔�摮拙��滩��芰眏憟磰�/p><h2>瘜訫��𨥈��曉𨯬瘥磰秩�䠷�/h2><p>敶枏酋摮鞉�霂渲��塚��曆�霂湔����嚗�蘨�航恕�笔𧑐�研���憭𡁏𧒄�辷�摮拙�銝漤�閬�����獢��隞硋蘨��閬�◤�祈�/p><h2>瘜訫�鈭䈑��躰秤�舀��輻��箔�</h2><p>瘝⊥�鈭箸糓摰𣬚����瘥㵪�銋�瓷�匧�蝢𡒊�摮拙���塳�嗘��舀�𤏪��滩���糓隞𡡞�霂臭葉摮虫����雿㰘��衣��W笆�芸楛���霂荔�摮拙�銋煺�摮虫���佅�W笆隞𣇉�銝滚�蝢�/p>",
+                        "瘚㰘𪄳, 5, "action", 1);
+
+                    insertSeedArticle("憭怠氖�喟頂嚗𡁜振摨剖兢蝳讐�蝚砌�憸埈緍,
+                        "憒���𠰴振摨剜�雿靝�隞嗉﹝�㵪�憭怠氖�喟頂撠望糓蝚砌�憸埈緍摮僐��洵銝�憸埈緍摮鞉緍撖嫣�嚗���Y�����芰�撠梢◇鈭����憟賜�憭怠氖�喟頂嚗峕糓蝏坔酋摮鞉�憟賜��鞾鵭蝷潛�,
+                        "<h2>銝箔�銋�井憒餃�蝟餅�鈭脣��喟頂�湧�/h2><p>�典振摨剔頂蝏煺葉嚗�井憒餃�蝟餅糓�詨�嚗䔶熔摮𣂼�蝟餅糓隞𤾸��喟頂���摨瑞�摰嗅滬璅∪�摨磰砲�荔�憭怠氖�喟頂 > 鈭脣��喟頂 > �毺�摰嗅滬�喟頂/p><p>敶枏井憒餃�蝟餌迅�綽�摮拙�隡帋��嗆�頨思�摮虫��啣�雿閧�鈭箝���雿閙��𠾼���雿訫����蝒����鈭偦��扳��莎�瘥𥪯遙雿閗紋蝔钅��滩�/p><h2>蝏讛𨯫憭怠氖�喟頂���銝芸�銋䭾�</h2><p><b>1. 瘥誩予15�����"憭怠氖�園𡢿\"</b>��酋摮𣂼��∪�嚗峕𦆮銝见振�∪��𧢲㦤嚗�蘨�航��𠰴予���靚�酋摮琜��芾�敶潭迨/p><p><b>2. 瘥誩𪂹銝�甈﹏"蝥虫�\"</b>����典����嚗䔶舅銝芯犖銝�韏瑟袇甇乓����箇㩞敶晞���憿輸平嚗峕𪄳�墧��望𧒄���閫�/p><p><b>3. �典酋摮鞾𢒰�㙡"蝘��拍�\"</b>��悟摮拙��见��嗆��交���秩\"�𤑳�雿癧"����豢�靚U����舀�憟賜��梁��躰�/p><h2>�脩�銋�糓�鞾鵭��㦤/h2><p>�踹��脩�銝齿糓�亙熒���憪颯���閬���臬�雿閗圾�喳�蝒��銝滨蕃�扯揭���鈭箄澈�餃稬����瑟����甈⊥��毺��脩�閫��嚗䔶�霈拙�蝟餅凒�牐熔撖�/p>",
+                        "瘚㰘𪄳, 6, "action", 0);
+
+                    insertSeedArticle("憒��撣桀𨭌摮拙�撱箇��亙熒��冗鈭文�",
+                        "蝷曆漱�賢��臬酋摮鞉𧊋�交��毺��詨��賢�銋衤����摰嗅滬�啣郎�∴�隞𡒊瑪銝𠰴�蝥蹂�嚗峕𧋦���靘𥕢�憟㛖頂蝏毺��輻咱蝷曆漱�賢��孵��寞�,
+                        "<h2>蝷曆漱�賢�隞𤾸振摨剖�/h2><p>摮拙���洵銝�銝芰冗鈭文��臬振摨准��銁摰嗅滬銝剖郎隡𡁶�瘝罸�𡁏䲮撘譌���鈭怎移蟡𧼮���貌蝞∠�嚗䔶��湔𦻖餈�宏�啣郎�∪�蝷曆���冗鈭支葉/p><p>�嗆�閬����糓嚗帋蛹摮拙��偦�惩��函�蝷曆漱蝏���臬�嚗諹�䔶��舀𤜯隞𤥁圾�喲䔮憸�/p><h2>��僑樴�挾蝷曆漱�孵��滨�</h2><p><b>3-5撗��摮虫���澈�諹蔭/b>���朞�皜豢��峕𠯫撣豢暑�剁�霈拙酋摮𣂷�撉��鈭怎�敹思����撘箄翰��澈嚗諹�峕糓撘訫紡摮拙���圾\"頧格�\"���敹�/p><p><b>6-8撗��摮虫�閫���脩�</b>���摮拙��峕��见��毺��暹𧒄嚗��撖潔�銵刻噢�芸楛����梹��曉𨯬撖寞䲮���瘜𤏪�銝�韏瑕粉�曇圾�單䲮獢�/p><p><b>9-12撗���孵��a����</b>����勗��惩𣪧�蠘��典�撠讐�憿寧𤌍嚗�郎銋惩銁�a�銝剖��亥䌊撌梁�隡睃飵嚗𣬚�閫��撠𢠃�隞碶犖�����/p><h2>敶枏酋摮鞾��啁冗鈭文𤌴�暹𧒄</h2><p>憒��摮拙��典郎�⊥��啣迨�祆�鋡急��歹�</p><ul><li>霈斤��曉𨯬隞𣇉��笔�嚗䔶�閬��乩�蝏坔遣/li><li>撣桀𨭌隞硋��啗䌊撌梁�隡睃飵嚗�遣蝡贝䌊靽∪�</li><li>�偦�㰘紋憭𣇉冗鈭斗㦤隡𡄯�憒��頞�号��冗�箸暑/li><li>敹���嗡����瘝罸�𡄯�鈭�圾摮行嵗�𣬚����</li></ul>",
+                        "瘚㰘𪄳, 7, "action", 0);
+
+                    // 撖䕘��拐��𥕦�
+                    insertSeedArticle("摮拙���揣��鍳�辷�隞𡡞妟�梢兝撘�,
+                        "韐W��躰�銝齿糓�坔酋摮𪀔"韏𡁻兝\"嚗諹�峕糓�孵�隞𣇉恣���皞鞟��箸��諹��䜘��妟�梢兝�臭�銝芰�雿喟��躰�撌亙�嚗諹悟摮拙��典�頝萎葉摮虫�閫����������澈,
+                        "<h2>銝箔�銋�揣����脣��滩�</h2><p>韐W�嚗㇅inancial Quotient, FQ嚗劐��箏������僎�𦯀蛹�唬誨蝷曆�銝匧之�詨�蝝㰘捶��揣����脖��舀�摮拙��笔⏚嚗諹�峕糓�嗘�憒��銝舘�皞𣂼遣蝡见�摨瑞��喟頂�婙�𥪜�雿閗��鉝���雿閖�㗇𥋘���雿訫辣餈�說頞喋���雿閙��拙���澈/p><h2>�嗉��勗�摨衣�暺��瘜訫�</h2><p><b>1. 摰𡁏𧒄蝏辷�銝滚�/b>����冽�瘥𤩺��箏��園𡢿�烐𦆮嚗䔶��煾�銝滚�餈��嚗諹悟摮拙�摮虫��冽��鞟�韏��銝剖��㗇𥋘/p><p><b>2. 銝劐葵摮睃�蝵鞉�/b>���憭��銝芰�摮琜�\"�刻�蝵𪀔"嚗��韏瑟䔉隞亙��剁���"瘨�晶蝵𪀔"嚗�虾隞仿��嗉������"��澈蝵𪀔"嚗����閬�葬�拍�鈭箸�銋啁兮�抬����銝�甈∪��圈妟�梢兝嚗峕��扳�靘见���/p><p><b>3. ��捂�舫�</b>��酋摮𣂼虾�賭��𢠃兝銝�甈⊥�扯��㚁�餈蹱糓隞硋郎銋删��箔����閬�悌�伐��峕糓�䔶�銝�韏瑕��矋�\"憒��銝𧢲活�齿䔉銝�甈∴�雿牐��𦒘��𡄯�\"</p><h2>�冽��曄�嚗峕�隞祈��瑕�</h2><p>�冽��曄�撟喳蝱嚗�酋摮𣂼虾隞仿�朞�摰峕�隞餃𦛚�������∟繮敺㛖妖����芸楛�喳�憒��雿輻鍂蝘臬��烐揢憟硋����蝘㙡"隞睃枂�坿繮敺轁��㗇𥋘\"��𡡒�荔�霈拙酋摮𣂼銁�笔��箸艶銝剝𤫇�潸揣��/p>",
+                        "瘚㰘𪄳, 6, "wealth", 1);
+
+                    insertSeedArticle("摰嗅滬��揣�仿秄嚗𡁶鍂�梁恣��振摨剛揣,
+                        "摰嗅滬��揣銝滚蘨�舐恣�梧��湔糓蝞∠�摰嗅滬��兢蝳誩�摰匧��麄���銝芸�摨瑞�摰嗅滬韐W𦛚雿梶頂嚗諹悟瘥譍葵摰嗅滬�𣂼��質�摰匧�餈賣�璇行�,
+                        "<h2>摰嗅滬��揣��𧋦/h2><p>敺��鈭箄�敺㛖�韐W停�舀�韏�����梧�雿��摰𧼮振摨剔�韐Y��祈捶�荔��冽��鞟�韏��嚗���啣振摨剜�憭抒�撟貊������鉄�𥕢葵撅�𢒰嚗帋��栶���韐嫘������憓𧼮��/p><h2>摰嗅滬��揣�𥟇郊/h2><p><b>蝚砌�甇伐�撱箇�摰嗅滬韐行𧋦</b>��扇敶蓥�銝芣���𤣰�荔��墧�璆𡁻兝�勗銁�芷���綫�𣂷蝙�沔"銝劐葵韐行�\"瘜𤏪��亙虜撘���韐行�������韏�揭�瑯��迂銋鞉��輯揭��/p><p><b>蝚砌�甇伐�撱箇�摨娍�亙抅/b>���-6銝芣����瘣餉晶嚗峕𦆮�券��嗅虾�𣇉��唳䲮���蝚娪兝�臬振摨剔�\"摰匧��俞"/p><p><b>蝚砌�甇伐�������瘨�晶</b>���銝芣��嗅��啗揭�𠬍�����梧��嗅�0%-30%嚗㚁��滚��埝�韐嫘����臭�蝘滚撩�嗅����銋䭾�/p><p><b>蝚砍�甇伐��閗�摮拙���𧊋/b>��膄鈭���脣�����湧�閬���舀�韏�銁摮拙�����𥕦畺�颱��婙�娪�霂颯��䔝蝝U���撉�/p><h2>蝏坔酋摮鞟�韐W�/h2><p>隞𤾸��孵�甇�&��揣撖諹�嚗𡁻兝�臬極�瘀�銝齿糓�桃�嚗𥡝揣撖峕䔉皞𣂷��偦�牐遠�潘���澈霈抵揣撖峕凒�㗇�銋剹���鈭𥡝�敹萎�敶勗�摮拙�銝��毺�韐W�銋贝楝/p>",
+                        "瘚㰘𪄳, 6, "wealth", 0);
+
+                    insertSeedArticle("�𥕦恥�鞾鵭霈∪�嚗𡁜銁�拐�銝剜�撠梯䌊,
+                        "瘚㰘𪄳蝳誩�摰Z恣�雴蛹瘥譍葵摰嗅滬�𣂷�鈭���冽����摰X㦤隡𠾼��銁餈䠷�嚗䔶�銝滢��賢��瑕�憸嘥��嗅�嚗峕凒�賢銁撣桀𨭌隞碶犖���蝔衤葉摰䂿緵�芣��鞾鵭,
+                        "<h2>隞�銋�糓�𥕦恥�鞾鵭霈∪�</h2><p>�𥕦恥�鞾鵭霈∪��舀��曄��㯄�删��拐��𥕦��������隞祉㮾靽∴���憟賜����璅∪��珮"�拐�\"�婙�娪�朞���澈隡䁅捶��漣����滚𦛚嚗�葬�拇凒憭𡁜振摨剛繮敺堒兢蝳𧶏��峕𧒄銋笔��啗䌊頨怎�隞瑕��/p><h2>銝箔�銋��㗇𥋘�𣂷蛹�𥕦恥</h2><p><b>雿𡡞秄瑽𥕦鍳/b>嚗帋���閬�之�讛��𡢅�銝漤�閬�𥿢韐改��芷�閬��憸埈��誩�鈭怎�敹�/p><p><b>�鞾鵭雿梶頂摰��</b>嚗帋��萘漣�𥕦恥�圈�蝥批�隡嗘犖嚗峕�銝�甇仿��㗇��啁��鞾鵭頝臬��屸�憟堒畺霈�/p><p><b>�拐��喳⏚/b>嚗𡁜�雿䭾�憟賜�鈭批��峕��∪�鈭怎�頨怨器����页�撣桀𨭌隞碶賑�孵�摰嗅滬�亙熒�𣬚�瘣餃�韐剁�餈嗵�隞瑕�潭��祈澈撠望糓��憭抒��墧𥁒/p><h2>�𥕦恥���/h2><p>�拇膥嚗䔶��冽��见���澈鈭��蝭��鈭𤾸�蝡亥𨯫�餌�憟賣�蝡𩤃�銝剖�嚗峕��见�蝘�縑�刻砭雿惩�鈭𤾸酋摮𣂷�韐刻����撱箄悅嚗𥕢����雿惩銁�𥕦恥蝷曄黎���鈭���箇瑪銝𠰴畺霈哨��帋�嚗䔶��嗉繮鈭��隞質恥�訫�皛⊥說���撠望�/p><p>餈坔停�臬�摰Y���暑�婙�𥪜銁摮虫����鈭思葉嚗���啣振摨凋�鈭衤�����齿���/p>",
+                        "瘚㰘𪄳, 5, "wealth", 0);
+
+                    log.info("鈭𠉛輕蝘滚����撌脣�憪见�嚗��15蝭��");
+                } else {
+                    log.warn("�����掩銝滚��湛�頝唾�蝘滚�����嘥�);
+                }
+            }
+        } catch (Exception e) {
+            log.warn("�嘥��𣇉�摮鞉�蝡惩仃韐� {}", e.getMessage());
+        }
+    }
+
+    private void insertSeedArticle(String title, String summary, String content,
+                                    String author, int readTime, String dimensionCode, int isFeatured) {
+        try {
+            // �亥砭��掩ID
+            String dimCatMap = dimensionCode.equals("body") ? "
+                : dimensionCode.equals("mind") ? "
+                : dimensionCode.equals("wisdom") ? "
+                : dimensionCode.equals("action") ? "
+                : dimensionCode.equals("wealth") ? " : ";
+            Long categoryId = jdbcTemplate.queryForObject(
+                "SELECT id FROM article_categories WHERE name = ?", Long.class, dimCatMap);
+
+            if (categoryId == null) {
+                log.warn("�芣𪄳�啣� {}, 頝唾����: {}", dimCatMap, title);
+                return;
+            }
+
+            jdbcTemplate.update(
+                "INSERT INTO articles (category_id, title, summary, content, author, read_time, " +
+                "related_dimensions, status, audit_status, is_featured, visibility, content_type, " +
+                "article_type, word_count, published_at, created_by, created_at, updated_at) " +
+                "VALUES (?, ?, ?, ?, ?, ?, ?, 'published', 'approved', ?, 'public', 'article', " +
+                "'original', ?, NOW(), 0, NOW(), NOW())",
+                categoryId, title, summary, content, author, readTime,
+                dimensionCode, isFeatured, content.length()
+            );
+            log.info("撌脣�撱箇�摮鞉� {}", title);
+        } catch (Exception e) {
+            log.warn("�𥕦遣蝘滚����憭梯揖 [{}]: {}", title, e.getMessage());
+        }
+
+        // 餈�宏42: �𥕦遣�嗉揮鈭箄”嚗�鉄韐凋僭�����寞�靽⊥�
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS consignees (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '��撅䂿鍂�弒D', " +
+                    "name VARCHAR(100) NOT NULL COMMENT '�嗉揮鈭箏�, " +
+                    "phone VARCHAR(20) COMMENT '�𧢲㦤��', " +
+                    "id_card VARCHAR(20) COMMENT '頨思遢霂�噡', " +
+                    "hand_signature TEXT COMMENT '�讠倌base64�曄��𨯅RL)', " +
+                    "ethnicity VARCHAR(20) COMMENT '瘞烐�', " +
+                    "blood_type VARCHAR(20) COMMENT '銵�, " +
+                    "address VARCHAR(500) COMMENT '�嗉揮�啣�', " +
+                    "is_default TINYINT(1) DEFAULT 0 COMMENT '�臬炏暺䁅恕�嗉揮, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_user_id (user_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='�嗉揮鈭箔縑�荔��怨揚銋唳����寞�靽⊥�");
+            log.info("撌脣�撱構onsignees);
+        } catch (Exception e) {
+            log.warn("�𥕦遣consignees銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏42: �𥕦遣���韐凋僭靽⊥�摮埈挾�滨蔭
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS product_purchase_fields (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "product_id BIGINT NOT NULL COMMENT '���ID', " +
+                    "field_key VARCHAR(50) NOT NULL COMMENT '摮埈挾���', " +
+                    "field_name VARCHAR(100) NOT NULL COMMENT '�曄內, " +
+                    "is_required TINYINT(1) DEFAULT 1 COMMENT '�臬炏敹�‵', " +
+                    "sort_order INT DEFAULT 0 COMMENT '�鍦�', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_product_id (product_id), " +
+                    "UNIQUE KEY uk_product_field (product_id, field_key)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='���韐凋僭靽⊥�摮埈挾�滨蔭'");
+            log.info("撌脣�撱歉roduct_purchase_fields);
+        } catch (Exception e) {
+            log.warn("�𥕦遣product_purchase_fields銵典虾�賢歇摮睃銁: {}", e.getMessage());
+        }
+
+        // 餈�宏42: product_orders銵冽溶�蠏onsignee_id�俰urchase_info摮埈挾
+        ensureColumn("product_orders", "consignee_id", "BIGINT COMMENT '�嗉揮鈭截D'");
+        ensureColumn("product_orders", "purchase_info", "TEXT COMMENT '韐凋僭靽⊥�JSON: {id_card, hand_signature, ...}'");
+
+    }
+
+    private void insertSysConfigSeed(String key, String value, String desc) {
+        Integer count = jdbcTemplate.queryForObject(
+            "SELECT COUNT(*) FROM sys_config WHERE config_key = ?", Integer.class, key);
+        if (count == null || count == 0) {
+            jdbcTemplate.update(
+                "INSERT INTO sys_config (config_key, config_value, description, updated_at) VALUES (?, ?, ?, NOW())",
+                key, value, desc);
+        }
+    }
+
+    private void initFoodTables() {
+        log.info("撘�憪见�憪见�憌笔��詨�..");
+
+        // 4撘䭾鰵(CREATE TABLE IF NOT EXISTS)
+        String[] ddl = {
+            "CREATE TABLE IF NOT EXISTS foods ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
+            + "category VARCHAR(50) COMMENT '��掩: �祈�/瘞湔�/�厩汗/瘞港漣/�见扒/鞊�掩/靚瑞�/靚�㭠/�嗡�', "
+            + "unit VARCHAR(20) DEFAULT 'g' COMMENT '霈⊿��蓥�', "
+            + "calories DECIMAL(8,2) COMMENT '�剝�(kcal/100g)', "
+            + "protein DECIMAL(8,2) COMMENT '�讠蒾g/100g)', "
+            + "fat DECIMAL(8,2) COMMENT '���(g/100g)', "
+            + "carbs DECIMAL(8,2) COMMENT '蝣單偌(g/100g)', "
+            + "fiber DECIMAL(8,2) COMMENT '�喲�蝥斤輕(g/100g)', "
+            + "price_level TINYINT COMMENT '隞瑟聢蝑厩漣 1-5', "
+            + "nutrition_tags VARCHAR(500) COMMENT '�亙���倌JSON', "
+            + "suitable_for VARCHAR(200) COMMENT '���鈭箇黎JSON', "
+            + "allergens VARCHAR(200) COMMENT '餈���𠴨SON', "
+            + "external_source VARCHAR(100) COMMENT '�唳旿�交�', "
+            + "external_id VARCHAR(100) COMMENT '憭㚚�ID', "
+            + "cover_image VARCHAR(500) COMMENT '憌���曄�', "
+            + "status VARCHAR(20) DEFAULT 'active', "
+            + "sort_order INT DEFAULT 0, "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "INDEX idx_category (category), "
+            + "INDEX idx_price (price_level)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS recipes ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "name VARCHAR(200) NOT NULL COMMENT '憌蠘停�滨妍', "
+            + "meal_type VARCHAR(20) COMMENT '�拚�/���/�𡁻�/�𣳇�', "
+            + "description TEXT COMMENT '蝞�, "
+            + "ingredients TEXT NOT NULL COMMENT '憌��皜��JSON', "
+            + "steps TEXT COMMENT '�寥左甇仿炊JSON', "
+            + "cook_time INT COMMENT '�寥左�園𡢿(���)', "
+            + "difficulty VARCHAR(20) COMMENT '�曉漲: 蝞�銝剔�/�圈𠗕', "
+            + "total_calories DECIMAL(8,2) COMMENT '�餌�, "
+            + "total_protein DECIMAL(8,2) COMMENT '�餉��質捶', "
+            + "total_fat DECIMAL(8,2) COMMENT '�餉�, "
+            + "total_carbs DECIMAL(8,2) COMMENT '�餌4, "
+            + "total_fiber DECIMAL(8,2) COMMENT '�餉�憌毺漱, "
+            + "suitable_for VARCHAR(200) COMMENT '����箸艶', "
+            + "nutrition_tags VARCHAR(500) COMMENT '�亙���倌', "
+            + "external_source VARCHAR(100), "
+            + "external_id VARCHAR(100), "
+            + "cover_image VARCHAR(500), "
+            + "status VARCHAR(20) DEFAULT 'active', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "INDEX idx_meal_type (meal_type), "
+            + "INDEX idx_cook_time (cook_time)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS seasonal_foods ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "food_id BIGINT NOT NULL COMMENT '�唾�foods.id', "
+            + "month TINYINT NOT NULL COMMENT '��遢 1-12', "
+            + "region VARCHAR(50) DEFAULT '�典𤙴' COMMENT '鈭批𧑐', "
+            + "peak_flag TINYINT DEFAULT 0 COMMENT '�𥕢漣���', "
+            + "sort_order INT DEFAULT 0, "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "INDEX idx_food_month (food_id, month), "
+            + "INDEX idx_month (month)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS meal_logs ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
+            + "child_id BIGINT COMMENT '摮拙�ID', "
+            + "meal_type VARCHAR(20) NOT NULL COMMENT '�拚�/���/�𡁻�/�𣳇�', "
+            + "meal_date DATE NOT NULL COMMENT '�券��交�', "
+            + "meal_time DATETIME COMMENT '�瑚��園𡢿', "
+            + "foods TEXT NOT NULL COMMENT '憌毺�皜��JSON', "
+            + "total_calories DECIMAL(8,2) COMMENT '�餌�, "
+            + "total_protein DECIMAL(8,2) COMMENT '�餉��質捶', "
+            + "total_fat DECIMAL(8,2) COMMENT '�餉�, "
+            + "total_carbs DECIMAL(8,2) COMMENT '�餌4, "
+            + "total_fiber DECIMAL(8,2) COMMENT '�餉�憌毺漱, "
+            + "note TEXT COMMENT '憭�釣', "
+            + "images VARCHAR(1000) COMMENT '�曄�JSON', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "INDEX idx_user_date (user_id, meal_date), "
+            + "INDEX idx_child_date (child_id, meal_date)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS report_food_suitability ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "report_id BIGINT NOT NULL COMMENT '�亙熒�亙�ID', "
+            + "food_id BIGINT COMMENT '憌��ID', "
+            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
+            + "category VARCHAR(50) COMMENT '��掩', "
+            + "score INT NOT NULL COMMENT '���摨西�, "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "INDEX idx_report (report_id), "
+            + "INDEX idx_food (food_id)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS user_food_preference ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
+            + "food_id BIGINT COMMENT '憌��ID', "
+            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
+            + "score INT NOT NULL DEFAULT 0 COMMENT '霂��', "
+            + "reason VARCHAR(500) COMMENT '�笔�', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "INDEX idx_user (user_id)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS food_nutrients ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "food_id BIGINT NOT NULL COMMENT '憌��ID', "
+            + "nutrient_code VARCHAR(20) NOT NULL COMMENT '�亙�蝝删�, "
+            + "amount_per_100g DECIMAL(10,4) NOT NULL COMMENT '00g�恍�', "
+            + "unit VARCHAR(20) NOT NULL COMMENT '�蓥�', "
+            + "source VARCHAR(50) DEFAULT 'importer' COMMENT '�唳旿�交�', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "UNIQUE KEY uk_food_nutrient (food_id, nutrient_code), "
+            + "INDEX idx_nutrient (nutrient_code)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS rdi_standards ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "nutrient_code VARCHAR(20) NOT NULL COMMENT '�亙�蝝删�, "
+            + "age_group VARCHAR(10) NOT NULL COMMENT '撟湧�, "
+            + "gender VARCHAR(6) DEFAULT 'all' COMMENT '�批�', "
+            + "rdi_type VARCHAR(10) NOT NULL COMMENT '����掩, "
+            + "amount DECIMAL(10,4) NOT NULL COMMENT '�刻�, "
+            + "unit VARCHAR(20) NOT NULL COMMENT '�蓥�', "
+            + "source VARCHAR(100) COMMENT '�唳旿�交�', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "UNIQUE KEY uk_rdi (nutrient_code, age_group, gender, rdi_type), "
+            + "INDEX idx_age (age_group)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS shopping_lists ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "user_id BIGINT NOT NULL COMMENT '�冽�ID', "
+            + "child_id BIGINT COMMENT '摮拙�ID', "
+            + "report_id BIGINT COMMENT '�亙熒�亙�ID', "
+            + "title VARCHAR(200) COMMENT '���', "
+            + "source VARCHAR(20) NOT NULL COMMENT '�交�', "
+            + "status VARCHAR(20) DEFAULT 'active' COMMENT '�嗆��, "
+            + "total_items INT DEFAULT 0 COMMENT '�駁★, "
+            + "purchased_items INT DEFAULT 0 COMMENT '撌脰揚憿寞㺭', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "INDEX idx_user (user_id), "
+            + "INDEX idx_report (report_id), "
+            + "INDEX idx_status (status)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS shopping_list_items ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "list_id BIGINT NOT NULL COMMENT '韐剔�皜��ID', "
+            + "food_id BIGINT COMMENT '憌��ID', "
+            + "food_name VARCHAR(100) NOT NULL COMMENT '憌���滨妍', "
+            + "category VARCHAR(50) COMMENT '��掩', "
+            + "quantity DECIMAL(8,2) DEFAULT 1 COMMENT '�圈�', "
+            + "unit VARCHAR(20) DEFAULT ' COMMENT '�蓥�', "
+            + "priority VARCHAR(10) DEFAULT 'medium' COMMENT '隡睃�, "
+            + "reason VARCHAR(200) COMMENT '�刻��笔�', "
+            + "score INT COMMENT '霂��', "
+            + "source VARCHAR(20) COMMENT '�交�', "
+            + "purchased TINYINT DEFAULT 0 COMMENT '�臬炏撌脰揚', "
+            + "purchased_at DATETIME COMMENT '韐凋僭�園𡢿', "
+            + "sort_order INT DEFAULT 0 COMMENT '�鍦�', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "INDEX idx_list (list_id), "
+            + "INDEX idx_purchased (purchased)"
+            + ");",
+
+            "CREATE TABLE IF NOT EXISTS follow_up ("
+            + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
+            + "family_id BIGINT NOT NULL COMMENT '摰嗅滬ID', "
+            + "child_id BIGINT COMMENT '摮拙�ID', "
+            + "teacher_id BIGINT COMMENT '閫��撣㇆D', "
+            + "deficiency_id BIGINT COMMENT '蝻箔�憿遐D', "
+            + "message_id BIGINT COMMENT '瘨��ID', "
+            + "status VARCHAR(20) DEFAULT 'pending' COMMENT '�嗆��, "
+            + "priority VARCHAR(10) DEFAULT 'medium' COMMENT '隡睃�, "
+            + "description VARCHAR(500) COMMENT '�讛膩', "
+            + "parent_feedback TEXT COMMENT '摰園鵭�漤�', "
+            + "teacher_review VARCHAR(500) COMMENT '閫��撣��, "
+            + "due_date DATETIME COMMENT '�芣迫�交�', "
+            + "completed_at DATETIME COMMENT '摰峕��園𡢿', "
+            + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
+            + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+            + "INDEX idx_family (family_id), "
+            + "INDEX idx_teacher (teacher_id), "
+            + "INDEX idx_status (status), "
+            + "INDEX idx_due (due_date)"
+            + ");"
+        };
+
+        for (String sql : ddl) {
+            try {
+                jdbcTemplate.execute(sql);
+            } catch (Exception e) {
+                log.warn("憌笔�銵求DL�扯�憭梯揖(�航�撌脣���: {}", e.getMessage());
+            }
+        }
+
+        // �拙� user_nutrition_profile嚗���𡏭”銝滚��典�頝唾�
+        ensureColumn("user_nutrition_profile", "budget_monthly", "INT COMMENT '������'");
+        ensureColumn("user_nutrition_profile", "family_taste_preferences", "TEXT COMMENT '摰嗅滬�𣂼���㭠�誩末JSON'");
+        ensureColumn("user_nutrition_profile", "cuisine_style", "VARCHAR(100) COMMENT '�誩末�𦦵頂'");
+        ensureColumn("user_nutrition_profile", "meal_count", "INT DEFAULT 3 COMMENT '瘥𤩺𠯫擗鞉㺭'");
+        ensureColumn("user_nutrition_profile", "cooking_ability", "VARCHAR(20) DEFAULT 'simple' COMMENT '�寥左�賢�: simple/medium/advanced'");
+
+        log.info("憌笔��詨�銵典�憪见�摰峕�");
+    }
+
+    private void ensureColumn(String table, String column, String definition) {
+        try {
+            jdbcTemplate.execute("ALTER TABLE " + table + " ADD COLUMN " + column + " " + definition);
+            log.info("撌脫溶�惩� {}.{}", table, column);
+        } catch (Exception e) {
+            if (e.getMessage() != null && e.getMessage().contains("Duplicate column")) {
+                log.info("{}.{} 撌脣��剁�頝唾�", table, column);
+            } else {
+                log.warn("瘛餃�頧緹}.{} 憭梯揖: {}", table, column, e.getMessage());
+            }
+        }
+    }
+
+    private void insertProductSeed(String name, String desc, String type,
+                                Integer price,
+                                String domain, String memberEligible) {
+        Integer count = jdbcTemplate.queryForObject(
+            "SELECT COUNT(*) FROM products WHERE name = ? AND product_type = ?", Integer.class, name, type);
+        if (count == null || count == 0) {
+            jdbcTemplate.update(
+                "INSERT INTO products (name, description, price, product_type, vendor_id, vendor_name, status, domain, member_eligible, created_at, updated_at) " +
+                "VALUES (?, ?, ?, ?, NULL, '撟喳蝱摰䀹䲮', 'on_shelf', ?, ?, NOW(), NOW())",
+                name, desc, price, type, domain, memberEligible);
+        }
+    }
+
+    private void insertContentSectionSeed(String pageKey, String sectionKey, String title,
+                                        String allowedRoles, int sortOrder) {
+        Integer count = jdbcTemplate.queryForObject(
+            "SELECT COUNT(*) FROM content_sections WHERE page_key = ? AND section_key = ?",
+            Integer.class, pageKey, sectionKey);
+        if (count == null || count == 0) {
+            jdbcTemplate.update(
+                "INSERT INTO content_sections (page_key, section_key, title, allowed_roles, sort_order, status, created_at, updated_at) " +
+                "VALUES (?, ?, ?, ?, ?, 'active', NOW(), NOW())",
+                pageKey, sectionKey, title, allowedRoles, sortOrder);
+        }
+    }
+}

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-a494f04a3357024d85fea51a3f96a691d9f31512
+34d2b3dad38bab6b3cd5bf8b0ce43e5879b83234

+ 25 - 0
cfc-web/CHANGELOG.md

@@ -1,6 +1,31 @@
 # 更新日志 (Changelog)
 
 此文件记录所有构建版本的变更。
+## v1.0.42 (2026-07-09)
+
+### 新功能
+- enhance health reports page and add draft audit UI
+
+### 其他
+- - HealthReportAudit.vue: new draft audit page with detail dialog (indicators/gut flora/disease risk tabs)
+- - Router + sidebar: register /health-report-audit route and menu entry
+- Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent)
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+- - HealthReportController: add POST /api/health/report/admin-list endpoint
+- - HealthReportService: add listAllReportsForAdmin() with childName resolution
+- - UpdateUserDTO: fix stale git conflict markers
+- Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent)
+- Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
+- 
+
+### Bug 修复
+- improve health report scoring and add admin report list
+
+### 工程化
+- auto bump version and changelog [skip ci]
+
+
 ## v1.0.41 (2026-07-09)
 
 ### 工程化

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.40",
+  "version": "1.0.41",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.40",
+      "version": "1.0.41",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
   "name": "cfc-web",
-  "version": "1.0.41",
+  "version": "1.0.42",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",