using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.DAL.Services.Interfaces; using PARR.DAL.TransformServices; using PARR.NextRun.Settings; namespace PARR.NextRun { internal class NextRunManager : INextRunManager { private readonly WorkerSettings workerSettings; private readonly ILogger logger; private readonly IIntervalService intervalService; private readonly IServiceProvider serviceProvider; public NextRunManager( WorkerSettings workerSettings, ILogger logger, IIntervalService intervalService, IServiceProvider serviceProvider ) { this.workerSettings = workerSettings; this.logger = logger; this.intervalService = intervalService; this.serviceProvider = serviceProvider; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса рассчета времени следующего создания наряда (nextRun)"); await intervalService.IntervalInitAsync(async () => { using (var scope = serviceProvider.CreateScope()) { //var appInWorkService = scope.ServiceProvider.GetService(); var esppSchService = scope.ServiceProvider.GetService(); var templateService = scope.ServiceProvider.GetService(); if (templateService == null || esppSchService == null) throw new Exception($"Не смог получить серивс {nameof(ITemplateService)} или {nameof(IEsppScheduleTransformService)}"); await HandlerAsync(templateService, esppSchService); } }, workerSettings.RepeatEvery); } /// /// Рассчет следующей даты срабатываения /// /// private async Task HandlerAsync(ITemplateService templateService, IEsppScheduleTransformService esppScheduleTransformService) { var templates = await templateService.Get() .Include(t => t.Job) .ThenInclude(t => t.Group) .Where(t => t.NextRun < DateTimeOffset.UtcNow).ToListAsync(); logger.LogDebug($"Шаблонов для обновления: {templates.Count()} шт."); int errorsCount = 0; foreach (var template in templates) { var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job!.GroupId, template.NextRun); template.LastRun = template.NextRun; template.NextRun = nextRun; if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = Constants.ParrComponentsEnum.NextRun })) logger.LogDebug($"Обновлены значения полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}"); else { logger.LogError($"Ошибка при обновлении значений полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}"); errorsCount++; } } logger.LogInformation($"Завершено обновление полей NextRun. Полей в задании: {templates.Count()}, обновлено: {templates.Count() - errorsCount}, ошибок: {errorsCount}"); } } }