日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現抽獎功能

瀏覽:15日期:2022-08-20 13:48:29

本文實例為大家分享了Java實現抽獎功能的具體代碼,供大家參考,具體內容如下

1 概述

項目開發中經常會有抽獎這樣的營銷活動的需求,例如:積分大轉盤、刮刮樂、老虎機等等多種形式,其實后臺的實現方法是一樣的,本文介紹一種常用的抽獎實現方法。

整個抽獎過程包括以下幾個方面:

獎品 獎品池 抽獎算法 獎品限制 獎品發放

2 獎品

獎品包括獎品、獎品概率和限制、獎品記錄。獎品表:

CREATE TABLE `points_luck_draw_prize` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT ’獎品名稱’, `url` varchar(50) DEFAULT NULL COMMENT ’圖片地址’, `value` varchar(20) DEFAULT NULL, `type` tinyint(4) DEFAULT NULL COMMENT ’類型1:紅包2:積分3:體驗金4:謝謝惠顧5:自定義’, `status` tinyint(4) DEFAULT NULL COMMENT ’狀態’, `is_del` bit(1) DEFAULT NULL COMMENT ’是否刪除’, `position` int(5) DEFAULT NULL COMMENT ’位置’, `phase` int(10) DEFAULT NULL COMMENT ’期數’, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=164 DEFAULT CHARSET=utf8mb4 COMMENT=’獎品表’;

獎品概率限制表:

CREATE TABLE `points_luck_draw_probability` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `points_prize_id` bigint(20) DEFAULT NULL COMMENT ’獎品ID’, `points_prize_phase` int(10) DEFAULT NULL COMMENT ’獎品期數’, `probability` float(4,2) DEFAULT NULL COMMENT ’概率’, `frozen` int(11) DEFAULT NULL COMMENT ’商品抽中后的冷凍次數’, `prize_day_max_times` int(11) DEFAULT NULL COMMENT ’該商品平臺每天最多抽中的次數’, `user_prize_month_max_times` int(11) DEFAULT NULL COMMENT ’每位用戶每月最多抽中該商品的次數’, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COMMENT=’抽獎概率限制表’;

獎品記錄表:

