この例では、参照のためにJava宝くじラッシュアルゴリズムを共有しています。特定のコンテンツは次のとおりです
アプリケーションシナリオ
シングルピース賞金(限られた時間)
偶然に獲得した複数の賞品(限られた時間、制限なし)
コード実装
テーブル構造:
-raffle設定はテーブルaward_info(id番号(11)null、act_id number(11)、 - activity id num number(11)、 - total prizes(0 is lunimited)rest number(11)、 - price lowal odds number(11)default 0、 - price probability start_date date、s-start date(can emat)end_date date(can emat)date - プリスID状態番号(5)デフォルト0、 - status 0-valid 1-Vailable Info_type番号(5)デフォルト0 -0-Normal); Alter Table Award_info制約PK_AWARD_INFOプライマリキー(ID)を追加する; --Winning record create table AWARD_LOG( id number(11), act_id number(11), --Activity ID get_time date, --Winning time product_id number(11), --Price ID number(11) default 1, --Winning number person varchar2(50), --Winner info_id number(11), --Raffle Setting ID state number(5) --Status 0-valid 1-invalid);alter table AWARD_LOG add constraint PK_AWARD_LOGプライマリキー(ID);
コード:
public static class awardResult {public int ret; // result sults public int logid; // award_log id} /*** luck draw algorithm* @param actid luck draw draw draw id* @param productid prize id -1はすべての賞品です。 -2賞が描かれました。 -3その他のエラー。 > = 0 Winning ProductID; -4除外ID * @Throws Exception */ public Static AwardResult getAwardfull(int actid、string person、int productid、int [] excludeids、boolean checkdate)スロー接続conn = jdbc.getConnection(); conn.setautocommit(false); {list <map <string、object >> rows;文字列sql;文字列checkdatestr = ""; String BasesQl = "Select T.Id、T.Product_Id、T.Num、T.Rest、T.ODDS、T.INFO_TYPE from Award_info t from t.act_id =?and T.State = 0"; if(checkdate){checkdatestr = "およびt.start_date <= sysdateおよびt.end_date> = sysdate"; } if(productId> 0){// snap sql = basesql + "および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( "no draw data data actid = {} person = {} productid = {} excludeids = {} checkdate = {}"、actid、人、productid、excludeids、checkdate); conn.commit(); result.ret = -1;返品結果; } int infoid = -1; int getProductid = -1; int num = -1; int rest = -1; if(rows.size()== 1){// snap 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 {// rull draw 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; // end値temp [i] [2] = k; //行インデックスI ++; } //ロールドローランダム= 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;壊す; }} infoid =((bigdecimal)rows.get(temp [j] [2])。get( "id"))。intvalue(); getProductid =((bigdecimal)rows.get(temp [j] [2])。 num =((number)rows.get(temp [j] [2])。get( "num"))。intvalue(); REST =((number)rows.get(temp [j] [2])。get( "rest"))。intvalue(); } // idを除外するかどうかを判断します(arrayutils.contains(expludeids、getproductid)){log.info( "はexclude id actid = {} person = {} productid = {} excludeids = {} checkdate = {}"、persod、produtid、exprodids、expludeds、checkdate); conn.commit(); result.ret = -4;返品結果; } //在庫不足if(num> 0 && ret <= 0){log.info( "賞品がクリアされていますactid = {} person = {} productid = {} excludeids = {} cechdate = {}" jdbc.commit(conn); result.ret = -2;返品結果; } //賞品レコードを更新するif(num> 0){//無制限のsql = "award_info set est = 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);番号logid = log.save(conn); if(logid == null){new sqlexception( "award_logエラーを保存"); } result.logid = logid.intvalue(); conn.commit(); result.ret = getProductid;返品結果; } catch(sqlexception e){log.error( "getaward error"、e); conn.rollback(); }最後に{jdbc.close(conn); } result.ret = -3;返品結果; }上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。