2023-10-23 16:17:42 +10:00
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Core.Common.Interfaces;
|
2026-05-04 11:55:07 +10:00
|
|
|
|
using PARR.Domain.Settings;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
using PARR.EsppApi;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
using PARR.EsppApi.Models;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
using PARR.EsppApi.Models.Query;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
using PARR.EsppOrderLoader.Services;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
using PARR.EsppOrderLoader.Settings;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.EsppOrderLoader
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class EsppOrderLoader : IEsppOrderLoader
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly WorkerSettings settings;
|
|
|
|
|
|
private readonly ILogger<EsppOrderLoader> logger;
|
|
|
|
|
|
private readonly IEsppApiService esppApiService;
|
|
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
private readonly IServiceProvider serviceProvider;
|
2023-11-29 15:59:27 +10:00
|
|
|
|
private readonly IIntervalService intervalService;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
|
|
|
|
|
|
public EsppOrderLoader(
|
|
|
|
|
|
WorkerSettings settings,
|
|
|
|
|
|
ILogger<EsppOrderLoader> logger,
|
|
|
|
|
|
IEsppApiService esppApiService,
|
2023-10-23 16:17:42 +10:00
|
|
|
|
SettingsFromDb settingsFromDb,
|
2023-11-29 15:59:27 +10:00
|
|
|
|
IServiceProvider serviceProvider,
|
|
|
|
|
|
IIntervalService intervalService
|
2023-10-23 13:50:43 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.settings = settings;
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
this.esppApiService = esppApiService;
|
|
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
this.serviceProvider = serviceProvider;
|
2023-11-29 15:59:27 +10:00
|
|
|
|
this.intervalService = intervalService;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-23 16:17:42 +10:00
|
|
|
|
|
2023-10-23 13:50:43 +10:00
|
|
|
|
public async Task StartAsync()
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation("Запуск сервиса загрузки нарядов из ЕСПП.");
|
|
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
await intervalService.IntervalInitAsync(DownloadOrdersAsync, settings.RepeatEvery);
|
|
|
|
|
|
logger.LogDebug("Сервис загрузки нарядов из ЕСПП успешно запущен с интервалом {RepeatEvery}", settings.RepeatEvery);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(ex, "Ошибка при инициализации интервального сервиса загрузки нарядов из ЕСПП");
|
|
|
|
|
|
throw;
|
|
|
|
|
|
}
|
2023-10-23 13:50:43 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-24 10:38:21 +10:00
|
|
|
|
|
|
|
|
|
|
//Получаю список нарядов из еспп
|
|
|
|
|
|
//проверяю есть ли наряд в бд
|
2026-02-09 12:00:46 +10:00
|
|
|
|
//если нет, ищу шаблон в бд, затем сохраняю наряд в бд с привязанным шаблоном (если шаблон не нашел, тоже сохраняю)
|
2023-10-23 13:50:43 +10:00
|
|
|
|
|
|
|
|
|
|
private async Task DownloadOrdersAsync()
|
2023-10-23 16:17:42 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogDebug("Начинаю процесс загрузки нарядов из ЕСПП");
|
2023-10-23 16:17:42 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
try
|
2023-10-23 16:17:42 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
var esppObjs = await GetOrdersAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (esppObjs == null || !esppObjs.Any())
|
2023-10-23 16:17:42 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-10-23 16:17:42 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
foreach (var item in esppObjs)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (var scope = serviceProvider.CreateScope())
|
|
|
|
|
|
{
|
|
|
|
|
|
var orderItemService = scope.ServiceProvider.GetService<IOrderItemService>();
|
|
|
|
|
|
if (orderItemService == null)
|
|
|
|
|
|
throw new Exception("Не смог получить сервис IOrderItemService, scope.ServiceProvider.GetService<IOrderItemService>()");
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogDebug("Обработка наряда {OrderNumber}", item.Number);
|
|
|
|
|
|
await orderItemService.WriteOrderAsync(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(
|
|
|
|
|
|
ex,
|
|
|
|
|
|
"Ошибка при обработке наряда {OrderNumber} из ЕСПП",
|
|
|
|
|
|
item?.Number ?? "неизвестно");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-23 16:17:42 +10:00
|
|
|
|
}
|
2026-02-09 12:00:46 +10:00
|
|
|
|
|
|
|
|
|
|
logger.LogDebug("Завершена обработка нарядов из ЕСПП");
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(ex, "Критическая ошибка при загрузке нарядов из ЕСПП");
|
|
|
|
|
|
throw;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task<IEnumerable<EsppOrder>?> GetOrdersAsync()
|
2023-10-23 13:50:43 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogDebug("Выполняю поиск нарядов в ЕСПП");
|
|
|
|
|
|
|
|
|
|
|
|
try
|
2024-02-13 15:28:32 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
var searchQuery = new FindOrdersQuery
|
|
|
|
|
|
{
|
|
|
|
|
|
DescriptionContains = settingsFromDb.TemplatePrefixWithoutVariable,
|
|
|
|
|
|
GenerateDateStart = DateTimeOffset.UtcNow.DateTime.Add(-settingsFromDb.OrderSearchDeltaDate),
|
|
|
|
|
|
GenerateDateEnd = DateTimeOffset.UtcNow.DateTime
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var downloadResult = await esppApiService.FindOrdersAsync(searchQuery);
|
|
|
|
|
|
|
|
|
|
|
|
logger.LogDebug("Результат запроса к ЕСПП: IsSuccess={IsSuccess}, Data={Data}",
|
|
|
|
|
|
downloadResult.IsSuccess,
|
|
|
|
|
|
downloadResult.Data?.Count() ?? 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (!downloadResult.IsSuccess)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(
|
|
|
|
|
|
downloadResult.Exception,
|
|
|
|
|
|
"Ошибка загрузки списка нарядов из ЕСПП. Ошибка: {ErrorMessage}",
|
|
|
|
|
|
downloadResult.Exception?.Message);
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var data = downloadResult.Data;
|
|
|
|
|
|
var count = data?.Count() ?? 0;
|
2024-02-13 15:28:32 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
if (data != null && count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation("Успешно получено нарядов из ЕСПП: {Count}", count);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogDebug("Успешно выполнен запрос к ЕСПП, но наряды отсутствуют. Количество: {Count}", count);
|
|
|
|
|
|
}
|
2023-10-23 13:50:43 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
return data;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
2023-10-23 13:50:43 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogError(ex, "Критическая ошибка при выполнении запроса на получение нарядов из ЕСПП");
|
2023-10-23 16:17:42 +10:00
|
|
|
|
return null;
|
2023-10-23 13:50:43 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|