Este ejemplo comparte el algoritmo Java Lottery Rush para su referencia. El contenido específico es el siguiente
Escenarios de aplicación
Compra de premios de una sola pieza (tiempo limitado)
Múltiples premios ganados por casualidad (tiempo limitado, sin límite)
Implementación del código
Estructura de la tabla:
-Configuración-raffle crea tabla premio_info (número de identificación (11) no nulo, número de act_id (11), --Activity ID NUM Número (11),-Premios de Total (0 es ilimitado) Número de descanso (11),-Número de probabilidades de asignación de precisión (11) predeterminado 0,-Probabilidad de inicio de probabilidad Price, Fecha de Date,-fecha de arranque (puede estar vacío) Fin_date Fecha,-Fecha (puede ser Fecha (puede ser una fecha (puede ser vacío (11) (11). -Número de estado de IDPrice ID (5) predeterminado 0,--status 0-válido 1-Vailable Info_Type Number (5) predeterminado 0 --0-Normal); alter tabla premio_info Agregar restricción PK_AWARD_INFO CLAVE PRIMARIA (ID); -registro ganador de la tabla de creación de la tabla (número de identificación (11), ACT_ID Número (11),-Actividad ID get_time Fecha,-Número de tiempo de horario de fin de semana (11), --Price ID de ID (11) Número predeterminado 1,-Número de advertencia VarChar2 (50), Número de información de Winner (11),-Número de estado de ajuste de rato estatal (5)--STATUS 0- VALID 1 INVALID 1 INVALID); restricción pk_award_log clave primaria (id);
Código:
Public Static Class AwardResult {public int ret; // devolver el resultado público int logid; // premio_log id} /*** Luck Draw Algorithm* @param Actid Luck Draw Id Activity Id* @param Luck Draw Draw Person* @param ProductID Premio ID -1 es todos los premios bajo la ID de actividad* @param ExcludeID Exclude Premio -1 no se excluye, y no puede ser simultáneamente con ProductID> 0* @Param CheckDate si verificar el tiempo* @@return no está allí está allí está allí. -2 El premio ha sido dibujado; -3 otros errores; > = 0 ProductID ganador; -4 Exclute ID * @throws Exception */ public static AwardResult GetAwardfull (int Actid, String Person, int productId, int [] ExcudeIds, Boolean Checks Date) lanza SQLException {premioResult date = new premedResult (); Conexión conn = jdbc.getConnection (); conn.setAutOcommit (falso); intente {list <map <string, objeto >> filas; Cadena sql; String checkDatestr = ""; String BasesQl = "Seleccione T.ID, T.Product_id, T.num, T.Rest, T.Odds, T.Info_Type de premio_info t donde t.act_id =? Y t.state = 0"; if (checkDate) {checkDatestr = "y t.start_date <= sysdate y t.end_date> = sysdate"; } if (productID> 0) {// snap sql = basesql + "y t.product_id =?" + checkDatestr + "para actualizar"; filas = jdbc.getrows (sql, nuevo objeto [] {actid, productID}, conn); } else {// Todos los elementos se dibujan para la actividad sql = basesql + checkDatestr + "para actualizar"; filas = jdbc.getrows (sql, nuevo objeto [] {actid}, conn); } if (rows.isempty ()) {// no dibujar datos log.info ("No Draw Data Actid = {} Person = {} ProductId = {} ExcudeIds = {} checkDate = {}", Actid, Person, ProductID, ExcuteIds, CheckDate); conn.commit (); resultado.ret = -1; resultado de retorno; } int infoid = -1; int getProductid = -1; int num = -1; int REST = -1; if (shows.size () == 1) {// snap num = ((número) Rows.get (0) .get ("num")). intValue (); REST = ((Número) filas.get (0) .get ("REST")). intValue (); infoid = ((número) filas.get (0) .get ("id")). intValue (); getProductID = ((Number) Rows.get (0) .get ("Product_id")). intValue (); } else {// Rull Draw int [] [] temp = new int [shows.size ()] [3]; int sum = -1; int i = 0; for (int k = 0; k <shows.size (); k ++) {// establece el premio del grupo int odds = ((bigDecimal) shows.get (k) .get ("odds")). intValue (); suma ++; temp [i] [0] = suma; // Valor de inicio Sum = Sum + Odds; temp [i] [1] = suma; // Valor final Temp [i] [2] = k; // índice de filas i ++; } // roll Draw Random Random = new Random (); int r = random.nextint (suma + 1); int j = 0; for (int k = 0; k <i; k ++) {if (r> = temp [k] [0] && r <= temp [k] [1]) {j = k; romper; }} infoid = ((bigDecimal) filas.get (temp [j] [2]). get ("id")). intValue (); getProductID = (((bigDecimal) filas.get (temp [j] [2]). get ("product_id")). intValue (); num = ((número) filas.get (temp [j] [2]). get ("num")). intValue (); REST = ((Número) filas.get (temp [j] [2]). get ("REST")). intValue (); } // juzga si excluir ID if (arrayUtils.contains (excludeIds, getProductId)) {log.info ("es el ID de excluir actid = {} persona = {} productId = {} excludeIds = {} checkDate = {}", actid, persona, productid, excluyids, checkdate); conn.commit (); resultado.ret = -4; resultado de retorno; } // stock insuficiente if (num> 0 && rest <= 0) {log.info ("El premio ha sido borrado actid = {} persona = {} productID = {} excludeIds = {} checkDate = {}", Actid, persona, productID, excludids, check date); JDBC.Commit (Conn); resultado.ret = -2; resultado de retorno; } // Actualice el registro del premio if (num> 0) {// no ilimitado sql = "actualizar premio_info set REST = REST - 1 donde id =?"; Jdbc.update (sql, nuevo objeto [] {infoid}, conn); } // Registre la lista de ganadores premiosglog log = new AwardLog (); log.SetActid (ACTID); log.setNum (1); log.setperson (persona); log.setProductID (getProductID); log.setinfoid (infoid); Número logid = log.save (Conn); if (logid == null) {lanzar nueva sqlexception ("guardar premio_log"); } resultado.logid = logid.intValue (); conn.commit (); resultado.ret = getProductid; resultado de retorno; } catch (sqlexception e) {log.error ("error de getward", e); conn.rollback (); } finalmente {jdbc.close (conn); } resultado.ret = -3; resultado de retorno; }Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.