feat(esppOrderLoader): логика синхронизации

This commit is contained in:
Mikhail Trubnikov
2023-10-23 16:17:42 +10:00
parent dd96234c7d
commit a94a6460ce
18 changed files with 3084 additions and 10 deletions

View File

@@ -1,7 +1,10 @@
using Microsoft.Extensions.Logging;
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
@@ -12,20 +15,24 @@ namespace PARR.EsppOrderLoader
private readonly ILogger<EsppOrderLoader> logger;
private readonly IEsppApiService esppApiService;
private readonly SettingsFromDb settingsFromDb;
private readonly IServiceProvider serviceProvider;
public EsppOrderLoader(
WorkerSettings settings,
ILogger<EsppOrderLoader> logger,
IEsppApiService esppApiService,
SettingsFromDb settingsFromDb
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("Запуск сервиса загрузки нарядов из ЕСПП.");
@@ -55,6 +62,27 @@ namespace PARR.EsppOrderLoader
// если в бд не добавляю, пишу в лог, что нет такого шаблона, в бд не добавляю
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<IOrderItemService>();
if (orderItemService == null)
throw new Exception("Не смог получить серивс IOrderItemService, scope.ServiceProvider.GetService<IOrderItemService>()");
await orderItemService.WriteOrderAsync(item);
}
}
}
private async Task<IEnumerable<EsppOrder>?> GetOrdersAsync()
{
var searchQuery = new FindOrdersQuery { ShortDescriptionContains = settingsFromDb.TemplatePrefixName, DateEnd = DateTime.Now.Add(settingsFromDb.OrderSearchDeltaDate) };
var downloadResult = await esppApiService.FindOrdersAsync(searchQuery);
@@ -62,18 +90,12 @@ namespace PARR.EsppOrderLoader
if (!downloadResult.IsSuccess)
{
logger.LogError(downloadResult.Exception, "Ошибка загрузки списка нарядов из ЕСПП");
return;
return null;
}
logger.LogInformation($"Получено нарядов из ЕСПП: {downloadResult.Data?.Count()}");
if (downloadResult.Data == null)
return;
foreach (var item in downloadResult.Data)
{
//todo:
}
return downloadResult.Data;
}
}

View File

@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using PARR.BLL;
using PARR.DAL;
using PARR.EsppApi;
using PARR.EsppOrderLoader.Services;
using PARR.EsppOrderLoader.Settings;
namespace PARR.EsppOrderLoader
@@ -20,6 +21,7 @@ namespace PARR.EsppOrderLoader
services.AddSingleton(settings);
services.AddTransient<IEsppOrderLoader, EsppOrderLoader>();
services.AddTransient<IOrderItemService, OrderItemService>();
}
public static IConfigurationBuilder AddEsppOrderLoaderConfigurations(this IConfigurationBuilder builder, IServiceCollection services)

View File

@@ -0,0 +1,9 @@
using PARR.EsppApi.Models;
namespace PARR.EsppOrderLoader.Services
{
internal interface IOrderItemService
{
Task WriteOrderAsync(EsppOrder esppOrder);
}
}

View File

@@ -0,0 +1,50 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.DAL.Services.Interfaces;
using PARR.EsppApi.Models;
namespace PARR.EsppOrderLoader.Services
{
internal class OrderItemService : IOrderItemService
{
private readonly ILogger<OrderItemService> logger;
private readonly IOrderService orderService;
private readonly ITemplateService templateService;
public OrderItemService(
ILogger<OrderItemService> logger,
IOrderService orderService,
ITemplateService templateService
)
{
this.orderService = orderService;
this.templateService = templateService;
this.logger = logger;
}
public async Task WriteOrderAsync(EsppOrder esppOrder)
{
// В цикле проверяю каждый наряд, есть ли он в БД + по имени ищу есть ли такой шаблон
// Если наряда такого нет в БД и есть шаблон, добавляю в БД
// если в бд не добавляю, пишу в лог, что нет такого шаблона, в бд не добавляю
var existOrder = await orderService.Get().FirstOrDefaultAsync(t => t.Number.ToLower() == esppOrder.Number.ToLower());
if (existOrder != null)
{
logger.LogInformation($"Наряд {esppOrder.Number} уже есть в БД. Пропускаю.");
return;
}
var template = await templateService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == esppOrder.ShortName.ToLower());
if (template == null)
{
logger.LogInformation($"Не найден шаблон для наряда {esppOrder.Number}, краткое описание наряда: {esppOrder.ShortName}. Пропускаю.");
return;
}
//todo: добавляю в БД!
}
}
}