ตัวอย่างนี้แบ่งปันอัลกอริทึม Java Lottery Rush สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
สถานการณ์แอปพลิเคชัน
การซื้อรางวัลชิ้นเดียว (เวลา จำกัด )
หลายรางวัลชนะโดยบังเอิญ (เวลา จำกัด ไม่ จำกัด )
การใช้รหัส
โครงสร้างตาราง:
-การตั้งค่า RAFFLE สร้าง TABLE AWARD_INFO (หมายเลข ID (11) ไม่ใช่ NULL, ACT_ID หมายเลข (11),-ACTIVITY ID NUM NUM NUM NUM (11),-รางวัลรวม (0 ไม่ จำกัด ) หมายเลข REST (11), วันที่ที่ว่างเปล่า (11) -หมายเลขสถานะ ID ราคา (5) ค่าเริ่มต้น 0,-Status 0-valid 1-vailable info_type หมายเลข (5) ค่าเริ่มต้น 0 --0-normal); เปลี่ยนตาราง Award_info เพิ่มข้อ จำกัด PK_AWARD_INFO หลัก (ID); -บันทึกที่ชนะการสร้างตาราง Award_log (หมายเลข ID (11), หมายเลข ACT_ID (11),-กิจกรรม ID วันที่ GET_TIME,-เวลาที่ได้รับรางวัลหมายเลข Product_id (11),-หมายเลข ID ราคา (11) ค่าเริ่มต้น 1, หมายเลขผู้ชนะ VARCHAR2 (50) ข้อ จำกัด PK_AWARD_LOG หลัก (ID);
รหัส:
รางวัลระดับสแตติกสาธารณะที่ได้รับรางวัล {สาธารณะ INT RET; // ส่งคืนผลการลงชื่อเข้าใช้ INT สาธารณะ; // Award_log ID} /*** อัลกอริทึมการวาดลัค* @param ActiD Luck Draw Id กิจกรรม* @param คนโชคดีวาดบุคคล* @param ProductId ProductId ID -1 เป็นรางวัลทั้งหมดภายใต้ ID กิจกรรม* @param Excludeid ID รางวัล -1 -2 รางวัลได้รับการวาด; -3 ข้อผิดพลาดอื่น ๆ ; > = 0 ชนะ productId; -4 ไม่รวม ID * @throws Exception */ Public Static Awardresult Getawardfull (int actiD, สตริงบุคคล, int productId, int [] excludeids, boolean checkdate) พ่น sqlexception {ผลที่ได้รับรางวัล = ใหม่ AwardResult (); การเชื่อมต่อ conn = jdbc.getConnection (); conn.setautocommit (เท็จ); ลอง {list <map <string, object >> แถว; สตริง SQL; String checkDatestr = ""; สตริง basesql = "เลือก t.id, t.product_id, t.num, t.rest, t.odds, t.info_type จาก adward_info t โดยที่ t.act_id =? และ t.state = 0"; if (checkDate) {checkDatestr = "และ t.start_date <= sysdate และ t.end_date> = sysdate"; } if (productId> 0) {// snap sql = basesql + "และ t.product_id =?" + checkDatestr + "สำหรับการอัปเดต"; ROWS = JDBC.GETROWS (SQL, วัตถุใหม่ [] {ActID, ProductId}, Conn); } else {// รายการทั้งหมดวาดสำหรับกิจกรรม sql = basesql + checkDatestr + "สำหรับการอัปเดต"; ROWS = JDBC.GETROWS (SQL, วัตถุใหม่ [] {ActID}, Conn); } if (rows.isEmpty ()) {// ไม่มีการวาด data log.info ("ไม่มีข้อมูลการวาด data actiD = {} person = {} productId = {} excludeids = {} checkDate = {}", actId, person, 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 = ((หมายเลข) rows.get (0) .get ("num")). intvalue (); rest = ((หมายเลข) rows.get (0) .get ("REST")). intValue (); Infoid = ((หมายเลข) rows.get (0) .get ("id")). intvalue (); getProductId = ((หมายเลข) rows.get (0) .get ("product_id")). intvalue (); } else {// rull draw int [] [] temp = new int [rows.size ()] [3]; int sum = -1; int i = 0; สำหรับ (int k = 0; k <rows.size (); k ++) {// ตั้งค่าพูลรางวัล Int Odds = ((bigdecimal) rows.get (k) .get ("อัตราต่อรอง")). intvalue (); ผลรวม ++; อุณหภูมิ [i] [0] = ผลรวม; // เริ่มต้นค่ารวม = ผลรวม + อัตราต่อรอง; อุณหภูมิ [i] [1] = ผลรวม; // ค่าสุดท้ายอุณหภูมิ [i] [2] = k; // rows index i ++; } // ม้วนวาดแบบสุ่ม = ใหม่สุ่ม (); int r = random.nextint (sum + 1); int j = 0; สำหรับ (int k = 0; k <i; k ++) {ถ้า (r> = temp [k] [0] && r <= temp [k] [1]) {j = k; หยุดพัก; }} infoid = ((bigdecimal) rows.get (temp [j] [2]). รับ ("id")). intvalue (); getProductId = ((bigdecimal) rows.get (temp [j] [2]). รับ ("product_id")). intvalue (); num = ((หมายเลข) rows.get (temp [j] [2]). get ("num")). intvalue (); REST = ((หมายเลข) rows.get (temp [j] [2]) รับ ("rest")). intvalue (); } // ตัดสินว่าจะยกเว้น id ถ้า (arrayutils.contains (excludeids, getProductId)) {log.info ("เป็น id exclude actiD = {} person = {} productId = {} excludeids = {} checkDate = {}" Conn.Commit (); result.ret = -4; ผลการกลับมา; } // สต็อกไม่เพียงพอถ้า (num> 0 && rest <= 0) {log.info ("รางวัลได้รับการล้าง actiD = {} person = {} productId = {} excludeIds = {} checkDate = {}" jdbc.commit (Conn); result.ret = -2; ผลการกลับมา; } // อัปเดตระเบียนรางวัลถ้า (num> 0) {// ไม่ จำกัด sql = "อัปเดต Award_Info Set REST = REST - 1 ที่ไหน id =?"; jdbc.update (sql, วัตถุใหม่ [] {infoid}, conn); } // บันทึกรายการผู้ชนะที่ได้รับรางวัล log = new AwardLog (); log.SetActId (actID); log.setNum (1); log.setperson (บุคคล); log.setProductId (getProductID); log.setInfoid (infoid); number logid = log.save (conn); if (logId == null) {โยน sqlexception ใหม่ ("บันทึกข้อผิดพลาดที่ได้รับรางวัล Award_log"); } result.logid = logId.intValue (); Conn.Commit (); result.ret = getProductId; ผลการกลับมา; } catch (sqlexception e) {log.error ("ข้อผิดพลาด getaward", e); conn.rollback (); } ในที่สุด {jdbc.close (conn); } result.ret = -3; ผลการกลับมา; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น