-- ============================================================
-- iShare 数据库设计 v2 → v3 增量脚本
-- 修订时间: 2026-02-17
-- 处理评审问题: R1, R2, I1, I2, I3(文档), L1, L2
-- ============================================================

USE pigxx_app;
SET NAMES utf8mb4;

-- ============================================================
-- R2: 修复 as_user_sub_member 唯一键问题
-- 原 UNIQUE(sub_id, user_id) 导致续费覆盖历史记录
-- 改为：允许多条记录，逻辑约束同 sub_id+user_id 只有一条 status=1
-- ============================================================
ALTER TABLE `as_user_sub_member`
  DROP INDEX IF EXISTS `uk_sub_user`;

-- 补充索引（定时任务/我的订阅高频查询）
ALTER TABLE `as_user_sub_member`
  ADD INDEX IF NOT EXISTS `idx_user_status`  (`user_id`, `status`),
  ADD INDEX IF NOT EXISTS `idx_expire_status` (`expire_time`, `status`);

-- L1: status 增加 4=等待车主录入凭据（广场拼车场景）
-- 注：仅修改注释，逻辑不变；应用层处理状态值
ALTER TABLE `as_user_sub_member`
  MODIFY COLUMN `status` tinyint NOT NULL DEFAULT 0
    COMMENT '状态: 0=待激活, 1=使用中, 2=已到期, 3=已退订, 4=等待车主录入凭据';


-- ============================================================
-- I2: as_sub_product.sub_plan_ids 逗号分隔改为关联表
-- ============================================================

-- 新增 M:N 关联表
CREATE TABLE IF NOT EXISTS `as_product_plan_rel` (
  `id`         bigint NOT NULL AUTO_INCREMENT     COMMENT '主键',
  `product_id` bigint NOT NULL                   COMMENT '产品ID（→ as_sub_product.id）',
  `plan_id`    bigint NOT NULL                   COMMENT '订阅计划ID（→ as_sub_plan.id）',
  `sort_order` int    NOT NULL DEFAULT 0         COMMENT '排序权重（同产品内多计划的展示顺序）',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_product_plan` (`product_id`, `plan_id`),
  KEY `idx_product_id` (`product_id`),
  KEY `idx_plan_id`    (`plan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='产品-订阅计划关联表（M:N）';

-- 移除旧的逗号分隔字段
ALTER TABLE `as_sub_product`
  DROP COLUMN IF EXISTS `sub_plan_ids`;

-- 补充 as_sub_product 高频查询索引
ALTER TABLE `as_sub_product`
  ADD INDEX IF NOT EXISTS `idx_product_type_status` (`product_type`, `status`);


-- ============================================================
-- R1: 新增 as_recharge — 钱包充值单
-- 支持外部支付充值时追踪（待支付→成功→到账）
-- ============================================================
CREATE TABLE IF NOT EXISTS `as_recharge` (
  `id`          bigint        NOT NULL AUTO_INCREMENT COMMENT '主键',
  `recharge_no` varchar(32)   NOT NULL               COMMENT '充值单号（RC+时间戳+随机，业务唯一）',
  `user_id`     bigint        NOT NULL               COMMENT '用户ID（→ app_user.user_id）',
  `amount`      decimal(10,2) NOT NULL               COMMENT '充值金额',
  `pay_type`    tinyint       NOT NULL               COMMENT '支付方式: 1=人工充值(管理员), 2=支付宝, 3=微信支付',
  `pay_no`      varchar(64)   DEFAULT NULL           COMMENT '第三方支付单号（外部支付时回填）',
  `status`      tinyint       NOT NULL DEFAULT 0     COMMENT '状态: 0=待支付, 1=已支付/已到账, 2=支付失败, 3=已取消',
  `remark`      varchar(256)  DEFAULT NULL           COMMENT '备注（人工充值时填写原因）',
  `operator_id` bigint        DEFAULT NULL           COMMENT '操作人ID（人工充值时为管理员ID）',
  `expire_time` datetime      DEFAULT NULL           COMMENT '订单过期时间（外部支付时 +15min）',
  `pay_time`    datetime      DEFAULT NULL           COMMENT '实际支付/到账时间',
  `create_time` datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime      DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_recharge_no` (`recharge_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status`  (`status`),
  KEY `idx_pay_no`  (`pay_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='钱包充值单表（含外部支付追踪）';


-- ============================================================
-- I1: 新增 as_banner — 首页广告位/Banner
-- ============================================================
CREATE TABLE IF NOT EXISTS `as_banner` (
  `id`          bigint       NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title`       varchar(128) NOT NULL               COMMENT 'Banner 标题（后台管理用）',
  `image_url`   varchar(512) NOT NULL               COMMENT 'Banner 图片 URL',
  `link_type`   tinyint      NOT NULL DEFAULT 0     COMMENT '跳转类型: 0=无跳转, 1=商品详情, 2=外部链接, 3=平台分类',
  `link_target` varchar(512) DEFAULT NULL           COMMENT '跳转目标（商品ID/URL/分类ID，按 link_type 解析）',
  `sort_order`  int          NOT NULL DEFAULT 0     COMMENT '排序权重（升序，值小靠前）',
  `status`      tinyint      NOT NULL DEFAULT 0     COMMENT '状态: 0=草稿, 1=展示中, 2=已下线',
  `start_time`  datetime     DEFAULT NULL           COMMENT '展示开始时间（NULL=立即生效）',
  `end_time`    datetime     DEFAULT NULL           COMMENT '展示结束时间（NULL=长期有效）',
  `create_by`   varchar(64)  DEFAULT NULL           COMMENT '创建人',
  `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime     DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_status_sort` (`status`, `sort_order`),
  KEY `idx_time_range`  (`start_time`, `end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='首页 Banner 广告位表';


-- ============================================================
-- L2: 补充关键查询索引
-- ============================================================

-- as_order: 用户订单列表 / 状态过滤
ALTER TABLE `as_order`
  ADD INDEX IF NOT EXISTS `idx_user_status` (`user_id`, `status`);

-- as_notification: 未读消息数
ALTER TABLE `as_notification`
  ADD INDEX IF NOT EXISTS `idx_user_read` (`user_id`, `is_read`);

-- as_user_sub: 商品下的可用合租槽
ALTER TABLE `as_user_sub`
  ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);

-- as_sub_account: 产品下的账号列表
ALTER TABLE `as_sub_account`
  ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);

-- ============================================================
-- END
-- ============================================================
