feat(esppOrderLoader): логика синхронизации
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
9
PARR.EsppOrderLoader/Services/IOrderItemService.cs
Normal file
9
PARR.EsppOrderLoader/Services/IOrderItemService.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using PARR.EsppApi.Models;
|
||||
|
||||
namespace PARR.EsppOrderLoader.Services
|
||||
{
|
||||
internal interface IOrderItemService
|
||||
{
|
||||
Task WriteOrderAsync(EsppOrder esppOrder);
|
||||
}
|
||||
}
|
||||
50
PARR.EsppOrderLoader/Services/OrderItemService.cs
Normal file
50
PARR.EsppOrderLoader/Services/OrderItemService.cs
Normal 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: добавляю в БД!
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user