176 lines
7.7 KiB
SQL
176 lines
7.7 KiB
SQL
-- =====================================================
|
||
-- 幸运抽奖系统 - 数据库脚本
|
||
-- 创建时间: 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;
|
||
|