feat(esppOrderManager): логика изменения статусов наряда. Добавлен проект с константами, вынес в него OrderStatusEnum. (EsppApi)Обновлена модель EsppOrder, при изменении статуса наряда, добавлено поле Решение.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,8 +12,4 @@
|
||||
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using PARR.BLL;
|
||||
using PARR.DAL;
|
||||
using PARR.EsppApi;
|
||||
using PARR.EsppOrderManager.Services;
|
||||
using PARR.EsppOrderManager.Settings;
|
||||
|
||||
namespace PARR.EsppOrderManager
|
||||
@@ -20,6 +21,7 @@ namespace PARR.EsppOrderManager
|
||||
services.AddSingleton(mqSettings);
|
||||
|
||||
services.AddTransient<IEsppOrderManager, EsppOrderManager>();
|
||||
services.AddTransient<IEsppOrderService, EsppOrderService>();
|
||||
}
|
||||
|
||||
public static IConfigurationBuilder AddEsppOrderManagerConfigurations(this IConfigurationBuilder builder, IServiceCollection services)
|
||||
|
||||
88
PARR.EsppOrderManager/Services/EsppOrderService.cs
Normal file
88
PARR.EsppOrderManager/Services/EsppOrderService.cs
Normal file
@@ -0,0 +1,88 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.EsppApi.Models.Query;
|
||||
using PARR.EsppApi;
|
||||
using PARR.Constants;
|
||||
|
||||
namespace PARR.EsppOrderManager.Services
|
||||
{
|
||||
internal class EsppOrderService : IEsppOrderService
|
||||
{
|
||||
private readonly ILogger<EsppOrderService> logger;
|
||||
private readonly IEsppApiService esppApiService;
|
||||
|
||||
public EsppOrderService(
|
||||
ILogger<EsppOrderService> logger,
|
||||
IEsppApiService esppApiService
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.esppApiService = esppApiService;
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> ChangeOrderToEsppAsync(Order order, string resultMsg, TimeSpan duration)
|
||||
{
|
||||
// Наряд нужно провести по всем статусам
|
||||
// Найти наряд, посмотреть его текущий статус (вдруг статус в ЕСПП был изменен, а в бд нет)
|
||||
// Сначала взять в работу
|
||||
// Списать ТНК
|
||||
// Выполнить
|
||||
|
||||
var esppOrderResult = await esppApiService.FindOrderByRecordIdAsync(order.Number);
|
||||
if (!esppOrderResult.IsSuccess || esppOrderResult.Data == null)
|
||||
{
|
||||
logger.LogError($"Не найден наряд в ЕСПП: {order.Number}");
|
||||
return false;
|
||||
}
|
||||
|
||||
// проверяем, совпадает ли NextStatus со статусом в ЕСПП
|
||||
// Если совпадают, значит в еспп поменяли, и не изменили в БД раньше (может ошибка была, может руками кто сделал)
|
||||
// так что говорим, как будто бы все ок
|
||||
if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum))
|
||||
{
|
||||
logger.LogInformation($"Для наряда {order.Number}, статус в ЕСПП совпадает с {nameof(order.NextStatusCode)} = {order.NextStatus!.Description}. " +
|
||||
$"Статус в ЕСПП менять не нужно.");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//todo:
|
||||
|
||||
//var resultInWork = await esppApiService.SetStatusInWorkAsync(order.Number, resultMsg);
|
||||
|
||||
//if (!resultInWork.IsSuccess)
|
||||
//{
|
||||
// return false;
|
||||
//}
|
||||
|
||||
|
||||
|
||||
//var tnk = new AddMtnkQuery
|
||||
//{
|
||||
// JobOperation = order!.Template!.ApplicationsInWork!.Work!.Tnk!.Name,
|
||||
// RecordId = order.Number,
|
||||
// Time = duration.ToString()
|
||||
//};
|
||||
|
||||
//var resultTnk = await esppApiService.AddMTnkAsync(tnk);
|
||||
|
||||
//var resultIsDone = await esppApiService.SetStatusIsDoneAsync(order.Number, resultMsg);
|
||||
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Совпадает ли NextStatus и Еспп статусом
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool IsEquelEsppStatusAndNextStatus(int nextStatusCode, OrderStatusEnum esppStatus)
|
||||
{
|
||||
return nextStatusCode == (int)esppStatus;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
13
PARR.EsppOrderManager/Services/IEsppOrderService.cs
Normal file
13
PARR.EsppOrderManager/Services/IEsppOrderService.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using PARR.DAL.Models;
|
||||
|
||||
namespace PARR.EsppOrderManager.Services
|
||||
{
|
||||
internal interface IEsppOrderService
|
||||
{
|
||||
/// <summary>
|
||||
/// Изменение статуса в ЕСПП
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<bool> ChangeOrderToEsppAsync(Order order, string resultMsg, TimeSpan duration);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user