using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; 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(); if (appInWorkService == null || esppSchService == null) throw new Exception("Не смог получить серивс IApplicationsInWorkService или IEsppScheduleTransformService"); await HandlerAsync(appInWorkService, esppSchService); } }, workerSettings.RepeatEvery); } /// /// Рассчет следующей даты срабатываения /// /// private async Task HandlerAsync(IApplicationsInWorkService applicationsInWorkService, IEsppScheduleTransformService esppScheduleTransformService) { var objs = await applicationsInWorkService.Get().Where(t => t.NextRun < DateTimeOffset.UtcNow).ToListAsync(); logger.LogDebug($"Объектов для обновления: {objs.Count()} шт."); int errorsCount = 0; foreach (var obj in objs) { var nextRun = await esppScheduleTransformService.GetNextDateAsync(obj.Id, obj.NextRun); obj.NextRun = nextRun; if (await applicationsInWorkService.CommitAsync()) logger.LogDebug($"Обновлено значение поле NextRun {obj.NextRun} для строки {obj.Id}"); else { logger.LogError($"Ошибка при обновлении значения поля NextRun {obj.NextRun} для строки {obj.Id}"); errorsCount++; } } logger.LogInformation($"Завершено обновление полей NextRun. Полей в задании: {objs.Count()}, обновлено: {objs.Count() - errorsCount}, ошибок: {errorsCount}"); } } }