using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; 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; private readonly IIntervalService intervalService; public EsppOrderLoader( WorkerSettings settings, ILogger logger, IEsppApiService esppApiService, SettingsFromDb settingsFromDb, IServiceProvider serviceProvider, IIntervalService intervalService ) { this.settings = settings; this.logger = logger; this.esppApiService = esppApiService; this.settingsFromDb = settingsFromDb; this.serviceProvider = serviceProvider; this.intervalService = intervalService; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса загрузки нарядов из ЕСПП."); await intervalService.IntervalInitAsync(DownloadOrdersAsync, settings.RepeatEvery); //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 { DescriptionContains = settingsFromDb.TemplatePrefixWithoutVariable, GenerateDateStart = DateTimeOffset.UtcNow.DateTime.Add(-settingsFromDb.OrderSearchDeltaDate), GenerateDateEnd = DateTimeOffset.UtcNow.DateTime }; var downloadResult = await esppApiService.FindOrdersAsync(searchQuery); if (!downloadResult.IsSuccess) { logger.LogError(downloadResult.Exception, "Ошибка загрузки списка нарядов из ЕСПП"); return null; } logger.LogInformation($"Получено нарядов из ЕСПП: {downloadResult.Data?.Count()}"); return downloadResult.Data; } } }