-- ============================================================================
-- 情绪博物馆数据库完整部署脚本
-- 版本: v3.0 Final (雪花算法主键版本) - 开发版本
-- 创建时间: 2025-07-13
-- 数据库类型: MySQL 8.0+
-- 说明: 包含完整表结构、索引、初始数据的一体化部署脚本
-- 主键类型: VARCHAR(36) 使用雪花算法生成，避免前端精度丢失问题
-- 关联策略: 不使用外键约束，通过代码中的ID字段关联
-- 特性: 开发阶段 - 先删除表再重新创建，确保表结构是最新的
-- 警告: 此脚本会删除现有表和数据，仅适用于开发环境！
-- ============================================================================
-- 设置SQL模式和字符集
SET
    SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';

SET
    AUTOCOMMIT = 0;

START TRANSACTION;

SET
    time_zone = "+00:00";

-- 创建数据库
CREATE DATABASE IF NOT EXISTS emotion_museum DEFAULT CHARACTER
SET
    utf8mb4 COLLATE utf8mb4_unicode_ci;

USE emotion_museum;

-- ============================================================================
-- 数据库设计原则
-- ============================================================================
-- 1. 主键策略: 使用VARCHAR(36)雪花算法ID，避免前端精度丢失
-- 2. 关联策略: 不使用外键约束，通过代码中的ID字段维护关联关系
-- 3. 公共字段: 所有表继承BaseEntity的公共字段
-- 4. 索引优化: 为查询频繁的字段创建合适的索引
-- 5. 字符集: 统一使用utf8mb4支持emoji和特殊字符
-- ============================================================================
-- 删除现有表（开发阶段确保表结构最新）
-- 警告: 这会删除所有数据！
-- ============================================================================
DROP TABLE IF EXISTS user_stats;

DROP TABLE IF EXISTS guest_user;

DROP TABLE IF EXISTS reward;

DROP TABLE IF EXISTS achievement;

DROP TABLE IF EXISTS comment;

DROP TABLE IF EXISTS community_post;

DROP TABLE IF EXISTS location_pin;

DROP TABLE IF EXISTS topic_interaction;

DROP TABLE IF EXISTS growth_topic;

DROP TABLE IF EXISTS emotion_record;

DROP TABLE IF EXISTS emotion_analysis;

DROP TABLE IF EXISTS coze_api_call;

DROP TABLE IF EXISTS message;

DROP TABLE IF EXISTS conversation;

DROP TABLE IF EXISTS user;

