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();