mall_client/zyhs_app_java/sql测试/lottery_draw_schema.sql

176 lines
7.7 KiB
MySQL
Raw Normal View History

2026-03-13 07:50:35 +00:00
-- =====================================================
-- 幸运抽奖系统 - 数据库脚本
-- 创建时间: 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;