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\">{{" + var query = $"<ROOT operation=\"SaveTask\" returnFormat=\"json\">{{" +
$"\"recordid\":\"{recordId}\"," + $"\"recordid\":\"{recordId}\"," +
$"\"status\":\"{newStatusStr}\"," + $"\"status\":\"{newStatusStr}\"," +
$"\"assignee\":\"{esppOrderSettings.AccountName}\"" + $"\"assignee\":\"{esppOrderSettings.AccountName}\"," +
$"\"resolution\":\"{resultMsg}\"," + $"\"resolution\":\"{resultMsg}\"" +
$"}}</ROOT>"; $"}}</ROOT>";
var result = await esppHttpService.SendAsync<EsppResponse>(query); var result = await esppHttpService.SendAsync<EsppResponse>(query);

View File

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

View File

@@ -30,6 +30,13 @@ namespace PARR.EsppApi
var responseString = await response.Content.ReadAsStringAsync(); 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}"); logger.LogDebug($"Получил данные, строка: {responseString}");
var obj = JsonSerializer.Deserialize<T>(responseString); var obj = JsonSerializer.Deserialize<T>(responseString);

View File

@@ -1,12 +1,11 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using PARR.BLL.Domain.Mq; using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces; using PARR.BLL.Services.Interfaces;
using PARR.DAL.Contracts; using PARR.DAL.Contracts;
using PARR.DAL.Models; using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces;
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
using PARR.EsppOrderManager.Services; using PARR.EsppOrderManager.Services;
using PARR.EsppOrderManager.Settings; using PARR.EsppOrderManager.Settings;
@@ -18,37 +17,37 @@ namespace PARR.EsppOrderManager
private readonly IMqService mqService; private readonly IMqService mqService;
private readonly ILogger<EsppOrderManager> logger; private readonly ILogger<EsppOrderManager> logger;
private readonly ITransformService transformService; private readonly ITransformService transformService;
private readonly IOrderService orderService;
private readonly IEsppOrderService esppOrderService; private readonly IEsppOrderService esppOrderService;
private readonly IServiceProvider serviceProvider;
public EsppOrderManager( public EsppOrderManager(
MqSettings mqSettings, MqSettings mqSettings,
IMqService mqService, IMqService mqService,
ILogger<EsppOrderManager> logger, ILogger<EsppOrderManager> logger,
ITransformService transformService, ITransformService transformService,
IOrderService orderService, IEsppOrderService esppOrderService,
IEsppOrderService esppOrderService IServiceProvider serviceProvider
) )
{ {
this.mqSettings = mqSettings; this.mqSettings = mqSettings;
this.mqService = mqService; this.mqService = mqService;
this.logger = logger; this.logger = logger;
this.transformService = transformService; this.transformService = transformService;
this.orderService = orderService;
this.esppOrderService = esppOrderService; this.esppOrderService = esppOrderService;
this.serviceProvider = serviceProvider;
} }
public async void Start() public async void Start()
{ {
// логика работы описана в документации // логика работы описана в документации
//var isConnected = mqService.InitConsumer(mqSettings, ManageOrder); //var isConnected = mqService.InitConsumer(mqSettings, ManageOrderAsync);
//if (!isConnected) //if (!isConnected)
// throw new Exception("Ошибка при подключении к RabbitMq"); // throw new Exception("Ошибка при подключении к RabbitMq");
//test, and remove async in method name //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() 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}"); logger.LogDebug($"Получили сообщение: {msg}");
var obj = transformService.GetModelFromJson<OrderManageMq>(msg); var objFromQuery = transformService.GetModelFromJson<OrderManageMq>(msg);
if (obj == null) if (objFromQuery == null)
return; 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() var order = await orderService.Get()
.Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel) .Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel)
.Include(t => t.OrderStatus) .Include(t => t.OrderStatus)
.Include(t => t.NextStatus) .Include(t => t.NextStatus)
.Include(t => t.Template).ThenInclude(t => t!.ApplicationsInWork).ThenInclude(t => t!.Work).ThenInclude(t => t!.Tnk) .Include(t => t.Template).ThenInclude(t => t!.ApplicationsInWork).ThenInclude(t => t!.Work).ThenInclude(t => t!.Tnk)
.FirstOrDefaultAsync(t => t.Id == obj.OrderId); .FirstOrDefaultAsync(t => t.Id == objFromQuery.OrderId);
if (order == null) if (!IsValidOrder(ref order, ref objFromQuery))
{
logger.LogError($"Не найден наряд с OrderId: {obj.OrderId}");
return; return;
}
if (order.StatusCode == order.NextStatusCode) logger.LogDebug($"Найден наряд в БД: {order!.Number}");
{
logger.LogInformation($"У наряда {order.Id}, {order.Number} статусы равны, ничего не делаем. Статус: {order.OrderStatus!.Description}");
return;
}
if (!order.NextStatusCode.HasValue) var resultMsg = GenerateResultMsg(order!);
{ var workDuration = CalcWorkDuration(order!);
logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}");
return;
}
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) 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()) if (!await orderService.CommitAsync())
{ {
logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}"); logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}");
@@ -109,9 +110,31 @@ namespace PARR.EsppOrderManager
} }
else 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 Microsoft.Extensions.Logging;
using PARR.DAL.Models;
using PARR.EsppApi.Models.Query;
using PARR.EsppApi;
using PARR.Constants; using PARR.Constants;
using PARR.DAL.Models;
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
namespace PARR.EsppOrderManager.Services namespace PARR.EsppOrderManager.Services
{ {
@@ -37,7 +37,7 @@ namespace PARR.EsppOrderManager.Services
} }
// проверяем, совпадает ли NextStatus со статусом в ЕСПП // проверяем, совпадает ли NextStatus со статусом в ЕСПП
// Если совпадают, значит в еспп поменяли, и не изменили в БД раньше (может ошибка была, может руками кто сделал) // Если совпадают, значит в еспп поменяли и не изменили в БД раньше (может ошибка была, может руками кто сделал)
// так что говорим, как будто бы все ок // так что говорим, как будто бы все ок
if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum)) if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum))
{ {
@@ -47,34 +47,107 @@ namespace PARR.EsppOrderManager.Services
return true; 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) // если текущий статус != 2-В работе, сначала меняем статус на 2-В работе, а затем уже списываем трудозатраты и меняем на 4-Выполнен
//{ if (!statusIsWork)
// return false; 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 return false;
//{ }
// 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> /// <summary>
/// Совпадает ли NextStatus и Еспп статусом /// Совпадает ли NextStatus и Еспп статусом
/// </summary> /// </summary>

View File

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