diff --git a/Hcs.Broker.Mock/Api/MockNsiApi.cs b/Hcs.Broker.Mock/Api/MockNsiApi.cs index 3fe17d2..d6ab6bf 100644 --- a/Hcs.Broker.Mock/Api/MockNsiApi.cs +++ b/Hcs.Broker.Mock/Api/MockNsiApi.cs @@ -1,4 +1,5 @@ using Hcs.Broker.Api; +using Hcs.Broker.Api.Request; using Hcs.Service.Async.Nsi; namespace Hcs.Broker.Mock.Api @@ -21,5 +22,16 @@ namespace Hcs.Broker.Mock.Api return Guid.NewGuid().ToString(); } + + /// + public async Task> GetExportDataProviderNsiItemResultAsync(string messageGuid) + { + await Task.Delay(3000); + + return new RequestSingleResult() + { + Ready = false + }; + } } } diff --git a/Hcs.Broker/Api/INsiApi.cs b/Hcs.Broker/Api/INsiApi.cs index a4ab04f..44f04e6 100644 --- a/Hcs.Broker/Api/INsiApi.cs +++ b/Hcs.Broker/Api/INsiApi.cs @@ -1,4 +1,5 @@ -using Hcs.Service.Async.Nsi; +using Hcs.Broker.Api.Request; +using Hcs.Service.Async.Nsi; namespace Hcs.Broker.Api { @@ -20,5 +21,12 @@ namespace Hcs.Broker.Api /// Токен отмены /// Идентификатор сообщения операции экспорта Task RequestExportDataProviderNsiItemAsync(exportDataProviderNsiItemRequestRegistryNumber registryNumber, CancellationToken token = default); + + /// + /// Возвращает результат экспорта данных справочника поставщика информации + /// + /// Идентификатор сообщения операции экспорта + /// Результат запроса + Task> GetExportDataProviderNsiItemResultAsync(string messageGuid); } } diff --git a/Hcs.Broker/Api/NsiApi.cs b/Hcs.Broker/Api/NsiApi.cs index d9450d5..71a4efb 100644 --- a/Hcs.Broker/Api/NsiApi.cs +++ b/Hcs.Broker/Api/NsiApi.cs @@ -1,4 +1,5 @@ -using Hcs.Broker.Api.Request.Exception; +using Hcs.Broker.Api.Request; +using Hcs.Broker.Api.Request.Exception; using Hcs.Broker.Api.Request.Nsi; using Hcs.Service.Async.Nsi; @@ -27,5 +28,12 @@ namespace Hcs.Broker.Api var request = new ExportDataProviderNsiItemRequest(client); return await request.SendAsync(registryNumber, token); } + + /// + public async Task> GetExportDataProviderNsiItemResultAsync(string messageGuid) + { + var request = new ExportDataProviderNsiItemRequest(client); + return await request.GetResultAsync(messageGuid); + } } } diff --git a/Hcs.Broker/Api/Request/Nsi/ExportDataProviderNsiItemRequest.cs b/Hcs.Broker/Api/Request/Nsi/ExportDataProviderNsiItemRequest.cs index acc6181..74a9760 100644 --- a/Hcs.Broker/Api/Request/Nsi/ExportDataProviderNsiItemRequest.cs +++ b/Hcs.Broker/Api/Request/Nsi/ExportDataProviderNsiItemRequest.cs @@ -1,4 +1,5 @@ -using Hcs.Broker.Internal; +using Hcs.Broker.Api.Request.Adapter; +using Hcs.Broker.Internal; using Hcs.Service.Async.Nsi; namespace Hcs.Broker.Api.Request.Nsi @@ -40,5 +41,25 @@ namespace Hcs.Broker.Api.Request.Nsi return response.AckRequest.Ack; }, token); } + + internal async Task> GetResultAsync(string messageGuid) + { + var result = await ExecuteGetResultAsync(messageGuid); + if (result == null) + { + return RequestSingleResult.CreateNotReady(); + } + + var item = result.Items.FirstOrDefault(); + if (item is NsiItemType nsiItem) + { + return RequestSingleResult.CreateSuccessful(nsiItem); + } + else if (item is IErrorMessage errorMessage) + { + return RequestSingleResult.CreateFailed(errorMessage); + } + return RequestSingleResult.CreateFailed(null); + } } } diff --git a/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs b/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs index 37d314c..d5516da 100644 --- a/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs +++ b/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs @@ -9,16 +9,13 @@ namespace Hcs.WebApp.BackgroundServices.OperationExecutors { public IExecutor CreateExecutor(IServiceScope scope, IClient client, Operation operation) { - switch (operation.Type) + return operation.Type switch { - case Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1: - return new ExportDataProviderNsiItemExecutor_15_7_0_1(client, scope, operation); + Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => new ExportDataProviderNsiItemExecutor_15_7_0_1(client, scope, operation), + Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemExecutor_15_7_0_1(client, scope, operation), - case Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1: - return new ExportNsiItemExecutor_15_7_0_1(client, scope, operation); - } - - throw new NotImplementedException($"Не удалось создать выполнителя операции типа {operation.Type}"); + _ => throw new NotImplementedException($"Не удалось создать выполнителя операции типа {operation.Type}"), + }; } } } diff --git a/Hcs.WebApp/BackgroundServices/OperationExecutors/Nsi/ExportDataProviderNsiItemExecutor_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/OperationExecutors/Nsi/ExportDataProviderNsiItemExecutor_15_7_0_1.cs index 950fbd6..ad1b825 100644 --- a/Hcs.WebApp/BackgroundServices/OperationExecutors/Nsi/ExportDataProviderNsiItemExecutor_15_7_0_1.cs +++ b/Hcs.WebApp/BackgroundServices/OperationExecutors/Nsi/ExportDataProviderNsiItemExecutor_15_7_0_1.cs @@ -26,6 +26,7 @@ namespace Hcs.WebApp.BackgroundServices.OperationExecutors.Nsi 272 => exportDataProviderNsiItemRequestRegistryNumber.Item272, 302 => exportDataProviderNsiItemRequestRegistryNumber.Item302, 337 => exportDataProviderNsiItemRequestRegistryNumber.Item337, + _ => throw new ArgumentException($"Не удалось получить номер справочника из значения {number}"), }; } diff --git a/Hcs.WebApp/BackgroundServices/ResultGetters/Nsi/ExportDataProviderNsiItemGetter_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/ResultGetters/Nsi/ExportDataProviderNsiItemGetter_15_7_0_1.cs new file mode 100644 index 0000000..dff92cc --- /dev/null +++ b/Hcs.WebApp/BackgroundServices/ResultGetters/Nsi/ExportDataProviderNsiItemGetter_15_7_0_1.cs @@ -0,0 +1,68 @@ +using Hcs.Broker; +using Hcs.WebApp.Data.Hcs; +using Hcs.WebApp.Services; +using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; + +namespace Hcs.WebApp.BackgroundServices.ResultGetters.Nsi +{ + public class ExportDataProviderNsiItemGetter_15_7_0_1(IClient client, IServiceScope scope, Operation operation) : ResultGetterBase(client, scope, operation) + { + public override async Task GetAsync() + { + var result = await client.Nsi.GetExportDataProviderNsiItemResultAsync(operation.MessageGuid!); + if (!result.Ready) + { + return false; + } + + if (result.Success) + { + var headquartersService = scope.ServiceProvider.GetRequiredService(); + var registryService = scope.ServiceProvider.GetRequiredService(); + + using var context = headquartersService.GetNewContext(); + var executionStrategy = context.Database.CreateExecutionStrategy(); + await executionStrategy.ExecuteAsync(async () => + { + using var transaction = await context.Database.BeginTransactionAsync(); + try + { + var registry = await registryService.GetRegistryByOperationIdAsync(context, operation.Id, true); + registry.SyncedAt = DateTime.UtcNow; + registry.Elements?.Clear(); + await context.SaveChangesAsync(); + + registry.Elements ??= []; + + foreach (var element in result.Result!.NsiElement) + { + var registryElement = new RegistryElement() + { + Code = element.Code, + GUID = element.GUID, + Json = JsonConvert.SerializeObject(element) + }; + registry.Elements.Add(registryElement); + } + await context.SaveChangesAsync(); + + await headquartersService.SetOperationEndedAsync(context, operation.Id); + + await transaction.CommitAsync(); + } + catch + { + await transaction.RollbackAsync(); + + throw; + } + }); + + return true; + } + + throw Failure(result.ErrorMessage); + } + } +} diff --git a/Hcs.WebApp/BackgroundServices/ResultGetters/NsiCommon/ExportNsiItemGetter_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/ResultGetters/NsiCommon/ExportNsiItemGetter_15_7_0_1.cs index 0c665f4..e3f35e6 100644 --- a/Hcs.WebApp/BackgroundServices/ResultGetters/NsiCommon/ExportNsiItemGetter_15_7_0_1.cs +++ b/Hcs.WebApp/BackgroundServices/ResultGetters/NsiCommon/ExportNsiItemGetter_15_7_0_1.cs @@ -30,9 +30,11 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon { var registry = await registryService.GetRegistryByOperationIdAsync(context, operation.Id, true); registry.SyncedAt = DateTime.UtcNow; - registry.Elements.Clear(); + registry.Elements?.Clear(); await context.SaveChangesAsync(); + registry.Elements ??= []; + foreach (var element in result.Result!.NsiElement) { var registryElement = new RegistryElement() diff --git a/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs b/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs index c3b975d..5e1ba23 100644 --- a/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs +++ b/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs @@ -1,4 +1,5 @@ using Hcs.Broker; +using Hcs.WebApp.BackgroundServices.ResultGetters.Nsi; using Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon; using Hcs.WebApp.Data.Hcs; @@ -8,13 +9,13 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters { public IResultGetter CreateResultGetter(IServiceScope scope, IClient client, Operation operation) { - switch (operation.Type) + return operation.Type switch { - case Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1: - return new ExportNsiItemGetter_15_7_0_1(client, scope, operation); - } + Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => new ExportDataProviderNsiItemGetter_15_7_0_1(client, scope, operation), + Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemGetter_15_7_0_1(client, scope, operation), - throw new NotImplementedException($"Не удалось создать получателя результата операции типа {operation.Type}"); + _ => throw new NotImplementedException($"Не удалось создать получателя результата операции типа {operation.Type}"), + }; } }