-- =====================================================
-- 幸运抽奖系统 - 数据库脚本
-- 创建时间: 2026-01-07
-- 说明: 包含新增表和修改字段
-- =====================================================

-- =====================================================
-- 1. 新增表: lottery_probability_segment (概率区间配置表)
-- 用途: 实现平均分配，防止奖项扎堆
-- =====================================================
CREATE TABLE IF NOT EXISTS `lottery_probability_segment` (
    `segment_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '区间配置ID',
    `activity_id` BIGINT NOT NULL COMMENT '活动ID',
    `segment_size` INT NOT NULL DEFAULT 25000 COMMENT '每个区间的大小',
    `award_level` INT NOT NULL COMMENT '奖项等级（1=省,2=地级市,3=县级市,4=自治县,5=县,6=阳光普照）',
    `quota_per_segment` INT NOT NULL COMMENT '每个区间内该等级奖项的配额',
    `description` VARCHAR(255) COMMENT '描述',
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX `idx_activity` (`activity_id`),
    INDEX `idx_activity_level` (`activity_id`, `award_level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='概率区间配置表（防止奖项扎堆）';

-- =====================================================
-- 2. 修改表: lottery_record (抽奖记录表)
-- 新增字段: activity_id, batch_no, points_cost
-- =====================================================
-- 检查并添加 activity_id 字段
ALTER TABLE `lottery_record` 
ADD COLUMN IF NOT EXISTS `activity_id` BIGINT COMMENT '活动ID' AFTER `record_id`;

-- 检查并添加 batch_no 字段
ALTER TABLE `lottery_record` 
ADD COLUMN IF NOT EXISTS `batch_no` VARCHAR(64) COMMENT '批次号（同一次抽奖的多个结果）' AFTER `award_id`;

-- 检查并添加 points_cost 字段
ALTER TABLE `lottery_record` 
ADD COLUMN IF NOT EXISTS `points_cost` INT DEFAULT 0 COMMENT '本次消耗积分' AFTER `is_win`;

-- 添加索引
ALTER TABLE `lottery_record` 
ADD INDEX IF NOT EXISTS `idx_batch_no` (`batch_no`);

ALTER TABLE `lottery_record` 
ADD INDEX IF NOT EXISTS `idx_activity_user` (`activity_id`, `user_id`);

-- =====================================================
-- 3. 初始化数据: 概率区间配置
-- 每25000张的配额（根据需求文档）
-- =====================================================
-- 注意: 请根据实际活动ID修改 activity_id 值

-- 清空已有配置（可选，谨慎使用）
-- DELETE FROM lottery_probability_segment WHERE activity_id = 1;

-- 插入配置数据（假设活动ID为1）
INSERT INTO `lottery_probability_segment` 
(`activity_id`, `segment_size`, `award_level`, `quota_per_segment`, `description`) 
VALUES 
(1, 25000, 1, 1, '海南省 - 每25000张出1个'),
(1, 25000, 2, 3, '地级市(海口/三亚/三沙/儋州) - 每25000张出3个'),
(1, 25000, 3, 10, '县级市(五指山/文昌/琼海/万宁/东方) - 每25000张出10个'),
(1, 25000, 4, 15, '自治县(白沙/昌江/乐东/保亭/琼中/陵水) - 每25000张出15个'),
(1, 25000, 5, 25, '县(定安县/屯昌县/澄迈县/临高县) - 每25000张出25个');
-- 等级6为阳光普照，无配额限制，不需要配置

-- =====================================================
-- 4. 奖项数据示例（lottery_award 表）
-- 请根据实际情况修改，这里只是示例
-- =====================================================
-- 注意：lottery_award 表需要有 activity_id 和 award_level 字段

/*
-- 如果 lottery_award 表没有 activity_id 字段，请先添加
ALTER TABLE `lottery_award` 
ADD COLUMN IF NOT EXISTS `activity_id` BIGINT COMMENT '活动ID' AFTER `award_id`;

-- 示例奖项数据（根据需求文档）
-- 等级1: 省（4张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(1, 1, '海南省', 1, '海南省，共4张', 1);

-- 等级2: 地级市（12张，每个3张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(2, 1, '海口', 2, '地级市，共3张', 1),
(3, 1, '三亚', 2, '地级市，共3张', 1),
(4, 1, '三沙', 2, '地级市，共3张', 1),
(5, 1, '儋州', 2, '地级市，共3张', 1);

-- 等级3: 县级市（40张，每个8张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(6, 1, '五指山', 3, '县级市，共8张', 1),
(7, 1, '文昌', 3, '县级市，共8张', 1),
(8, 1, '琼海', 3, '县级市，共8张', 1),
(9, 1, '万宁', 3, '县级市，共8张', 1),
(10, 1, '东方', 3, '县级市，共8张', 1);

-- 等级4: 自治县（60张，每个10张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(11, 1, '白沙', 4, '自治县，共10张', 1),
(12, 1, '昌江', 4, '自治县，共10张', 1),
(13, 1, '乐东', 4, '自治县，共10张', 1),
(14, 1, '保亭', 4, '自治县，共10张', 1),
(15, 1, '琼中', 4, '自治县，共10张', 1),
(16, 1, '陵水', 4, '自治县，共10张', 1);

-- 等级5: 县（100张，每个25张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(17, 1, '定安县', 5, '县，共25张', 1),
(18, 1, '屯昌县', 5, '县，共25张', 1),
(19, 1, '澄迈县', 5, '县，共25张', 1),
(20, 1, '临高县', 5, '县，共25张', 1);

-- 等级6: 阳光普照（99784张）
INSERT INTO `lottery_award` (`award_id`, `activity_id`, `award_name`, `award_level`, `description`, `status`) VALUES
(21, 1, '阳光普照卡', 6, '阳光普照卡，共99784张', 1);
*/

-- =====================================================
-- 5. 卡片数据生成说明（lottery_card 表）
-- =====================================================
/*
卡片需要根据奖项配置批量生成，每个奖项对应多张卡片。
卡片数量：
- 海南省(award_id=1): 4张
- 海口(award_id=2): 3张, 三亚: 3张, 三沙: 3张, 儋州: 3张 = 12张
- 五指山~东方(award_id=6~10): 每个8张 = 40张
- 白沙~陵水(award_id=11~16): 每个10张 = 60张
- 定安~临高(award_id=17~20): 每个25张 = 100张
- 阳光普照(award_id=21): 99784张

总计: 4 + 12 + 40 + 60 + 100 + 99784 = 100000张

生成卡片的存储过程示例（可选）:
DELIMITER //
CREATE PROCEDURE generate_lottery_cards(IN p_award_id BIGINT, IN p_count INT, IN p_prefix VARCHAR(10))
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < p_count DO
        INSERT INTO lottery_card (card_no, award_id, status, create_time)
        VALUES (CONCAT(p_prefix, LPAD(i+1, 6, '0')), p_award_id, 0, NOW());
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 调用示例:
-- CALL generate_lottery_cards(1, 4, 'HN');     -- 海南省 4张
-- CALL generate_lottery_cards(2, 3, 'HK');     -- 海口 3张
-- ...
*/

-- =====================================================
-- 6. 验证SQL
-- =====================================================
-- 查询概率配置
SELECT * FROM lottery_probability_segment WHERE activity_id = 1;

-- 查询各等级奖项数量
SELECT award_level, COUNT(*) as award_count, GROUP_CONCAT(award_name) as awards 
FROM lottery_award 
WHERE activity_id = 1 AND status = 1 
GROUP BY award_level 
ORDER BY award_level;

-- 查询各奖项卡片数量（通过lottery_card）
SELECT a.award_id, a.award_name, a.award_level, 
       COUNT(c.card_id) as total_cards,
       SUM(CASE WHEN c.status = 0 THEN 1 ELSE 0 END) as available_cards
FROM lottery_award a
LEFT JOIN lottery_card c ON a.award_id = c.award_id
WHERE a.activity_id = 1
GROUP BY a.award_id, a.award_name, a.award_level
ORDER BY a.award_level, a.award_id;