CREATE TABLE `points_luck_draw_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `member_id` bigint(20) DEFAULT NULL COMMENT ’用戶ID’, `member_mobile` varchar(11) DEFAULT NULL COMMENT ’中獎用戶手機號’, `points` int(11) DEFAULT NULL COMMENT ’消耗積分’, `prize_id` bigint(20) DEFAULT NULL COMMENT ’獎品ID’, `result` smallint(4) DEFAULT NULL COMMENT ’1:中獎 2:未中獎’, `month` varchar(10) DEFAULT NULL COMMENT ’中獎月份’, `daily` date DEFAULT NULL COMMENT ’中獎日期(不包括時間)’, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3078 DEFAULT CHARSET=utf8mb4 COMMENT=’抽獎記錄表’;

3 獎品池

獎品池是根據獎品的概率和限制組裝成的抽獎用的池子。主要包括獎品的總池值和每個獎品所占的池值(分為開始值和結束值)兩個維度。

獎品的總池值:所有獎品池值的總和。 每個獎品的池值:算法可以變通,常用的有以下兩種方式 :

1)、獎品的概率*10000(保證是整數)2)、獎品的概率10000獎品的剩余數量

獎品池bean:

public class PrizePool implements Serializable{ /** * 總池值 */ private int total; /** * 池中的獎品 */ private List<PrizePoolBean> poolBeanList;}

池中的獎品bean:

public class PrizePoolBean implements Serializable{ /** * 數據庫中真實獎品的ID */ private Long id; /** * 獎品的開始池值 */ private int begin; /** * 獎品的結束池值 */ private int end;}

獎品池的組裝代碼:

/** * 獲取超級大富翁的獎品池 * @param zillionaireProductMap 超級大富翁獎品map * @param flag true:有現金 false:無現金 * @return */ private PrizePool getZillionairePrizePool(Map<Long, ActivityProduct> zillionaireProductMap, boolean flag) { //總的獎品池值 int total = 0; List<PrizePoolBean> poolBeanList = new ArrayList<>(); for(Entry<Long, ActivityProduct> entry : zillionaireProductMap.entrySet()){ ActivityProduct product = entry.getValue(); //無現金獎品池,過濾掉類型為現金的獎品 if(!flag && product.getCategoryId() == ActivityPrizeTypeEnums.XJ.getType()){ continue; } //組裝獎品池獎品 PrizePoolBean prizePoolBean = new PrizePoolBean(); prizePoolBean.setId(product.getProductDescriptionId()); prizePoolBean.setBengin(total); total = total + product.getEarnings().multiply(new BigDecimal('10000')).intValue(); prizePoolBean.setEnd(total); poolBeanList.add(prizePoolBean); } PrizePool prizePool = new PrizePool(); prizePool.setTotal(total); prizePool.setPoolBeanList(poolBeanList); return prizePool;}

4 抽獎算法

整個抽獎算法為:

1. 隨機獎品池總池值以內的整數 2. 循環比較獎品池中的所有獎品,隨機數落到哪個獎品的池區間即為哪個獎品中獎。抽獎代碼:

public static PrizePoolBean getPrize(PrizePool prizePool){ //獲取總的獎品池值 int total = prizePool.getTotal(); //獲取隨機數 Random rand=new Random(); int random=rand.nextInt(total); //循環比較獎品池區間 for(PrizePoolBean prizePoolBean : prizePool.getPoolBeanList()){ if(random >= prizePoolBean.getBengin() && random < prizePoolBean.getEnd()){ return prizePoolBean; } } return null; }

5 獎品限制

實際抽獎中對一些比較大的獎品往往有數量限制,比如:某某獎品一天最多被抽中5次、某某獎品每位用戶只能抽中一次。。等等類似的限制,對于這樣的限制我們分為兩種情況來區別對待:

1. 限制的獎品比較少,通常不多于3個:這種情況我們可以再組裝獎品池的時候就把不符合條件的獎品過濾掉,這樣抽中的獎品都是符合條件的。例如,在上面的超級大富翁抽獎代碼中,我們規定現金獎品一天只能被抽中5次,那么我們可以根據判斷條件分別組裝出有現金的獎品和沒有現金的獎品。2. 限制的獎品比較多,這樣如果要采用第一種方式,就會導致組裝獎品非常繁瑣,性能低下,我們可以采用抽中獎品后校驗抽中的獎品是否符合條件,如果不符合條件則返回一個固定的獎品即可。

6 獎品發放

獎品發放可以采用工廠模式進行發放:不同的獎品類型走不同的獎品發放處理器,示例代碼如下:獎品發放:

/** * 異步分發獎品 * @param prizeList * @throws Exception */ @Async('myAsync') @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public Future<Boolean> sendPrize(Long memberId, List<PrizeDto> prizeList){ try { for(PrizeDto prizeDto : prizeList){ //過濾掉謝謝惠顧的獎品 if(prizeDto.getType() == PointsLuckDrawTypeEnum.XXHG.getType()){ continue; } //根據獎品類型從工廠中獲取獎品發放類 SendPrizeProcessor sendPrizeProcessor = sendPrizeProcessorFactory.getSendPrizeProcessor( PointsLuckDrawTypeEnum.getPointsLuckDrawTypeEnumByType(prizeDto.getType())); if(ObjectUtil.isNotNull(sendPrizeProcessor)){ //發放獎品 sendPrizeProcessor.send(memberId, prizeDto); } } return new AsyncResult<>(Boolean.TRUE); }catch (Exception e){ //獎品發放失敗則記錄日志 saveSendPrizeErrorLog(memberId, prizeList); LOGGER.error('積分抽獎發放獎品出現異常', e); return new AsyncResult<>(Boolean.FALSE); }}

工廠類:

@Componentpublic class SendPrizeProcessorFactory implements ApplicationContextAware{ private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public SendPrizeProcessor getSendPrizeProcessor(PointsLuckDrawTypeEnum typeEnum){ String processorName = typeEnum.getSendPrizeProcessorName(); if(StrUtil.isBlank(processorName)){ return null; } SendPrizeProcessor processor = applicationContext.getBean(processorName, SendPrizeProcessor.class); if(ObjectUtil.isNull(processor)){ throw new RuntimeException('沒有找到名稱為【' + processorName + '】的發送獎品處理器'); } return processor; }}

獎品發放類舉例:

/** * 紅包獎品發放類 */@Component('sendHbPrizeProcessor')public class SendHbPrizeProcessor implements SendPrizeProcessor{ private Logger LOGGER = LoggerFactory.getLogger(SendHbPrizeProcessor.class); @Resource private CouponService couponService; @Resource private MessageLogService messageLogService; @Override public void send(Long memberId, PrizeDto prizeDto) throws Exception { // 發放紅包 Coupon coupon = couponService.receiveCoupon(memberId, Long.parseLong(prizeDto.getValue())); //發送站內信 messageLogService.insertActivityMessageLog(memberId, '你參與積分抽大獎活動抽中的' + coupon.getAmount() + '元理財紅包已到賬,謝謝參與', '積分抽大獎中獎通知'); //輸出log日志 LOGGER.info(memberId + '在積分抽獎中抽中的' + prizeDto.getPrizeName() + '已經發放!'); }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩激情中文字幕| 国产亚洲一卡2卡3卡4卡新区| 国产精品2区| 国产精品一级| 久久爱www.| 欧美激情aⅴ一区二区三区 | a日韩av网址| 中文字幕成在线观看| 人人精品亚洲| 成人日韩在线| 999精品色在线播放| 亚洲国产专区| 久久不射网站| 青青草国产成人99久久| 久久wwww| 中国字幕a在线看韩国电影| 久久久水蜜桃av免费网站| 免费观看久久av| 首页亚洲欧美制服丝腿| 亚州精品视频| 国产精品久av福利在线观看| 色偷偷偷在线视频播放| 在线观看免费一区二区| 综合色一区二区| 欧美精品国产一区| 免费在线亚洲欧美| 亚洲va在线| 亚洲一区二区三区四区电影 | 久久精品欧美一区| 在线综合亚洲| 日韩av一区二| 电影91久久久| 欧美精品一区二区久久| 亚洲精品国产精品粉嫩| 国产精品啊v在线| 美女网站视频一区| 精品一级视频| 国产激情综合| 日韩不卡在线| 免费成人在线观看| 国产精品密蕾丝视频下载| 国产成人精品一区二区三区在线| 91精品国产成人观看| 亚洲三级毛片| 国产一区二区三区四区二区| 9国产精品视频| 国产日本精品| 亚洲精品国产嫩草在线观看 | 欧美精品影院| 麻豆成全视频免费观看在线看| 91久久黄色| 麻豆成人av在线| 亚洲经典在线| 精品午夜av| 水蜜桃久久夜色精品一区的特点| 免费一级欧美在线观看视频| 1000部精品久久久久久久久| 久久精品 人人爱| 啪啪国产精品| 久久国产生活片100| 四虎4545www国产精品| 中文字幕一区二区av| 国产成人免费| 国产传媒在线| 激情黄产视频在线免费观看| 蜜桃免费网站一区二区三区| 国产 日韩 欧美 综合 一区| 久久亚洲欧美| 97精品国产一区二区三区 | 亚洲精选成人| 精品国产免费人成网站| 性欧美精品高清| 色综合五月天| 亚洲精品亚洲人成在线观看| 免费一二一二在线视频| 国产精品视频一区二区三区综合| 亚洲黑丝一区二区| 国产乱子精品一区二区在线观看| 91久久国产| 国产不卡精品| 日本综合精品一区| 黄色成人91| 国产高潮在线| 国产精品亚洲一区二区在线观看| 99亚洲视频| 久久久久久黄| 国产一区国产二区国产三区| 日韩av中文字幕一区| 丝袜国产日韩另类美女| 亚洲天堂免费电影| 免费一级欧美片在线观看网站 | 色8久久久久| 99国产精品自拍| 蜜桃精品在线| 久久电影tv| 国产aⅴ精品一区二区四区| 国产亚洲一区二区三区不卡| 亚洲精品视频一二三区| 亚洲精品1区| 国产专区一区| 欧美一区久久久| 精品国产欧美| 欧美激情视频一区二区三区免费 | 国产日韩一区二区三区在线播放| 免费看的黄色欧美网站| 欧美日中文字幕| 日韩欧美午夜| 国产精品久久久久久久久妇女| 国产精久久一区二区| 日韩精选在线| 亚洲一级大片| 一级成人国产| 视频一区二区三区在线| 日韩视频中文| 中文日韩在线| 欧美日韩激情| 欧美日韩精品免费观看视完整| 久久影院一区二区三区| 三级久久三级久久久| 亚洲免费影视| 99re国产精品| 红桃视频国产一区| 国产偷自视频区视频一区二区| 亚洲高清av| 亚洲国产日韩欧美在线| 欧美日韩激情| 伊人成人网在线看| 亚洲美洲欧洲综合国产一区| 亚洲一区欧美激情| 亚洲一区日韩在线| 丝袜亚洲精品中文字幕一区| 丝袜亚洲另类欧美| 婷婷综合国产| 欧美一区成人| 国产精品一二| 国产成人调教视频在线观看| 亚洲综合电影| 激情综合在线| 亚洲免费中文| 亚洲香蕉久久| 国产精品最新| 麻豆mv在线观看| 91精品国产乱码久久久久久久| 欧美日韩免费观看一区=区三区| 亚洲一区成人| 日本成人在线一区| 久久国产欧美日韩精品| 国产一区二区三区精品在线观看| 高清av一区| 99久久久久国产精品| 麻豆精品91| 欧美日韩一区二区三区在线电影| 国产精品九九| 日韩精品免费一区二区在线观看| 精品一区欧美| 亚洲精品第一| 精品网站aaa| 国产一区亚洲| 日韩精品亚洲aⅴ在线影院| 国产精品v一区二区三区| 成人av三级| 久久成人精品| 麻豆中文一区二区| 亚洲黄色免费av| 黑丝美女一区二区| 奇米亚洲欧美| 激情国产在线| 视频在线观看一区| 久久gogo国模啪啪裸体| 99视频精品全国免费| 日韩精品一二三四| 国产美女撒尿一区二区| 亚洲综合电影| 亚洲精品婷婷| 伊人久久国产| 亚洲免费福利一区| 最近高清中文在线字幕在线观看1| 欧美色图国产精品| 日本一区二区三区视频在线看| 国产中文欧美日韩在线| 日韩午夜一区| 国产精品99精品一区二区三区∴| 91精品啪在线观看国产18| 亚洲毛片在线免费| 蜜桃av在线播放| 日本午夜精品久久久| 91精品一区二区三区综合| 日韩av网站在线免费观看| 九九精品调教| 久久激情av| 国产欧美日韩一区二区三区四区| 蜜桃av一区二区在线观看| 国产欧美日韩一级| 神马久久午夜| 精品亚洲自拍| 日韩精品一级中文字幕精品视频免费观看| 国产精品久久久久久久久免费高清| 亚洲成av人片一区二区密柚| 91九色综合| 国产农村妇女精品一区二区|