feat(esppOrderManager): отладка
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user