java抽奖程序代码(抽奖系统代码教程展示)

概述 项目开发中经常会有抽奖这样的营销活动的需求,例如:积分大转盘、刮刮乐、老虎机等等多种形式,其实后台的实现方法是一样的,本文介绍一种常用的抽奖实现方法。 整个抽奖过程包括以下几个方面: 奖品奖品池抽奖算法奖品限制奖品发放 奖品 奖品包括奖品、奖品概率和限制、奖品记录。 奖品表: CREATETABLE`points_luck_draw_prize`( `id`bigint(20)NOTNULL…

简述

新项目开发设计中常常会出现抽奖那样的促销活动的要求,例如:積分幸运转盘、刮刮卡、水果机这些形式多样,实际上后台管理的完成方式 是一样的,文中详细介绍一种常见的抽奖完成方式。

全部抽奖全过程主要包括下列一些层面:

  • 奖品
  • 奖品池
  • 抽奖优化算法
  • 奖品限定
  • 奖品派发

奖品

奖品包含奖品、奖品概率和限定、奖品纪录。

奖品表:

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=\'抽奖记录卡\';

奖品池

奖品池是依据奖品的概率和限定拼装成的抽奖用的水池。主要包含奖品的总池值和每一个奖品所占的池值(分成逐渐值和完毕值)2个层面。全新面试问题梳理好啦,点一下Java招聘面试库微信小程序线上做题。

  • 奖品的总池值:全部奖品池值的总数。
  • 每一个奖品的池值:优化算法可以随机应变,常见的有下列这两种方法 :
    • 奖品的概率*10000(确保是整数金额)
    • 奖品的概率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;
    }

抽奖优化算法

全部抽奖优化算法为:

  • 任意奖品池总池值之内的整数金额
  • 循环系统较为奖品池中的全部奖品,随机数字落到哪个奖品的池区段即是哪个奖品中奖。

强烈推荐一个 Spring Boot 初级教程及实战演练实例:

https://github.com/javastacks/spring-boot-best-practice

抽奖编码:

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次、某某礼品每一位客户只有抽中一次。。这些相近的限定,针对那样的限定大家分成2种情形来有所差异:

  • 限定的礼品较为少,通常不超过3个:这样的事情我们可以再拼装礼品池的过程中就把不满足条件的礼品过虑掉,那样抽中的礼品全是满足条件的。例如,在上面的超级大富翁抽奖活动编码中,大家要求现钱礼品一天只有被抽到5次,那麼我们可以依据分辨标准各自拼装出有资金的礼品和沒有红包的礼品。
  • 限定的礼品比较多,那样假如要选用第一种方法,便会造成拼装礼品十分繁杂,特性不高,我们可以选用抽中奖励后校检抽中的礼品是不是满足条件,如果不符合条件则回到一个固定不动的礼品就可以。

礼品派发

礼品派发可以选用工厂模式开展派发:不一样的礼品种类走不一样的礼品派发CPU,实例编码如下所示:

礼品派发:

