diff --git a/Hcs.Broker.Mock/Api/MockHouseManagementApi.cs b/Hcs.Broker.Mock/Api/MockHouseManagementApi.cs index e14d6b6..0ce9829 100644 --- a/Hcs.Broker.Mock/Api/MockHouseManagementApi.cs +++ b/Hcs.Broker.Mock/Api/MockHouseManagementApi.cs @@ -1,5 +1,6 @@ using Hcs.Broker.Api; using Hcs.Broker.Api.Payload.HouseManagement; +using Hcs.Broker.Api.Request; using Hcs.Service.Async.HouseManagement; namespace Hcs.Broker.Mock.Api @@ -31,6 +32,25 @@ namespace Hcs.Broker.Mock.Api return []; } + /// + public async Task RequestExportSupplyResourceContractDataAsync(string? exportGuid = null, CancellationToken token = default) + { + await Task.Delay(3000, token); + + return Guid.NewGuid().ToString(); + } + + /// + public async Task> GetExportSupplyResourceContractDataResultAsync(string messageGuid) + { + await Task.Delay(3000); + + return new RequestMultipleResult() + { + Ready = false + }; + } + /// public async Task ExportSupplyResourceContractDataAsync(Guid contractRootGuid, CancellationToken token = default) { diff --git a/Hcs.Broker/Api/HouseManagementApi.cs b/Hcs.Broker/Api/HouseManagementApi.cs index 8af1869..440bb0c 100644 --- a/Hcs.Broker/Api/HouseManagementApi.cs +++ b/Hcs.Broker/Api/HouseManagementApi.cs @@ -1,4 +1,5 @@ using Hcs.Broker.Api.Payload.HouseManagement; +using Hcs.Broker.Api.Request; using Hcs.Broker.Api.Request.HouseManagement; using Hcs.Service.Async.HouseManagement; @@ -28,6 +29,20 @@ namespace Hcs.Broker.Api return await request.ExecuteAsync(token); } + /// + public async Task RequestExportSupplyResourceContractDataAsync(string? exportGuid = null, CancellationToken token = default) + { + var request = new ExportSupplyResourceContractDataRequest(client); + return await request.SendAsync(exportGuid, token); + } + + /// + public async Task> GetExportSupplyResourceContractDataResultAsync(string messageGuid) + { + var request = new ExportSupplyResourceContractDataRequest(client); + return await request.GetResultAsync(messageGuid); + } + /// public async Task ExportSupplyResourceContractDataAsync(Guid contractRootGuid, CancellationToken token = default) { diff --git a/Hcs.Broker/Api/IHouseManagementApi.cs b/Hcs.Broker/Api/IHouseManagementApi.cs index 31652ce..6e7c88a 100644 --- a/Hcs.Broker/Api/IHouseManagementApi.cs +++ b/Hcs.Broker/Api/IHouseManagementApi.cs @@ -1,4 +1,5 @@ using Hcs.Broker.Api.Payload.HouseManagement; +using Hcs.Broker.Api.Request; using Hcs.Service.Async.HouseManagement; namespace Hcs.Broker.Api @@ -29,6 +30,21 @@ namespace Hcs.Broker.Api /// Договора ресурсоснабжения Task> ExportSupplyResourceContractDataAsync(CancellationToken token = default); + /// + /// Запрашивает экспорт договоров ресурсоснабжения + /// + /// Идентификатор экспорта, не заполняется при первичном экспорте + /// Токен отмены + /// Идентификатор сообщения операции экспорта + Task RequestExportSupplyResourceContractDataAsync(string? exportGuid = null, CancellationToken token = default); + + /// + /// Возвращает результат экспорта договоров ресурсоснабжения + /// + /// Идентификатор сообщения операции экспорта + /// Результат запроса + Task> GetExportSupplyResourceContractDataResultAsync(string messageGuid); + /// /// Возвращает договор ресурсоснабжения по его идентификатору в ГИС ЖКХ /// diff --git a/Hcs.Broker/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs b/Hcs.Broker/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs index 833c8e6..f6c8240 100644 --- a/Hcs.Broker/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs +++ b/Hcs.Broker/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs @@ -40,6 +40,59 @@ namespace Hcs.Broker.Api.Request.HouseManagement return result; } + internal async Task SendAsync(string? exportGuid = null, CancellationToken token = default) + { + var itemsElementName = new List(); + var items = new List(); + + if (!string.IsNullOrEmpty(exportGuid)) + { + itemsElementName.Add(ItemsChoiceType32.ExportContractRootGUID); + items.Add(exportGuid); + } + + // http://open-gkh.ru/HouseManagement/exportSupplyResourceContractRequest.html + var request = new exportSupplyResourceContractRequest + { + Id = Constants.SIGNED_XML_ELEMENT_ID, + version = "13.1.1.1", + ItemsElementName = [.. itemsElementName], + Items = [.. items] + }; + + return await SendAsync(request, async asyncClient => + { + var response = await asyncClient.exportSupplyResourceContractDataAsync(CreateRequestHeader(), request); + return response.AckRequest.Ack; + }, token); + } + + internal async Task> GetResultAsync(string messageGuid) + { + try + { + var result = await ExecuteGetResultAsync(messageGuid); + if (result == null) + { + return RequestMultipleResult.CreateNotReady(); + } + + var contractResult = result.Items.OfType().First(); + var paginationData = new PaginationData(contractResult.Item); + return RequestMultipleResult + .CreateSuccessful(contractResult.Contract) + .SetNextResultsGuid(paginationData.IsLastPage ? null : paginationData.NextGuid.ToString()); + } + catch (NoResultsRemoteException) + { + return RequestMultipleResult.CreateSuccessful([]); + } + catch + { + throw; + } + } + internal async Task ExecuteAsync(Guid contractRootGuid, CancellationToken token) { exportSupplyResourceContractResultType result = null; diff --git a/Hcs.Broker/Api/Request/RequestMultipleResult.cs b/Hcs.Broker/Api/Request/RequestMultipleResult.cs new file mode 100644 index 0000000..427515e --- /dev/null +++ b/Hcs.Broker/Api/Request/RequestMultipleResult.cs @@ -0,0 +1,52 @@ +using Hcs.Broker.Api.Request.Adapter; + +namespace Hcs.Broker.Api.Request +{ + public class RequestMultipleResult + { + public bool Ready { get; set; } + + public bool Success { get; set; } + + public IEnumerable? Results { get; set; } + + public string? NextResultsGuid { get; set; } + + public IErrorMessage? ErrorMessage { get; set; } + + public static RequestMultipleResult CreateNotReady() + { + return new RequestMultipleResult + { + Ready = false + }; + } + + public static RequestMultipleResult CreateSuccessful(IEnumerable? results) + { + return new RequestMultipleResult + { + Ready = true, + Success = true, + Results = results + }; + } + + public static RequestMultipleResult CreateFailed(IErrorMessage? errorMessage) + { + return new RequestMultipleResult + { + Ready = true, + Success = false, + ErrorMessage = errorMessage + }; + } + + public RequestMultipleResult SetNextResultsGuid(string? nextResultsGuid) + { + NextResultsGuid = nextResultsGuid; + + return this; + } + } +} diff --git a/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs b/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs index 736ca2c..76f3f4a 100644 --- a/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs +++ b/Hcs.WebApp/BackgroundServices/OperationExecutors/ExecutorFactory.cs @@ -1,4 +1,5 @@ using Hcs.Broker; +using Hcs.WebApp.BackgroundServices.OperationExecutors.HouseManagement; using Hcs.WebApp.BackgroundServices.OperationExecutors.Nsi; using Hcs.WebApp.BackgroundServices.OperationExecutors.NsiCommon; using Hcs.WebApp.Data.Hcs; @@ -13,6 +14,7 @@ namespace Hcs.WebApp.BackgroundServices.OperationExecutors { 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), + Operation.OperationType.HouseManagement_ExportSupplyResourceContractData_15_7_0_1 => new ExportSupplyResourceContractDataExecutor_15_7_0_1(client, scope, operation), Operation.OperationType.ParseHousesData_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для обращения к ГИС ЖКХ") }; diff --git a/Hcs.WebApp/BackgroundServices/OperationExecutors/HouseManagement/ExportSupplyResourceContractDataExecutor_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/OperationExecutors/HouseManagement/ExportSupplyResourceContractDataExecutor_15_7_0_1.cs new file mode 100644 index 0000000..6f68421 --- /dev/null +++ b/Hcs.WebApp/BackgroundServices/OperationExecutors/HouseManagement/ExportSupplyResourceContractDataExecutor_15_7_0_1.cs @@ -0,0 +1,13 @@ +using Hcs.Broker; +using Hcs.WebApp.Data.Hcs; + +namespace Hcs.WebApp.BackgroundServices.OperationExecutors.HouseManagement +{ + public class ExportSupplyResourceContractDataExecutor_15_7_0_1(IClient client, IServiceScope scope, Operation operation) : ExecutorBase(client, scope, operation) + { + public override async Task ExecuteAsync(CancellationToken cancellationToken) + { + return await client.HouseManagement.RequestExportSupplyResourceContractDataAsync(operation.ExportGuid, cancellationToken); + } + } +} diff --git a/Hcs.WebApp/Data/Hcs/Operation.cs b/Hcs.WebApp/Data/Hcs/Operation.cs index 80794e1..108fd04 100644 --- a/Hcs.WebApp/Data/Hcs/Operation.cs +++ b/Hcs.WebApp/Data/Hcs/Operation.cs @@ -14,7 +14,10 @@ namespace Hcs.WebApp.Data.Hcs Nsi_ExportNsiItem_15_7_0_1, [Display(Description = "Парсинг данных домов")] - ParseHousesData_15_7_0_1 + ParseHousesData_15_7_0_1, + + [Display(Description = "Экспорт договоров ресурсоснабжения")] + HouseManagement_ExportSupplyResourceContractData_15_7_0_1, } public enum OperationKind @@ -39,6 +42,8 @@ namespace Hcs.WebApp.Data.Hcs public string? MessageGuid { get; set; } + public string? ExportGuid { get; set; } + public string? FailureReason { get; set; } public virtual ICollection Registries { get; set; } = []; @@ -47,6 +52,8 @@ namespace Hcs.WebApp.Data.Hcs public virtual ICollection FilesToParse { get; set; } = []; + public virtual ICollection SupplyContracts { get; set; } = []; + [NotMapped] public bool Completed => EndedAt.HasValue; @@ -54,7 +61,8 @@ namespace Hcs.WebApp.Data.Hcs public OperationKind Kind => Type switch { OperationType.NsiCommon_ExportNsiItem_15_7_0_1 or - OperationType.Nsi_ExportNsiItem_15_7_0_1 => OperationKind.Remote, + OperationType.Nsi_ExportNsiItem_15_7_0_1 or + OperationType.HouseManagement_ExportSupplyResourceContractData_15_7_0_1 => OperationKind.Remote, OperationType.ParseHousesData_15_7_0_1 => OperationKind.Parse };