diff --git a/Hcs.Client/Client/Api/HouseManagementApi.cs b/Hcs.Client/Client/Api/HouseManagementApi.cs index 72b4118..15e5e10 100644 --- a/Hcs.Client/Client/Api/HouseManagementApi.cs +++ b/Hcs.Client/Client/Api/HouseManagementApi.cs @@ -44,5 +44,17 @@ namespace Hcs.Client.Api var request = new ExportSupplyResourceContractDataRequest(client); return await request.ExecuteAsync(contractNumber, token); } + + /// + /// Возвращает объекты жилищного фонда из договора ресурсоснабжения по его идентификатору + /// + /// Идентификатор договора ресурсоснабжения в ГИС ЖКХ + /// Токен отмены + /// Объекты жилищного фонда + public async Task> ExportSupplyResourceContractObjectAddressDataAsync(Guid contractRootGuid, CancellationToken token = default) + { + var request = new ExportSupplyResourceContractObjectAddressDataRequest(client); + return await request.ExecuteAsync(contractRootGuid, token); + } } } diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs index e5825a7..53a9f4c 100644 --- a/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs +++ b/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractDataRequest.cs @@ -1,4 +1,5 @@ -using Hcs.Client.Internal; +using Hcs.Client.Api.Request.Exception; +using Hcs.Client.Internal; using Hcs.Service.Async.HouseManagement; using System; using System.Collections.Generic; @@ -107,17 +108,28 @@ namespace Hcs.Client.Api.Request.HouseManagement Items = [.. items] }; - var result = await SendAndWaitResultAsync(request, async asyncClient => + try { - var ackResponse = await asyncClient.exportSupplyResourceContractDataAsync( - CreateRequestHeader(), request); - return ackResponse.AckRequest.Ack; - }, token); + var result = await SendAndWaitResultAsync(request, async asyncClient => + { + var ackResponse = await asyncClient.exportSupplyResourceContractDataAsync( + CreateRequestHeader(), request); + return ackResponse.AckRequest.Ack; + }, token); - var contractResult = result.Items.OfType().First(); - onResultReceived?.Invoke(contractResult.Contract); + var contractResult = result.Items.OfType().First(); + onResultReceived?.Invoke(contractResult.Contract); - return new PaginationData(contractResult.Item); + return new PaginationData(contractResult.Item); + } + catch (NoResultsRemoteException) + { + return PaginationData.CreateLastPageData(); + } + catch (System.Exception e) + { + throw e; + } } } } diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractObjectAddressDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractObjectAddressDataRequest.cs new file mode 100644 index 0000000..97c743f --- /dev/null +++ b/Hcs.Client/Client/Api/Request/HouseManagement/ExportSupplyResourceContractObjectAddressDataRequest.cs @@ -0,0 +1,96 @@ +using Hcs.Client.Api.Request.Exception; +using Hcs.Client.Internal; +using Hcs.Service.Async.HouseManagement; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Hcs.Client.Api.Request.HouseManagement +{ + internal class ExportSupplyResourceContractObjectAddressDataRequest(ClientBase client) : HouseManagementRequestBase(client) + { + internal async Task> ExecuteAsync(Guid contractRootGuid, CancellationToken token) + { + var result = new List(); + + void OnResultReceived(exportSupplyResourceContractObjectAddressResultType[] addresses) + { + if (addresses?.Length > 0) + { + result.AddRange(addresses); + } + } + + var pageNum = 0; + Guid? exportObjectGuid = null; + while (true) + { + pageNum++; + + client.TryLog($"Querying page #{pageNum}..."); + + var data = await QueryBatchAsync(contractRootGuid, exportObjectGuid, OnResultReceived, token); + if (data.IsLastPage) + { + break; + } + + exportObjectGuid = data.NextGuid; + } + + return result; + } + + private async Task QueryBatchAsync( + Guid contractRootGuid, Guid? exportObjectGuid, + Action onResultReceived, + CancellationToken token) + { + var itemsElementName = new List(); + var items = new List(); + + itemsElementName.Add(ItemsChoiceType34.ContractRootGUID); + items.Add(contractRootGuid.ToString()); + + if (exportObjectGuid.HasValue) + { + itemsElementName.Add(ItemsChoiceType34.ExportObjectGUID); + items.Add(exportObjectGuid.ToString()); + } + + // http://open-gkh.ru/HouseManagement/exportSupplyResourceContractObjectAddressRequest.html + var request = new exportSupplyResourceContractObjectAddressRequest + { + Id = Constants.SIGNED_XML_ELEMENT_ID, + version = "13.1.1.1", + ItemsElementName = [.. itemsElementName], + Items = [.. items] + }; + + try + { + var result = await SendAndWaitResultAsync(request, async asyncClient => + { + var ackResponse = await asyncClient.exportSupplyResourceContractObjectAddressDataAsync( + CreateRequestHeader(), request); + return ackResponse.AckRequest.Ack; + }, token); + + var contractResult = result.Items.OfType().First(); + onResultReceived?.Invoke(contractResult.ObjectAddress); + + return new PaginationData(contractResult.Item); + } + catch (NoResultsRemoteException) + { + return PaginationData.CreateLastPageData(); + } + catch (System.Exception e) + { + throw e; + } + } + } +} diff --git a/Hcs.Client/Hcs.Client.csproj b/Hcs.Client/Hcs.Client.csproj index 2b16469..c758742 100644 --- a/Hcs.Client/Hcs.Client.csproj +++ b/Hcs.Client/Hcs.Client.csproj @@ -81,6 +81,7 @@ + diff --git a/Hcs.TestApp/TestApp/Program.cs b/Hcs.TestApp/TestApp/Program.cs index be9bf73..f6232d4 100644 --- a/Hcs.TestApp/TestApp/Program.cs +++ b/Hcs.TestApp/TestApp/Program.cs @@ -45,6 +45,8 @@ namespace Hcs.TestApp //houseManagementScenario.ExportSupplyResourceContractDataByGuid(); //houseManagementScenario.ExportSupplyResourceContractDataByNumber(); + //houseManagementScenario.ExportSupplyResourceContractObjectAddressData(); + //nsiScenario.ExportDataProviderNsiItem1(); //nsiScenario.ExportDataProviderNsiItem51(); //nsiScenario.ExportDataProviderNsiItem59(); diff --git a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs index 5b2a785..310ac9d 100644 --- a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs +++ b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs @@ -24,5 +24,11 @@ namespace Hcs.TestApp.Scenario var result = client.HouseManagement.ExportSupplyResourceContractDataAsync("239009043").Result; Console.WriteLine("Scenario execution " + (result != null ? "succeeded" : "failed")); } + + internal void ExportSupplyResourceContractObjectAddressData() + { + var result = client.HouseManagement.ExportSupplyResourceContractObjectAddressDataAsync(Guid.Parse("575a7ff9-5473-4ab4-b077-fa80c1f85f0b")).Result; + Console.WriteLine("Scenario execution " + (result != null ? "succeeded" : "failed")); + } } }