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

相关推荐

  • 网站标签优化有哪些方法,seo常见的标签介绍

    每个SEO从业者都需要掌握一定的WEB前端代码,为之后的网页设计、UI合作等打好基础。下面是SEO常用标签 TDK标签 TDK对每个seoer来说都是熟悉的不能再熟悉的html标签了.TDK分别表示Title、Keywords和Description三大最常见的优化标签。Title页面标题,keywords页面关键词、description页面描述这两个标签被搜索引擎识别,关键字设置等需要在这几个…

    2022年5月20日
    720
  • 绩效奖金怎么算个人所得税,事业单位个人绩效工资计算公式

    设计绩效奖金方案的考虑因素 VUCA时代,变化是唯一的不变,变的不止是外部的环境,还有员工的内心。信息的冲击、生活的压力、高薪的诱惑,让员工的内心蠢蠢欲动,都希望能找到一份有更好报酬的工作。 这样的现状让HR们在制定激励方案时越来越棘手:老板要求成本可控,花的每一分钱都要有价值;管理者要求方案清晰公平,避免出现矛盾冲突;员工则要求方案够刺激,这样才能充分调动积极性;还有要求精神激励的,希望能够取得…

    2022年10月14日
    590
  • 微信怎么导出聊天记录,微信文件批量导出教程

    微信出了新功能:聊天记录“不显示”。 渣男们第一时间更新,并隐藏了各种不堪入目的对话框。 有句话说得好,“好男人都是相似的,渣男却各有各的渣”。 今天兔姐就给大家揭露——渣男十大常见骚操作,希望各位姐妹擦亮眼睛! 林子大了,什么渣男都有。 但遇到渣男不可怕,可怕的是不能及时止损,任其继续伤害你。 所以,对待渣男的正确方式就是:果断说拜拜

    2022年6月16日
    610
  • apk逆向分析(安卓逆向教程)

    我们很多小白都不知道APK是什么,但是相信很多人都知道APP是什么,不过也有很多行业内半知半懂的同学们还会把APP和APK当做是一个,所以呢今天小编就来和大家深度剖析一下我们的APK和APP。 首先我们先来分别认识一下APP和APK APP APP英文名(Application)的简称,翻译成中文叫做应用,由于智能手机的流行,现在的APP多指移动设备。(包括平板电脑、手机、和其他移动设备)上的第三…

    2022年5月13日
    960
  • 创业新项目有哪些(4个适合年轻人创业的项目推荐)

    现在有很多年轻人都有自己的爱好,在创业的时候他们可能会更加注重个人的喜好,比如喜欢打游戏的,开了一家游戏类的互联网公司;喜欢喝奶茶的,开了一家奶茶店;喜欢看书的,开了家共享书店等等。那有哪些适合年轻人的创业新项目呢? 一、游戏推广平台 许多人可能对游戏推广这个职业不太了解,游戏推广与传统的地推不同的是不用自己到处去寻找客户推广自己的产品,而是可以直接通过各大网络游戏平台推广自己的产品。各大游戏公司…

    2022年5月20日
    800
  • Camtasia 2022Win/Mac版安装激活教程 微课电脑录制编辑视频

    作为一个自媒体人,每天都要录制编辑视频,选择一个好的视频编辑工具就是大家首先面临的一个难题,选择一个好工具,可以起到事半功倍的效果,大大提高工作效率。

    2022年4月26日
    2290
  • 微粒贷利息怎么算的,微粒贷利息的计算方法

    微粒贷是国内首家互联网银行腾讯微众银行推出的纯信用贷款口子,在2015年横空出世。一开始只有少数腾讯用户可以享受这一贷款服务,那时,希财君也只有看看的份。随着微粒贷逐渐平民化,普通的微信、QQ用户也可以申请微粒贷了。那么。微粒贷利息怎么算呢?希财君详细为大家讲一讲有关内容。 微粒贷常规利息计算方式 请大家擦亮双眼不要被微粒贷按月还款的方式所迷惑,其实,微粒贷利息按天计算,借一天钱算一天的利息,童叟…

    2022年7月31日
    540
  • 电话营销员是做什么的,电话营销员的工作内容与岗位职责介绍

    刚刚接到一个来自北京的推销电话。 推销员说话的语气非常沉闷,无精打采,一点热情没有,好像是刚刚才睡醒的样子。 我告诉她,我没有这方面的购买需要,客气地挂掉了电话。 我在想,与其找这样的电话销售员,还不如安排AI机器人打电话呢。 记得很久之前看过一个故事,有个销售员刚入行不久,做推销工作的时候总是受到打击,工作热情,也提不上来。后来他的领导告诉他:你要改变想法,假如你打了100个电话,才有一个客户成…

    2022年6月19日
    630
  • 微商专用手机排名,哪些手机适合做微商用

    经济不景气,做微商成本低,收益好,而且通过微信等社交软件推广成本较传统广告低太多,所以做微商的越来越多。微商肯定需要一个手机能多开微信或者QQ软件,今天笔者就推荐两款支持微信QQ八开的手机,就是说一个手机可以支持八个微信账号和八个QQ账号同时登录在线。现在请出今天的两位主角。金立K3和小辣椒红辣椒9X. 下面做个对比表格,让大家一目了然。 通过表格对比,整体配置,小辣椒完胜金立,特别是CPU,小辣…

    2022年7月11日
    810
  • 如何打开pdf格式文档,具体方法与步骤分享给大家

    在平时工作和学习中,很多资料都是PDF格式,而我们想对其进行修改和拷贝,往往会非常麻烦。 那么今天给大家带来的这个软件,就是可以对PDF进行修改的福昕PDF编辑器 我们打开软件,先看前半段 我把一些比较特别的功能给大家展示下: 对象里可以添加文本和图形,以及对原文本的字进行改变。 在编辑对象中,就可以对绿框中的字进行改变 在文档选项中 可以增加或删除页面 滤镜选项可以增加个滤镜??? 我也没想到这…

    2022年7月9日
    520

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信