-- ============================================================
-- 零食商城 数据库初始化脚本
-- 适用 MySQL 8.0+
-- 字符集：utf8mb4 / 排序规则：utf8mb4_unicode_ci
-- 全部表与字段均已添加 COMMENT 注释
-- ============================================================

-- 删除并重建数据库
DROP DATABASE IF EXISTS `snack_mall`;
CREATE DATABASE `snack_mall`
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

USE `snack_mall`;


-- ============================================================
-- ① 用户表
-- ============================================================
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
    `id`          BIGINT       NOT NULL AUTO_INCREMENT                              COMMENT '主键 ID',
    `username`    VARCHAR(50)  NOT NULL                                              COMMENT '登录用户名（唯一）',
    `password`    VARCHAR(100) NOT NULL                                              COMMENT '加密密码（BCrypt 强度 10）',
    `phone`       VARCHAR(20)  DEFAULT NULL                                          COMMENT '手机号',
    `nickname`    VARCHAR(50)  DEFAULT NULL                                          COMMENT '昵称',
    `avatar`      VARCHAR(255) DEFAULT NULL                                          COMMENT '头像 URL',
    `gender`      TINYINT      NOT NULL DEFAULT 0                                    COMMENT '性别：0-未知 1-男 2-女',
    `birthday`    DATE         DEFAULT NULL                                          COMMENT '生日',
    `status`      TINYINT      NOT NULL DEFAULT 1                                    COMMENT '账号状态：0-禁用 1-启用',
    `last_login_time`  DATETIME DEFAULT NULL                                          COMMENT '最近登录时间',
    `last_login_ip`    VARCHAR(50) DEFAULT NULL                                      COMMENT '最近登录 IP',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_username` (`username`),
    KEY `idx_phone`        (`phone`),
    KEY `idx_status`       (`status`),
    KEY `idx_create_time`  (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='前台用户表';


-- ============================================================
-- ② 管理员表
-- ============================================================
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
    `id`              BIGINT       NOT NULL AUTO_INCREMENT                          COMMENT '主键 ID',
    `username`        VARCHAR(50)  NOT NULL                                          COMMENT '登录用户名（唯一）',
    `password`        VARCHAR(100) NOT NULL                                          COMMENT 'BCrypt 加密密码',
    `nickname`        VARCHAR(50)  DEFAULT NULL                                      COMMENT '昵称',
    `avatar`          VARCHAR(255) DEFAULT NULL                                      COMMENT '头像 URL',
    `email`           VARCHAR(100) DEFAULT NULL                                      COMMENT '邮箱',
    `phone`           VARCHAR(20)  DEFAULT NULL                                      COMMENT '手机号',
    `role`            VARCHAR(50)  NOT NULL DEFAULT 'admin'                          COMMENT '角色标识：super_admin / admin / operator',
    `status`          TINYINT      NOT NULL DEFAULT 1                                COMMENT '账号状态：0-禁用 1-启用',
    `last_login_time` DATETIME     DEFAULT NULL                                      COMMENT '最近登录时间',
    `last_login_ip`   VARCHAR(50)  DEFAULT NULL                                      COMMENT '最近登录 IP',
    `create_time`     DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                COMMENT '创建时间',
    `update_time`     DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_username` (`username`),
    KEY `idx_status`    (`status`),
    KEY `idx_role`      (`role`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='后台管理员表';


-- ============================================================
-- ③ 商品分类表（支持多级树形）
-- ============================================================
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                              COMMENT '主键 ID',
    `name`       VARCHAR(50)  NOT NULL                                              COMMENT '分类名称',
    `parent_id`  BIGINT       NOT NULL DEFAULT 0                                    COMMENT '父分类 ID，0 表示一级分类',
    `level`      TINYINT      NOT NULL DEFAULT 1                                    COMMENT '层级：1-一级 2-二级 3-三级',
    `sort`       INT          NOT NULL DEFAULT 0                                    COMMENT '排序号（升序展示）',
    `icon`       VARCHAR(255) DEFAULT NULL                                          COMMENT '分类图标 URL',
    `status`     TINYINT      NOT NULL DEFAULT 1                                    COMMENT '状态：0-禁用 1-启用',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_parent_id`  (`parent_id`),
    KEY `idx_level`      (`level`),
    KEY `idx_status`     (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品分类表（支持多级树形结构）';


-- ============================================================
-- ④ 商品 SPU 表
-- ============================================================
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
    `id`          BIGINT        NOT NULL AUTO_INCREMENT                             COMMENT '主键 ID（SPU）',
    `name`        VARCHAR(200)  NOT NULL                                             COMMENT '商品名称',
    `category_id` BIGINT        NOT NULL                                             COMMENT '所属分类 ID',
    `brand`       VARCHAR(100)  DEFAULT NULL                                         COMMENT '品牌',
    `main_image`  VARCHAR(255)  DEFAULT NULL                                         COMMENT '主图 URL',
    `sub_images`  TEXT          DEFAULT NULL                                         COMMENT '副图列表（JSON 数组）',
    `detail`      LONGTEXT      DEFAULT NULL                                         COMMENT '富文本详情（HTML）',
    `origin_price` DECIMAL(10,2) DEFAULT NULL                                         COMMENT '原价/划线价',
    `sales`       INT           NOT NULL DEFAULT 0                                   COMMENT '累计销量',
    `view_count`  INT           NOT NULL DEFAULT 0                                   COMMENT '浏览量',
    `status`      TINYINT       NOT NULL DEFAULT 1                                   COMMENT '状态：0-下架 1-上架',
    `is_hot`      TINYINT       NOT NULL DEFAULT 0                                   COMMENT '是否热门：0-否 1-是',
    `is_new`      TINYINT       NOT NULL DEFAULT 0                                   COMMENT '是否新品：0-否 1-是',
    `create_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                   COMMENT '创建时间',
    `update_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_category_id`  (`category_id`),
    KEY `idx_status`       (`status`),
    KEY `idx_sales`        (`sales`),
    KEY `idx_create_time`  (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品 SPU 表';


-- ============================================================
-- ⑤ 商品 SKU 表
-- ============================================================
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku` (
    `id`         BIGINT        NOT NULL AUTO_INCREMENT                              COMMENT '主键 ID（SKU）',
    `product_id` BIGINT        NOT NULL                                              COMMENT '所属 SPU ID',
    `sku_name`   VARCHAR(100)  NOT NULL                                              COMMENT '规格名称，如：原味/500g',
    `image`      VARCHAR(255)  DEFAULT NULL                                          COMMENT '规格图片 URL',
    `price`      DECIMAL(10,2) NOT NULL                                              COMMENT '售价',
    `stock`      INT           NOT NULL DEFAULT 0                                    COMMENT '库存数量',
    `sales`      INT           NOT NULL DEFAULT 0                                    COMMENT '累计销量',
    `weight`     INT           DEFAULT NULL                                          COMMENT '重量（克）',
    `sort`       INT           NOT NULL DEFAULT 0                                    COMMENT '排序号',
    `create_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '创建时间',
    `update_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_product_id`  (`product_id`),
    KEY `idx_create_time` (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品 SKU 表（具体规格）';


-- ============================================================
-- ⑥ 收货地址
-- ============================================================
DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                               COMMENT '主键 ID',
    `user_id`    BIGINT       NOT NULL                                               COMMENT '所属用户 ID',
    `receiver`   VARCHAR(50)  NOT NULL                                               COMMENT '收货人姓名',
    `phone`      VARCHAR(20)  NOT NULL                                               COMMENT '收货人手机号',
    `province`   VARCHAR(50)  DEFAULT NULL                                           COMMENT '省',
    `city`       VARCHAR(50)  DEFAULT NULL                                           COMMENT '市',
    `district`   VARCHAR(50)  DEFAULT NULL                                           COMMENT '区/县',
    `detail`     VARCHAR(255) NOT NULL                                               COMMENT '详细地址',
    `tag`        VARCHAR(20)  DEFAULT NULL                                           COMMENT '标签：家/公司/学校',
    `is_default` TINYINT      NOT NULL DEFAULT 0                                     COMMENT '是否默认地址：0-否 1-是',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                     COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_user_id`  (`user_id`),
    KEY `idx_is_default` (`user_id`, `is_default`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='收货地址表';


-- ============================================================
-- ⑦ 购物车
-- ============================================================
DROP TABLE IF EXISTS `cart`;
CREATE TABLE `cart` (
    `id`         BIGINT   NOT NULL AUTO_INCREMENT                                   COMMENT '主键 ID',
    `user_id`    BIGINT   NOT NULL                                                   COMMENT '用户 ID',
    `product_id` BIGINT   NOT NULL                                                   COMMENT '商品 SPU ID',
    `sku_id`     BIGINT   NOT NULL                                                   COMMENT '商品 SKU ID',
    `quantity`   INT      NOT NULL DEFAULT 1                                         COMMENT '数量',
    `selected`   TINYINT  NOT NULL DEFAULT 1                                         COMMENT '选中状态：0-未选 1-已选',
    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP                         COMMENT '加入时间',
    `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_user_sku` (`user_id`, `sku_id`),
    KEY `idx_user_id` (`user_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='购物车表';


-- ============================================================
-- ⑧ 订单主表
-- ============================================================
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
    `id`               BIGINT        NOT NULL AUTO_INCREMENT                          COMMENT '主键 ID',
    `order_no`         VARCHAR(32)   NOT NULL                                          COMMENT '订单号（业务唯一）',
    `user_id`          BIGINT        NOT NULL                                          COMMENT '下单用户 ID',
    `total_amount`     DECIMAL(10,2) NOT NULL                                          COMMENT '商品总金额（未优惠）',
    `freight_amount`   DECIMAL(10,2) NOT NULL DEFAULT 0                                COMMENT '运费',
    `discount_amount`  DECIMAL(10,2) NOT NULL DEFAULT 0                                COMMENT '优惠金额（满减/折扣）',
    `coupon_id`        BIGINT        DEFAULT NULL                                      COMMENT '使用的优惠券 ID',
    `coupon_amount`    DECIMAL(10,2) NOT NULL DEFAULT 0                                COMMENT '优惠券抵扣金额',
    `pay_amount`       DECIMAL(10,2) NOT NULL                                          COMMENT '实付金额',
    `status`           TINYINT       NOT NULL DEFAULT 0                                COMMENT '订单状态：0-待付款 1-待发货 2-待收货 3-已完成 4-已取消 5-已退款',
    `receiver_name`    VARCHAR(50)   NOT NULL                                          COMMENT '收货人姓名',
    `receiver_phone`   VARCHAR(20)   NOT NULL                                          COMMENT '收货人手机号',
    `receiver_address` VARCHAR(255)  NOT NULL                                          COMMENT '完整收货地址',
    `remark`           VARCHAR(500)  DEFAULT NULL                                      COMMENT '订单备注',
    `tracking_company` VARCHAR(50)  DEFAULT NULL                                      COMMENT '物流公司',
    `tracking_no`      VARCHAR(50)   DEFAULT NULL                                      COMMENT '物流单号',
    `pay_time`         DATETIME      DEFAULT NULL                                      COMMENT '支付时间',
    `deliver_time`     DATETIME      DEFAULT NULL                                      COMMENT '发货时间',
    `receive_time`     DATETIME      DEFAULT NULL                                      COMMENT '收货时间',
    `cancel_time`      DATETIME      DEFAULT NULL                                      COMMENT '取消时间',
    `finish_time`      DATETIME      DEFAULT NULL                                      COMMENT '完成时间',
    `pay_channel`      VARCHAR(20)   DEFAULT NULL                                      COMMENT '支付渠道：alipay / wechat / balance',
    `pay_trade_no`     VARCHAR(64)   DEFAULT NULL                                      COMMENT '第三方支付平台交易号（支付宝/微信返回）',
    `refund_trade_no`  VARCHAR(64)   DEFAULT NULL                                      COMMENT '退款交易号（支付宝/微信返回）',
    `refund_time`      DATETIME      DEFAULT NULL                                      COMMENT '退款时间',
    `refund_reason`    VARCHAR(255)  DEFAULT NULL                                      COMMENT '退款原因',
    `create_time`      DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                COMMENT '创建时间',
    `update_time`      DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_order_no`     (`order_no`),
    UNIQUE KEY `uk_pay_trade_no` (`pay_trade_no`),
    KEY `idx_user_id`     (`user_id`),
    KEY `idx_status`      (`status`),
    KEY `idx_create_time` (`create_time`),
    KEY `idx_user_status` (`user_id`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='订单主表';


-- ============================================================
-- ⑨ 订单商品明细
-- ============================================================
DROP TABLE IF EXISTS `order_item`;
CREATE TABLE `order_item` (
    `id`            BIGINT        NOT NULL AUTO_INCREMENT                             COMMENT '主键 ID',
    `order_id`      BIGINT        NOT NULL                                             COMMENT '订单 ID',
    `order_no`      VARCHAR(32)   NOT NULL                                             COMMENT '订单号（冗余）',
    `product_id`    BIGINT        NOT NULL                                             COMMENT '商品 SPU ID',
    `product_name`  VARCHAR(200)  NOT NULL                                             COMMENT '商品名（冗余防商品改名）',
    `product_image` VARCHAR(255)  DEFAULT NULL                                         COMMENT '商品主图（冗余）',
    `sku_id`        BIGINT        NOT NULL                                             COMMENT 'SKU ID',
    `sku_name`      VARCHAR(100)  NOT NULL                                             COMMENT 'SKU 规格（冗余）',
    `price`         DECIMAL(10,2) NOT NULL                                             COMMENT '成交单价',
    `quantity`      INT           NOT NULL                                             COMMENT '购买数量',
    `total_amount`  DECIMAL(10,2) NOT NULL                                             COMMENT '小计金额（price*quantity）',
    `create_time`   DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                   COMMENT '创建时间',
    PRIMARY KEY (`id`),
    KEY `idx_order_id`   (`order_id`),
    KEY `idx_order_no`   (`order_no`),
    KEY `idx_product_id` (`product_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='订单商品明细表';


-- ============================================================
-- ⑩ 收藏
-- ============================================================
DROP TABLE IF EXISTS `favorite`;
CREATE TABLE `favorite` (
    `id`         BIGINT   NOT NULL AUTO_INCREMENT                                    COMMENT '主键 ID',
    `user_id`    BIGINT   NOT NULL                                                    COMMENT '用户 ID',
    `product_id` BIGINT   NOT NULL                                                    COMMENT '商品 SPU ID',
    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP                          COMMENT '收藏时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_user_product` (`user_id`, `product_id`),
    KEY `idx_user_id`    (`user_id`),
    KEY `idx_product_id` (`product_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户收藏表';


-- ============================================================
-- ⑪ 轮播图
-- ============================================================
DROP TABLE IF EXISTS `banner`;
CREATE TABLE `banner` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                                 COMMENT '主键 ID',
    `title`      VARCHAR(100) DEFAULT NULL                                            COMMENT '标题',
    `image`      VARCHAR(255) NOT NULL                                                COMMENT '图片 URL',
    `link_type`  TINYINT      NOT NULL DEFAULT 0                                      COMMENT '跳转类型：0-不跳转 1-商品 2-分类 3-外链',
    `link_value` VARCHAR(255) DEFAULT NULL                                            COMMENT '跳转目标值（商品 ID / 分类 ID / URL）',
    `sort`       INT          NOT NULL DEFAULT 0                                      COMMENT '排序号（升序）',
    `status`     TINYINT      NOT NULL DEFAULT 1                                      COMMENT '状态：0-下线 1-上线',
    `start_time` DATETIME     DEFAULT NULL                                            COMMENT '生效时间',
    `end_time`   DATETIME     DEFAULT NULL                                            COMMENT '失效时间',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                      COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_status_sort`  (`status`, `sort`),
    KEY `idx_start_time`   (`start_time`),
    KEY `idx_end_time`     (`end_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='首页轮播图表';


-- ============================================================
-- ⑫ 客服会话表（WebSocket 长连接）
-- 设计要点：
--   - 客户端通过 WebSocket 建立长连接，服务端实时转发消息
--   - session_no 是对外展示/查询的编号
--   - user_seq / admin_seq 记录各端最大已确认序号，用于断线补发
--   - status 区分会话生命周期
-- ============================================================
DROP TABLE IF EXISTS `chat_session`;
CREATE TABLE `chat_session` (
    `id`            BIGINT       NOT NULL AUTO_INCREMENT                             COMMENT '主键 ID',
    `session_no`    VARCHAR(32)  NOT NULL                                             COMMENT '会话编号（业务唯一）',
    `user_id`       BIGINT       NOT NULL                                             COMMENT '发起用户 ID',
    `admin_id`      BIGINT       DEFAULT NULL                                         COMMENT '接待客服 ID，NULL=待分配',
    `status`        TINYINT      NOT NULL DEFAULT 0                                   COMMENT '会话状态：0-待处理 1-处理中 2-已解决 3-已关闭',
    `user_unread`   INT          NOT NULL DEFAULT 0                                   COMMENT '用户未读消息数',
    `admin_unread`  INT          NOT NULL DEFAULT 0                                   COMMENT '客服未读消息数',
    `last_message`  VARCHAR(500) DEFAULT NULL                                         COMMENT '最后一条消息摘要',
    `last_time`     DATETIME     DEFAULT NULL                                         COMMENT '最后一条消息时间',
    `user_seq`      BIGINT       NOT NULL DEFAULT 0                                   COMMENT '用户端最大已确认消息序号（用于断线补发）',
    `admin_seq`     BIGINT       NOT NULL DEFAULT 0                                   COMMENT '客服端最大已确认消息序号（用于断线补发）',
    `close_time`    DATETIME     DEFAULT NULL                                         COMMENT '关闭时间',
    `create_time`   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                   COMMENT '创建时间',
    `update_time`   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_session_no` (`session_no`),
    KEY `idx_user_id`     (`user_id`),
    KEY `idx_admin_id`    (`admin_id`),
    KEY `idx_status`      (`status`),
    KEY `idx_last_time`   (`last_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服会话表';


-- ============================================================
-- ⑬ 客服消息表（WebSocket 消息持久化）
-- 设计要点：
--   - 每条消息全局递增 seq 编号（同 session 内）
--   - 客户端通过 last_ack_seq 拉取差量消息
--   - type 支持 text / image / file / system / product（商品卡片）
-- ============================================================
DROP TABLE IF EXISTS `chat_message`;
CREATE TABLE `chat_message` (
    `id`          BIGINT     NOT NULL AUTO_INCREMENT                                  COMMENT '主键 ID',
    `session_id`  BIGINT     NOT NULL                                                  COMMENT '所属会话 ID',
    `seq`         BIGINT     NOT NULL DEFAULT 0                                        COMMENT '消息在会话内的递增序号（用于断线补发和排序）',
    `sender_id`   BIGINT     NOT NULL                                                  COMMENT '发送者 ID（用户/客服）',
    `sender_type` TINYINT    NOT NULL                                                  COMMENT '发送者类型：0-用户 1-客服 2-系统',
    `type`        VARCHAR(10) NOT NULL DEFAULT 'text'                                  COMMENT '消息类型：text / image / file / product / system',
    `content`     TEXT       NOT NULL                                                  COMMENT '消息内容（文字 / JSON / 图片 URL）',
    `extra`       JSON       DEFAULT NULL                                              COMMENT '扩展字段（商品卡片等结构化数据）',
    `is_recalled` TINYINT    NOT NULL DEFAULT 0                                        COMMENT '是否撤回：0-否 1-是',
    `create_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP                        COMMENT '发送时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_session_seq` (`session_id`, `seq`),
    KEY `idx_session_id`    (`session_id`),
    KEY `idx_create_time`   (`create_time`),
    KEY `idx_session_time`  (`session_id`, `create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服消息表（WebSocket 持久化）';


-- ============================================================
-- ⑭ 客服快捷回复模板
-- ============================================================
DROP TABLE IF EXISTS `quick_reply`;
CREATE TABLE `quick_reply` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                                 COMMENT '主键 ID',
    `title`      VARCHAR(100) NOT NULL                                                 COMMENT '模板标题（用于搜索）',
    `content`    VARCHAR(500) NOT NULL                                                 COMMENT '模板内容',
    `category`   VARCHAR(50)  DEFAULT NULL                                             COMMENT '分类：问候/物流/售后/活动等',
    `sort`       INT          NOT NULL DEFAULT 0                                       COMMENT '排序号',
    `status`     TINYINT      NOT NULL DEFAULT 1                                       COMMENT '状态：0-禁用 1-启用',
    `use_count`  INT          NOT NULL DEFAULT 0                                       COMMENT '使用次数（统计）',
    `create_by`  BIGINT       DEFAULT NULL                                             COMMENT '创建人（管理员 ID）',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                      COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_status_sort` (`status`, `sort`),
    KEY `idx_category`    (`category`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服快捷回复模板表';


-- ============================================================
-- ⑮ 系统公告
-- ============================================================
DROP TABLE IF EXISTS `notice`;
CREATE TABLE `notice` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                                 COMMENT '主键 ID',
    `title`      VARCHAR(200) NOT NULL                                                 COMMENT '公告标题',
    `content`    LONGTEXT     NOT NULL                                                 COMMENT '公告内容（富文本 HTML）',
    `type`       TINYINT      NOT NULL DEFAULT 0                                       COMMENT '公告类型：0-普通 1-重要 2-活动',
    `is_top`     TINYINT      NOT NULL DEFAULT 0                                       COMMENT '是否置顶：0-否 1-是',
    `status`     TINYINT      NOT NULL DEFAULT 1                                       COMMENT '状态：0-下线 1-上线',
    `start_time` DATETIME     DEFAULT NULL                                             COMMENT '生效时间',
    `end_time`   DATETIME     DEFAULT NULL                                             COMMENT '失效时间',
    `view_count` INT          NOT NULL DEFAULT 0                                       COMMENT '浏览量',
    `publisher_id` BIGINT     DEFAULT NULL                                             COMMENT '发布人（管理员 ID）',
    `create_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP                       COMMENT '创建时间',
    `update_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_status`       (`status`),
    KEY `idx_type`         (`type`),
    KEY `idx_create_time`  (`create_time`),
    KEY `idx_top_status`   (`is_top`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='系统公告表';


-- ============================================================
-- ⑯ 优惠券模板
-- ============================================================
DROP TABLE IF EXISTS `coupon`;
CREATE TABLE `coupon` (
    `id`            BIGINT        NOT NULL AUTO_INCREMENT                              COMMENT '主键 ID',
    `name`          VARCHAR(100)  NOT NULL                                              COMMENT '优惠券名称',
    `type`          TINYINT       NOT NULL                                              COMMENT '类型：0-满减券 1-折扣券 2-无门槛券',
    `amount`        DECIMAL(10,2) NOT NULL                                              COMMENT '满减面值 / 折扣率（0.85 表示 8.5 折）',
    `min_amount`    DECIMAL(10,2) NOT NULL DEFAULT 0                                    COMMENT '最低使用金额（0 表示无门槛）',
    `max_discount`  DECIMAL(10,2) NOT NULL DEFAULT 0                                    COMMENT '折扣券最高抵扣金额',
    `total`         INT           NOT NULL                                              COMMENT '发放总量（-1 表示不限量）',
    `remain`        INT           NOT NULL                                              COMMENT '剩余可领取数量',
    `per_limit`     INT           NOT NULL DEFAULT 1                                    COMMENT '每人限领数量',
    `status`        TINYINT       NOT NULL DEFAULT 1                                    COMMENT '状态：0-未上线 1-已上线 2-已结束',
    `start_time`    DATETIME      NOT NULL                                              COMMENT '领取开始时间',
    `end_time`      DATETIME      NOT NULL                                              COMMENT '领取截止时间',
    `valid_days`    INT           DEFAULT NULL                                          COMMENT '领取后有效天数（NULL 时使用固定截止日期）',
    `description`   VARCHAR(500)  DEFAULT NULL                                          COMMENT '使用说明',
    `create_time`   DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '创建时间',
    `update_time`   DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_status`     (`status`),
    KEY `idx_start_time` (`start_time`),
    KEY `idx_end_time`   (`end_time`),
    KEY `idx_type`       (`type`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='优惠券模板表';


-- ============================================================
-- ⑰ 用户优惠券（领取记录）
-- ============================================================
DROP TABLE IF EXISTS `user_coupon`;
CREATE TABLE `user_coupon` (
    `id`          BIGINT   NOT NULL AUTO_INCREMENT                                    COMMENT '主键 ID',
    `user_id`     BIGINT   NOT NULL                                                    COMMENT '用户 ID',
    `coupon_id`   BIGINT   NOT NULL                                                    COMMENT '优惠券模板 ID',
    `status`      TINYINT  NOT NULL DEFAULT 0                                          COMMENT '状态：0-未使用 1-已使用 2-已过期 3-已作废',
    `order_id`    BIGINT   DEFAULT NULL                                                COMMENT '使用时关联的订单 ID',
    `receive_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP                          COMMENT '领取时间',
    `use_time`    DATETIME DEFAULT NULL                                                COMMENT '使用时间',
    `expire_time` DATETIME NOT NULL                                                    COMMENT '过期时间',
    PRIMARY KEY (`id`),
    KEY `idx_user_id`   (`user_id`),
    KEY `idx_coupon_id` (`coupon_id`),
    KEY `idx_status`    (`status`),
    KEY `idx_expire`    (`expire_time`),
    KEY `idx_user_status` (`user_id`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户优惠券领取记录表';


-- ============================================================
-- ⑱ 限时抢购活动
-- 设计要点（与 Redis 配合）：
--   - 活动开启时，把 seckill_product 的 seckill_stock 同步到 Redis
--     key: seckill:stock:{activityId}:{productId}
--   - 用户抢购时 Redis DECR 原子扣减，避免超卖
--   - 抢购成功后再异步写库（消费 MQ 消息）
--   - seckill_order 唯一索引 (user_id, activity_id, product_id) 兜底"一人一单"
-- ============================================================
DROP TABLE IF EXISTS `seckill_activity`;
CREATE TABLE `seckill_activity` (
    `id`         BIGINT       NOT NULL AUTO_INCREMENT                                 COMMENT '主键 ID',
    `name`       VARCHAR(100) NOT NULL                                                 COMMENT '活动名称',
    `cover`      VARCHAR(255) DEFAULT NULL                                             COMMENT '活动封面图',
    `start_time` DATETIME     NOT NULL                                                 COMMENT '活动开始时间',
    `end_time`   DATETIME     NOT NULL                                                 COMMENT '活动结束时间',
    `status`     TINYINT      NOT NULL DEFAULT 0                                       COMMENT '状态：0-未开始 1-进行中 2-已结束',
    `description` VARCHAR(500) DEFAULT NULL                                            COMMENT '活动说明',
    `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                      COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_start_time` (`start_time`),
    KEY `idx_end_time`   (`end_time`),
    KEY `idx_status`     (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='限时抢购活动表';


-- ============================================================
-- ⑲ 抢购活动商品
-- ============================================================
DROP TABLE IF EXISTS `seckill_product`;
CREATE TABLE `seckill_product` (
    `id`            BIGINT        NOT NULL AUTO_INCREMENT                              COMMENT '主键 ID',
    `activity_id`   BIGINT        NOT NULL                                              COMMENT '所属活动 ID',
    `product_id`    BIGINT        NOT NULL                                              COMMENT '商品 SPU ID',
    `sku_id`        BIGINT        NOT NULL                                              COMMENT '商品 SKU ID',
    `seckill_price` DECIMAL(10,2) NOT NULL                                              COMMENT '抢购价',
    `origin_price`  DECIMAL(10,2) NOT NULL                                              COMMENT '原价（展示用）',
    `seckill_stock` INT           NOT NULL                                              COMMENT '总库存（同步到 Redis）',
    `remain_stock`  INT           NOT NULL                                              COMMENT '剩余库存（兜底用，正常情况下以 Redis 为准）',
    `per_limit`     INT           NOT NULL DEFAULT 1                                    COMMENT '每人限购数量',
    `sales`         INT           NOT NULL DEFAULT 0                                    COMMENT '已售数量（异步消费 MQ 后累加）',
    `sort`          INT           NOT NULL DEFAULT 0                                    COMMENT '活动内排序',
    `create_time`   DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '创建时间',
    `update_time`   DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_activity_sku` (`activity_id`, `sku_id`),
    KEY `idx_product_id`  (`product_id`),
    KEY `idx_activity_id` (`activity_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='抢购活动商品表';


-- ============================================================
-- ⑳ 抢购订单（仅作为"成功下单"的最终记录）
-- 设计要点：
--   - 抢购请求先通过 Redis 原子扣库存 + Lua 限流
--   - 抢到后消息进入 MQ，由消费者线程消费：
--       ① 写 seckill_order（唯一索引防一人多单）
--       ② 生成主订单
--       ③ 异步扣 MySQL 库存（兜底）
--   - 此表只保留"已成功抢购"的记录，不存失败的请求
--   - (user_id, activity_id, product_id) 唯一索引：兜底防一人多单
-- ============================================================
DROP TABLE IF EXISTS `seckill_order`;
CREATE TABLE `seckill_order` (
    `id`          BIGINT   NOT NULL AUTO_INCREMENT                                    COMMENT '主键 ID',
    `user_id`     BIGINT   NOT NULL                                                    COMMENT '用户 ID',
    `activity_id` BIGINT   NOT NULL                                                    COMMENT '活动 ID',
    `product_id`  BIGINT   NOT NULL                                                    COMMENT '商品 SPU ID',
    `sku_id`      BIGINT   NOT NULL                                                    COMMENT 'SKU ID',
    `quantity`    INT      NOT NULL                                                    COMMENT '抢购数量',
    `seckill_price` DECIMAL(10,2) NOT NULL                                             COMMENT '成交单价',
    `order_id`    BIGINT   DEFAULT NULL                                                COMMENT '关联主订单 ID（支付/取消后回填）',
    `status`      TINYINT  NOT NULL DEFAULT 0                                          COMMENT '状态：0-待支付 1-已支付 2-已取消 3-已退款',
    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP                          COMMENT '抢购时间',
    `pay_time`    DATETIME DEFAULT NULL                                                COMMENT '支付时间',
    PRIMARY KEY (`id`),
    -- 唯一索引：防止同一用户在同一活动中对同一商品重复抢购
    UNIQUE KEY `uk_user_activity_sku` (`user_id`, `activity_id`, `sku_id`),
    KEY `idx_order_id`      (`order_id`),
    KEY `idx_activity_id`   (`activity_id`),
    KEY `idx_user_id`       (`user_id`),
    KEY `idx_status`        (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='抢购成功记录表';


-- ============================================================
-- ㉑ 文件上传记录
-- ============================================================
DROP TABLE IF EXISTS `upload_file`;
CREATE TABLE `upload_file` (
    `id`            BIGINT       NOT NULL AUTO_INCREMENT                               COMMENT '主键 ID',
    `name`          VARCHAR(255) NOT NULL                                              COMMENT '原始文件名',
    `path`          VARCHAR(255) NOT NULL                                              COMMENT '存储路径（相对 uploads/）',
    `url`           VARCHAR(255) NOT NULL                                              COMMENT '访问 URL',
    `size`          BIGINT       NOT NULL DEFAULT 0                                    COMMENT '文件大小（字节）',
    `content_type`  VARCHAR(100) DEFAULT NULL                                          COMMENT 'MIME 类型',
    `storage_type`  VARCHAR(20)  NOT NULL DEFAULT 'local'                              COMMENT '存储类型：local / qiniu / aliyun / tencent / minio',
    `biz_type`      VARCHAR(50)  DEFAULT NULL                                          COMMENT '业务类型：avatar / product / banner / chat',
    `upload_by`     BIGINT       DEFAULT NULL                                          COMMENT '上传人（用户/管理员 ID）',
    `create_time`   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP                    COMMENT '上传时间',
    PRIMARY KEY (`id`),
    KEY `idx_upload_by`  (`upload_by`),
    KEY `idx_biz_type`   (`biz_type`),
    KEY `idx_create_time`(`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='文件上传记录表';


-- ============================================================
-- 完成
-- ============================================================
SELECT '✅ 数据库初始化完成，共 21 张表' AS message;
