2023-10-23 16:17:42 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
using PARR.Core.Repositories.Interfaces;
|
|
|
|
|
|
using PARR.Domain.Entities;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
using PARR.EsppApi.Models;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.EsppOrderLoader.Services
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class OrderItemService : IOrderItemService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly ILogger<OrderItemService> logger;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
private readonly IOrderRepository orderService;
|
|
|
|
|
|
private readonly ITemplateRepository templateService;
|
|
|
|
|
|
private readonly IOrderStatusRepository orderStatusService;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
|
|
|
|
|
|
public OrderItemService(
|
|
|
|
|
|
ILogger<OrderItemService> logger,
|
2026-04-30 10:35:31 +10:00
|
|
|
|
IOrderRepository orderService,
|
|
|
|
|
|
ITemplateRepository templateService,
|
|
|
|
|
|
IOrderStatusRepository orderStatusService
|
2023-10-23 16:17:42 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.orderService = orderService;
|
|
|
|
|
|
this.templateService = templateService;
|
2023-10-24 10:38:21 +10:00
|
|
|
|
this.orderStatusService = orderStatusService;
|
2023-10-23 16:17:42 +10:00
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task WriteOrderAsync(EsppOrder esppOrder)
|
|
|
|
|
|
{
|
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
|
|
|
|
logger.LogDebug("Начинаю обработку наряда {EsppOrderNumber}", esppOrder.Number);
|
|
|
|
|
|
|
|
|
|
|
|
var existOrder = await orderService.Get()
|
|
|
|
|
|
.FirstOrDefaultAsync(t => t.Number.ToLower() == esppOrder.Number.ToLower());
|
|
|
|
|
|
|
|
|
|
|
|
if (existOrder != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation("Наряд {EsppOrderNumber} уже существует в БД. Пропускаю.", esppOrder.Number);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
logger.LogDebug("Поиск шаблона для наряда {EsppOrderNumber}", esppOrder.Number);
|
|
|
|
|
|
|
|
|
|
|
|
var template = await templateService.Get()
|
|
|
|
|
|
.Include(t => t.Job)
|
|
|
|
|
|
.FirstOrDefaultAsync(t => t.Name.ToLower() == esppOrder.TemplateName.ToLower());
|
|
|
|
|
|
|
|
|
|
|
|
if (template == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogWarning(
|
|
|
|
|
|
"Не найден шаблон для наряда {EsppOrderNumber} с именем шаблона {TemplateName}. " +
|
|
|
|
|
|
"Краткое описание: {ShortName}, рабочая группа: {WorkGroup}",
|
|
|
|
|
|
esppOrder.Number,
|
|
|
|
|
|
esppOrder.TemplateName,
|
|
|
|
|
|
esppOrder.ShortName,
|
|
|
|
|
|
esppOrder.WorkGroup);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogDebug(
|
|
|
|
|
|
"Найден шаблон {TemplateId} для наряда {EsppOrderNumber}",
|
|
|
|
|
|
template.Id,
|
|
|
|
|
|
esppOrder.Number);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var statusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status);
|
|
|
|
|
|
|
|
|
|
|
|
var newOrder = new Order
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
|
Number = esppOrder.Number,
|
|
|
|
|
|
WorkGroup = esppOrder.WorkGroup,
|
|
|
|
|
|
ShortName = esppOrder.ShortName,
|
|
|
|
|
|
TemplateId = template?.Id,
|
|
|
|
|
|
StatusCode = statusCode,
|
|
|
|
|
|
GenerateDate = template == null
|
|
|
|
|
|
? null
|
|
|
|
|
|
: CalcGenerationDate(template.NextRun, template.LastRun),
|
|
|
|
|
|
ExpirationDate = esppOrder.ExpirationDateUTC,
|
|
|
|
|
|
DateCreated = DateTimeOffset.UtcNow
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
logger.LogDebug("Создание нового наряда {OrderNumber} в БД", esppOrder.Number);
|
|
|
|
|
|
|
|
|
|
|
|
var createResult = await orderService.CreateAsync(newOrder);
|
|
|
|
|
|
var commitResult = await orderService.CommitAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!createResult || !commitResult)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(
|
|
|
|
|
|
"Ошибка при добавлении нового наряда в БД. " +
|
|
|
|
|
|
"Номер наряда: {EsppOrderNumber}, рабочая группа: {WorkGroup}, " +
|
|
|
|
|
|
"краткое описание: {ShortName}",
|
|
|
|
|
|
esppOrder.Number,
|
|
|
|
|
|
esppOrder.WorkGroup,
|
|
|
|
|
|
esppOrder.ShortName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation(
|
|
|
|
|
|
"Успешно добавлен наряд в БД: {EsppOrderNumber}, краткое описание: {ShortName}",
|
|
|
|
|
|
esppOrder.Number,
|
|
|
|
|
|
esppOrder.ShortName);
|
|
|
|
|
|
}
|
2023-10-23 16:17:42 +10:00
|
|
|
|
}
|
2026-02-09 12:00:46 +10:00
|
|
|
|
catch (Exception ex)
|
2023-10-25 12:40:33 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogError(
|
|
|
|
|
|
ex,
|
|
|
|
|
|
"Произошла ошибка при обработке наряда {EsppOrderNumber}",
|
|
|
|
|
|
esppOrder?.Number ?? "неизвестно");
|
|
|
|
|
|
throw;
|
2023-10-25 12:40:33 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-02-26 14:27:54 +10:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Рассчет GenerationDate относительно текущей даты и nextRun из ApplicationInWorks
|
|
|
|
|
|
/// </summary>
|
2026-02-09 12:00:46 +10:00
|
|
|
|
/// <param name="nextRun">Следующее время запуска</param>
|
|
|
|
|
|
/// <param name="lastRun">Последнее время запуска</param>
|
|
|
|
|
|
/// <returns>Рассчитанная дата генерации</returns>
|
2024-02-27 09:20:57 +10:00
|
|
|
|
private DateTimeOffset? CalcGenerationDate(DateTimeOffset nextRun, DateTimeOffset? lastRun)
|
2024-02-26 14:27:54 +10:00
|
|
|
|
{
|
2024-02-28 12:16:53 +10:00
|
|
|
|
if (DateTimeOffset.UtcNow > nextRun)
|
2026-02-09 12:00:46 +10:00
|
|
|
|
{
|
2024-02-27 09:20:57 +10:00
|
|
|
|
return nextRun;
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|
2024-02-26 14:27:54 +10:00
|
|
|
|
|
2024-02-27 09:20:57 +10:00
|
|
|
|
if (lastRun.HasValue)
|
2026-02-09 12:00:46 +10:00
|
|
|
|
{
|
2024-02-27 09:20:57 +10:00
|
|
|
|
return lastRun.Value;
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|
2024-02-26 14:27:54 +10:00
|
|
|
|
|
2024-02-27 09:20:57 +10:00
|
|
|
|
return null;
|
2024-02-26 14:27:54 +10:00
|
|
|
|
}
|
2023-10-23 16:17:42 +10:00
|
|
|
|
}
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|