/// <summary> /// 현재 날짜를 확인 하여 당첨 번호를 '나눔로또' 사이트에서 읽어 옵니다. /// winner 큐에 그 값을 push 하는 동작 까지 수행 합니다. /// 이렇게 하면, 시스템에 동작이 멈추는 경우에도 큐에 남아 있게 되어서, 처리에 문제가 없습니다. /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("[collector.winner] starting collctor winnerQ..."); while (!stoppingToken.IsCancellationRequested) { try { using (var _ltctx = _contextFactory.CreateDbContext()) { var _winner_no = _winnerReader.GetThisWeekSequenceNo(); // 1 시간에 1회 // 현재 시간을 계산하여, 회차가 증가 되었으면 // 나눔로또 홈페이지를 크롤링 하여 저장 하도록 큐에 명령을 발송 합니다. var _no_winner = await WinnerReadingAsync(_ltctx, _winner_no); if (_no_winner > 0) { _logger.LogInformation($"[collector.winner] ({_winner_no}) push winner => {_no_winner} games"); } } } catch (Exception ex) { _logger.LogError(ex, "collector.winner"); } await Task.Delay(60 * 60 * 1 * 1000, stoppingToken); } }
/// <summary> /// 매주 4주전 6등 삭제 /// </summary> public (int success, int failure) DropChoiceClearing(int week_term = 4) { var _result = (success : 0, failure : 0); using (var _ltctx = _contextFactory.CreateDbContext()) { var _sequence_no = _winnerReader.GetThisWeekSequenceNo() - week_term; try { _ltctx.Database.BeginTransaction(); var _choice_count = _ltctx.tb_lion_choice .Where(c => c.SequenceNo <= _sequence_no && c.Ranking > 5) .Count(); if (_choice_count > 0) { var _parameters = new List <SqlParameter> { new SqlParameter("@sequence_no", SqlDbType.SmallInt) { Value = _sequence_no } }; _result.success = _ltctx.Database.ExecuteSqlRaw( "DELETE FROM tb_lion_choice WHERE SequenceNo <= @sequence_no AND Ranking > 5", _parameters ); _ltctx.SaveChanges(); } _ltctx.Database.CommitTransaction(); } catch { _ltctx.Database.RollbackTransaction(); _result.failure++; } } return(_result); }
public async Task <IActionResult> GetPrizeBySeqNo(int sequence_no) { return(await CProxy.UsingAsync(() => { var _result = (success : false, message : "ok"); var _winner = (mWinner)null; if (sequence_no >= 1 && sequence_no <= __winner_reader.GetThisWeekSequenceNo()) { _winner = __db_context.tb_lion_winner .Where(w => w.SequenceNo == sequence_no) .SingleOrDefault(); if (_winner == null) { _result.message = $"해당 회차'{sequence_no}'의 추첨 정보가 없습니다"; _winner = new mWinner() { SequenceNo = sequence_no, IssueDate = __winner_reader.GetIssueDateBySequenceNo(sequence_no), PaymentDate = __winner_reader.GetPaymentDateBySequenceNo(sequence_no) }; } else { _result.success = true; } } else { _result.message = "추첨 회차가 범위를 벗어 났습니다"; } return Ok(new { _result.success, _result.message, result = _winner }); })); }
public async Task <IActionResult> GetUserSequenceNos() { return(await CProxy.Using(() => { var _result = (success : false, message : "ok"); var _sequence_nos = new List <TKeyValue>(); { var _login_id = __usermgr.GetLoginId(Request); if (String.IsNullOrEmpty(_login_id) == false) { _sequence_nos = __db_context.TbLionChoice .Where(c => c.LoginId == _login_id) .GroupBy(x => x.SequenceNo) .Select( y => new TKeyValue { key = y.Key, value = y.Count() } ) .OrderByDescending(z => z.key) .ToList(); if (_sequence_nos.Count() < 1) { var _today_sequence_no = WinnerReader.GetThisWeekSequenceNo(); _sequence_nos.Add(new TKeyValue { key = _today_sequence_no, value = 0 }); } _result.success = true; } else { _result.message = "인증 정보에서 회원ID를 찾을 수 없습니다"; } } return new OkObjectResult(new { success = _result.success, message = _result.message, result = _sequence_nos }); })); }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("[receiver.analyst] starting receiver analysisQ..."); while (!stoppingToken.IsCancellationRequested) { try { var _read_line = (string)null; if (PQueue.QAnalyst.TryDequeue(out _read_line) == false) { await Task.Delay(10); continue; } var _request = JsonConvert.DeserializeObject <VmsRequest <dSelector> >(_read_line); { var _selector = _request.data; using (var _ltctx = _contextFactory.CreateDbContext()) { var _aresult = await StartAnalysis(_ltctx, _selector); if (_aresult == true) { // next step var _today_seqno = _winnerReader.GetThisWeekSequenceNo(); if (_selector.sequence_no == _today_seqno) { await _pipe_client.AnalysisSelectAsync(_ltctx, _selector.sequence_no); } } } } } catch (Exception ex) { _logger.LogError(ex, "receiver.analyst"); } } }
public async Task <int> SelectMemberAsync(AppDbContext ltctx, WinnerReader reader, int selectNo, bool resend) { var _result = 0; var _today_winner_no = reader.GetThisWeekSequenceNo(); // 현재의 예상 번호가 select(추출) 되어 있으면, choice(선택) 한다. // analysis(분석) 차수와 같은 차수이면 select(추출)이 있다고 가정한다. if (_today_winner_no == selectNo - 1) { var _digits = new List <short> { 0, 0, 0 }; { var _master = ltctx.tb_lion_member .Where(m => m.LoginId == LottoSelectmasterId) .SingleOrDefault(); if (_master != null) { var _offset = 0; if (_master.Digit1 > 0) { if (!_digits.Contains(_master.Digit1)) { _digits[_offset] = _master.Digit1; _offset++; } } if (_master.Digit2 > 0) { if (!_digits.Contains(_master.Digit2)) { _digits[_offset] = _master.Digit2; _offset++; } } if (_master.Digit3 > 0) { if (!_digits.Contains(_master.Digit3)) { _digits[_offset] = _master.Digit3; _offset++; } } } } // 가입 member(회원)들에게 각자에게 할당 된 갯수만큼을 select(추출)테이블에서 choice(선택) 테이블로 // 복사 후 메일 발송 하도록 큐에 명령을 보냅니다. (여기서 처리 하지 않고 memberQ에서 pop하여 처리 함) var _members = ltctx.tb_lion_member .Where(m => m.IsNumberChoice == true && m.IsMailSend == true && m.IsAlive == true && m.MailError == false) .ToList(); foreach (var _member in _members) { var _no_choice = ltctx.tb_lion_choice .Where(c => c.SequenceNo == selectNo && c.LoginId == _member.LoginId) .GroupBy(c => c.IsMailSent) .Select(n => new { b = n.Key, c = n.Count() }) .ToList(); var _no_choice_t = _no_choice.Where(c => c.b == true).Sum(c => c.c); var _no_choice_f = _no_choice.Where(c => c.b == false).Sum(c => c.c); // 기 선택 하였으면 skip 함 if (_no_choice_t + _no_choice_f <= 0 || _no_choice_f > 0) { var _choice = new dChoice() { sequence_no = selectNo, login_id = _member.LoginId, resend = resend || _no_choice_f > 0, digit1 = _digits[0], digit2 = _digits[1], digit3 = _digits[2] }; // member(회원)들에게 메일 발송 하도록 큐에 명령을 보냅니다. await this.RequestToChoicerQ(_choice); _result++; } } } return(_result); }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("[receiver.winner] starting receiver winnerQ..."); var _lastSelector = new dSelector(); while (!stoppingToken.IsCancellationRequested) { try { var _read_line = (string)null; if (PQueue.QWinner.TryDequeue(out _read_line) == false) { await Task.Delay(10); continue; } var _request = JsonConvert.DeserializeObject <VmsRequest <dSelector> >(_read_line); { var _selector = _request.data; if (_lastSelector.sequence_no != _selector.sequence_no) { _lastSelector.sequence_no = _selector.sequence_no; using (var _ltctx = _contextFactory.CreateDbContext()) { //'나눔로또'에서 크롤링 합니다. var _winner = await _winnerReader.ReadWinnerBall(_selector.sequence_no); if (_winner != null) { // 당첨번호를 테이블에 저장 합니다. if (await WinnerUpdateAsync(_ltctx, _winner) == true) { WriteWinner(_selector.sequence_no, "insert success"); } else { WriteWinner(_selector.sequence_no, "insert failure"); } } else { WriteWinner(_selector.sequence_no, "crawling failure"); } // next step var _today_seqno = _winnerReader.GetThisWeekSequenceNo(); if (_selector.sequence_no == _today_seqno) { await _pipe_client.WinnerCollectorAsync(_ltctx, _selector.sequence_no); } } } else { WriteWinner(_selector.sequence_no, "skip winner crawling..."); } } } catch (Exception ex) { _logger.LogError(ex, "receiver.winner"); } } }