feat(esppOrderManager): логика изменения статусов наряда. Добавлен проект с константами, вынес в него OrderStatusEnum. (EsppApi)Обновлена модель EsppOrder, при изменении статуса наряда, добавлено поле Решение.

This commit is contained in:
Mikhail Trubnikov
2023-11-20 12:26:33 +10:00
parent 1c02f9978a
commit 113a801060
17 changed files with 256 additions and 48 deletions

View File

@@ -6,6 +6,8 @@ using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
using PARR.EsppOrderManager.Services;
using PARR.EsppOrderManager.Settings;
namespace PARR.EsppOrderManager
@@ -17,7 +19,7 @@ namespace PARR.EsppOrderManager
private readonly ILogger<EsppOrderManager> logger;
private readonly ITransformService transformService;
private readonly IOrderService orderService;
private readonly IEsppApiService esppApiService;
private readonly IEsppOrderService esppOrderService;
public EsppOrderManager(
MqSettings mqSettings,
@@ -25,7 +27,7 @@ namespace PARR.EsppOrderManager
ILogger<EsppOrderManager> logger,
ITransformService transformService,
IOrderService orderService,
IEsppApiService esppApiService
IEsppOrderService esppOrderService
)
{
this.mqSettings = mqSettings;
@@ -33,7 +35,7 @@ namespace PARR.EsppOrderManager
this.logger = logger;
this.transformService = transformService;
this.orderService = orderService;
this.esppApiService = esppApiService;
this.esppOrderService = esppOrderService;
}
public async void Start()
@@ -67,6 +69,7 @@ namespace PARR.EsppOrderManager
.Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel)
.Include(t => t.OrderStatus)
.Include(t => t.NextStatus)
.Include(t => t.Template).ThenInclude(t => t!.ApplicationsInWork).ThenInclude(t => t!.Work).ThenInclude(t => t!.Tnk)
.FirstOrDefaultAsync(t => t.Id == obj.OrderId);
if (order == null)
@@ -81,15 +84,39 @@ namespace PARR.EsppOrderManager
return;
}
if (!order.NextStatusCode.HasValue)
{
logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}");
return;
}
var resultMsg = GenerateResultMsg(order);
var workDuration = CalcWorkDuration(order);
//todo:!!! менять статус наряда. Можн ли закрыть не беря в работу?
// Изменям статус наряда в ЕСПП
var result = await esppOrderService.ChangeOrderToEsppAsync(order, resultMsg, workDuration);
if (result)
{
logger.LogInformation($"Статусы наряда {order.Number} в ЕСПП обновлены. Установлен статус: {order.NextStatus!.Description}");
//обновляем статусы в БД
order.StatusCode = order.NextStatusCode.Value;
if (!await orderService.CommitAsync())
{
logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}");
}
}
else
logger.LogError($"Ошибка при обновлении статуса наряда {order.Number}. Статус не изменен.");
logger.LogDebug($"Закончил работу с сообщением: {msg}");
}
/// <summary>
/// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента
/// Генерирует текст поля Решение, в зависимости от статуса наряда и от истории Агента
/// </summary>
/// <param name="order"></param>
/// <returns></returns>
@@ -99,15 +126,17 @@ namespace PARR.EsppOrderManager
.OrderBy(t => t.DateCreated)
.Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}");
var baseMsg = order.Template!.ApplicationsInWork!.Solution + "\r\n";
var msgAgent = "Работы выполнены средствами автоматизации. \r\n" +
"Журнал работы: \r\n" +
$"{string.Join("\r\n", agentHistory)}";
var msgAgentEmpty = "Работы должны были выполниться средствами автоматизации. " +
"Но от средств автоматизации не поступило сообщений. " +
var msgAgentEmpty = "Работы должны были выполняться средствами автоматизации. " +
"От средств автоматизации не поступило сообщений. " +
"Работы не выполнены.";
return agentHistory.Any() ? msgAgent : msgAgentEmpty;
return baseMsg + (agentHistory.Any() ? msgAgent : msgAgentEmpty);
}
@@ -122,15 +151,41 @@ namespace PARR.EsppOrderManager
.OrderBy(t => t.DateCreated);
if (!agentHistory.Any())
return TimeSpan.Zero;
return GetTnkDurationByScriptDuration(TimeSpan.Zero);
var dateStart = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.Start)?.DateCreated;
var dateEnd = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.End)?.DateCreated;
if (dateStart.HasValue && dateEnd.HasValue)
return dateEnd.Value - dateStart.Value;
{
var duration = dateEnd.Value - dateStart.Value;
logger.LogDebug($"Продолжительность работы скрипта: {duration}");
return TimeSpan.Zero;
return GetTnkDurationByScriptDuration(duration);
}
return GetTnkDurationByScriptDuration(TimeSpan.Zero);
}
/// <summary>
/// Получить время для списания ТНК по времени работы скрипта
/// </summary>
/// <param name="scriptDuration"></param>
/// <returns></returns>
private TimeSpan GetTnkDurationByScriptDuration(TimeSpan scriptDuration)
{
// минимальное значение 1 минута
var minDuration = new TimeSpan(0, 1, 0);
if (scriptDuration < minDuration)
{
logger.LogDebug($"Продолжительность меньше минимального, беру минимальное: {minDuration}. {scriptDuration}<{minDuration}");
return minDuration;
}
else
return scriptDuration;
}
}