Пример #1
0
        public Task StartAsync(CancellationToken cancellationToken)
        {
            //Если процесс для обработки бегграундных задач
            if (            //true
                IsBackgroundProcess
                )
            {
                //_logger.LogInformation("Timed Background Service is starting.");
                int hourToStartDailyTasks = 8;
                //11;//debug
                int minuteToStartDailyTasks = 25;
                //27;//debug
                int hourToSendDaily_TER_avg_permonth = 8;
                //1;//debug
                int minuteToSendDaily_TER_avg_permonth = 0;
                //25;//debug
                TimeSpan dayPeriod        = new TimeSpan(24, 0, 0);
                TimeSpan halfDayPeriod    = new TimeSpan(12, 0, 0);
                TimeSpan hourPeriod       = new TimeSpan(1, 0, 0);
                TimeSpan cacheTasksPeriod = hourPeriod;
                TimeSpan TER_avg_permonth = cacheTasksPeriod;        //hourPeriod;

                TimeToCacheTasks = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hourToStartDailyTasks, minuteToStartDailyTasks, 0);
                //DateTime.Now.AddSeconds(10);//debug
                TimeToCacheTasks = StaticMethods.CorrectionStartDay(TimeToCacheTasks, cacheTasksPeriod);

                TimeTo_TER_avg_permonth = TimeToCacheTasks;
                //new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour: 7, minute: 55, second: 0);
                //DateTime.Now.AddSeconds(10);//debug
                TimeTo_TER_avg_permonth = StaticMethods.CorrectionStartDay(TimeTo_TER_avg_permonth, TER_avg_permonth);

                TimeToSendDaily_Shifts = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour: 8, minute: 30, second: 0);
                TimeToSendDaily_Shifts = StaticMethods.CorrectionStartDay(TimeToSendDaily_Shifts, halfDayPeriod);

                TimeToSendDaily_TER_avg_permonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hourToSendDaily_TER_avg_permonth, minuteToSendDaily_TER_avg_permonth, 0);
                TimeToSendDaily_TER_avg_permonth = StaticMethods.CorrectionStartDay(TimeToSendDaily_TER_avg_permonth, dayPeriod);

                using (var scope = scopeFactory.CreateScope())
                {
                    //у нас отдельно висит процесс запущенный для фоновых задач из под сервиса,
                    //так что проверяем чтобы пользователь был из под которого запущена служба
                    // Важный момент, под IIS процессы быстро убиваются так что там нельзя запускать в фоне ничего долго играющего


                    var dbContext = scope.ServiceProvider.GetRequiredService <ScaffoldContext>();
                    //dbContext.StgBackgroundTasklogs.Add(new StgBackgroundTasklogs { LogDateTime = DateTime.Now, Message = $"{scope.ServiceProvider.GetRequiredService<WebHostBuilderContext>().Configuration.GetSection("SESSIONNAME").Value}", TimerName = "debug",TypeId=2 });
                    //dbContext.StgBackgroundTasklogs.Add(new StgBackgroundTasklogs { LogDateTime = DateTime.Now, Message = $"{scope.ServiceProvider.GetRequiredService<WebHostBuilderContext>().Configuration.GetSection("USERNAME").Value}", TimerName = "debug", TypeId = 2 });
                    //Чтобы запускалось в круглое время вычисляем ближайшее время в формате HH:00:00

                    DateTime roundTime = DateTime.Now.AddHours(1).AddMinutes(-DateTime.Now.Minute).AddSeconds(-DateTime.Now.Second);

                    List_of_timers_data.Add(new Timer_data {
                        method      = new TimerCallback(Email_report_CheckPaRecordByStatus)
                        , StartDate = roundTime
                        , Period    = TimeSpan.FromMinutes(
                            //ищем отчет "Отчет о некорректных записях" и получаем периодичность для задания
                            dbContext.StgEmailReportsNames.Where(r => r.ReportNameEng == "CheckPaRecordByStatus").FirstOrDefault().DelayTime)
                        , TimerName = "email_report_CheckPaRecordByStatus"
                    });

                    List_of_timers_data.Add(new Timer_data {
                        method      = new TimerCallback(Email_report_Daily_TER_avg_permonth)
                        , StartDate = TimeToSendDaily_TER_avg_permonth
                                      //,StartDate = DateTime.Now.AddSeconds(5)
                        , Period = TimeSpan.FromMinutes(
                            //ищем отчет "Средневзвешенное ТЭР на тонну по циклам производства" и получаем периодичность для задания
                            dbContext.StgEmailReportsNames.Where(r => r.ReportNameEng == "Daily_TER_avg_permonth").FirstOrDefault().DelayTime)
                        , TimerName = "email_report_Daily_TER_avg_permonth"
                    });
                    //для управления разностью времени между задачами
                    int diff_minutes = 0;

                    List_of_timers_data.Add(new Timer_data
                    {
                        method      = new TimerCallback(Fill_Caches)
                        , StartDate = TimeToCacheTasks.AddMinutes(diff_minutes)
                                      //DateTime.Now.AddSeconds(5)//debug
                        ,
                        Period = cacheTasksPeriod
                        ,
                        TimerName = "Fill_Caches"
                    });

                    List_of_timers_data.Add(new Timer_data {
                        method      = new TimerCallback(Fill_TER_avg_permonth)
                        , StartDate =                         //DateTime.Now.AddSeconds(5)
                                      TimeTo_TER_avg_permonth
                        , Period    = TER_avg_permonth
                        , TimerName = "Fill_TER_avg_permonth"
                    });
                    diff_minutes += 1;
                    List_of_timers_data.Add(new Timer_data
                    {
                        method = new TimerCallback(Email_report_SkuDataByShifts_BDM)
                        ,
                        StartDate =                         //DateTime.Now.AddSeconds(5)
                                    TimeToSendDaily_Shifts
                        ,
                        Period = halfDayPeriod
                        ,
                        TimerName = "email_report_SkuDataByShifts_BDM"
                    });

                    foreach (var timer_data in List_of_timers_data)
                    {
                        StaticMethods.AddNewTimer(new TimerCallback(WrapTimer), timer_data, Timers, dbContext);
                    }
                }
            }

            return(Task.CompletedTask);
        }