-- ============================================================
-- 黄精粉健康商城 HJF 数据库迁移脚本
-- 版本：Phase 2
-- 日期：2026-03-15
-- 执行说明：
--   1. 兼容 MySQL 5.7+，数据库前缀为 eb_
--   2. 按顺序执行 P2-01 ~ P2-05
--   3. 所有操作均做幂等处理，可重复执行
-- ============================================================

-- ============================================================
-- P2-01: 公排池表
-- ============================================================

CREATE TABLE IF NOT EXISTS `eb_queue_pool` (
  `id`            int(11)        NOT NULL AUTO_INCREMENT              COMMENT '自增主键',
  `uid`           int(11)        NOT NULL DEFAULT 0                   COMMENT '用户 ID',
  `order_id`      varchar(50)    NOT NULL DEFAULT ''                  COMMENT '来源订单号（eb_store_order.order_id）',
  `amount`        decimal(10,2)  NOT NULL DEFAULT 3600.00             COMMENT '报单金额（元）',
  `queue_no`      int(11)        NOT NULL DEFAULT 0                   COMMENT '全局排队序号（自增，唯一）',
  `status`        tinyint(1)     NOT NULL DEFAULT 0                   COMMENT '状态：0=排队中 1=已退款',
  `refund_time`   int(11)        NOT NULL DEFAULT 0                   COMMENT '退款时间（Unix 时间戳）',
  `trigger_batch` int(11)        NOT NULL DEFAULT 0                   COMMENT '触发退款的批次号',
  `add_time`      int(11)        NOT NULL DEFAULT 0                   COMMENT '入队时间（Unix 时间戳）',
  PRIMARY KEY (`id`),
  UNIQUE  KEY `uniq_queue_no`         (`queue_no`),
  INDEX         `idx_uid`             (`uid`),
  INDEX         `idx_status_add_time` (`status`, `add_time`),
  INDEX         `idx_trigger_batch`   (`trigger_batch`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公排池';


-- ============================================================
-- P2-02: 积分释放日志表
-- ============================================================

CREATE TABLE IF NOT EXISTS `eb_points_release_log` (
  `id`           int(11)      NOT NULL AUTO_INCREMENT             COMMENT '自增主键',
  `uid`          int(11)      NOT NULL DEFAULT 0                  COMMENT '用户 ID',
  `points`       int(11)      NOT NULL DEFAULT 0                  COMMENT '积分数量（绝对值）',
  `pm`           tinyint(1)   NOT NULL DEFAULT 1                  COMMENT '收支方向：1=收入 0=支出',
  `type`         varchar(50)  NOT NULL DEFAULT ''                 COMMENT '类型：reward_direct/reward_umbrella/release/consume',
  `title`        varchar(255) NOT NULL DEFAULT ''                 COMMENT '标题',
  `mark`         varchar(500) NOT NULL DEFAULT ''                 COMMENT '备注',
  `status`       varchar(30)  NOT NULL DEFAULT 'frozen'           COMMENT '状态：frozen=冻结 released=已释放 consumed=已消费',
  `order_id`     varchar(50)  NOT NULL DEFAULT ''                 COMMENT '关联订单号（奖励来源），释放记录为空',
  `release_date` date                  DEFAULT NULL               COMMENT '释放日期（每日释放时填写）',
  `add_time`     int(11)      NOT NULL DEFAULT 0                  COMMENT '记录时间（Unix 时间戳）',
  PRIMARY KEY (`id`),
  INDEX `idx_uid_type`     (`uid`, `type`),
  INDEX `idx_uid_add_time` (`uid`, `add_time`),
  INDEX `idx_release_date` (`release_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分释放明细日志';


-- ============================================================
-- P2-03 / P2-04: eb_user / eb_store_product / eb_store_order 扩展字段
--
-- MySQL 5.7 不支持 "ADD COLUMN IF NOT EXISTS"，
-- 改用存储过程 + information_schema 实现幂等检查。
-- ============================================================

DROP PROCEDURE IF EXISTS `hjf_migrate_columns`;

DELIMITER $$
CREATE PROCEDURE `hjf_migrate_columns`()
BEGIN

  -- ---- eb_user 字段 ----
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'member_level'
  ) THEN
    ALTER TABLE `eb_user`
      ADD COLUMN `member_level` tinyint(1) NOT NULL DEFAULT 0 COMMENT '会员等级：0普通 1创客 2云店 3服务商 4分公司';
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'no_assess'
  ) THEN
    ALTER TABLE `eb_user`
      ADD COLUMN `no_assess` tinyint(1) NOT NULL DEFAULT 0 COMMENT '不计入伞下业绩：1=不计入';
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'frozen_points'
  ) THEN
    ALTER TABLE `eb_user`
      ADD COLUMN `frozen_points` int(11) NOT NULL DEFAULT 0 COMMENT '待释放（冻结）积分';
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND COLUMN_NAME = 'available_points'
  ) THEN
    ALTER TABLE `eb_user`
      ADD COLUMN `available_points` int(11) NOT NULL DEFAULT 0 COMMENT '可用积分';
  END IF;

  -- eb_user 索引：idx_member_level
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user' AND INDEX_NAME = 'idx_member_level'
  ) THEN
    ALTER TABLE `eb_user` ADD INDEX `idx_member_level` (`member_level`);
  END IF;

  -- ---- eb_store_product 字段 ----
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND COLUMN_NAME = 'is_queue_goods'
  ) THEN
    ALTER TABLE `eb_store_product`
      ADD COLUMN `is_queue_goods` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否报单商品：1=是';
  END IF;

  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND COLUMN_NAME = 'allow_pay_types'
  ) THEN
    ALTER TABLE `eb_store_product`
      ADD COLUMN `allow_pay_types` varchar(255) NOT NULL DEFAULT '' COMMENT '允许积分支付类型（JSON数组）';
  END IF;

  -- eb_store_product 索引：idx_is_queue_goods
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product' AND INDEX_NAME = 'idx_is_queue_goods'
  ) THEN
    ALTER TABLE `eb_store_product` ADD INDEX `idx_is_queue_goods` (`is_queue_goods`);
  END IF;

  -- ---- eb_store_order 字段 ----
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_order' AND COLUMN_NAME = 'is_queue_goods'
  ) THEN
    ALTER TABLE `eb_store_order`
      ADD COLUMN `is_queue_goods` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否报单商品订单：1=是';
  END IF;

  -- eb_store_order 索引：idx_is_queue_goods
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_order' AND INDEX_NAME = 'idx_is_queue_goods'
  ) THEN
    ALTER TABLE `eb_store_order` ADD INDEX `idx_is_queue_goods` (`is_queue_goods`);
  END IF;

END$$
DELIMITER ;

CALL `hjf_migrate_columns`();
DROP PROCEDURE IF EXISTS `hjf_migrate_columns`;


-- ============================================================
-- P2-05: eb_system_config 初始化配置项
--
-- 字段说明（与 CRMEB 原表保持一致）：
--   menu_name   = 配置键名（代码中 SystemConfigService::get() 读取）
--   value       = 默认值（字符串）
--   info        = 后台显示名称
--   desc        = 说明文字
--   config_tab_id = 0（不归属某分组，便于独立管理）
--   status      = 1（启用）
-- ============================================================

-- 防止重复执行报错，使用 INSERT IGNORE
INSERT IGNORE INTO `eb_system_config`
  (`is_store`, `menu_name`, `type`, `input_type`, `config_tab_id`,
   `parameter`, `upload_type`, `required`, `width`, `high`,
   `value`, `info`, `desc`, `sort`, `status`)
VALUES

-- 公排触发倍数：每入 N 单退款第1单（默认 4）
(0, 'hjf_trigger_multiple', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '4', '公排触发倍数', '每进入N单公排触发退款第1单，默认4', 10, 1),

-- 积分每日释放比例（‰，默认 4，即 4‰）
(0, 'hjf_release_rate', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '4', '积分每日释放比例(‰)', '每日释放：frozen_points × N / 1000，默认4（即4‰）', 20, 1),

-- 提现手续费率（%，默认 7，即 7%）
(0, 'hjf_fee_rate', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '7', '提现手续费率(%)', '申请提现时收取的手续费比例，默认7%', 30, 1),

-- 等级升级门槛：普通→创客（直推N单）
(0, 'hjf_level_direct_require_1', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '3', '创客升级所需直推单数', '普通会员直推N单报单商品后升级为创客，默认3', 40, 1),

-- 等级升级门槛：创客→云店（伞下N单）
(0, 'hjf_level_umbrella_require_2', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '30', '云店升级所需伞下单数', '创客伞下业绩达到N单后升级为云店，默认30', 50, 1),

-- 等级升级门槛：云店→服务商（伞下N单）
(0, 'hjf_level_umbrella_require_3', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '100', '服务商升级所需伞下单数', '云店伞下业绩达到N单后升级为服务商，默认100', 60, 1),

-- 等级升级门槛：服务商→分公司（伞下N单）
(0, 'hjf_level_umbrella_require_4', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '1000', '分公司升级所需伞下单数', '服务商伞下业绩达到N单后升级为分公司，默认1000', 70, 1),

-- 直推奖励积分：创客直推可得N积分
(0, 'hjf_reward_direct_1', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '500', '创客直推奖励积分', '创客等级直推一单报单商品可获得的冻结积分，默认500', 80, 1),

-- 直推奖励积分：云店
(0, 'hjf_reward_direct_2', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '800', '云店直推奖励积分', '云店等级直推一单报单商品可获得的冻结积分，默认800', 90, 1),

-- 直推奖励积分：服务商
(0, 'hjf_reward_direct_3', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '1000', '服务商直推奖励积分', '服务商等级直推一单报单商品可获得的冻结积分，默认1000', 100, 1),

-- 直推奖励积分：分公司
(0, 'hjf_reward_direct_4', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '1300', '分公司直推奖励积分', '分公司等级直推一单报单商品可获得的冻结积分，默认1300', 110, 1),

-- 伞下奖励积分：创客（无伞下奖励）
(0, 'hjf_reward_umbrella_1', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '0', '创客伞下奖励积分', '创客等级伞下奖励积分（级差），默认0（无伞下奖励）', 120, 1),

-- 伞下奖励积分：云店
(0, 'hjf_reward_umbrella_2', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '300', '云店伞下奖励积分', '云店等级伞下奖励积分（级差），默认300', 130, 1),

-- 伞下奖励积分：服务商
(0, 'hjf_reward_umbrella_3', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '200', '服务商伞下奖励积分', '服务商等级伞下奖励积分（级差），默认200', 140, 1),

-- 伞下奖励积分：分公司
(0, 'hjf_reward_umbrella_4', 'text', 'input', 0,
 '', 0, '', 100, 0,
 '300', '分公司伞下奖励积分', '分公司等级伞下奖励积分（级差），默认300', 150, 1);


-- ============================================================
-- 迁移完成校验（可手动执行检查）
-- ============================================================

-- SELECT TABLE_NAME FROM information_schema.TABLES
--   WHERE TABLE_SCHEMA = DATABASE()
--   AND TABLE_NAME IN ('eb_queue_pool', 'eb_points_release_log');

-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
--   WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user'
--   AND COLUMN_NAME IN ('member_level','no_assess','frozen_points','available_points');

-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
--   WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product'
--   AND COLUMN_NAME IN ('is_queue_goods','allow_pay_types');

-- SELECT menu_name, value FROM eb_system_config
--   WHERE menu_name LIKE 'hjf_%' ORDER BY sort;
