国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java抽獎(jiǎng)?chuàng)屬徦惴?/h1>
2019-11-26 14:00:48
字體:
供稿:網(wǎng)友

本文示例為大家分享了Java抽獎(jiǎng)?chuàng)屬徦惴ǎ┐蠹覅⒖迹唧w內(nèi)容如下

應(yīng)用場景

單件獎(jiǎng)品搶購(可限時(shí))
多件獎(jiǎng)品按概率中獎(jiǎng)(可限時(shí)、可不限量)

代碼實(shí)現(xiàn)

表結(jié)構(gòu):

--抽獎(jiǎng)設(shè)置create table AWARD_INFO( ID     NUMBER(11) not null, ACT_ID   NUMBER(11),  --活動(dòng)ID NUM    NUMBER(11),  --獎(jiǎng)品總量(0為不限量) REST    NUMBER(11),  --獎(jiǎng)品余量 ODDS    NUMBER(11) default 0,  --中獎(jiǎng)概率 START_DATE DATE,     --開始日期(可為空) END_DATE  DATE,     --結(jié)束日期(可為空) PRODUCT_ID NUMBER(11),  --獎(jiǎng)品ID STATE   NUMBER(5) default 0,  --狀態(tài) 0-有效 1-失效 INFO_TYPE NUMBER(5) default 0   --0-正常 );alter table AWARD_INFO add constraint PK_AWARD_INFO primary key (ID);--中獎(jiǎng)紀(jì)錄create table AWARD_LOG( id     number(11),   act_id   number(11),  --活動(dòng)ID get_time  date,  --中獎(jiǎng)時(shí)間 product_id number(11),  --獎(jiǎng)品ID num    number(11) default 1,  --中獎(jiǎng)數(shù)量 person   varchar2(50),  --中獎(jiǎng)人 info_id  number(11),  --抽獎(jiǎng)設(shè)置ID state   number(5)  --狀態(tài) 0-有效 1-失效);alter table AWARD_LOG add constraint PK_AWARD_LOG primary key (ID);

代碼:

  public static class AwardResult{    public int ret;  //返回結(jié)果    public int logId; //AWARD_LOG id  }  /**   * 抽獎(jiǎng)算法   * @param actId 抽獎(jiǎng)活動(dòng)ID   * @param person 抽獎(jiǎng)人   * @param productId 獎(jiǎng)品ID -1則為該活動(dòng)ID下所有獎(jiǎng)品   * @param excludeId 排除獎(jiǎng)品ID -1 則不排除,與productId不能同時(shí)>0   * @param checkDate 是否檢查時(shí)間   * @return -1 沒有抽獎(jiǎng)數(shù)據(jù);-2 獎(jiǎng)品已抽完; -3 其他錯(cuò)誤;>=0 中獎(jiǎng)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{//活動(dòng)所有物品抽獎(jiǎng)        sql = baseSql + checkDateStr + " for update";        rows = JDBC.getRows(sql, new Object[]{actId}, conn);      }      if(rows.isEmpty()){//沒有抽獎(jiǎng)數(shù)據(jù)        log.info("沒有抽獎(jiǎng)數(shù)據(jù) 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{//抽獎(jiǎng)        int[][] temp = new int[rows.size()][3];        int sum = -1;        int i = 0;        for(int k = 0; k < rows.size(); k++){//設(shè)置獎(jiǎng)品池          int odds = ((BigDecimal)rows.get(k).get("ODDS")).intValue();          sum++;          temp[i][0] = sum; //起始值          sum = sum + odds;          temp[i][1] = sum; //結(jié)束值          temp[i][2] = k;  //rows index          i++;        }        //抽獎(jiǎng)        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();      }      //判斷是否排除id      if(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("獎(jiǎng)品已清空 actId={} person={} productId={} excludeIds={} checkDate={}", actId, person, productId, excludeIds, checkDate);        JDBC.commit(conn);        result.ret = -2;        return result;      }      //更新獎(jiǎng)品記錄      if(num > 0){//非不限量        sql = "update award_info set rest = rest - 1 where id = ?";        JDBC.update(sql, new Object[]{infoId}, conn);      }      //記錄獲獎(jiǎng)名單      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;  }

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

主站蜘蛛池模板: 巴里| 建昌县| 冕宁县| 洱源县| 无极县| 尼木县| 周至县| 四平市| 东兴市| 清流县| 泸定县| 衡东县| 通城县| 林甸县| 砀山县| 靖宇县| 民和| 思南县| 齐河县| 侯马市| 尼勒克县| 乐陵市| 仁寿县| 筠连县| 洛扎县| 兴隆县| 华坪县| 吴堡县| 乃东县| 宣威市| 贵阳市| 崇左市| 邵阳市| 平阴县| 金昌市| 富阳市| 吉林市| 阿荣旗| 江北区| 荣昌县| 三河市|