Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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
                });
            }));
        }
Esempio n. 4
0
        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
                });
            }));
        }
Esempio n. 5
0
        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");
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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");
                }
            }
        }