From 113a801060627b1ee3cf02c96975467ae6af97f3 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Mon, 20 Nov 2023 12:26:33 +1000 Subject: [PATCH] =?UTF-8?q?feat(esppOrderManager):=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=80=D1=8F=D0=B4=D0=B0.=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=20=D1=81=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=D0=B8,=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=20?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B5=D0=B3=D0=BE=20OrderStatusEnum.=20(EsppApi?= =?UTF-8?q?)=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20EsppOrder,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D1=8F=D0=B4=D0=B0,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API.sln | 22 +++-- .../OrderStatusEnum.cs | 5 +- PARR.Constants/PARR.Constants.csproj | 9 ++ PARR.DAL/Context/DataContext.cs | 1 + PARR.DAL/PARR.DAL.csproj | 4 + .../Implementations/OrderStatusService.cs | 2 +- .../Interfaces/IOrderStatusService.cs | 3 +- PARR.EsppApi/EsppApiService.cs | 22 +++-- PARR.EsppApi/IEsppApiService.cs | 6 +- PARR.EsppApi/Models/EsppOrder.cs | 32 ++++++- PARR.EsppApi/Models/EsppResponse.cs | 8 +- PARR.EsppOrderManager/EsppOrderManager.cs | 77 +++++++++++++--- .../PARR.EsppOrderManager.csproj | 4 - .../ParrEsppOrderManagerInstaller.cs | 2 + .../Services/EsppOrderService.cs | 88 +++++++++++++++++++ .../Services/IEsppOrderService.cs | 13 +++ PARR.Test/Worker.cs | 6 +- 17 files changed, 256 insertions(+), 48 deletions(-) rename {PARR.DAL/Contracts => PARR.Constants}/OrderStatusEnum.cs (83%) create mode 100644 PARR.Constants/PARR.Constants.csproj create mode 100644 PARR.EsppOrderManager/Services/EsppOrderService.cs create mode 100644 PARR.EsppOrderManager/Services/IEsppOrderService.cs diff --git a/PARR.API.sln b/PARR.API.sln index 3391cb0e..547d9e78 100644 --- a/PARR.API.sln +++ b/PARR.API.sln @@ -35,21 +35,23 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.GeneratorTemplates", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.GeneratorTemplatesWorker", "PARR.GeneratorTemplatesWorker\PARR.GeneratorTemplatesWorker.csproj", "{BE11D005-D3FE-4F29-93A2-7379E729C78D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderLoader", "PARR.EsppOrderLoader\PARR.EsppOrderLoader.csproj", "{F83395F9-CE33-40A5-BA1A-4A1233E9AA67}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderLoader", "PARR.EsppOrderLoader\PARR.EsppOrderLoader.csproj", "{F83395F9-CE33-40A5-BA1A-4A1233E9AA67}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderLoaderWorker", "PARR.EsppOrderLoaderWorker\PARR.EsppOrderLoaderWorker.csproj", "{868ED9E0-42AD-4540-90BE-31A57A21CD93}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderLoaderWorker", "PARR.EsppOrderLoaderWorker\PARR.EsppOrderLoaderWorker.csproj", "{868ED9E0-42AD-4540-90BE-31A57A21CD93}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Master", "PARR.Master\PARR.Master.csproj", "{EB730B71-83BB-4787-8096-07F1D45CB55B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Master", "PARR.Master\PARR.Master.csproj", "{EB730B71-83BB-4787-8096-07F1D45CB55B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.MasterWorker", "PARR.MasterWorker\PARR.MasterWorker.csproj", "{DC64DE01-2C7F-4557-9F97-DBFA21E74C1C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.MasterWorker", "PARR.MasterWorker\PARR.MasterWorker.csproj", "{DC64DE01-2C7F-4557-9F97-DBFA21E74C1C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderManager", "PARR.EsppOrderManager\PARR.EsppOrderManager.csproj", "{771E46EC-8EB5-4BBE-9631-C6EBF7A237C1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderManager", "PARR.EsppOrderManager\PARR.EsppOrderManager.csproj", "{771E46EC-8EB5-4BBE-9631-C6EBF7A237C1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderManagerWorker", "PARR.EsppOrderManagerWorker\PARR.EsppOrderManagerWorker.csproj", "{026C7940-9938-4294-B896-A6FFB0A33017}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderManagerWorker", "PARR.EsppOrderManagerWorker\PARR.EsppOrderManagerWorker.csproj", "{026C7940-9938-4294-B896-A6FFB0A33017}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppApi", "PARR.EsppApi\PARR.EsppApi.csproj", "{47A87CEC-9A16-4044-A7A3-E1430BE6C3AC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppApi", "PARR.EsppApi\PARR.EsppApi.csproj", "{47A87CEC-9A16-4044-A7A3-E1430BE6C3AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Test", "PARR.Test\PARR.Test.csproj", "{CFE2A198-67BF-4828-8E8D-31A01858FDA7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Test", "PARR.Test\PARR.Test.csproj", "{CFE2A198-67BF-4828-8E8D-31A01858FDA7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Constants", "PARR.Constants\PARR.Constants.csproj", "{46B09885-C9FB-449C-ACAA-24C671194C4D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -135,6 +137,10 @@ Global {CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.Build.0 = Release|Any CPU + {46B09885-C9FB-449C-ACAA-24C671194C4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46B09885-C9FB-449C-ACAA-24C671194C4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46B09885-C9FB-449C-ACAA-24C671194C4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46B09885-C9FB-449C-ACAA-24C671194C4D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PARR.DAL/Contracts/OrderStatusEnum.cs b/PARR.Constants/OrderStatusEnum.cs similarity index 83% rename from PARR.DAL/Contracts/OrderStatusEnum.cs rename to PARR.Constants/OrderStatusEnum.cs index 23da878c..79825b6b 100644 --- a/PARR.DAL/Contracts/OrderStatusEnum.cs +++ b/PARR.Constants/OrderStatusEnum.cs @@ -1,5 +1,8 @@ -namespace PARR.DAL.Contracts +namespace PARR.Constants { + /// + /// Статус Наряда в ЕСПП + /// public enum OrderStatusEnum { /// diff --git a/PARR.Constants/PARR.Constants.csproj b/PARR.Constants/PARR.Constants.csproj new file mode 100644 index 00000000..cfadb03d --- /dev/null +++ b/PARR.Constants/PARR.Constants.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index 5f9482a8..45c8eb21 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Models.AIHIT; diff --git a/PARR.DAL/PARR.DAL.csproj b/PARR.DAL/PARR.DAL.csproj index 5f116215..b4466c86 100644 --- a/PARR.DAL/PARR.DAL.csproj +++ b/PARR.DAL/PARR.DAL.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/PARR.DAL/Services/Implementations/OrderStatusService.cs b/PARR.DAL/Services/Implementations/OrderStatusService.cs index bbeda7f5..9368e415 100644 --- a/PARR.DAL/Services/Implementations/OrderStatusService.cs +++ b/PARR.DAL/Services/Implementations/OrderStatusService.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Logging; +using PARR.Constants; using PARR.DAL.Context; -using PARR.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; diff --git a/PARR.DAL/Services/Interfaces/IOrderStatusService.cs b/PARR.DAL/Services/Interfaces/IOrderStatusService.cs index d0631f51..4600f03b 100644 --- a/PARR.DAL/Services/Interfaces/IOrderStatusService.cs +++ b/PARR.DAL/Services/Interfaces/IOrderStatusService.cs @@ -1,4 +1,5 @@ -using PARR.DAL.Contracts; +using PARR.Constants; +using PARR.DAL.Contracts; using PARR.DAL.Models; namespace PARR.DAL.Services.Interfaces diff --git a/PARR.EsppApi/EsppApiService.cs b/PARR.EsppApi/EsppApiService.cs index 262abf82..8c0b52d4 100644 --- a/PARR.EsppApi/EsppApiService.cs +++ b/PARR.EsppApi/EsppApiService.cs @@ -18,21 +18,27 @@ namespace PARR.EsppApi this.esppHttpService = esppHttpService; } - public Task> SetStatusInWorkAsync(string recordId)//TODO упростить можно без RecordIdQuery + public Task> SetStatusInWorkAsync(string recordId, string resultMsg)//TODO упростить можно без RecordIdQuery { - return SetStatusAsync(recordId, "2-В работе"); + return SetStatusAsync(recordId, "2-В работе", resultMsg); } - public Task> SetStatusIsDone(string recordId)//TODO упростить можно без RecordIdQuery + public Task> SetStatusIsDoneAsync(string recordId, string resultMsg)//TODO упростить можно без RecordIdQuery { - - return SetStatusAsync(recordId, "4-Выполнен"); + return SetStatusAsync(recordId, "4-Выполнен", resultMsg); } - private async Task> SetStatusAsync(string recordId, string newStatusStr) + private async Task> SetStatusAsync(string recordId, string newStatusStr, string resultMsg) { //TODO assignee сразу назначаем принудительно, чтобы было понятно кто менял объект - var result = await esppHttpService.SendAsync($"{{\"recordid\":\"{recordId}\",\"status\":\"{newStatusStr}\", \"assignee\":\"{esppOrderSettings.AccountName}\"}}"); + var query = $"{{" + + $"\"recordid\":\"{recordId}\"," + + $"\"status\":\"{newStatusStr}\"," + + $"\"assignee\":\"{esppOrderSettings.AccountName}\"" + + $"\"resolution\":\"{resultMsg}\"," + + $"}}"; + + var result = await esppHttpService.SendAsync(query); if (result.Data != null && result.Data.ErrorCode != "0") return new EsppResultBase(null, false, new Exception(result.Data.Message)); @@ -79,7 +85,7 @@ namespace PARR.EsppApi } - public async Task> AddMTnk(AddMtnkQuery mtnk) + public async Task> AddMTnkAsync(AddMtnkQuery mtnk) { var result = await esppHttpService.SendAsync( $"{{\"recordid\":\"{mtnk.RecordId}\"," + diff --git a/PARR.EsppApi/IEsppApiService.cs b/PARR.EsppApi/IEsppApiService.cs index ceb5160f..4b851002 100644 --- a/PARR.EsppApi/IEsppApiService.cs +++ b/PARR.EsppApi/IEsppApiService.cs @@ -21,19 +21,19 @@ namespace PARR.EsppApi /// Взять наряд в работу /// /// - Task> SetStatusInWorkAsync(string recordId); + Task> SetStatusInWorkAsync(string recordId, string resultMsg); /// /// Установить статус наряда как выполнен /// /// - Task> SetStatusIsDone(string recordId); + Task> SetStatusIsDoneAsync(string recordId, string resultMsg); /// /// Списание трудозатрат по модульным ТНК /// /// - Task> AddMTnk(AddMtnkQuery mtnk); + Task> AddMTnkAsync(AddMtnkQuery mtnk); } } diff --git a/PARR.EsppApi/Models/EsppOrder.cs b/PARR.EsppApi/Models/EsppOrder.cs index aee98eca..c8a32434 100644 --- a/PARR.EsppApi/Models/EsppOrder.cs +++ b/PARR.EsppApi/Models/EsppOrder.cs @@ -1,4 +1,5 @@ -using PARR.EsppApi.Settings; +using PARR.Constants; +using PARR.EsppApi.Settings; using System.Globalization; using System.Text.Json.Serialization; @@ -15,6 +16,9 @@ namespace PARR.EsppApi.Models [JsonPropertyName("assignment")] public string? WorkGroup { get; set; } + /// + /// Статус наряда в формате строки + /// [JsonPropertyName("status")] public string Status { get; set; } = string.Empty; @@ -37,6 +41,32 @@ namespace PARR.EsppApi.Models return new DateTimeOffset(utc, new TimeSpan(0)); } } + + /// + /// Статус наряда в формате OrderStatusEnum + /// + public OrderStatusEnum StatusEnum + { + get + { + switch (Status.Trim()) + { + case "1-Направлен в группу": + return OrderStatusEnum.New; + case "2-В работе": + return OrderStatusEnum.InWork; + case "3-Приостановлен": + return OrderStatusEnum.Stop; + case "4-Выполнен": + return OrderStatusEnum.Complete; + case "5-Закрыт": + return OrderStatusEnum.Closed; + default: + //logger.LogWarning($"Не смог распознать статус наряда, вернул значение по умполчанию: {OrderStatusEnum.New.ToString()}, входящее значение: {statusName}"); + return OrderStatusEnum.New; + } + } + } } } diff --git a/PARR.EsppApi/Models/EsppResponse.cs b/PARR.EsppApi/Models/EsppResponse.cs index b99fb7ea..5aa52ce3 100644 --- a/PARR.EsppApi/Models/EsppResponse.cs +++ b/PARR.EsppApi/Models/EsppResponse.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PARR.EsppApi.Models +namespace PARR.EsppApi.Models { public class EsppResponse { diff --git a/PARR.EsppOrderManager/EsppOrderManager.cs b/PARR.EsppOrderManager/EsppOrderManager.cs index 3db37191..215305e8 100644 --- a/PARR.EsppOrderManager/EsppOrderManager.cs +++ b/PARR.EsppOrderManager/EsppOrderManager.cs @@ -6,6 +6,8 @@ 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; namespace PARR.EsppOrderManager @@ -17,7 +19,7 @@ namespace PARR.EsppOrderManager private readonly ILogger logger; private readonly ITransformService transformService; private readonly IOrderService orderService; - private readonly IEsppApiService esppApiService; + private readonly IEsppOrderService esppOrderService; public EsppOrderManager( MqSettings mqSettings, @@ -25,7 +27,7 @@ namespace PARR.EsppOrderManager ILogger logger, ITransformService transformService, IOrderService orderService, - IEsppApiService esppApiService + IEsppOrderService esppOrderService ) { this.mqSettings = mqSettings; @@ -33,7 +35,7 @@ namespace PARR.EsppOrderManager this.logger = logger; this.transformService = transformService; this.orderService = orderService; - this.esppApiService = esppApiService; + this.esppOrderService = esppOrderService; } public async void Start() @@ -67,6 +69,7 @@ namespace PARR.EsppOrderManager .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); if (order == null) @@ -81,15 +84,39 @@ namespace PARR.EsppOrderManager return; } + if (!order.NextStatusCode.HasValue) + { + logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}"); + return; + } + var resultMsg = GenerateResultMsg(order); var workDuration = CalcWorkDuration(order); - //todo:!!! менять статус наряда. Можн ли закрыть не беря в работу? + // Изменям статус наряда в ЕСПП + var result = await esppOrderService.ChangeOrderToEsppAsync(order, resultMsg, workDuration); + + if (result) + { + logger.LogInformation($"Статусы наряда {order.Number} в ЕСПП обновлены. Установлен статус: {order.NextStatus!.Description}"); + + //обновляем статусы в БД + order.StatusCode = order.NextStatusCode.Value; + if (!await orderService.CommitAsync()) + { + logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}"); + } + + } + else + logger.LogError($"Ошибка при обновлении статуса наряда {order.Number}. Статус не изменен."); + + logger.LogDebug($"Закончил работу с сообщением: {msg}"); } /// - /// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента + /// Генерирует текст поля Решение, в зависимости от статуса наряда и от истории Агента /// /// /// @@ -99,15 +126,17 @@ namespace PARR.EsppOrderManager .OrderBy(t => t.DateCreated) .Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}"); + var baseMsg = order.Template!.ApplicationsInWork!.Solution + "\r\n"; + var msgAgent = "Работы выполнены средствами автоматизации. \r\n" + "Журнал работы: \r\n" + $"{string.Join("\r\n", agentHistory)}"; - var msgAgentEmpty = "Работы должны были выполниться средствами автоматизации. " + - "Но от средств автоматизации не поступило сообщений. " + + var msgAgentEmpty = "Работы должны были выполняться средствами автоматизации. " + + "От средств автоматизации не поступило сообщений. " + "Работы не выполнены."; - return agentHistory.Any() ? msgAgent : msgAgentEmpty; + return baseMsg + (agentHistory.Any() ? msgAgent : msgAgentEmpty); } @@ -122,15 +151,41 @@ namespace PARR.EsppOrderManager .OrderBy(t => t.DateCreated); if (!agentHistory.Any()) - return TimeSpan.Zero; + return GetTnkDurationByScriptDuration(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; + { + var duration = dateEnd.Value - dateStart.Value; + logger.LogDebug($"Продолжительность работы скрипта: {duration}"); - return TimeSpan.Zero; + return GetTnkDurationByScriptDuration(duration); + } + + return GetTnkDurationByScriptDuration(TimeSpan.Zero); + } + + + /// + /// Получить время для списания ТНК по времени работы скрипта + /// + /// + /// + private TimeSpan GetTnkDurationByScriptDuration(TimeSpan scriptDuration) + { + // минимальное значение 1 минута + var minDuration = new TimeSpan(0, 1, 0); + + if (scriptDuration < minDuration) + { + logger.LogDebug($"Продолжительность меньше минимального, беру минимальное: {minDuration}. {scriptDuration}<{minDuration}"); + + return minDuration; + } + else + return scriptDuration; } } diff --git a/PARR.EsppOrderManager/PARR.EsppOrderManager.csproj b/PARR.EsppOrderManager/PARR.EsppOrderManager.csproj index 226873a9..74361878 100644 --- a/PARR.EsppOrderManager/PARR.EsppOrderManager.csproj +++ b/PARR.EsppOrderManager/PARR.EsppOrderManager.csproj @@ -12,8 +12,4 @@ - - - - diff --git a/PARR.EsppOrderManager/ParrEsppOrderManagerInstaller.cs b/PARR.EsppOrderManager/ParrEsppOrderManagerInstaller.cs index a483dea8..66b92e1d 100644 --- a/PARR.EsppOrderManager/ParrEsppOrderManagerInstaller.cs +++ b/PARR.EsppOrderManager/ParrEsppOrderManagerInstaller.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using PARR.BLL; using PARR.DAL; using PARR.EsppApi; +using PARR.EsppOrderManager.Services; using PARR.EsppOrderManager.Settings; namespace PARR.EsppOrderManager @@ -20,6 +21,7 @@ namespace PARR.EsppOrderManager services.AddSingleton(mqSettings); services.AddTransient(); + services.AddTransient(); } public static IConfigurationBuilder AddEsppOrderManagerConfigurations(this IConfigurationBuilder builder, IServiceCollection services) diff --git a/PARR.EsppOrderManager/Services/EsppOrderService.cs b/PARR.EsppOrderManager/Services/EsppOrderService.cs new file mode 100644 index 00000000..59743fbd --- /dev/null +++ b/PARR.EsppOrderManager/Services/EsppOrderService.cs @@ -0,0 +1,88 @@ +using Microsoft.Extensions.Logging; +using PARR.DAL.Models; +using PARR.EsppApi.Models.Query; +using PARR.EsppApi; +using PARR.Constants; + +namespace PARR.EsppOrderManager.Services +{ + internal class EsppOrderService : IEsppOrderService + { + private readonly ILogger logger; + private readonly IEsppApiService esppApiService; + + public EsppOrderService( + ILogger logger, + IEsppApiService esppApiService + ) + { + this.logger = logger; + this.esppApiService = esppApiService; + } + + + public async Task ChangeOrderToEsppAsync(Order order, string resultMsg, TimeSpan duration) + { + // Наряд нужно провести по всем статусам + // Найти наряд, посмотреть его текущий статус (вдруг статус в ЕСПП был изменен, а в бд нет) + // Сначала взять в работу + // Списать ТНК + // Выполнить + + var esppOrderResult = await esppApiService.FindOrderByRecordIdAsync(order.Number); + if (!esppOrderResult.IsSuccess || esppOrderResult.Data == null) + { + logger.LogError($"Не найден наряд в ЕСПП: {order.Number}"); + return false; + } + + // проверяем, совпадает ли NextStatus со статусом в ЕСПП + // Если совпадают, значит в еспп поменяли, и не изменили в БД раньше (может ошибка была, может руками кто сделал) + // так что говорим, как будто бы все ок + if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum)) + { + logger.LogInformation($"Для наряда {order.Number}, статус в ЕСПП совпадает с {nameof(order.NextStatusCode)} = {order.NextStatus!.Description}. " + + $"Статус в ЕСПП менять не нужно."); + + return true; + } + + //todo: + + //var resultInWork = await esppApiService.SetStatusInWorkAsync(order.Number, resultMsg); + + //if (!resultInWork.IsSuccess) + //{ + // return false; + //} + + + + //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; + } + + + /// + /// Совпадает ли NextStatus и Еспп статусом + /// + /// + private bool IsEquelEsppStatusAndNextStatus(int nextStatusCode, OrderStatusEnum esppStatus) + { + return nextStatusCode == (int)esppStatus; + } + + } +} diff --git a/PARR.EsppOrderManager/Services/IEsppOrderService.cs b/PARR.EsppOrderManager/Services/IEsppOrderService.cs new file mode 100644 index 00000000..490cb0fa --- /dev/null +++ b/PARR.EsppOrderManager/Services/IEsppOrderService.cs @@ -0,0 +1,13 @@ +using PARR.DAL.Models; + +namespace PARR.EsppOrderManager.Services +{ + internal interface IEsppOrderService + { + /// + /// Изменение статуса в ЕСПП + /// + /// + Task ChangeOrderToEsppAsync(Order order, string resultMsg, TimeSpan duration); + } +} diff --git a/PARR.Test/Worker.cs b/PARR.Test/Worker.cs index b4547b8e..e1232f20 100644 --- a/PARR.Test/Worker.cs +++ b/PARR.Test/Worker.cs @@ -32,7 +32,7 @@ namespace PARR.Test { //var orders = result.Data; - var inWorkResult = await esppApiService.SetStatusInWorkAsync(recordId); + var inWorkResult = await esppApiService.SetStatusInWorkAsync(recordId, "Решение..."); if (!inWorkResult.IsSuccess) { _logger.LogError(inWorkResult.Exception, $"Не удалось взять в работу наряда{recordId}"); @@ -41,7 +41,7 @@ namespace PARR.Test var tnk = new AddMtnkQuery { RecordId = recordId, JobOperation = "Не учтена в перечне ТНК", Time = "00:05" }; - var addMtnkResult = await esppApiService.AddMTnk(tnk); + var addMtnkResult = await esppApiService.AddMTnkAsync(tnk); if (!addMtnkResult.IsSuccess) { @@ -50,7 +50,7 @@ namespace PARR.Test } - var resFinish = await esppApiService.SetStatusIsDone(recordId); + var resFinish = await esppApiService.SetStatusIsDoneAsync(recordId, "Решение..."); if (!resFinish.IsSuccess) { _logger.LogError(resFinish.Exception, $"Не удалось обновить статус наряда {recordId}");