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}"),
+ };
}
}