纠纷奇闻作文社交美文家庭
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

用Java写了一个抽奖功能,年会抽奖靠它了

8月24日 游鱼坊投稿
  概述
  项目开发中经常会有抽奖这样的营销活动的需求,例如:积分大转盘、刮刮乐、老虎机等等多种形式,其实后台的实现方法是一样的,本文介绍一种常用的抽奖实现方法。
  整个抽奖过程包括以下几个方面:奖品奖品池抽奖算法奖品限制奖品发放奖品奖品包括奖品、奖品概率和限制、奖品记录。
  奖品表:CREATETABLEpointsluckdrawprize(idbigint(20)NOTNULLAUTOINCREMENT,namevarchar(50)DEFAULTNULLCOMMENT奖品名称,urlvarchar(50)DEFAULTNULLCOMMENT图片地址,valuevarchar(20)DEFAULTNULL,typetinyint(4)DEFAULTNULLCOMMENT类型1:红包2:积分3:体验金4:谢谢惠顾5:自定义,statustinyint(4)DEFAULTNULLCOMMENT状态,isdelbit(1)DEFAULTNULLCOMMENT是否删除,positionint(5)DEFAULTNULLCOMMENT位置,phaseint(10)DEFAULTNULLCOMMENT期数,createtimedatetimeDEFAULTNULL,updatetimedatetimeDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBAUTOINCREMENT164DEFAULTCHARSETutf8mb4COMMENT奖品表;
  奖品概率限制表:CREATETABLEpointsluckdrawprobability(idbigint(20)NOTNULLAUTOINCREMENT,pointsprizeidbigint(20)DEFAULTNULLCOMMENT奖品ID,pointsprizephaseint(10)DEFAULTNULLCOMMENT奖品期数,probabilityfloat(4,2)DEFAULTNULLCOMMENT概率,frozenint(11)DEFAULTNULLCOMMENT商品抽中后的冷冻次数,prizedaymaxtimesint(11)DEFAULTNULLCOMMENT该商品平台每天最多抽中的次数,userprizemonthmaxtimesint(11)DEFAULTNULLCOMMENT每位用户每月最多抽中该商品的次数,createtimedatetimeDEFAULTNULL,updatetimedatetimeDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBAUTOINCREMENT114DEFAULTCHARSETutf8mb4COMMENT抽奖概率限制表;
  奖品记录表:CREATETABLEpointsluckdrawrecord(idbigint(20)NOTNULLAUTOINCREMENT,memberidbigint(20)DEFAULTNULLCOMMENT用户ID,membermobilevarchar(11)DEFAULTNULLCOMMENT中奖用户手机号,pointsint(11)DEFAULTNULLCOMMENT消耗积分,prizeidbigint(20)DEFAULTNULLCOMMENT奖品ID,resultsmallint(4)DEFAULTNULLCOMMENT1:中奖2:未中奖,monthvarchar(10)DEFAULTNULLCOMMENT中奖月份,dailydateDEFAULTNULLCOMMENT中奖日期(不包括时间),createtimedatetimeDEFAULTNULL,updatetimedatetimeDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBAUTOINCREMENT3078DEFAULTCHARSETutf8mb4COMMENT抽奖记录表;奖品池
  奖品池是根据奖品的概率和限制组装成的抽奖用的池子。主要包括奖品的总池值和每个奖品所占的池值(分为开始值和结束值)两个维度。最新面试题整理好了,点击Java面试库小程序在线刷题。奖品的总池值:所有奖品池值的总和。每个奖品的池值:算法可以变通,常用的有以下两种方式:
  奖品的概率10000(保证是整数)奖品的概率10000奖品的剩余数量
  奖品池bean:publicclassPrizePoolimplementsSerializable{总池值池中的奖品privateListPrizePoolBeanpoolBeanL}
  池中的奖品bean:publicclassPrizePoolBeanimplementsSerializable{数据库中真实奖品的IDprivateL奖品的开始池值奖品的结束池值}
  奖品池的组装代码:获取超级大富翁的奖品池paramzillionaireProductMap超级大富翁奖品mapparamflagtrue:有现金false:无现金returnprivatePrizePoolgetZillionairePrizePool(MapLong,ActivityProductzillionaireProductMap,booleanflag){总的奖品池值inttotal0;ListPrizePoolBeanpoolBeanListnewArrayList();for(EntryLong,ActivityProductentry:zillionaireProductMap。entrySet()){ActivityProductproductentry。getValue();无现金奖品池,过滤掉类型为现金的奖品if(!flagproduct。getCategoryId()ActivityPrizeTypeEnums。XJ。getType()){}组装奖品池奖品PrizePoolBeanprizePoolBeannewPrizePoolBean();prizePoolBean。setId(product。getProductDescriptionId());prizePoolBean。setBengin(total);totaltotalproduct。getEarnings()。multiply(newBigDecimal(10000))。intValue();prizePoolBean。setEnd(total);poolBeanList。add(prizePoolBean);}PrizePoolprizePoolnewPrizePool();prizePool。setTotal(total);prizePool。setPoolBeanList(poolBeanList);returnprizeP}抽奖算法
  整个抽奖算法为:随机奖品池总池值以内的整数循环比较奖品池中的所有奖品,随机数落到哪个奖品的池区间即为哪个奖品中奖。
  推荐一个SpringBoot基础教程及实战示例:
  https:github。comjavastacksspringbootbestpractice
  抽奖代码:publicstaticPrizePoolBeangetPrize(PrizePoolprizePool){获取总的奖品池值inttotalprizePool。getTotal();获取随机数RandomrandnewRandom();intrandomrand。nextInt(total);循环比较奖品池区间for(PrizePoolBeanprizePoolBean:prizePool。getPoolBeanList()){if(randomprizePoolBean。getBengin()randomprizePoolBean。getEnd()){returnprizePoolB}}}奖品限制
  实际抽奖中对一些比较大的奖品往往有数量限制,比如:某某奖品一天最多被抽中5次、某某奖品每位用户只能抽中一次等等类似的限制,对于这样的限制我们分为两种情况来区别对待:限制的奖品比较少,通常不多于3个:这种情况我们可以再组装奖品池的时候就把不符合条件的奖品过滤掉,这样抽中的奖品都是符合条件的。例如,在上面的超级大富翁抽奖代码中,我们规定现金奖品一天只能被抽中5次,那么我们可以根据判断条件分别组装出有现金的奖品和没有现金的奖品。限制的奖品比较多,这样如果要采用第一种方式,就会导致组装奖品非常繁琐,性能低下,我们可以采用抽中奖品后校验抽中的奖品是否符合条件,如果不符合条件则返回一个固定的奖品即可。奖品发放
  奖品发放可以采用工厂模式进行发放:不同的奖品类型走不同的奖品发放处理器,示例代码如下:
  奖品发放:异步分发奖品paramprizeListthrowsExceptionAsync(myAsync)Transactional(rollbackForException。class,propagationPropagation。REQUIRED)publicFutureBooleansendPrize(LongmemberId,ListPrizeDtoprizeList){try{for(PrizeDtoprizeDto:prizeList){过滤掉谢谢惠顾的奖品if(prizeDto。getType()PointsLuckDrawTypeEnum。XXHG。getType()){}根据奖品类型从工厂中获取奖品发放类SendPrizeProcessorsendPrizeProcessorsendPrizeProcessorFactory。getSendPrizeProcessor(PointsLuckDrawTypeEnum。getPointsLuckDrawTypeEnumByType(prizeDto。getType()));if(ObjectUtil。isNotNull(sendPrizeProcessor)){发放奖品sendPrizeProcessor。send(memberId,prizeDto);}}returnnewAsyncResult(Boolean。TRUE);}catch(Exceptione){奖品发放失败则记录日志saveSendPrizeErrorLog(memberId,prizeList);LOGGER。error(积分抽奖发放奖品出现异常,e);returnnewAsyncResult(Boolean。FALSE);}}
  工厂类:ComponentpublicclassSendPrizeProcessorFactoryimplementsApplicationContextAware{privateApplicationContextapplicationCOverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this。applicationContextapplicationC}publicSendPrizeProcessorgetSendPrizeProcessor(PointsLuckDrawTypeEnumtypeEnum){StringprocessorNametypeEnum。getSendPrizeProcessorName();if(StrUtil。isBlank(processorName)){}SendPrizeProcessorprocessorapplicationContext。getBean(processorName,SendPrizeProcessor。class);if(ObjectUtil。isNull(processor)){thrownewRuntimeException(没有找到名称为【processorName】的发送奖品处理器);}}}
  奖品发放类举例:红包奖品发放类Component(sendHbPrizeProcessor)publicclassSendHbPrizeProcessorimplementsSendPrizeProcessor{privateLoggerLOGGERLoggerFactory。getLogger(SendHbPrizeProcessor。class);ResourceprivateCouponServicecouponSResourceprivateMessageLogServicemessageLogSOverridepublicvoidsend(LongmemberId,PrizeDtoprizeDto)throwsException{发放红包CouponcouponcouponService。receiveCoupon(memberId,Long。parseLong(prizeDto。getValue()));发送站内信messageLogService。insertActivityMessageLog(memberId,你参与积分抽大奖活动抽中的coupon。getAmount()元理财红包已到账,谢谢参与,积分抽大奖中奖通知);输出log日志LOGGER。info(memberId在积分抽奖中抽中的prizeDto。getPrizeName()已经发放!);}}
  原文链接:https:blog。csdn。netwang258533488articledetails78901303
搜索 投诉 评论 转载

iPhoneXR是否能成为ios下一款钉子户机型大家来看看说到苹果手机,大家首先想到的就是高端二字,ios系统最大的特点无非就是系统干净、使用流畅、体验顺滑、品质优秀等优点。但是经过多年发展,苹果除了以上优点,苹果也存在很多缺点……智慧城市技术推动高效的灾难响应和恢复从西部热浪引发的野火到东南部无情的飓风,由于气候变化,自然灾害的频率和严重性都在增加。正如2020年发生的历史性极端事件所证明的那样,总共发生了22起价值10亿美元的天气和气候……盘点2021年那些值得入手的冰箱盘点2021年那些值得入手的冰箱!最值得入手的六款冰箱,覆盖所有价位,记得点赞收藏。第一、容声217,1200元买个软冷冻的三门冰箱,还要什么自行车,不仅噪音小还节能,每……用Java写了一个抽奖功能,年会抽奖靠它了概述项目开发中经常会有抽奖这样的营销活动的需求,例如:积分大转盘、刮刮乐、老虎机等等多种形式,其实后台的实现方法是一样的,本文介绍一种常用的抽奖实现方法。整个抽奖过……地产业掀起高管离职潮,不行的是行业还是个人?走过红利期后,行业马太效应加剧,经验复制之路难走。中小房企在获取资源上存在很大难度,仅凭职业经理人的能力,也很难为房企达成快速的规模扩张。下行周期中,老板对职业经理人的耐心也很……工信部中国新能源车成本偏高将统筹保障动力电池资源供应工业信息化部副部长辛国斌9月16日上午在海南省海口市召开的第三届世界新能源汽车大会(WNEVC2021)上视频发言时表示,发展新能源汽车是中国实现碳中和等目标的战略选择,并取得……得物App成中国潮流文化风向标牵引国潮新浪潮国潮的兴起,是Z世代文化自信的表现。得物App作为一端连接消费者、一端连接品牌方的桥梁,正成为新一代年轻人在线购物的首选,在其驱动下,越来越多的国潮品牌搭上高速发展的列车。……万物皆可互联首款搭载华为鸿蒙系统的新车即将来袭!在6月2日晚,华为举行了线上发布会,此次发布会主要发布了鸿蒙操作系统以及华为全场景新品,主要针对手机端鸿蒙系统进行讲解。目前很多华为用户已经收到了鸿蒙系统的推送,该系统可实现多……营收同比下滑,完美世界真正的忧虑在哪里?今年4月,完美世界在北京召开战略发布会,宣布从品牌到产品方向希望突破传统定位进行升级,持续培育IP之外谋求包括二次元在内更多品类的成功。8月16日,完美世界发布2021年……人工智能红利显现科大讯飞营收利润稳健,持续增长可期文杨剑勇今年,新冠病毒冲击着世界经济的同时,企业经营也受到巨大挑战。不过,善于利用新技术的企业,经营能得到快速恢复,抗压力显然更强。具体来说,以人工智能、云计算为核心的新……独立院校人才管理创新模式论文〔摘要〕针对目前我国独立院校人才培养过程中存在的专业口径狭窄、脱离工程实际、忽视实践环节、工程型师资缺乏等问题,结合独立院校物流管理专业人才培养的实际情况,参照目前国际上先进的……微课在现代成人高等教育教学中的应用的论文微课作为一种新兴的教学手段,运用网络技术,具有短小精悍、针对性强等特点,在现代教育教学过程中发挥越来越重要的作用。成人教育学生受时空限制,传统的教育教学方法受到很大的挑战。在教……
欧陆音乐魅力维也纳Liszt次旗舰落地喇叭射手要近战,SNK公布王者荣耀联动DLC角色英雄公孙离宣传视王者荣耀破浪对决玩法即将上线,峡谷海战5V6登顶王者荣耀6月收入超PUBGMobile,位列全球手游收入为何国外手机那么贵,哪里来的自信?手机市场排名变化巨大,华为无货可卖,面临全国缺货微软XboxOne新预览版推送正式添加键鼠支持第二届Oculus游戏展将会在2022年举行战地52月12日更新,新增DLSS支持商用自动洗碗机洗碗效果怎么样?第五批游戏版号下发,腾讯再获版号EA取消开放世界星球大战的游戏开发
尽管生活很忙,也要关注孩子的需求,给予足够的关注私人空间关于老师的作文我心目中的好老师谈恋爱秘诀三种男人最念旧忘不了前女友是谁出卖了米洛舍维奇结局是怎样的爆福原爱江宏杰疑婚变福原爱周末才能过二人世界红辣椒以下是地球上10个最大的未解之谜阿里密集收购与亿融资背后离婚如何分割婚后财产?肝火旺或与这3个因素有关,若有这4种异常,提示你该降肝火了热 安全警钟长鸣演讲稿

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形