feat(esppOrderManager): отладка

This commit is contained in:
Mikhail Trubnikov
2023-11-20 16:59:58 +10:00
parent 113a801060
commit 7f3a2441c9
6 changed files with 168 additions and 62 deletions

View File

@@ -34,8 +34,8 @@ namespace PARR.EsppApi
var query = $"<ROOT operation=\"SaveTask\" returnFormat=\"json\">{{" +
$"\"recordid\":\"{recordId}\"," +
$"\"status\":\"{newStatusStr}\"," +
$"\"assignee\":\"{esppOrderSettings.AccountName}\"" +
$"\"resolution\":\"{resultMsg}\"," +
$"\"assignee\":\"{esppOrderSettings.AccountName}\"," +
$"\"resolution\":\"{resultMsg}\"" +
$"}}</ROOT>";
var result = await esppHttpService.SendAsync<EsppResponse>(query);

View File

@@ -14,4 +14,8 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PARR.Constants\PARR.Constants.csproj" />
</ItemGroup>
</Project>

View File

@@ -30,6 +30,13 @@ namespace PARR.EsppApi
var responseString = await response.Content.ReadAsStringAsync();
if (responseString.Contains("ErrorCode") && responseString.Contains("Message"))
{
logger.LogError(new Exception(responseString), $"Ошибка при выполнении запроса в ЕСПП. Тело запроса: {query}");
return new EsppResultBase<T>(null, false, new Exception($"Espp error: {responseString}"));
}
logger.LogDebug($"Получил данные, строка: {responseString}");
var obj = JsonSerializer.Deserialize<T>(responseString);

View File

@@ -1,12 +1,11 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces;
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;
@@ -18,37 +17,37 @@ namespace PARR.EsppOrderManager
private readonly IMqService mqService;
private readonly ILogger<EsppOrderManager> logger;
private readonly ITransformService transformService;
private readonly IOrderService orderService;
private readonly IEsppOrderService esppOrderService;
private readonly IServiceProvider serviceProvider;
public EsppOrderManager(
MqSettings mqSettings,
IMqService mqService,
ILogger<EsppOrderManager> logger,
ITransformService transformService,
IOrderService orderService,
IEsppOrderService esppOrderService
IEsppOrderService esppOrderService,
IServiceProvider serviceProvider
)
{
this.mqSettings = mqSettings;
this.mqService = mqService;
this.logger = logger;
this.transformService = transformService;
this.orderService = orderService;
this.esppOrderService = esppOrderService;
this.serviceProvider = serviceProvider;
}
public async void Start()
{
// логика работы описана в документации
//var isConnected = mqService.InitConsumer(mqSettings, ManageOrder);
//var isConnected = mqService.InitConsumer(mqSettings, ManageOrderAsync);
//if (!isConnected)
// throw new Exception("Ошибка при подключении к RabbitMq");
//test, and remove async in method name
await ManageOrder("{\"OrderId\":\"77eeccfb-4ca0-443e-8cc7-f6aa9dc774b7\"}");
await ManageOrderAsync("{\"OrderId\":\"77eeccfb-4ca0-443e-8cc7-f6aa9dc774b7\"}");
}
public void Stop()
@@ -57,51 +56,53 @@ namespace PARR.EsppOrderManager
}
private async Task ManageOrder(string msg)
private async Task ManageOrderAsync(string msg)
{
logger.LogDebug($"Получили сообщение: {msg}");
var obj = transformService.GetModelFromJson<OrderManageMq>(msg);
if (obj == null)
var objFromQuery = transformService.GetModelFromJson<OrderManageMq>(msg);
if (objFromQuery == null)
return;
using (var scope = serviceProvider.CreateScope())
{
var orderService = scope.ServiceProvider.GetService<IOrderService>();
if (orderService == null)
throw new Exception("Не смог получить серивс IOrderService, scope.ServiceProvider.GetService<IOrderService>()");
await ManageOrderToScopeAsync(orderService, objFromQuery);
}
logger.LogDebug($"Закончил работу с сообщением: {msg}");
}
private async Task ManageOrderToScopeAsync(IOrderService orderService, OrderManageMq objFromQuery)
{
var order = await orderService.Get()
.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);
.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 == objFromQuery.OrderId);
if (order == null)
{
logger.LogError($"Не найден наряд с OrderId: {obj.OrderId}");
if (!IsValidOrder(ref order, ref objFromQuery))
return;
}
if (order.StatusCode == order.NextStatusCode)
{
logger.LogInformation($"У наряда {order.Id}, {order.Number} статусы равны, ничего не делаем. Статус: {order.OrderStatus!.Description}");
return;
}
logger.LogDebug($"Найден наряд в БД: {order!.Number}");
if (!order.NextStatusCode.HasValue)
{
logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}");
return;
}
var resultMsg = GenerateResultMsg(order);
var workDuration = CalcWorkDuration(order);
var resultMsg = GenerateResultMsg(order!);
var workDuration = CalcWorkDuration(order!);
// Изменям статус наряда в ЕСПП
var result = await esppOrderService.ChangeOrderToEsppAsync(order, resultMsg, workDuration);
var result = await esppOrderService.ChangeOrderToEsppAsync(order!, resultMsg, workDuration);
if (result)
{
logger.LogInformation($"Статусы наряда {order.Number} в ЕСПП обновлены. Установлен статус: {order.NextStatus!.Description}");
logger.LogInformation($"Статусы наряда {order!.Number} в ЕСПП обновлены. Установлен статус: {order.NextStatus!.Description}");
//обновляем статусы в БД
order.StatusCode = order.NextStatusCode.Value;
order.StatusCode = order.NextStatusCode!.Value;
if (!await orderService.CommitAsync())
{
logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}");
@@ -109,9 +110,31 @@ namespace PARR.EsppOrderManager
}
else
logger.LogError($"Ошибка при обновлении статуса наряда {order.Number}. Статус не изменен.");
logger.LogError($"Ошибка при обновлении статуса наряда {order!.Number}. Статус не изменен.");
}
logger.LogDebug($"Закончил работу с сообщением: {msg}");
private bool IsValidOrder(ref Order? order, ref OrderManageMq query)
{
if (order == null)
{
logger.LogError($"Не найден наряд с OrderId: {query.OrderId}");
return false;
}
if (order.StatusCode == order.NextStatusCode)
{
logger.LogInformation($"У наряда {order.Id}, {order.Number} статусы равны, ничего не делаем. Статус: {order.OrderStatus!.Description}");
return false;
}
if (!order.NextStatusCode.HasValue)
{
logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}");
return false;
}
return true;
}

