using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; using PARR.EsppOrderManager.Settings; namespace PARR.EsppOrderManager { internal class EsppOrderManager : IEsppOrderManager { private readonly MqSettings mqSettings; private readonly IMqService mqService; private readonly ILogger logger; private readonly ITransformService transformService; private readonly IOrderService orderService; public EsppOrderManager( MqSettings mqSettings, IMqService mqService, ILogger logger, ITransformService transformService, IOrderService orderService ) { this.mqSettings = mqSettings; this.mqService = mqService; this.logger = logger; this.transformService = transformService; this.orderService = orderService; } public async void Start() { // логика работы описана в документации //var isConnected = mqService.InitConsumer(mqSettings, ManageOrder); //if (!isConnected) // throw new Exception("Ошибка при подключении к RabbitMq"); //test, and remove async in method name await ManageOrder("{\"OrderId\":\"77eeccfb-4ca0-443e-8cc7-f6aa9dc774b7\"}"); } public void Stop() { mqService.Dispose(); } private async Task ManageOrder(string msg) { logger.LogDebug($"Получили сообщение: {msg}"); var obj = transformService.GetModelFromJson(msg); if (obj == null) return; var order = await orderService.Get() .Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel) .Include(t => t.OrderStatus) .Include(t => t.NextStatus) .FirstOrDefaultAsync(t => t.Id == obj.OrderId); if (order == null) { logger.LogError($"Не найден наряд с OrderId: {obj.OrderId}"); return; } if (order.StatusCode == order.NextStatusCode) { logger.LogInformation($"У наряда {order.Id}, {order.Number} статусы равны, ничего не делаем. Статус: {order.OrderStatus!.Description}"); return; } var resultMsg = GenerateResultMsg(order); //todo:!!! } /// /// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента /// /// /// private string GenerateResultMsg(Order order) { var agentHistory = order.AgentHistories .OrderBy(t => t.DateCreated) .Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}"); string msgAgent = "Работы выполнены средствами автоматизации. \r\n" + "Журнал работы: \r\n" + $"{string.Join("\r\n", agentHistory)}"; string msgAgentEmpty = "Работы должны были выполниться средствами автоматизации. " + "Но от средств автоматизации не поступило сообщений. " + "Работы не выполнены."; return agentHistory.Any() ? msgAgent : msgAgentEmpty; } } }