feat(esppOrderLoader): изменено журналирвоание

This commit is contained in:
Mikhail Kuznetsov
2026-02-09 12:00:46 +10:00
parent 25e7fe4b90
commit 7dd40d1701
16 changed files with 434 additions and 252 deletions

View File

@@ -41,74 +41,116 @@ namespace PARR.EsppOrderLoader
{
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);
//}
try
{
await intervalService.IntervalInitAsync(DownloadOrdersAsync, settings.RepeatEvery);
logger.LogDebug("Сервис загрузки нарядов из ЕСПП успешно запущен с интервалом {RepeatEvery}", settings.RepeatEvery);
}
catch (Exception ex)
{
logger.LogError(ex, "Ошибка при инициализации интервального сервиса загрузки нарядов из ЕСПП");
throw;
}
}
//Получаю список нарядов из еспп
//проверяю есть ли наряд в бд
//если нет, ище шаблон в бд, затем сохраняю наряд в бд с привязанным шаблоном (если шаблон не нашел, тоже сохраняю)
//если нет, ищу шаблон в бд, затем сохраняю наряд в бд с привязанным шаблоном (если шаблон не нашел, тоже сохраняю)
private async Task DownloadOrdersAsync()
{
var esppObjs = await GetOrdersAsync();
logger.LogDebug("Начинаю процесс загрузки нарядов из ЕСПП");
if (esppObjs == null)
return;
foreach (var item in esppObjs)
try
{
using (var scope = serviceProvider.CreateScope())
{
var orderItemService = scope.ServiceProvider.GetService<IOrderItemService>();
if (orderItemService == null)
throw new Exception("Не смог получить серивс IOrderItemService, scope.ServiceProvider.GetService<IOrderItemService>()");
var esppObjs = await GetOrdersAsync();
await orderItemService.WriteOrderAsync(item);
if (esppObjs == null || !esppObjs.Any())
{
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>()");
try
{
logger.LogDebug("Обработка наряда {OrderNumber}", item.Number);
await orderItemService.WriteOrderAsync(item);
}
catch (Exception ex)
{
logger.LogError(
ex,
"Ошибка при обработке наряда {OrderNumber} из ЕСПП",
item?.Number ?? "неизвестно");
}
}
}
logger.LogDebug("Завершена обработка нарядов из ЕСПП");
}
catch (Exception ex)
{
logger.LogError(ex, "Критическая ошибка при загрузке нарядов из ЕСПП");
throw;
}
}
private async Task<IEnumerable<EsppOrder>?> GetOrdersAsync()
{
var searchQuery = new FindOrdersQuery
{
DescriptionContains = settingsFromDb.TemplatePrefixWithoutVariable,
GenerateDateStart = DateTimeOffset.UtcNow.DateTime.Add(-settingsFromDb.OrderSearchDeltaDate),
GenerateDateEnd = DateTimeOffset.UtcNow.DateTime
};
logger.LogDebug("Выполняю поиск нарядов в ЕСПП");
var downloadResult = await esppApiService.FindOrdersAsync(searchQuery);
if (!downloadResult.IsSuccess)
try
{
logger.LogError(downloadResult.Exception, "Ошибка загрузки списка нарядов из ЕСПП");
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;
if (data != null && count > 0)
{
logger.LogInformation("Успешно получено нарядов из ЕСПП: {Count}", count);
}
else
{
logger.LogDebug("Успешно выполнен запрос к ЕСПП, но наряды отсутствуют. Количество: {Count}", count);
}
return data;
}
catch (Exception ex)
{
logger.LogError(ex, "Критическая ошибка при выполнении запроса на получение нарядов из ЕСПП");
return null;
}
logger.LogInformation($"Получено нарядов из ЕСПП: {downloadResult.Data?.Count()}");
return downloadResult.Data;
}
}
}
}

View File

@@ -26,74 +26,92 @@ namespace PARR.EsppOrderLoader.Services
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)
try
{
logger.LogInformation($"Наряд {esppOrder.Number} уже есть в БД. Пропускаю.");
return;
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);
}
}
var template = await templateService.Get()
.Include(t => t.Job)
.FirstOrDefaultAsync(t => t.Name.ToLower() == esppOrder.TemplateName.ToLower());
if (template == null)
logger.LogWarning($"Не найден шаблон для наряда {esppOrder.Number}, краткое описание наряда: {esppOrder.ShortName}. {esppOrder.WorkGroup}");
var newOrder = new Order
catch (Exception ex)
{
Id = Guid.NewGuid(),
Number = esppOrder.Number,
WorkGroup = esppOrder.WorkGroup,
ShortName = esppOrder.ShortName,
TemplateId = template?.Id,
StatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status),
GenerateDate = template == null ?
null
//: CalcGenerationDate(template.ApplicationsInWork!.NextRun, template.ApplicationsInWork!.LastRun),
: CalcGenerationDate(template.NextRun, template.LastRun),
//CalcGenerationDate(esppOrder.ExpirationDateUTC, template.ApplicationsInWork!.TemplateDurationTimeSpan),
ExpirationDate = esppOrder.ExpirationDateUTC
};
if (!await orderService.CreateAsync(newOrder) || !await orderService.CommitAsync())
logger.LogError($"Ошибка при добавлении новой записи наряда в БД. {esppOrder.Number}, {esppOrder.WorkGroup}, {esppOrder.ShortName}");
else
logger.LogInformation($"Добавлен наряд в БД: {esppOrder.Number}, {esppOrder.ShortName}");
}
/// <summary>
/// Рассчет GenerationDate относительно templateDuration
/// </summary>
/// <param name="expirationDateUTC"></param>
/// <param name="templateDuration"></param>
/// <returns></returns>
private DateTimeOffset? CalcGenerationDate(DateTimeOffset expirationDateUTC, TimeSpan? templateDuration)
{
//TimeSpan duration;
//try
//{
// //ЕСПП кривоногие, они почему-то таймспан пишут так "7 00:00:00", а правильно так: "7:00:00:00"
// var durationWithTimeSpanFormat = templateDuration.Replace(" ", ":");
// duration = TimeSpan.Parse(durationWithTimeSpanFormat);
//}
//catch (Exception e)
//{
// logger.LogError(e, $"Ошибка при конвертации templateDuration в TimeSpan, исходное значение: {templateDuration}");
// return null;
//}
if (templateDuration.HasValue)
return expirationDateUTC.Add(-templateDuration.Value);
else
{
logger.LogError($"templateDuration = null.");
return null;
logger.LogError(
ex,
"Произошла ошибка при обработке наряда {EsppOrderNumber}",
esppOrder?.Number ?? "неизвестно");
throw;
}
}
@@ -101,17 +119,22 @@ namespace PARR.EsppOrderLoader.Services
/// <summary>
/// Рассчет GenerationDate относительно текущей даты и nextRun из ApplicationInWorks
/// </summary>
/// <returns></returns>
/// <param name="nextRun">Следующее время запуска</param>
/// <param name="lastRun">Последнее время запуска</param>
/// <returns>Рассчитанная дата генерации</returns>
private DateTimeOffset? CalcGenerationDate(DateTimeOffset nextRun, DateTimeOffset? lastRun)
{
if (DateTimeOffset.UtcNow > nextRun)
{
return nextRun;
}
if (lastRun.HasValue)
{
return lastRun.Value;
}
return null;
}
}
}
}