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

fix(schema): schema.sql 同步补充 79 张缺失表的 CREATE TABLE 定义

Wave 5 fix:
- 37 张表: 从 DatabaseInitializer.runMigration* 提取 CREATE TABLE 语句
- 42 张表: 从 entity @TableField/pojo 字段反向生成 CREATE TABLE
- 验证: 无重复表名, mvn clean compile 通过
Xiaogang Liao 2 месяцев назад
Родитель
Сommit
9ef56b91ca
1 измененных файлов с 855 добавлено и 0 удалено
  1. 855 0
      cfc-backend/src/main/resources/schema.sql

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

@@ -2937,3 +2937,858 @@ CREATE TABLE family_earnings_record (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭收益收支流水';
 
 ALTER TABLE commission_records ADD COLUMN family_id BIGINT COMMENT '归属家庭ID';
+
+
+-- ========== Schema.sql 补充: 从 DatabaseInitializer 同步的表 ==========
+
+-- after_sales_requests
+
+CREATE TABLE IF NOT EXISTS after_sales_requests (id BIGINT AUTO_INCREMENT PRIMARY KEY,order_id BIGINT NOT NULL COMMENT '订单ID',order_no VARCHAR(32) NOT NULL COMMENT '订单号',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 '处理人ID',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='售后申请';
+
+-- article_reading_records
+
+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='文章阅读记录表';
+
+-- bazi_reading_template
+
+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='五行命理解读模板';
+
+-- cart_items
+
+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='购物车';
+
+-- contacts
+
+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='联系人表';
+
+-- dan_knowledge_base
+
+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='知识库表';
+
+-- dan_knowledge_base_dimension
+
+CREATE TABLE IF NOT EXISTS dan_knowledge_base_dimension (id BIGINT PRIMARY KEY AUTO_INCREMENT, knowledge_id BIGINT NOT NULL COMMENT '知识库ID', 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='知识-维度关联表';
+
+-- dan_knowledge_base_tag
+
+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='知识-标签关联表';
+
+-- dan_knowledge_tag
+
+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='标签表';
+
+-- distribution_relations
+
+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='销售关系';
+
+-- distribution_systems
+
+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 '创建者ID',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='销售体系';
+
+-- emotion_checkin
+
+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 '打卡人用户ID', 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='情绪打卡表';
+
+-- health_checkins
+
+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='健康打卡表';
+
+-- health_disease_risk
+
+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='疾病风险评估数据';
+
+-- health_gut_flora
+
+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='菌群检测专项数据';
+
+-- health_report_survey
+
+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='报告调研问卷';
+
+-- numsoul_config
+
+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='生命灵数配置';
+
+-- nutrition_deficiency_record
+
+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='营养缺乏分析记录';
+
+-- nutrition_indicator_mapping
+
+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='指标-营养素映射表';
+
+-- product_dimension_config
+
+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,无父级为NULL', 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='维度配置表';
+
+-- promotion_tier_config
+
+CREATE TABLE IF NOT EXISTS promotion_tier_config (id BIGINT AUTO_INCREMENT PRIMARY KEY, tier_code VARCHAR(10) NOT NULL UNIQUE COMMENT '等级编码: R0/R1/R2/R3/R4', tier_name VARCHAR(50) NOT NULL COMMENT '等级名称', min_team_size_1st INT NOT NULL DEFAULT 0 COMMENT '一级团队人数下限', min_team_size_2nd INT NOT NULL DEFAULT 0 COMMENT '二级团队人数下限', min_total_referral_earnings INT NOT NULL DEFAULT 0 COMMENT '累计推荐佣金下限(分)', min_total_share_earnings INT NOT NULL DEFAULT 0 COMMENT '累计消费返利下限(分)', commission_rate_l1 INT NOT NULL DEFAULT 0 COMMENT 'L1佣金比例(%)', commission_rate_l2 INT NOT NULL DEFAULT 0 COMMENT 'L2佣金比例(%)', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='推广等级阈值配置';
+
+-- shop_categories
+
+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 '父分类ID(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='商品类目';
+
+-- shop_discount_rules
+
+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 '满减门槛(分,仅THRESHOLD)',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='折扣规则';
+
+-- trial_memberships
+
+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;
+
+-- user_profile_history
+
+CREATE TABLE IF NOT EXISTS user_profile_history (id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL COMMENT '用户ID', field_name VARCHAR(64) NOT NULL COMMENT '变更字段名', old_value TEXT COMMENT '旧值', new_value TEXT COMMENT '新值', source VARCHAR(32) DEFAULT 'user' COMMENT '变更来源: user/admin/auto', changed_at DATETIME NOT NULL COMMENT '变更时间', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_ph_user (user_id), INDEX idx_ph_field (field_name), INDEX idx_ph_changed (changed_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息变更历史表';
+
+-- follow_up
+
+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 '规划师ID', deficiency_id BIGINT COMMENT '缺乏项ID', 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);
+
+-- food_nutrients
+
+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 '每100g含量', 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);
+
+-- foods
+
+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 '过敏原JSON', 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);
+
+-- meal_logs
+
+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 '总碳水', 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);
+
+-- product_skus
+
+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';
+
+-- rdi_standards
+
+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);
+
+-- recipes
+
+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 '总碳水', 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);
+
+-- report_food_suitability
+
+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);
+
+-- seasonal_foods
+
+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);
+
+-- shopping_list_items
+
+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);
+
+-- shopping_lists
+
+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);
+
+-- user_food_preference
+
+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);
+
+
+
+-- ========== Schema.sql 补充: 从 entity 反向生成的表 ==========
+
+-- article_quiz_records
+
+CREATE TABLE IF NOT EXISTS article_quiz_records (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    article_id BIGINT,
+    user_id BIGINT,
+    child_id BIGINT,
+    questions VARCHAR(255),
+    answers VARCHAR(255),
+    score INT,
+    points_earned INT,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- assessment_results
+
+CREATE TABLE IF NOT EXISTS assessment_results (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    child_id BIGINT,
+    teacher_id BIGINT,
+    appointment_id BIGINT,
+    attention_score INT,
+    focus_score INT,
+    memory_score INT,
+    logic_score INT,
+    overall_score INT,
+    assessment_date DATETIME,
+    duration_minutes INT,
+    analysis_report VARCHAR(255),
+    growth_suggestions VARCHAR(255),
+    next_review_date DATETIME,
+    status VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME,
+    child_name VARCHAR(255),
+    child_birthday DATETIME,
+    child_gender VARCHAR(255),
+    child_age INT,
+    school VARCHAR(255),
+    grade VARCHAR(255),
+    grade_class VARCHAR(255),
+    height INT,
+    weight INT,
+    family_status VARCHAR(255),
+    parent_degree VARCHAR(255),
+    nation VARCHAR(255),
+    province VARCHAR(255),
+    city VARCHAR(255),
+    district VARCHAR(255),
+    address VARCHAR(255),
+    single_child VARCHAR(255),
+    school_score VARCHAR(255),
+    urgent_name VARCHAR(255),
+    urgent_phone VARCHAR(255),
+    pics VARCHAR(255),
+    videos VARCHAR(255),
+    audio VARCHAR(255),
+    audio_url VARCHAR(255),
+    process_desc VARCHAR(255),
+    result_desc VARCHAR(255)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- cognitive_norms
+
+CREATE TABLE IF NOT EXISTS cognitive_norms (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    dimension_key VARCHAR(255),
+    gender VARCHAR(255),
+    age_min INT,
+    age_max INT,
+    percentile5 INT,
+    percentile25 INT,
+    percentile50 INT,
+    percentile75 INT,
+    percentile95 INT,
+    source VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- contact_match_requests
+
+CREATE TABLE IF NOT EXISTS contact_match_requests (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    requester_id BIGINT,
+    target_user_id BIGINT,
+    contact_id BIGINT,
+    status VARCHAR(255),
+    message VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- daily_checkin
+
+CREATE TABLE IF NOT EXISTS daily_checkin (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    checkin_date DATETIME,
+    diet_score INT,
+    exercise_score INT,
+    sleep_score INT,
+    water_intake INT,
+    mood_score INT,
+    weight_kg DECIMAL(10,2),
+    height_cm DECIMAL(10,2),
+    remark VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- diet_meal_record
+
+CREATE TABLE IF NOT EXISTS diet_meal_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    checkin_id BIGINT,
+    meal_type VARCHAR(255),
+    food_name VARCHAR(255),
+    food_amount VARCHAR(255),
+    calories INT,
+    protein DECIMAL(10,2),
+    fat DECIMAL(10,2),
+    carbs DECIMAL(10,2),
+    fiber DECIMAL(10,2),
+    eaten_at DATETIME,
+    source VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- dimension_weights
+
+CREATE TABLE IF NOT EXISTS dimension_weights (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    target_type VARCHAR(255),
+    target_id BIGINT,
+    dimension VARCHAR(255),
+    weight INT,
+    enabled TINYINT(1),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- emotion_alert
+
+CREATE TABLE IF NOT EXISTS emotion_alert (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    child_id BIGINT,
+    alert_type VARCHAR(255),
+    severity VARCHAR(255),
+    title VARCHAR(255),
+    message VARCHAR(255),
+    related_checkin_id BIGINT,
+    resolved TINYINT(1),
+    created_at DATETIME,
+    resolved_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- energy_dimension_config
+
+CREATE TABLE IF NOT EXISTS energy_dimension_config (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    dimension VARCHAR(255),
+    data_source VARCHAR(255),
+    category VARCHAR(255),
+    weight INT,
+    is_active INT,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- exercise_record
+
+CREATE TABLE IF NOT EXISTS exercise_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    checkin_id BIGINT,
+    exercise_type VARCHAR(255),
+    duration_minutes INT,
+    intensity VARCHAR(255),
+    calories_burned INT,
+    heart_rate_avg INT,
+    heart_rate_max INT,
+    start_time DATETIME,
+    end_time DATETIME,
+    remark VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- family_memberships
+
+CREATE TABLE IF NOT EXISTS family_memberships (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id BIGINT,
+    level_code VARCHAR(255),
+    start_date DATETIME,
+    end_date DATETIME,
+    payment_method VARCHAR(255),
+    payment_status VARCHAR(255),
+    order_no VARCHAR(255),
+    transaction_id VARCHAR(255),
+    amount INT,
+    auto_renew INT,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- food_recommend_idx
+
+CREATE TABLE IF NOT EXISTS food_recommend_idx (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    food_id BIGINT,
+    food_name VARCHAR(255),
+    index_score INT,
+    health_report_id BIGINT,
+    calculated_at DATETIME,
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- food_recommend_idx_log
+
+CREATE TABLE IF NOT EXISTS food_recommend_idx_log (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    food_id BIGINT,
+    food_name VARCHAR(255),
+    previous_index INT,
+    new_index INT,
+    health_report_id BIGINT,
+    change_reason VARCHAR(255),
+    changed_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- guide_activities
+
+CREATE TABLE IF NOT EXISTS guide_activities (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    guide_id BIGINT,
+    title VARCHAR(255),
+    description VARCHAR(255),
+    cover_image VARCHAR(255),
+    category VARCHAR(255),
+    location VARCHAR(255),
+    activity_date DATETIME,
+    max_participants INT,
+    current_participants INT,
+    price BIGINT,
+    status VARCHAR(255),
+    source VARCHAR(255),
+    published_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- guide_family_relations
+
+CREATE TABLE IF NOT EXISTS guide_family_relations (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    guide_id BIGINT,
+    family_id BIGINT,
+    relation_type VARCHAR(255),
+    status VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- guide_hierarchy
+
+CREATE TABLE IF NOT EXISTS guide_hierarchy (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    parent_id BIGINT,
+    child_id BIGINT,
+    level INT,
+    status VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- health_data_sources
+
+CREATE TABLE IF NOT EXISTS health_data_sources (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    source_type VARCHAR(255),
+    dimension_codes VARCHAR(255),
+    parsed_result VARCHAR(255),
+    file_url VARCHAR(255),
+    confidence DECIMAL(10,2),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- health_dimension_scores
+
+CREATE TABLE IF NOT EXISTS health_dimension_scores (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    dimension VARCHAR(255),
+    score INT,
+    percentile INT,
+    data_source VARCHAR(255),
+    tier INT,
+    raw_data VARCHAR(255),
+    assess_date DATETIME,
+    expire_date DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- health_growth_record
+
+CREATE TABLE IF NOT EXISTS health_growth_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    record_date DATETIME,
+    height_cm DECIMAL(10,2),
+    weight_kg DECIMAL(10,2),
+    bmi DECIMAL(10,2),
+    head_circumference DECIMAL(10,2),
+    bone_age INT,
+    tooth_age INT,
+    growth_rate DECIMAL(10,2),
+    percentile_height INT,
+    percentile_weight INT,
+    percentile_bmi INT,
+    standard_type VARCHAR(255),
+    source VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- health_norm_reference
+
+CREATE TABLE IF NOT EXISTS health_norm_reference (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    dimension VARCHAR(255),
+    gender VARCHAR(255),
+    age_min INT,
+    age_max INT,
+    percentile5 INT,
+    percentile15 INT,
+    percentile25 INT,
+    percentile50 INT,
+    percentile75 INT,
+    percentile85 INT,
+    percentile95 INT,
+    source VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- interaction_logs
+
+CREATE TABLE IF NOT EXISTS interaction_logs (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id BIGINT,
+    from_member_id BIGINT,
+    to_member_id BIGINT,
+    interaction_type VARCHAR(255),
+    description VARCHAR(255),
+    happened_at DATETIME,
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- membership_levels
+
+CREATE TABLE IF NOT EXISTS membership_levels (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    level_code VARCHAR(255),
+    level_name VARCHAR(255),
+    level_desc VARCHAR(255),
+    price_monthly INT,
+    price_quarterly INT,
+    price_yearly INT,
+    features VARCHAR(255),
+    max_children INT,
+    max_tasks_per_day INT,
+    ai_review_enabled INT,
+    priority_support INT,
+    teacher_consultation INT,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- mental_health_screen
+
+CREATE TABLE IF NOT EXISTS mental_health_screen (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    child_id BIGINT,
+    screen_type VARCHAR(255),
+    answers VARCHAR(255),
+    total_score INT,
+    severity_level VARCHAR(255),
+    risk_flags VARCHAR(255),
+    suggestions VARCHAR(255),
+    completed_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- order_items
+
+CREATE TABLE IF NOT EXISTS order_items (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    order_id BIGINT,
+    product_id BIGINT,
+    sku_id BIGINT,
+    product_name VARCHAR(255),
+    product_image VARCHAR(255),
+    sku_specs VARCHAR(255),
+    price DECIMAL(10,2),
+    quantity INT,
+    subtotal DECIMAL(10,2)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- payment_orders
+
+CREATE TABLE IF NOT EXISTS payment_orders (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    order_no VARCHAR(255),
+    family_id BIGINT,
+    level_code VARCHAR(255),
+    payment_type VARCHAR(255),
+    period VARCHAR(255),
+    amount INT,
+    user_coupon_id BIGINT,
+    status VARCHAR(255),
+    pay_method VARCHAR(255),
+    transaction_id VARCHAR(255),
+    paid_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- points_exchange_products
+
+CREATE TABLE IF NOT EXISTS points_exchange_products (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    name VARCHAR(255),
+    description VARCHAR(255),
+    cover_image VARCHAR(255),
+    points_price INT,
+    stock INT,
+    product_type VARCHAR(255),
+    category VARCHAR(255),
+    expiry_days INT,
+    sort_order INT,
+    status VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- points_exchange_records
+
+CREATE TABLE IF NOT EXISTS points_exchange_records (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    child_id BIGINT,
+    family_member_id BIGINT,
+    product_id BIGINT,
+    product_name VARCHAR(255),
+    points_cost INT,
+    quantity INT,
+    status VARCHAR(255),
+    redeem_code VARCHAR(255),
+    expired_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- promotion_materials
+
+CREATE TABLE IF NOT EXISTS promotion_materials (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    title VARCHAR(255),
+    description VARCHAR(255),
+    material_type VARCHAR(255),
+    cover_url VARCHAR(255),
+    file_url VARCHAR(255),
+    tags VARCHAR(255),
+    usage_scenario VARCHAR(255),
+    sort_order INT,
+    status VARCHAR(255),
+    created_by BIGINT,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- relationship_questionnaire_responses
+
+CREATE TABLE IF NOT EXISTS relationship_questionnaire_responses (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    snapshot_id BIGINT,
+    respondent_id BIGINT,
+    answers_json VARCHAR(255),
+    trust_score DECIMAL(10,2),
+    intimacy_score DECIMAL(10,2),
+    communication_score DECIMAL(10,2),
+    interaction_bonus DECIMAL(10,2),
+    total_score DECIMAL(10,2),
+    calculated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- relationship_questionnaire_snapshots
+
+CREATE TABLE IF NOT EXISTS relationship_questionnaire_snapshots (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_member_id BIGINT,
+    respondent_id BIGINT,
+    member_name VARCHAR(255),
+    relationship_type VARCHAR(255),
+    ai_generated_json VARCHAR(255),
+    version VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- share_events
+
+CREATE TABLE IF NOT EXISTS share_events (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    target_type VARCHAR(255),
+    target_id BIGINT,
+    share_channel VARCHAR(255),
+    share_title VARCHAR(255),
+    share_url VARCHAR(255),
+    click_count INT,
+    read_count INT,
+    reward_points INT,
+    status VARCHAR(255),
+    expires_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- share_reads
+
+CREATE TABLE IF NOT EXISTS share_reads (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    share_event_id BIGINT,
+    reader_id BIGINT,
+    reader_ip VARCHAR(255),
+    read_duration INT,
+    read_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- sleep_record
+
+CREATE TABLE IF NOT EXISTS sleep_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    checkin_id BIGINT,
+    sleep_time DATETIME,
+    wake_time DATETIME,
+    duration_minutes INT,
+    deep_sleep_minutes INT,
+    light_sleep_minutes INT,
+    rem_minutes INT,
+    quality_score INT,
+    dream_count INT,
+    remark VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- teachers
+
+CREATE TABLE IF NOT EXISTS teachers (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    teacher_no VARCHAR(255),
+    title VARCHAR(255),
+    specialty VARCHAR(255),
+    bio VARCHAR(255),
+    experience_years INT,
+    rating INT,
+    total_appointments INT,
+    status VARCHAR(255),
+    verification_status VARCHAR(255),
+    street_id BIGINT,
+    province VARCHAR(255),
+    city VARCHAR(255),
+    district VARCHAR(255),
+    street VARCHAR(255),
+    verified_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- training_plan_items
+
+CREATE TABLE IF NOT EXISTS training_plan_items (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    plan_id BIGINT,
+    sequence INT,
+    dimension_key VARCHAR(255),
+    suggestion VARCHAR(255),
+    task_title VARCHAR(255),
+    task_desc VARCHAR(255),
+    minigame_code VARCHAR(255),
+    article_id BIGINT,
+    task_points INT,
+    deadline_days INT,
+    status VARCHAR(255),
+    completed_at DATETIME,
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- training_plans
+
+CREATE TABLE IF NOT EXISTS training_plans (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    guide_id BIGINT,
+    child_id BIGINT,
+    title VARCHAR(255),
+    description VARCHAR(255),
+    status VARCHAR(255),
+    source VARCHAR(255),
+    deployed_at DATETIME,
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- training_plan_tasks
+
+CREATE TABLE IF NOT EXISTS training_plan_tasks (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    plan_id BIGINT,
+    plan_item_id BIGINT,
+    task_id BIGINT,
+    child_id BIGINT,
+    status VARCHAR(255),
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- upgrade_services
+
+CREATE TABLE IF NOT EXISTS upgrade_services (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    guide_id BIGINT,
+    from_level VARCHAR(255),
+    to_level VARCHAR(255),
+    service_fee INT,
+    status VARCHAR(255),
+    reviewed_by BIGINT,
+    reviewed_at DATETIME,
+    reject_reason VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- user_nutrition_profile
+
+CREATE TABLE IF NOT EXISTS user_nutrition_profile (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    fruit_allergy VARCHAR(255),
+    fruit_preferences VARCHAR(255),
+    questionnaire_status VARCHAR(255),
+    budget_monthly INT,
+    family_taste_preferences VARCHAR(255),
+    cuisine_style VARCHAR(255),
+    meal_count INT,
+    cooking_ability VARCHAR(255),
+    created_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- user_rfm_tags
+
+CREATE TABLE IF NOT EXISTS user_rfm_tags (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    user_id BIGINT,
+    r_score INT,
+    f_score INT,
+    m_score INT,
+    rfm_tier VARCHAR(255),
+    total_orders INT,
+    total_amount DECIMAL(10,2),
+    last_order_at DATETIME,
+    updated_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- user_trigger_rules
+
+CREATE TABLE IF NOT EXISTS user_trigger_rules (
+    user_id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    action_config VARCHAR(255),
+    last_triggered_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- water_record
+
+CREATE TABLE IF NOT EXISTS water_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    member_id BIGINT,
+    checkin_id BIGINT,
+    amount_ml INT,
+    water_type VARCHAR(255),
+    drunk_at DATETIME,
+    created_at DATETIME
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;