-- ============================================================================
-- 1. 用户表 (user)
-- ============================================================================
CREATE TABLE user (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    account VARCHAR(50) NOT NULL UNIQUE, -- 账号
    password VARCHAR(255) NOT NULL, -- 密码(加密后)
    username VARCHAR(50) NOT NULL UNIQUE, -- 用户名
    email VARCHAR(100) NOT NULL UNIQUE, -- 邮箱
    phone VARCHAR(20) UNIQUE, -- 手机号
    avatar VARCHAR(500), -- 头像URL
    nickname VARCHAR(50) NOT NULL, -- 昵称
    birth_date DATE, -- 生日
    location VARCHAR(100), -- 所在地
    bio TEXT, -- 个人简介
    member_level VARCHAR(20) NOT NULL DEFAULT 'free', -- 会员等级
    total_days INT NOT NULL DEFAULT 0, -- 使用天数
    -- 成长数据
    self_awareness DECIMAL(5, 2) NOT NULL DEFAULT 50.00, -- 自我感知
    emotional_resilience DECIMAL(5, 2) NOT NULL DEFAULT 50.00, -- 情绪韧性
    action_power DECIMAL(5, 2) NOT NULL DEFAULT 50.00, -- 行动力
    empathy DECIMAL(5, 2) NOT NULL DEFAULT 50.00, -- 共情力
    life_enthusiasm DECIMAL(5, 2) NOT NULL DEFAULT 50.00, -- 生活热度
    -- 状态字段
    status TINYINT NOT NULL DEFAULT 1, -- 状态: 0-禁用, 1-正常
    is_verified TINYINT NOT NULL DEFAULT 0, -- 是否已验证: 0-未验证, 1-已验证
    last_active_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 最后活跃时间
    -- 第三方登录字段
    third_party_id VARCHAR(128), -- 第三方平台ID
    third_party_type VARCHAR(32), -- 第三方平台类型: wechat, qq, wechat-mp
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户表';

-- ============================================================================
-- 2. 对话表 (conversation)
-- 关联说明: user_id 关联 user.id，通过代码逻辑维护关联关系
-- ============================================================================
CREATE TABLE conversation (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    user_id VARCHAR(36) NOT NULL, -- 用户ID (关联user.id)
    user_type VARCHAR(20) NOT NULL DEFAULT 'registered', -- 用户类型: registered-注册用户, guest-访客用户
    title VARCHAR(200), -- 对话标题
    type VARCHAR(50) NOT NULL DEFAULT 'emotion_chat', -- 对话类型
    status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态: active-活跃, ended-结束, archived-归档
    coze_conversation_id VARCHAR(100), -- Coze对话ID
    bot_id VARCHAR(50), -- 使用的Bot ID
    workflow_id VARCHAR(50), -- 使用的Workflow ID
    initial_message TEXT, -- 初始消息
    context TEXT, -- 上下文信息
    primary_emotion VARCHAR(50), -- 主要情绪
    emotion_intensity DECIMAL(3, 2), -- 情绪强度
    emotion_trend VARCHAR(50), -- 情绪趋势
    keywords JSON, -- 关键词
    ai_insights TEXT, -- AI洞察
    confidence DECIMAL(3, 2), -- 分析置信度
    start_time DATETIME, -- 开始时间
    end_time DATETIME, -- 结束时间
    last_active_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- 最后活跃时间
    message_count INT NOT NULL DEFAULT 0, -- 消息数量
    total_tokens INT DEFAULT 0, -- 总Token使用量
    total_cost DECIMAL(10, 4) DEFAULT 0.0000, -- 总费用
    client_ip VARCHAR(45), -- 客户端IP地址 (支持IPv6)
    user_agent TEXT, -- 用户代理信息
    summary TEXT, -- 对话摘要
    tags JSON, -- 标签
    metadata JSON, -- 扩展元数据
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '对话表';

-- ============================================================================
-- 3. 消息表 (message)
-- 关联说明: conversation_id 关联 conversation.id，通过代码逻辑维护关联关系
-- ============================================================================
CREATE TABLE message (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    conversation_id VARCHAR(36) NOT NULL, -- 对话ID (关联conversation.id)
    content TEXT NOT NULL, -- 消息内容
    type VARCHAR(50) NOT NULL DEFAULT 'text', -- 消息类型
    sender VARCHAR(20) NOT NULL, -- 发送者: user-用户, assistant-AI助手
    timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 消息时间戳
    coze_chat_id VARCHAR(50), -- Coze平台的聊天ID
    coze_message_id VARCHAR(50), -- Coze平台的消息ID
    status VARCHAR(20) DEFAULT 'sent', -- 消息状态: sending/sent/failed/processing
    error_message TEXT, -- 错误信息
    emotion_score DECIMAL(3, 2), -- 情绪评分
    emotion_type VARCHAR(50), -- 情绪类型
    emotion_confidence DECIMAL(3, 2), -- 情绪分析置信度
    prompt_tokens INT DEFAULT 0, -- 输入Token数
    completion_tokens INT DEFAULT 0, -- 输出Token数
    total_tokens INT DEFAULT 0, -- 总Token数
    api_cost DECIMAL(10, 6) DEFAULT 0.000000, -- API调用费用
    is_read TINYINT NOT NULL DEFAULT 0, -- 是否已读: 0-未读, 1-已读
    parent_message_id VARCHAR(36), -- 父消息ID（用于回复链）
    emotion_analysis JSON, -- 情绪分析结果
    metadata JSON, -- 扩展元数据
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '消息表';

-- ============================================================================
-- 4. Coze API调用记录表 (coze_api_call) - 优化版本
-- ============================================================================
CREATE TABLE coze_api_call (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    conversation_id VARCHAR(36), -- 对话ID
    message_id VARCHAR(36), -- 消息ID
    -- Coze API 信息
    coze_chat_id VARCHAR(50), -- Coze聊天ID
    coze_conversation_id VARCHAR(50), -- Coze对话ID
    bot_id VARCHAR(50) NOT NULL, -- Bot ID
    workflow_id VARCHAR(50), -- Workflow ID
    user_id VARCHAR(36) NOT NULL, -- 用户ID
    -- 请求信息
    request_type VARCHAR(20) NOT NULL, -- 请求类型: chat/stream/retrieve/messages
    request_url VARCHAR(500), -- 请求URL
    request_body JSON, -- 请求体
    request_headers JSON, -- 请求头
    -- 用户消息内容
    user_message TEXT, -- 用户输入的消息内容
    user_message_type VARCHAR(20) DEFAULT 'text', -- 用户消息类型: text/image/file
    -- AI回复内容
    ai_reply TEXT, -- AI回复的消息内容
    ai_reply_type VARCHAR(20) DEFAULT 'text', -- AI回复类型: text/image/file
    -- 响应信息
    response_status INT, -- HTTP状态码
    response_body JSON, -- 响应体
    response_headers JSON, -- 响应头
    -- 轮询信息
    poll_count INT DEFAULT 0, -- 轮询次数
    poll_start_time DATETIME, -- 轮询开始时间
    poll_end_time DATETIME, -- 轮询结束时间
    final_status VARCHAR(20), -- 最终状态: completed/failed/timeout
    -- 状态和时间
    status VARCHAR(20) NOT NULL, -- 调用状态: pending/success/failed/timeout
    start_time DATETIME NOT NULL, -- 开始时间
    end_time DATETIME, -- 结束时间
    duration_ms INT, -- 耗时（毫秒）
    -- 使用统计
    prompt_tokens INT DEFAULT 0, -- 输入Token数
    completion_tokens INT DEFAULT 0, -- 输出Token数
    total_tokens INT DEFAULT 0, -- 总Token数
    cost DECIMAL(10, 6) DEFAULT 0.000000, -- 费用
    -- 功能调用信息
    function_calls JSON, -- 函数调用记录
    function_results JSON, -- 函数调用结果
    -- 错误信息
    error_code VARCHAR(50), -- 错误代码
    error_message TEXT, -- 错误信息
    -- 扩展信息
    client_ip VARCHAR(45), -- 客户端IP
    user_agent TEXT, -- 用户代理
    session_id VARCHAR(100), -- 会话ID
    trace_id VARCHAR(100), -- 追踪ID
    metadata JSON, -- 扩展元数据
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Coze API调用记录表 - 完整版本';

-- ============================================================================
-- 5. 情绪分析表 (emotion_analysis)
-- ============================================================================
CREATE TABLE emotion_analysis (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    user_id VARCHAR(36) NOT NULL, -- 用户ID
    message_id VARCHAR(36), -- 关联消息ID
    text TEXT NOT NULL, -- 分析文本
    primary_emotion VARCHAR(50), -- 主要情绪
    intensity DECIMAL(3, 2), -- 情绪强度
    polarity VARCHAR(20), -- 情绪极性: positive-积极, negative-消极, neutral-中性
    confidence DECIMAL(3, 2), -- 置信度
    emotions JSON, -- 情绪分布详情
    keywords JSON, -- 关键词列表
    suggestion TEXT, -- 建议
    analysis_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 分析时间
    metadata JSON, -- 扩展元数据
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '情绪分析表';

-- ============================================================================
-- 6. 情绪记录表 (emotion_record)
-- ============================================================================
CREATE TABLE emotion_record (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    user_id VARCHAR(36) NOT NULL, -- 用户ID
    record_date DATE NOT NULL, -- 记录日期
    emotion_type VARCHAR(50) NOT NULL, -- 情绪类型
    intensity DECIMAL(3, 2) NOT NULL, -- 情绪强度
    triggers TEXT, -- 触发因素
    description TEXT, -- 描述
    tags JSON, -- 标签
    weather VARCHAR(50), -- 天气
    location VARCHAR(100), -- 地点
    activity VARCHAR(100), -- 活动
    people VARCHAR(200), -- 相关人物
    notes TEXT, -- 备注
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '情绪记录表';

-- ============================================================================
-- 7. 成长课题表 (growth_topic)
-- ============================================================================
CREATE TABLE growth_topic (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    title VARCHAR(100) NOT NULL, -- 课题标题
    category VARCHAR(50) NOT NULL, -- 分类
    difficulty VARCHAR(20) NOT NULL, -- 难度: easy-简单, medium-中等, hard-困难
    description TEXT, -- 描述
    content TEXT, -- 内容
    duration_days INT, -- 持续天数
    unlock_conditions JSON, -- 解锁条件
    is_unlocked TINYINT NOT NULL DEFAULT 1, -- 是否解锁
    progress DECIMAL(5, 2) NOT NULL DEFAULT 0.00, -- 进度百分比
    completed_time DATETIME, -- 完成时间
    rewards JSON, -- 奖励
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '成长课题表';

-- ============================================================================
-- 8. 课题互动表 (topic_interaction)
-- ============================================================================
CREATE TABLE topic_interaction (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    topic_id VARCHAR(36) NOT NULL, -- 课题ID
    type VARCHAR(50) NOT NULL, -- 互动类型
    content TEXT, -- 内容
    user_input TEXT, -- 用户输入
    ai_response TEXT, -- AI回应
    rating INT, -- 评分
    feedback TEXT, -- 反馈
    completed_time DATETIME, -- 完成时间
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '课题互动表';

-- ============================================================================
-- 9. 地点标记表 (location_pin)
-- ============================================================================
CREATE TABLE location_pin (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    name VARCHAR(100) NOT NULL, -- 地点名称
    type VARCHAR(50) NOT NULL, -- 地点类型
    category VARCHAR(50), -- 地点分类
    latitude DECIMAL(10, 8) NOT NULL, -- 纬度
    longitude DECIMAL(11, 8) NOT NULL, -- 经度
    address VARCHAR(200), -- 地址
    description TEXT, -- 描述
    created_by VARCHAR(36), -- 创建者
    likes INT NOT NULL DEFAULT 0, -- 点赞数
    visits INT NOT NULL DEFAULT 0, -- 访问数
    is_bookmarked TINYINT NOT NULL DEFAULT 0, -- 是否收藏
    last_visit_time DATETIME, -- 最后访问时间
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '地点标记表';

-- ============================================================================
-- 10. 社区帖子表 (community_post)
-- ============================================================================
CREATE TABLE community_post (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    user_id VARCHAR(36) NOT NULL, -- 用户ID
    location_id VARCHAR(36), -- 地点ID
    title VARCHAR(200), -- 标题
    content TEXT NOT NULL, -- 内容
    type VARCHAR(50) NOT NULL, -- 帖子类型
    images JSON, -- 图片列表
    tags JSON, -- 标签
    likes INT NOT NULL DEFAULT 0, -- 点赞数
    view_count INT NOT NULL DEFAULT 0, -- 浏览数
    comment_count INT NOT NULL DEFAULT 0, -- 评论数
    is_private TINYINT NOT NULL DEFAULT 0, -- 是否私密
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区帖子表';

-- ============================================================================
-- 11. 评论表 (comment)
-- ============================================================================
CREATE TABLE comment (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    post_id VARCHAR(36) NOT NULL, -- 帖子ID
    user_id VARCHAR(36) NOT NULL, -- 用户ID
    content TEXT NOT NULL, -- 评论内容
    reply_to_id VARCHAR(36), -- 回复的评论ID
    likes INT NOT NULL DEFAULT 0, -- 点赞数
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '评论表';

-- ============================================================================
-- 12. 成就表 (achievement)
-- ============================================================================
CREATE TABLE achievement (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    title VARCHAR(100) NOT NULL, -- 成就标题
    description TEXT, -- 描述
    category VARCHAR(50) NOT NULL, -- 分类
    icon VARCHAR(200), -- 图标
    rarity VARCHAR(20) NOT NULL, -- 稀有度
    condition_type VARCHAR(50), -- 条件类型
    condition_value JSON, -- 条件值
    rewards JSON, -- 奖励
    unlocked_time DATETIME, -- 解锁时间
    progress DECIMAL(5, 2) NOT NULL DEFAULT 0.00, -- 进度
    is_hidden TINYINT NOT NULL DEFAULT 0, -- 是否隐藏
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '成就表';

-- ============================================================================
-- 13. 奖励表 (reward)
-- ============================================================================
CREATE TABLE reward (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    topic_id VARCHAR(36), -- 课题ID
    achievement_id VARCHAR(36), -- 成就ID
    type VARCHAR(50) NOT NULL, -- 奖励类型
    name VARCHAR(100) NOT NULL, -- 奖励名称
    description TEXT, -- 描述
    icon VARCHAR(200), -- 图标
    rarity VARCHAR(20), -- 稀有度
    value JSON, -- 奖励值
    earned_time DATETIME, -- 获得时间
    is_new TINYINT NOT NULL DEFAULT 1, -- 是否新获得
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '奖励表';

-- ============================================================================
-- 14. 访客用户表 (guest_user)
-- ============================================================================
CREATE TABLE guest_user (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    guest_user_id VARCHAR(50) NOT NULL UNIQUE, -- 访客用户ID (格式: guest_xxx)
    ip_address VARCHAR(45) NOT NULL, -- 客户端IP地址 (支持IPv6)
    user_agent TEXT, -- 用户代理信息
    nickname VARCHAR(50), -- 访客昵称
    avatar VARCHAR(500), -- 访客头像
    last_active_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 最后活跃时间
    conversation_count INT NOT NULL DEFAULT 0, -- 会话数量
    message_count INT NOT NULL DEFAULT 0, -- 消息数量
    location VARCHAR(100), -- IP地址的地理位置信息
    device_info VARCHAR(200), -- 设备信息
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '访客用户表';

-- ============================================================================
-- 15. 用户统计表 (user_stats)
-- ============================================================================
CREATE TABLE user_stats (
    id VARCHAR(36) PRIMARY KEY, -- UUID主键
    user_id VARCHAR(36) NOT NULL UNIQUE, -- 用户ID
    total_conversations INT NOT NULL DEFAULT 0, -- 总对话数
    total_messages INT NOT NULL DEFAULT 0, -- 总消息数
    total_emotions_recorded INT NOT NULL DEFAULT 0, -- 总情绪记录数
    topics_completed INT NOT NULL DEFAULT 0, -- 完成的课题数
    achievements_unlocked INT NOT NULL DEFAULT 0, -- 解锁的成就数
    total_points INT NOT NULL DEFAULT 0, -- 总积分
    consecutive_days INT NOT NULL DEFAULT 0, -- 连续使用天数
    max_consecutive_days INT NOT NULL DEFAULT 0, -- 最大连续天数
    locations_visited INT NOT NULL DEFAULT 0, -- 访问的地点数
    posts_created INT NOT NULL DEFAULT 0, -- 创建的帖子数
    comments_made INT NOT NULL DEFAULT 0, -- 评论数
    likes_received INT NOT NULL DEFAULT 0, -- 收到的点赞数
    social_interactions INT NOT NULL DEFAULT 0, -- 社交互动数
    -- 公共字段
    create_by VARCHAR(36), -- 创建人ID
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    update_by VARCHAR(36), -- 更新人ID
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
    is_deleted TINYINT NOT NULL DEFAULT 0, -- 是否删除: 0-未删除, 1-已删除
    remarks VARCHAR(500) -- 备注
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户统计表';

-- ============================================================================
-- 创建索引以提高查询性能
-- 注意: MySQL的CREATE INDEX不支持IF NOT EXISTS
-- 如果索引已存在，重复执行会产生警告但不会中断脚本执行
-- ============================================================================
-- user表索引
CREATE INDEX idx_user_account ON user (account);

CREATE INDEX idx_user_username ON user (username);

CREATE INDEX idx_user_email ON user (email);

CREATE INDEX idx_user_phone ON user (phone);

CREATE INDEX idx_user_last_active_time ON user (last_active_time);

CREATE INDEX idx_user_create_time ON user (create_time);

CREATE INDEX idx_user_member_level ON user (member_level);

CREATE INDEX idx_user_status ON user (status);

CREATE INDEX idx_user_is_verified ON user (is_verified);

CREATE INDEX idx_user_create_by ON user (create_by);

CREATE INDEX idx_user_update_by ON user (update_by);

CREATE INDEX idx_user_is_deleted ON user (is_deleted);

CREATE INDEX idx_user_third_party_id ON user (third_party_id);

CREATE INDEX idx_user_third_party_type ON user (third_party_type);

-- conversation表索引
CREATE INDEX idx_conversation_user_id ON conversation (user_id);

CREATE INDEX idx_conversation_start_time ON conversation (start_time);

CREATE INDEX idx_conversation_user_id_start_time ON conversation (user_id, start_time);

CREATE INDEX idx_conversation_primary_emotion ON conversation (primary_emotion);

CREATE INDEX idx_conversation_end_time ON conversation (end_time);

CREATE INDEX idx_conversation_create_time ON conversation (create_time);

CREATE INDEX idx_conversation_coze_conversation_id ON conversation (coze_conversation_id);

CREATE INDEX idx_conversation_status ON conversation (status);

CREATE INDEX idx_conversation_last_active_time ON conversation (last_active_time);

CREATE INDEX idx_conversation_create_by ON conversation (create_by);

CREATE INDEX idx_conversation_update_by ON conversation (update_by);

CREATE INDEX idx_conversation_is_deleted ON conversation (is_deleted);

CREATE INDEX idx_conversation_user_type ON conversation (user_type);

CREATE INDEX idx_conversation_emotion_trend ON conversation (emotion_trend);

CREATE INDEX idx_conversation_confidence ON conversation (confidence);

CREATE INDEX idx_conversation_client_ip ON conversation (client_ip);

-- message表索引
CREATE INDEX idx_message_conversation_id ON message (conversation_id);

CREATE INDEX idx_message_timestamp ON message (timestamp);

CREATE INDEX idx_message_conversation_id_timestamp ON message (conversation_id, timestamp);

CREATE INDEX idx_message_sender ON message (sender);

CREATE INDEX idx_message_type ON message (type);

CREATE INDEX idx_message_is_read ON message (is_read);

CREATE INDEX idx_message_create_time ON message (create_time);

CREATE INDEX idx_message_coze_chat_id ON message (coze_chat_id);

CREATE INDEX idx_message_status ON message (status);

CREATE INDEX idx_message_parent_message_id ON message (parent_message_id);

CREATE INDEX idx_message_create_by ON message (create_by);

CREATE INDEX idx_message_update_by ON message (update_by);

CREATE INDEX idx_message_is_deleted ON message (is_deleted);

-- coze_api_call表索引
CREATE INDEX idx_coze_api_call_conversation_id ON coze_api_call (conversation_id);

CREATE INDEX idx_coze_api_call_message_id ON coze_api_call (message_id);

CREATE INDEX idx_coze_api_call_coze_chat_id ON coze_api_call (coze_chat_id);

CREATE INDEX idx_coze_api_call_bot_id ON coze_api_call (bot_id);

CREATE INDEX idx_coze_api_call_user_id ON coze_api_call (user_id);

CREATE INDEX idx_coze_api_call_status ON coze_api_call (status);

CREATE INDEX idx_coze_api_call_final_status ON coze_api_call (final_status);

CREATE INDEX idx_coze_api_call_start_time ON coze_api_call (start_time);

CREATE INDEX idx_coze_api_call_request_type ON coze_api_call (request_type);

CREATE INDEX idx_coze_api_call_client_ip ON coze_api_call (client_ip);

CREATE INDEX idx_coze_api_call_session_id ON coze_api_call (session_id);

CREATE INDEX idx_coze_api_call_trace_id ON coze_api_call (trace_id);

CREATE INDEX idx_coze_api_call_user_status ON coze_api_call (user_id, status);

CREATE INDEX idx_coze_api_call_conversation_time ON coze_api_call (conversation_id, start_time);

-- emotion_analysis表索引
CREATE INDEX idx_emotion_analysis_user_id ON emotion_analysis (user_id);

CREATE INDEX idx_emotion_analysis_message_id ON emotion_analysis (message_id);

CREATE INDEX idx_emotion_analysis_primary_emotion ON emotion_analysis (primary_emotion);

CREATE INDEX idx_emotion_analysis_analysis_time ON emotion_analysis (analysis_time);

CREATE INDEX idx_emotion_analysis_create_time ON emotion_analysis (create_time);

CREATE INDEX idx_emotion_analysis_create_by ON emotion_analysis (create_by);

CREATE INDEX idx_emotion_analysis_update_by ON emotion_analysis (update_by);

CREATE INDEX idx_emotion_analysis_is_deleted ON emotion_analysis (is_deleted);

-- emotion_record表索引
CREATE INDEX idx_emotion_record_user_id ON emotion_record (user_id);

CREATE INDEX idx_emotion_record_date ON emotion_record (record_date);

CREATE INDEX idx_emotion_record_emotion_type ON emotion_record (emotion_type);

CREATE INDEX idx_emotion_record_user_id_date ON emotion_record (user_id, record_date);

CREATE INDEX idx_emotion_record_user_id_emotion_type ON emotion_record (user_id, emotion_type);

CREATE INDEX idx_emotion_record_intensity ON emotion_record (intensity);

CREATE INDEX idx_emotion_record_create_time ON emotion_record (create_time);

CREATE INDEX idx_emotion_record_create_by ON emotion_record (create_by);

CREATE INDEX idx_emotion_record_update_by ON emotion_record (update_by);

CREATE INDEX idx_emotion_record_is_deleted ON emotion_record (is_deleted);

-- growth_topic表索引
CREATE INDEX idx_growth_topic_category ON growth_topic (category);

CREATE INDEX idx_growth_topic_difficulty ON growth_topic (difficulty);

CREATE INDEX idx_growth_topic_is_unlocked ON growth_topic (is_unlocked);

CREATE INDEX idx_growth_topic_progress ON growth_topic (progress);

CREATE INDEX idx_growth_topic_completed_time ON growth_topic (completed_time);

CREATE INDEX idx_growth_topic_category_difficulty ON growth_topic (category, difficulty);

CREATE INDEX idx_growth_topic_create_time ON growth_topic (create_time);

-- topic_interaction表索引
CREATE INDEX idx_topic_interaction_topic_id ON topic_interaction (topic_id);

CREATE INDEX idx_topic_interaction_type ON topic_interaction (type);

CREATE INDEX idx_topic_interaction_completed_time ON topic_interaction (completed_time);

CREATE INDEX idx_topic_interaction_rating ON topic_interaction (rating);

CREATE INDEX idx_topic_interaction_topic_id_type ON topic_interaction (topic_id, type);

CREATE INDEX idx_topic_interaction_create_time ON topic_interaction (create_time);

-- location_pin表索引
CREATE INDEX idx_location_pin_latitude_longitude ON location_pin (latitude, longitude);

CREATE INDEX idx_location_pin_type ON location_pin (type);

CREATE INDEX idx_location_pin_category ON location_pin (category);

CREATE INDEX idx_location_pin_created_by ON location_pin (created_by);

CREATE INDEX idx_location_pin_likes ON location_pin (likes);

CREATE INDEX idx_location_pin_visits ON location_pin (visits);

CREATE INDEX idx_location_pin_is_bookmarked ON location_pin (is_bookmarked);

CREATE INDEX idx_location_pin_type_category ON location_pin (type, category);

CREATE INDEX idx_location_pin_create_time ON location_pin (create_time);

CREATE INDEX idx_location_pin_last_visit_time ON location_pin (last_visit_time);

-- community_post表索引
CREATE INDEX idx_community_post_user_id ON community_post (user_id);

CREATE INDEX idx_community_post_location_id ON community_post (location_id);

CREATE INDEX idx_community_post_create_time ON community_post (create_time);

CREATE INDEX idx_community_post_type ON community_post (type);

CREATE INDEX idx_community_post_likes ON community_post (likes);

CREATE INDEX idx_community_post_view_count ON community_post (view_count);

CREATE INDEX idx_community_post_is_private ON community_post (is_private);

CREATE INDEX idx_community_post_user_id_create_time ON community_post (user_id, create_time);

CREATE INDEX idx_community_post_type_create_time ON community_post (type, create_time);

-- comment表索引
CREATE INDEX idx_comment_post_id ON comment (post_id);

CREATE INDEX idx_comment_user_id ON comment (user_id);

CREATE INDEX idx_comment_reply_to_id ON comment (reply_to_id);

CREATE INDEX idx_comment_create_time ON comment (create_time);

CREATE INDEX idx_comment_likes ON comment (likes);

CREATE INDEX idx_comment_post_id_create_time ON comment (post_id, create_time);

-- achievement表索引
CREATE INDEX idx_achievement_category ON achievement (category);

CREATE INDEX idx_achievement_rarity ON achievement (rarity);

CREATE INDEX idx_achievement_unlocked_time ON achievement (unlocked_time);

CREATE INDEX idx_achievement_is_hidden ON achievement (is_hidden);

CREATE INDEX idx_achievement_progress ON achievement (progress);

CREATE INDEX idx_achievement_category_rarity ON achievement (category, rarity);

CREATE INDEX idx_achievement_create_time ON achievement (create_time);

-- reward表索引
CREATE INDEX idx_reward_topic_id ON reward (topic_id);

CREATE INDEX idx_reward_achievement_id ON reward (achievement_id);

CREATE INDEX idx_reward_type ON reward (type);

CREATE INDEX idx_reward_earned_time ON reward (earned_time);

CREATE INDEX idx_reward_rarity ON reward (rarity);

CREATE INDEX idx_reward_is_new ON reward (is_new);

CREATE INDEX idx_reward_type_earned_time ON reward (type, earned_time);

CREATE INDEX idx_reward_create_time ON reward (create_time);

-- user_stats表索引
CREATE INDEX idx_user_stats_user_id ON user_stats (user_id);

CREATE INDEX idx_user_stats_total_points ON user_stats (total_points);

CREATE INDEX idx_user_stats_consecutive_days ON user_stats (consecutive_days);

CREATE INDEX idx_user_stats_max_consecutive_days ON user_stats (max_consecutive_days);

CREATE INDEX idx_user_stats_social_interactions ON user_stats (social_interactions);

CREATE INDEX idx_user_stats_update_time ON user_stats (update_time);

CREATE INDEX idx_user_stats_create_time ON user_stats (create_time);

-- guest_user表索引
CREATE INDEX idx_guest_user_guest_user_id ON guest_user (guest_user_id);

CREATE INDEX idx_guest_user_ip_address ON guest_user (ip_address);

CREATE INDEX idx_guest_user_last_active_time ON guest_user (last_active_time);

CREATE INDEX idx_guest_user_conversation_count ON guest_user (conversation_count);

CREATE INDEX idx_guest_user_message_count ON guest_user (message_count);

CREATE INDEX idx_guest_user_create_time ON guest_user (create_time);

CREATE INDEX idx_guest_user_create_by ON guest_user (create_by);

CREATE INDEX idx_guest_user_update_by ON guest_user (update_by);

CREATE INDEX idx_guest_user_is_deleted ON guest_user (is_deleted);

-- ============================================================================
-- 数据库统计信息
-- ============================================================================
SELECT
    COUNT(*) as total_tables
FROM
    INFORMATION_SCHEMA.TABLES
WHERE
    TABLE_SCHEMA = 'emotion_museum';

-- 显示创建的表
SELECT
    TABLE_NAME as table_name,
    TABLE_COMMENT as comment,
    ENGINE as engine
FROM
    INFORMATION_SCHEMA.TABLES
WHERE
    TABLE_SCHEMA = 'emotion_museum'
ORDER BY
    TABLE_NAME;

-- 提交事务
COMMIT;