private async Task <int> WinnerReadingAsync(AppDbContext ltctx, int winner_no) { var _result = 0; try { var _winner_no = ltctx.tb_lion_winner.Max(w => w.SequenceNo); for (_winner_no++; _winner_no <= winner_no; _winner_no++) { var _selection = new dSelector() { sequence_no = _winner_no, sent_by_queue = true }; if (await _pipe_client.RequestToWinnerQ(_selection)) { _result++; } } } catch (Exception ex) { _logger.LogError(ex, "collector.winner"); } return(_result); }
/// <summary> /// /// </summary> /// <param name="ltctx"></param> /// <param name="selector"></param> /// <returns></returns> public async Task <bool> StartSelect(AppDbContext ltctx, dSelector selector) { var _result = false; var _prev_analysis = ltctx.tb_lion_analysis .Where(x => x.SequenceNo == (selector.sequence_no - 1)) .Count(); // 바로 앞의 analysis(분석) 레코드가 있어야 select(추출) 진행 함 if (_prev_analysis > 0) { // 다음 회차의 예측 번호를 select(추출) 합니다. var _factor = await NextGameSelectAsync(ltctx, selector.sequence_no); if ((_factor.LNoExtraction + _factor.RNoExtraction) > 0) { WriteSelect(selector.sequence_no, $"selected:{(_factor.LNoExtraction + _factor.RNoExtraction)}"); _result = true; } } else { WriteSelect(selector.sequence_no, "not-found-analysis failure"); } return(_result); }
/// <summary> /// analysisQ /// </summary> /// <param name="ltctx"></param> /// <param name="winner_no"></param> /// <returns></returns> public async Task <int> WinnerCollectorAsync(AppDbContext ltctx, int winner_no) { var _result = 0; var _sequence_nos = new List <int>(); var _analysis_no = ltctx.tb_lion_analysis.Max(x => x.SequenceNo); for (_analysis_no++; _analysis_no <= winner_no; _analysis_no++) { _sequence_nos.Add(_analysis_no); } var _select_nos = ltctx.tb_lion_select .Where(s => s.SequenceNo <= winner_no && s.Ranking == 0) .GroupBy(s => s.SequenceNo) .Select(s => s.Key) .ToList(); foreach (var _s in _select_nos) { if (_sequence_nos.Exists(x => x == _s) == false) { _sequence_nos.Add(_s); } } var _choice_nos = ltctx.tb_lion_choice .Where(c => c.SequenceNo <= winner_no && c.Ranking == 0) .GroupBy(c => c.SequenceNo) .Select(c => c.Key) .ToList(); foreach (var _c in _choice_nos) { if (_sequence_nos.Exists(x => x == _c) == false) { _sequence_nos.Add(_c); } } foreach (var _n in _sequence_nos) { var _selection = new dSelector() { sequence_no = _n, sent_by_queue = true }; await RequestToAnalystQ(_selection); _result++; } return(_result); }
public async Task <bool> RequestToWinnerQ(dSelector select) { return(await RequestToServer(new VmsRequest <dSelector> { command = QCommand.WinnerQ, data = select }, PQueue.ReceiveServerPipeName )); }
/// <summary> /// /// </summary> /// <param name="ltctx"></param> /// <param name="selection"></param> /// <returns></returns> public async Task <bool> StartAnalysis(AppDbContext ltctx, dSelector selection) { var _result = false; var _max_winner_no = ltctx.tb_lion_winner.Max(a => a.SequenceNo); if (selection.sequence_no >= 1 && selection.sequence_no <= _max_winner_no) { var _max_analysis_no = ltctx.tb_lion_analysis.Max(a => a.SequenceNo); // winner(당첨) 번호를 (analysis)분석 합니다. if (await WinnerAnalysisAsync(ltctx, _max_analysis_no, selection.sequence_no) == false) { WriteAnalysis(selection.sequence_no, "analysis failure"); } else { WriteAnalysis(selection.sequence_no, "analysis success"); } // select(추출) 번호와 choice(선택) 번호를 scoring(채점) 합니다. if (await WinnerScoringAsync(ltctx, selection.sequence_no) == false) { WriteAnalysis(selection.sequence_no, "scoring failure"); } else { WriteAnalysis(selection.sequence_no, "scoring success"); } _result = true; } else { WriteAnalysis(selection.sequence_no, "out-of-winner failure"); } return(_result); }
public async Task <int> AnalysisSelectAsync(AppDbContext ltctx, int select_no) { var _result = 0; // 분석 테이블의 마지막 회차+1에 해당하는 회차의 예상 번호를 추출 합니다. var _select_no = ltctx.tb_lion_select.Max(x => x.SequenceNo); for (_select_no++; _select_no <= select_no + 1; _select_no++) { var _selection = new dSelector() { sequence_no = _select_no, sent_by_queue = true }; await this.RequestToSelectQ(_selection); _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"); } } }