/**
     * 多线程派发礼品
     * @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);
        }
    }

加工厂类:

@Component
public 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   \"】的推送礼品CPU\");
        }
        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()   \"已经派发!\");
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月8日 上午11:15
下一篇 2022年5月8日 上午11:17

相关推荐

  • 搭建网站需要多少钱,个人建站的步骤流程分享

    悦然网络工作室已经连续给大家介绍了企业网站建设的基础知识点,包括域名、空间服务器、网站程序、老域名等等,大家只要了解了这些,对企业网站建设应该就会有一个相对详细的认知了。 今天悦然网络工作室再介绍一个大家可能最关心的问题,那就是企业网站建设的费用。关于企业网站建设的费用价格其实并没有一个统一的标准,有些很便宜,有些很贵,便宜的不一定不好,贵的也不一定就更好。 企业网站建设的基础费用 一、域名 制作…

    2022年9月14日
    550
  • 什么是产品思维,解说产品思维和用户思维的区别

    产品思维是一种解决问题的综合思维,是进一步把问题解决方案产品化的过程。 该系列文章框架如下,中途可能有调整: 作为产品从业者,会经常纠结的一个问题是“产品经理需要懂技术吗?要懂多少?”。 针对这个问题,有这么一个技术转产品的人,写了几篇“产品经理需要懂的技术”的文章,获得了不少正反馈。于是持续性产出了一系列这类文章,备受产品经理追捧。不久后,出版了《产品经理必懂的技术那点事儿》的电子书和纸质书,进…

    2022年8月2日
    500
  • 如何进行营销策划,营销策划的五个标准步骤

    优秀的营销方案 一:命运定律 定律1:短期销量增长不一定能改变命运。营销老总的首要职责是寻找改变命运的增长模式。 一家乳制品企业的销售额从5年前的1亿元,增长为现在的3亿元,这家企业是离死亡更近了还是更远了?答案是更近了。也就是说,短期销量增长并没有改变企业死亡的命运。 另一家销售额只有5000万元的乳制品企业,老板召开会议时,写下7亿元、20亿元、50亿元、100亿元。这家企业就是蒙牛。只有快速…

    2022年7月5日
    990
  • 淘宝网怎么进货的,新手开店必看拿货技巧

    很多卖家进入淘宝开店第一个困难的问题就是怎么找货源?其实开淘宝,前期最让店家头疼的问题就是找货源,货源质量、款式的好坏和价格等问题直接影响你后期的运营。 新手卖家开店想找好的货源不仅不容易被人跟风,更让你的产品比他人更有的优势,更多卖家一大堆疑虑,什么样的货源好做、在哪去寻找货源、哪些货源能够快速赚到钱?有人说,物以稀为贵,选择商品一定不能选择那些到处都能买到的商品。不以为然商品贵在质量,贵在有与…

    2022年9月5日
    480
  • 营销管理的实质是什么,简述市场营销管理过程步骤

    一、销售管理流程 销售管理流程包括六个:  第一,开单与发货流程。  第二,结算与返利流程。  第三,供货与收款流程。  第四,售后服务管理流程。 第五,网络开发与维护流程。  第六,价格与市场秩序管理流程。 二、市场管理流程 市场管理流程包括七个: 第一,营销资源的分配及效果监测;  第二,品牌规划与管理;  第三,主题营销策划和管理;  第四,产品组合策略;  第五,广告管理; 第六,促销策略…

    2022年6月17日
    710
  • 人工智能创业项目方案介绍,如何在人工智能领域创业

    2018,被称为人工智能爆发的元年,在这一年,人们预料到人工智能将迎来飞速的发展。快速的发展会给创业者带来更多的机会,但这不表示每一个从事这一行业的人都能够获得成功。事实上,人工智能是一个庞大的概念,其中包含了很多的领域和层级,每一层或者每一个领域都有很多的选择。 之所以人工智能的概念在提出了这么多年之后才真正迎来爆发——它在2017年就已经成为了一个受人追捧的创投风口,是因为在早年的研究中人们很…

    2022年7月21日
    850
  • 免费的网络电视软件哪个好,2020网络电视软件排行榜

    你喜欢看电视剧吗?这不是肯定的吗!不喜欢看电视剧的话,你可能也不会点击进来的哦。好了,话不多说,今天要提及到的热门电视剧有两个:《少年锦衣卫》和《大秦帝国之崛起》。接下来,我会用到这两个电视剧,来向大家推荐几款免费看热门电视剧和热门电影的智能电视软件,一起来看看吧~ 《少年锦衣卫》 我们先来看看《少年锦衣卫》吧,豆瓣评分8.7!此处不得不提一下,我才看到第一集的时候,就被它吸引住,然后毫不犹豫的跳…

    2022年10月12日
    600
  • 网站建设报价比较,这些收费标准你应该要知道

    对于初次建站,不懂互联网建站的企业或是个人而言,企业网站的建设费用一直是个困扰大家的问题。都包括哪些方面?是一次性收费还是每年都收费?企业建站(www.qyjz.com.cn)小编下面给你详细解释一下! 企业网站的建设费用都包括哪些?-企业建站   一、域名:   域名,域名就是我们经常看到的,即网站的访问地址,也就是网址。是需要注册的,也是按年注册的,   费用呢?域名注册商收取的费用都不一样。…

    2022年10月11日
    390
  • 手机怎么投屏到电视上,详细操作教程分享给有需要的朋友

    因为疫情的原因,大家都不能出门玩耍了,刷剧也就成了消磨时间最好的选择。但用手机观看视频总归没有电视大屏幕来的清爽舒服。这时就可以借助“投屏”功能,痛痛快快在电视上观看想看的电影了。 教授介绍了几种手机投屏的方式,一起看一看吧~ 一、无线投屏 01手机自带无线投屏 现在的智能手机基本都带有无线投屏功能,只需手机和电视在同一个网络下即可使用。该方法有一个缺点,那就是当网络不稳定时,视频就会出现卡顿的现…

    2022年7月25日
    2850
  • 怎么刷关键词排名,快速提高关键词排名的方法

    关键字排名真的三五天就能上Baidu首页吗烦忙刷关键字排名真的有路子吗烦忙 关键字排名上首页 Landy在给一些客户做网站优化诊断或许关键字排名时,会碰着一些不懂SEO优化的客户,他们提出一系列苛刻的前提,尤其关于关键字排名他们进展可以三五天就能看到结果。这也难怪客户会用如许的要求,由于如今网站优化这个效劳行业,曾经被“优化软件”搅和的让客户无法真正看法真正的SEO优化究竟若何去做,以及SEO优化…

    2022年7月30日
    5650

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信