剛開始只有一個抽獎大轉盤
活動 有以下抽獎規則數據庫
每一個用戶天天能夠抽3次json
新客第一次抽獎100%中獎設計
新客接下來抽獎只能中紅包獎品code
中了優惠券一個月內只能中紅包 中了實物半年內只能中紅包orm
對應的數據庫表設計爲ci
create table lottery_activity( id int primary key auto_increment, name varchar(20) not null comment '活動名稱', start_time datetime not null default current_timestamp comment '活動起始時間', end_time datetime comment '活動截止時間 爲空表示無截止時間', daily_draw_count tinyint default 3 not null comment '每日抽獎次數', new_user_probability tinyint not null comment '新客中獎機率', old_user_probability tinyint not null comment '老客中獎機率', new_user_first_probability tinyint not null comment '新客首次中獎機率', coupon_interval decimal(10,5) not null comment '優惠券間隔時間 單位天', real_object_interval decimal(10,5) not null comment '實物間隔時間 單位天' )charset utf8 comment '抽獎活動配置';
可是後面又有開寶箱
活動須要複用抽獎大轉盤的玩法 而開寶箱
與已有的抽獎大轉盤又有所不一樣 以下所示rem
名稱 | 開寶箱 | 抽獎頻道 |
---|---|---|
開始時間 | 2016-09-20 | 2016-07-01 |
結束時間 | 2016-09-30 | 無截止時間 |
天天抽獎次數* | 無 | 3 |
整個活動期間抽獎次數* | 1 | 無 |
用戶區分模式* | 按用戶等級區分 | 按新老客區分 |
用戶中獎機率* | v0中獎機率 v1中獎機率 v2中獎機率 v3中獎機率 v4中獎機率 ... |
新客中獎機率 老客中獎機率 新客首次抽獎機率 |
實物獎品間隔 | 11天 | 半年 |
優惠券獎品間隔 | 11天 | 一個月 |
此時抽獎活動配置表 就不夠用了 因而從新設計了表結構 以下所示文檔
Create Table: CREATE TABLE `lottery_activity` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT '活動名稱', `start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活動起始時間', `end_time` datetime DEFAULT NULL COMMENT '活動截止時間 爲空表示無截止時間', `daily_draw_count` tinyint(4) DEFAULT NULL COMMENT '每日抽獎次數', `total_draw_count` int(11) DEFAULT NULL COMMENT '活動期間總抽獎次數', `lottery_rules` varchar(1000) NOT NULL COMMENT '抽獎規則 json格式', `coupon_interval` decimal(10,5) NOT NULL COMMENT '優惠券間隔時間 單位天', `real_object_interval` decimal(10,5) NOT NULL COMMENT '實物間隔時間 單位天' ) CHARSET=utf8 COMMENT='抽獎活動配置'
將一些不一樣抽獎活動特異的抽獎規則放到lottery_rules
字段中get
如抽獎大轉盤it
{ "old_user_probability" : 45, # 老客抽獎機率 "first_draw_awards" : "28", # 首次抽獎才能中的獎品 如新客只有首次才能中優惠券 "old_user_first_probability" : 45, # 老客首次抽獎機率 "new_user_probability" : 30, # 新客抽獎機率 "new_user_first_probability" : 100, # 新客首次抽獎機率 "probability_configuration_mode" : 1 #中獎機率配置模式 -- 新老客 }
開寶箱
{ "default_probability" : 100, # 默認100%中獎 "probability_configuration_mode" : 2 #中獎機率配置模式 -- 用戶等級 }
因而在代碼中須要解析該json根據對應的中獎機率配置模式
來計算用戶的中獎機率 如
if(PROBABILITY_CONFIGURATION_MODE_OF_NEW_OLD_USER == probabilityConfigurationMode){ // 按照新老客配置得中獎機率 int newUserFirstProbability = (int) lotteryRulesMap.get("new_user_first_probability"); // 新客首次抽獎機率 int newUserProbability = (int) lotteryRulesMap.get("new_user_probability"); // 新客中獎機率 int oldUserFirstProbability = (int) lotteryRulesMap.get("old_user_first_probability"); // 老客首次抽獎機率 int oldUserProbability = (int) lotteryRulesMap.get("old_user_probability"); // 老客抽獎機率 probability = isPlatformNewUser?(isUserFirstDraw? newUserFirstProbability : newUserProbability): (isUserFirstDraw?oldUserFirstProbability:oldUserProbability); }