using Hcs.Broker.Api.Request.Exception; using Hcs.Broker.Internal; using Hcs.Service.Async.HouseManagement; namespace Hcs.Broker.Api.Request.HouseManagement { internal class ExportSupplyResourceContractObjectAddressDataRequest(Client 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; } } } }