using Microsoft.EntityFrameworkCore; 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.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; private readonly IEsppApiService esppApiService; public EsppOrderManager( MqSettings mqSettings, IMqService mqService, ILogger logger, ITransformService transformService, IOrderService orderService, IEsppApiService esppApiService ) { this.mqSettings = mqSettings; this.mqService = mqService; this.logger = logger; this.transformService = transformService; this.orderService = orderService; this.esppApiService = esppApiService; } 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); var workDuration = CalcWorkDuration(order); //todo:!!! менять статус наряда. Можн ли закрыть не беря в работу? } /// /// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента /// /// /// private string GenerateResultMsg(Order order) { var agentHistory = order.AgentHistories .OrderBy(t => t.DateCreated) .Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}"); var msgAgent = "Работы выполнены средствами автоматизации. \r\n" + "Журнал работы: \r\n" + $"{string.Join("\r\n", agentHistory)}"; var msgAgentEmpty = "Работы должны были выполниться средствами автоматизации. " + "Но от средств автоматизации не поступило сообщений. " + "Работы не выполнены."; return agentHistory.Any() ? msgAgent : msgAgentEmpty; } /// /// Рассчиать трудозатраты /// /// /// private TimeSpan CalcWorkDuration(Order order) { var agentHistory = order.AgentHistories .OrderBy(t => t.DateCreated); if (!agentHistory.Any()) return TimeSpan.Zero; var dateStart = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.Start)?.DateCreated; var dateEnd = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.End)?.DateCreated; if (dateStart.HasValue && dateEnd.HasValue) return dateEnd.Value - dateStart.Value; return TimeSpan.Zero; } } }