View File

@@ -1,8 +1,8 @@
using Microsoft.Extensions.Logging;
using PARR.DAL.Models;
using PARR.EsppApi.Models.Query;
using PARR.EsppApi;
using PARR.Constants;
using PARR.DAL.Models;
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
namespace PARR.EsppOrderManager.Services
{
@@ -37,7 +37,7 @@ namespace PARR.EsppOrderManager.Services
}
// проверяем, совпадает ли NextStatus со статусом в ЕСПП
// Если совпадают, значит в еспп поменяли, и не изменили в БД раньше (может ошибка была, может руками кто сделал)
// Если совпадают, значит в еспп поменяли и не изменили в БД раньше (может ошибка была, может руками кто сделал)
// так что говорим, как будто бы все ок
if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum))
{
@@ -47,34 +47,107 @@ namespace PARR.EsppOrderManager.Services
return true;
}
//todo:
// Установить статус 2-В работе
if (order.NextStatusCode == (int)OrderStatusEnum.InWork)
if (esppOrderResult.Data.StatusEnum == OrderStatusEnum.New || esppOrderResult.Data.StatusEnum == OrderStatusEnum.Stop)
return await SetInWorkStatusAsync(order.Number, resultMsg);
//var resultInWork = await esppApiService.SetStatusInWorkAsync(order.Number, resultMsg);
// Списать трудозатраты и установить статус 4-Выполнен
if (order.NextStatusCode == (int)OrderStatusEnum.Complete)
{
var statusIsWork = esppOrderResult.Data.StatusEnum == OrderStatusEnum.InWork;
//if (!resultInWork.IsSuccess)
//{
// return false;
//}
// если текущий статус != 2-В работе, сначала меняем статус на 2-В работе, а затем уже списываем трудозатраты и меняем на 4-Выполнен
if (!statusIsWork)
statusIsWork = await SetInWorkStatusAsync(order.Number, resultMsg);
if (statusIsWork)
{
// заполняем ТНК
var tnk = new AddMtnkQuery
{
JobOperation = order!.Template!.ApplicationsInWork!.Work!.Name,
RecordId = order.Number,
Time = duration.ToString("HH:mm")
};
return await SetCompleteStatusAsync(order.Number, resultMsg, tnk);
}
else
{
logger.LogError($"Для наряда {order.Number} не могу изменить статус на {OrderStatusEnum.Complete}, так как текущий статус не {OrderStatusEnum.InWork}. " +
$"Текущий статус в ЕСПП: {esppOrderResult.Data.Status}");
//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;
}
}
return false;
}
/// <summary>
/// Установка статуса 4-Выполнен
/// </summary>
/// <param name="orderNumber"></param>
/// <param name="resultMsg"></param>
/// <param name="tnk"></param>
/// <returns></returns>
private async Task<bool> SetCompleteStatusAsync(string orderNumber, string resultMsg, AddMtnkQuery tnk)
{
// списываем трудозатраты
var resultTnk = await esppApiService.AddMTnkAsync(tnk);
if (!resultTnk.IsSuccess)
{
logger.LogError(resultTnk.Exception, $"Ошибка при списывании трудозатрат для наряда {orderNumber}.");
return false;
}
// выполняем наряд
var result = await esppApiService.SetStatusIsDoneAsync(orderNumber, resultMsg);
if (result.IsSuccess)
{
logger.LogDebug($"В ЕСПП, для наряда {orderNumber} установлен статус {OrderStatusEnum.Complete}");
return true;
}
else
{
logger.LogError(result.Exception, $"В ЕСПП, для наряда {orderNumber} не удалось установить статус {OrderStatusEnum.Complete}.");
return false;
}
}
/// <summary>
/// Установка статуса 2-В работе
/// </summary>
/// <param name="orderNumber"></param>
/// <param name="resultMsg"></param>
/// <returns></returns>
private async Task<bool> SetInWorkStatusAsync(string orderNumber, string resultMsg)
{
var result = await esppApiService.SetStatusInWorkAsync(orderNumber, resultMsg);
if (result.IsSuccess)
{
logger.LogDebug($"В ЕСПП, для наряда {orderNumber} установлен статус {OrderStatusEnum.InWork}");
return true;
}
else
{
logger.LogError(result.Exception, $"В ЕСПП, для наряда {orderNumber} не удалось установить статус {OrderStatusEnum.InWork}.");
return false;
}
}
/// <summary>
/// Совпадает ли NextStatus и Еспп статусом
/// </summary>

View File

@@ -25,7 +25,6 @@ builder.Services.AddLogging(config =>
builder.Services.InstallEsppOrderManagerServices(builder.Configuration);
builder.Configuration.AddEsppOrderManagerConfigurations(builder.Services);
builder.Services.AddEsppOrderManagerSettings(builder.Configuration);
builder.Services.InstallEsppApiServices(builder.Configuration);
builder.Services.AddHostedService<Worker>();