using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.DAL.Contracts; using PARR.EsppApi; using PARR.EsppApi.Models; using PARR.EsppApi.Models.Query; using PARR.EsppOrderLoader.Services; using PARR.EsppOrderLoader.Settings; namespace PARR.EsppOrderLoader { internal class EsppOrderLoader : IEsppOrderLoader { private readonly WorkerSettings settings; private readonly ILogger logger; private readonly IEsppApiService esppApiService; private readonly SettingsFromDb settingsFromDb; private readonly IServiceProvider serviceProvider; public EsppOrderLoader( WorkerSettings settings, ILogger logger, IEsppApiService esppApiService, SettingsFromDb settingsFromDb, IServiceProvider serviceProvider ) { this.settings = settings; this.logger = logger; this.esppApiService = esppApiService; this.settingsFromDb = settingsFromDb; this.serviceProvider = serviceProvider; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса загрузки нарядов из ЕСПП."); var nextStart = DateTime.Now; while (true) { if (nextStart.Hour == DateTime.Now.Hour && nextStart.Minute == DateTime.Now.Minute) { logger.LogInformation("Загрузка списка нарядов из ЕСПП."); await DownloadOrdersAsync(); nextStart = DateTime.Now.Add(settings.RepeatEvery); logger.LogInformation($"Следующая дата загрузки: {nextStart}"); } // Каждую минуту await Task.Delay(60 * 1000); } } // получаю список из ЕСПП по фильтрам // В цикле проверяю каждый наряд, есть ли он в БД + по имени ищу есть ли такой шаблон // Если наряда такого нет в БД и есть шаблон, добавляю в БД // если в бд не добавляю, пишу в лог, что нет такого шаблона, в бд не добавляю private async Task DownloadOrdersAsync() { var esppObjs = await GetOrdersAsync(); if (esppObjs == null) return; foreach (var item in esppObjs) { using (var scope = serviceProvider.CreateScope()) { var orderItemService = scope.ServiceProvider.GetService(); if (orderItemService == null) throw new Exception("Не смог получить серивс IOrderItemService, scope.ServiceProvider.GetService()"); await orderItemService.WriteOrderAsync(item); } } } private async Task?> GetOrdersAsync() { var searchQuery = new FindOrdersQuery { ShortDescriptionContains = settingsFromDb.TemplatePrefixName, DateEnd = DateTime.Now.Add(settingsFromDb.OrderSearchDeltaDate) }; var downloadResult = await esppApiService.FindOrdersAsync(searchQuery); if (!downloadResult.IsSuccess) { logger.LogError(downloadResult.Exception, "Ошибка загрузки списка нарядов из ЕСПП"); return null; } logger.LogInformation($"Получено нарядов из ЕСПП: {downloadResult.Data?.Count()}"); return downloadResult.Data; } } }