diff --git a/PARR.EsppApi/EsppApiService.cs b/PARR.EsppApi/EsppApiService.cs
index 8c0b52d4..a332bcd1 100644
--- a/PARR.EsppApi/EsppApiService.cs
+++ b/PARR.EsppApi/EsppApiService.cs
@@ -34,8 +34,8 @@ namespace PARR.EsppApi
var query = $"{{" +
$"\"recordid\":\"{recordId}\"," +
$"\"status\":\"{newStatusStr}\"," +
- $"\"assignee\":\"{esppOrderSettings.AccountName}\"" +
- $"\"resolution\":\"{resultMsg}\"," +
+ $"\"assignee\":\"{esppOrderSettings.AccountName}\"," +
+ $"\"resolution\":\"{resultMsg}\"" +
$"}}";
var result = await esppHttpService.SendAsync(query);
diff --git a/PARR.EsppApi/PARR.EsppApi.csproj b/PARR.EsppApi/PARR.EsppApi.csproj
index 7c0a9f66..c4c78f10 100644
--- a/PARR.EsppApi/PARR.EsppApi.csproj
+++ b/PARR.EsppApi/PARR.EsppApi.csproj
@@ -14,4 +14,8 @@
+
+
+
+
diff --git a/PARR.EsppApi/Services/EsppHttpService.cs b/PARR.EsppApi/Services/EsppHttpService.cs
index 546846c0..64404a0c 100644
--- a/PARR.EsppApi/Services/EsppHttpService.cs
+++ b/PARR.EsppApi/Services/EsppHttpService.cs
@@ -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(null, false, new Exception($"Espp error: {responseString}"));
+ }
+
logger.LogDebug($"Получил данные, строка: {responseString}");
var obj = JsonSerializer.Deserialize(responseString);
diff --git a/PARR.EsppOrderManager/EsppOrderManager.cs b/PARR.EsppOrderManager/EsppOrderManager.cs
index 215305e8..0d9f508f 100644
--- a/PARR.EsppOrderManager/EsppOrderManager.cs
+++ b/PARR.EsppOrderManager/EsppOrderManager.cs
@@ -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 logger;
private readonly ITransformService transformService;
- private readonly IOrderService orderService;
private readonly IEsppOrderService esppOrderService;
+ private readonly IServiceProvider serviceProvider;
public EsppOrderManager(
MqSettings mqSettings,
IMqService mqService,
ILogger 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(msg);
- if (obj == null)
+ var objFromQuery = transformService.GetModelFromJson(msg);
+ if (objFromQuery == null)
return;
+ using (var scope = serviceProvider.CreateScope())
+ {
+ var orderService = scope.ServiceProvider.GetService();
+ if (orderService == null)
+ throw new Exception("Не смог получить серивс IOrderService, scope.ServiceProvider.GetService()");
+
+ 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;
}
diff --git a/PARR.EsppOrderManager/Services/EsppOrderService.cs b/PARR.EsppOrderManager/Services/EsppOrderService.cs
index 59743fbd..caee6076 100644
--- a/PARR.EsppOrderManager/Services/EsppOrderService.cs
+++ b/PARR.EsppOrderManager/Services/EsppOrderService.cs
@@ -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;
}
+ ///
+ /// Установка статуса 4-Выполнен
+ ///
+ ///
+ ///
+ ///
+ ///
+ private async Task 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;
+ }
+ }
+
+
+ ///
+ /// Установка статуса 2-В работе
+ ///
+ ///
+ ///
+ ///
+ private async Task 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;
+ }
+ }
+
+
///
/// Совпадает ли NextStatus и Еспп статусом
///
diff --git a/PARR.EsppOrderManagerWorker/Program.cs b/PARR.EsppOrderManagerWorker/Program.cs
index e7f99edb..cd42bd06 100644
--- a/PARR.EsppOrderManagerWorker/Program.cs
+++ b/PARR.EsppOrderManagerWorker/Program.cs
@@ -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();