抽獎大轉盤設計演化

剛開始只有一個抽獎大轉盤活動 有以下抽獎規則數據庫

  • 每一個用戶天天能夠抽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);
        }

參考文檔

基於Event Sourcing和DSL的積分規則引擎設計實現案例

相關文章
相關標籤/搜索