Este exemplo compartilha o algoritmo Java Lottery Rush para sua referência. O conteúdo específico é o seguinte
Cenários de aplicação
Compra de prêmio de peça única (tempo limitado)
Vários prêmios ganhos por acaso (tempo limitado, sem limite)
Implementação de código
Estrutura da tabela:
--Raffle Settings create table AWARD_INFO( ID NUMBER(11) not null, ACT_ID NUMBER(11), --Activity ID NUM NUMBER(11), --Total prizes (0 is unlimited) REST NUMBER(11), --Price allowance ODDS NUMBER(11) default 0, --Price probability START_DATE DATE, --Start date (can be empty) END_DATE DATE, --End date (can be empty) PRODUCT_ID NUMBER(11), -Price ID Número do estado do estado (5) padrão 0,--status 0-Valid 1-Valável Info_type Número (5) padrão 0 --0-Normal); ALTER TABLE Award_info Adicionar restrição pk_award_info chave primária (id); -vencedor do registro Criar tabela Award_log (número do ID (11), Número ACT_ID (11),-Aatividade ID Get_time Data,-Número de tempo de tempo product_id (11),-Price ID Número (11) Padrão 1,-Número de vencimento Id Ids Varchar2 (50),-Número de vencedor do número de resfriamento de um nocivo de resfriamento (5)-Número de 5), que é um número de resfriamento de um resfriamento de um numero (50), que é um número de imert. restrição pk_award_log chave primária (id);
Código:
Classe estática pública AwardResult {public int ret; // RETORNO DE RECURNO Public int logid; // Award_log ID} /*** LUCK Draw Algorithm* @param actid Luck Draw ID da atividade* @param Pessoa sorte Pessoa* @param ProductId O ID do prêmio -1 é todos os prêmios sob o ID da atividade* @param exclui @exclui ID -não é excluído e não pode ser o que não é o que não é o que não é o que não é o que não é o que não é excluído* @PrudeId> 0* @Param. -2 O prêmio foi desenhado; -3 Outros erros; > = 0 ProductID vencedor; -4 Excluir ID * @Throws Exception */ public static premedResult getAwardfull (int Actid, String Pessoa, Int ProductId, Int [] excluiids, Boolean CheckDate) lança SqLexception {AwardResult resultado = novo AwardResult (); Conexão conn = jdbc.getConnection (); Conn.SetAutocomit (false); tente {list <map <string, objeto >> linhas; String sql; String checkDateSTest = ""; String basesql = "Selecione t.id, t.product_id, t.num, t.rest, t.odds, t.info_type de prêmio_info t onde t.act_id =? E t.state = 0"; if (checkDate) {checkDateSTer = "e t.start_date <= sysdate e t.end_date> = sysdate"; } if (productId> 0) {// snap sql = basesql + "e t.product_id =?" + checkDateST + "para atualização"; linhas = jdbc.getRows (sql, novo objeto [] {Actid, productId}, conn); } else {// Todos os itens desenham para a atividade sql = basesql + checkDateSTest + "para atualização"; linhas = jdbc.getRows (sql, novo objeto [] {Actid}, Conn); } if (linhas.isEmpty ()) {// sem desenhar dados log.info ("Não desenhar dados actid = {} pessoa = {} productId = {} excluiids = {} checkDate = {}", atid, pessoa, produto, excludeIds, verificação); Conn.Commit (); resultado.ret = -1; resultado de retorno; } int infoid = -1; int getProductId = -1; int num = -1; int descansar = -1; if (linhas.size () == 1) {// snap num = ((número) linhas.get (0) .get ("num")). intvalue (); REST = ((número) linhas.get (0) .get ("Rest")). IntValue (); infoid = ((número) linhas.get (0) .get ("id")). intvalue (); getProductId = ((número) linhas.get (0) .get ("product_id")). intvalue (); } else {// RULL Draw int [] [] temp = new int [linhas.size ()] [3]; int sum = -1; int i = 0; for (int k = 0; k <robes.size (); k ++) {// Defina o pool de prêmios int as odds = ((bigDecimal) linhas.get (k) .get ("odds")). intvalue (); soma ++; temp [i] [0] = soma; // Valor inicial soma = soma + chances; temp [i] [1] = soma; // temp de valor final [i] [2] = k; // Índice de linhas i ++; } // roll desenhar aleatório aleatório = novo aleatório (); int r = random.nextInt (soma + 1); int j = 0; for (int k = 0; k <i; k ++) {if (r> = temp [k] [0] && r <= temp [k] [1]) {j = k; quebrar; }} infoid = ((bigdecimal) linhas.get (temp [j] [2]). get ("id")). intvalue (); getProductId = ((bigDecimal) linhas.get (temp [j] [2]). get ("product_id")). intvalue (); num = ((número) linhas.get (temp [j] [2]). get ("num")). intvalue (); REST = ((número) linhas.get (temp [j] [2]). Get ("Rest")). IntValue (); } // julgue se deve excluir o ID se (Arrayutils.Contains (excluiIds, getProductId)) {log.info ("é o exclude ID Actid = {} pessoa = {} ProductId = {} excluiIds = {} checkdate = {}", actid, pessoa, produto, excludeDs = {} checkdate = {} ", actid, pessoa, produto, excluir, excluir, excluir, excluir; Conn.Commit (); resultado.ret = -4; resultado de retorno; } // estoque insuficiente if (num> 0 && Rest <= 0) {log.info ("O prêmio foi limpo Actid = {} Person = {} ProductId = {} excluiids = {} checkDate = {}", Actid, Pessoa, ProductId, Excluaids, checkdate); JDBC.Commit (Conn); resultado.ret = -2; resultado de retorno; } // Atualize o registro do prêmio se (num> 0) {// não ilimitado sql = "update Award_info set descans = REST - 1 onde id =?"; Jdbc.update (sql, novo objeto [] {infoid}, conn); } // Registre a lista de Winners AwardLog LOG = new AwardLog (); log.setactId (Actid); log.setNum (1); log.setPerson (pessoa); log.setProductId (getProductId); log.setInfoid (infoid); Número logid = log.save (conn); if (logid == null) {lança nova sqLexception ("Salvar Award_log Error"); } result.logid = logid.intValue (); Conn.Commit (); resultado.ret = getProductId; resultado de retorno; } catch (sqLexception e) {log.error ("erro de getaward", e); Conn.Rollback (); } finalmente {jdbc.close (conn); } resultado.ret = -3; resultado de retorno; }O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.