2019独角兽企业重金招聘Python工程师标准>>>

表结构

--抽奖设置
create table AWARD_INFO
(ID         NUMBER(11) not null,ACT_ID     NUMBER(11),    --活动IDNUM        NUMBER(11),    --奖品总量(0为不限量)REST       NUMBER(11),    --奖品余量ODDS       NUMBER(11) default 0,    --中奖概率START_DATE DATE,          --开始日期(可为空)END_DATE   DATE,          --结束日期(可为空)PRODUCT_ID NUMBER(11),    --奖品IDSTATE      NUMBER(5) default 0,    --状态 0-有效 1-失效INFO_TYPE  NUMBER(5) default 0     --0-正常
);
alter table AWARD_INFOadd constraint PK_AWARD_INFO primary key (ID);--中奖纪录
create table AWARD_LOG
(id         number(11),    act_id     number(11),    --活动IDget_time   date,    --中奖时间product_id number(11),    --奖品IDnum        number(11) default 1,    --中奖数量person     varchar2(50),    --中奖人info_id    number(11),    --抽奖设置IDstate      number(5)    --状态 0-有效 1-失效
);
alter table AWARD_LOGadd constraint PK_AWARD_LOG primary key (ID);

代码实现

   public static class AwardResult{public int ret;    //返回结果public int logId;  //AWARD_LOG id}/*** 抽奖算法* @param actId 抽奖活动ID* @param person 抽奖人* @param productId 奖品ID -1则为该活动ID下所有奖品* @param excludeId 排除奖品ID -1 则不排除,与productId不能同时>0* @param checkDate 是否检查时间* @return -1 没有抽奖数据;-2 奖品已抽完; -3 其他错误;>=0 中奖productId; -4 排除id* @throws Exception*/public static AwardResult getAwardFull(int actId, String person, int productId, int[] excludeIds, boolean checkDate) throws SQLException{AwardResult result = new AwardResult(); Connection conn = JDBC.getConnection();conn.setAutoCommit(false);try{List<Map<String,Object>> rows;String sql;String checkDateStr = "";String baseSql = "select t.id, t.product_id, t.num, t.rest, t.odds, t.info_type from award_info t where t.act_id=? and t.state=0 ";if(checkDate){checkDateStr = " and t.start_Date <= sysdate and t.end_Date >= sysdate ";}if(productId > 0){//抢购sql = baseSql + " and t.product_id=? " + checkDateStr + " for update";rows = JDBC.getRows(sql, new Object[]{actId, productId}, conn);}else{//活动所有物品抽奖sql = baseSql + checkDateStr + " for update";rows = JDBC.getRows(sql, new Object[]{actId}, conn);}if(rows.isEmpty()){//没有抽奖数据log.info("没有抽奖数据  actId={} person={} productId={} excludeIds={} checkDate={}", actId, person, productId, excludeIds, checkDate);conn.commit();result.ret = -1;return result;}int infoId = -1;int getProductId = -1;int num = -1;int rest = -1;if(rows.size() == 1){//抢购num = ((Number)rows.get(0).get("NUM")).intValue();rest =  ((Number)rows.get(0).get("REST")).intValue();infoId = ((Number)rows.get(0).get("ID")).intValue();getProductId = ((Number)rows.get(0).get("PRODUCT_ID")).intValue();}else{//抽奖int[][] temp = new int[rows.size()][3];int sum = -1;int i = 0;for(int k = 0;  k < rows.size(); k++){//设置奖品池int odds = ((BigDecimal)rows.get(k).get("ODDS")).intValue();sum++;temp[i][0] = sum; //起始值sum = sum + odds;temp[i][1] = sum; //结束值temp[i][2] = k;   //rows indexi++;}//抽奖Random random = new Random();int r = random.nextInt(sum + 1);int j = 0;for(int k = 0; k < i; k++){if(r >= temp[k][0] && r <= temp[k][1]){j = k;break;}}infoId = ((BigDecimal)rows.get(temp[j][2]).get("ID")).intValue();getProductId = ((BigDecimal)rows.get(temp[j][2]).get("PRODUCT_ID")).intValue();num = ((Number)rows.get(temp[j][2]).get("NUM")).intValue();rest = ((Number)rows.get(temp[j][2]).get("REST")).intValue();}//判断是否排除idif(ArrayUtils.contains(excludeIds, getProductId)){log.info("是排除ID  actId={} person={} productId={} excludeIds={} checkDate={}", actId, person, productId, excludeIds, checkDate);conn.commit();result.ret = -4;return result;}//存量不足if(num > 0 && rest <= 0){log.info("奖品已清空  actId={} person={} productId={} excludeIds={} checkDate={}", actId, person, productId, excludeIds, checkDate);JDBC.commit(conn);result.ret = -2;return result;}//更新奖品记录if(num > 0){//非不限量sql = "update award_info set rest = rest - 1 where id = ?";JDBC.update(sql, new Object[]{infoId}, conn);}//记录获奖名单AwardLog log = new AwardLog();log.setActId(actId);log.setNum(1);log.setPerson(person);log.setProductId(getProductId);log.setInfoId(infoId);Number logId = log.save(conn);if(logId == null){throw new SQLException("save award_log error");}result.logId = logId.intValue();conn.commit();result.ret = getProductId;return result;}catch(SQLException e){log.error("getAward error", e);conn.rollback();}finally{JDBC.close(conn);}result.ret = -3;return result;}

应用场景

  • 单件奖品抢购(可限时)
  • 多件奖品按概率中奖(可限时、可不限量)

转载于:https://my.oschina.net/jackruan/blog/719788

Java抽奖抢购算法相关推荐

  1. java 抽奖算法_Java抽奖算法第二例

    本文实例为大家分享了java抽奖算法,供大家参考,具体内容如下 1. 算法分析 根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,反查落在那个区间上,即为所抽取的奖品. 2. 代码核心算法 ...

  2. java随机数抽奖系统_Java实现游戏抽奖的算法

    Java实现游戏抽奖的算法 发布时间:2020-05-29 13:27:44 来源:亿速云 阅读:282 作者:鸽子 Java开发游戏抽奖算法主要有随机数一一对应.离散法Alias算法等. 一.随机数 ...

  3. java抽奖random,java抽奖概率,java抽奖

    java抽奖概率,java抽奖 Field Type Comment prize_name varchar(50) 奖品名称 total int(11) 数量 prizenum int(11) 奖品序 ...

  4. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  5. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  6. Java常见排序算法

    Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html

  7. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  8. JAVA版连连看算法研究

    JAVA连连看之算法: 连连看连接方式的类型:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:off ...

  9. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

最新文章

  1. Java加密算法 AES
  2. 23种设计模式C++源码与UML实现--责任链模式
  3. python打印二进制内容,Python字节不打印二进制
  4. SAE帮助「海底小纵队学英语」全面拥抱Serverless
  5. Java变量的初始化问题探究
  6. springboot 2.0 配置 logback
  7. Spring Boot Executable jar/war 原理
  8. 【翻译】Ext JS——高效的编码风格指南
  9. 亲密关系沟通-【匹配度】调整沟通模式
  10. 为/tmp添加nodev/nosuid/noexec挂载选项
  11. 推荐一本好书《应用框架的设计与实现 .NET平台》电子工业出版社
  12. shell---字体颜色
  13. 标准工时分析软件VIOOVI,适配现代化工业的人工智能软件
  14. 计算机没有安装cad2006,win7系统不能正常安装cad2006的解决方法
  15. 周迅是永远的精灵,不接受反驳
  16. 服务器无法取消指令方块显示,我的世界服务器如何关掉命令方块的提示(如图)...
  17. 大米手机现身了,小米一脸蒙圈?大米好么?好在哪里呢?
  18. 谷歌支付:无法购买您要买的商品。
  19. canvas-网页蜘蛛网特效代码解读
  20. python增强对比度_OpenCV-Python-(4)-对比度增强

热门文章

  1. 每天学一点flash(67) 上传图片
  2. 诺顿无法启动扫描,扫描引擎返回错误0x20000058错误
  3. UltraEdit(UE)如何设置去掉.bak备份文件?
  4. 金笛JDMail邮件服务器帮你应付电子邮件归档危机
  5. .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
  6. 当前局域网禁止BT下载的常用工具及其弊端。
  7. How to convert hair particles to mesh in Blender
  8. Q143:FS,物质导数(Material Derivative)
  9. 机器学习与深度学习基础概念介绍
  10. BI工具的主要功能都有哪些