109 lines
4.0 KiB
C#
109 lines
4.0 KiB
C#
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<EsppOrderManager> logger;
|
||
private readonly ITransformService transformService;
|
||
private readonly IOrderService orderService;
|
||
|
||
public EsppOrderManager(
|
||
MqSettings mqSettings,
|
||
IMqService mqService,
|
||
ILogger<EsppOrderManager> 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<OrderManageMq>(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:!!!
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента
|
||
/// </summary>
|
||
/// <param name="order"></param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
|
||
}
|
||
}
|