using Hcs.ClientApi.DataTypes; using Hcs.ClientApi.RemoteCaller; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using HouseManagement = Hcs.Service.Async.HouseManagement.v15_7_0_1; namespace Hcs.ClientApi.HouseManagementApi { /// /// Метод получения списка адресных объектов по договору ресурсоснабжения /// public class HcsMethodExportSupplyResourceContractObjectAddress : HcsHouseManagementMethod { public HcsMethodExportSupplyResourceContractObjectAddress(HcsClientConfig config) : base(config) { EnableMinimalResponseWaitDelay = true; CanBeRestarted = true; } /// /// Запрос на экспорт объектов жилищного фонда из договора ресурсоснабжения /// public async Task QueryAddresses( ГисДоговор договор, Action<ГисАдресныйОбъект> resultHandler, CancellationToken token) { int numResults = 0; Action<ГисАдресныйОбъект> countingHandler = (result) => { numResults += 1; resultHandler(result); }; Guid? nextGuid = null; while (true) { var paged = await QueryOneBatch(договор, countingHandler, nextGuid, token); if (paged.IsLastPage) break; nextGuid = paged.NextGuid; numResults += 1; } return numResults; } private async Task QueryOneBatch( ГисДоговор договор, Action<ГисАдресныйОбъект> resultHandler, Guid? firstGuid, CancellationToken token) { var itemNames = new List { }; List items = new List { }; if (договор.ГуидВерсииДоговора != default) { itemNames.Add(HouseManagement.ItemsChoiceType34.ContractGUID); items.Add(FormatGuid(договор.ГуидВерсииДоговора)); } else { itemNames.Add(HouseManagement.ItemsChoiceType34.ContractRootGUID); items.Add(FormatGuid(договор.ГуидДоговора)); } // TODO: Проверить комментарий // Если указан guid следующей страницы данных, добавляем его в параметры // (на 20.12.2023 эта функция не работает, первый пакет содержит 1000 записей // и запрос второго пакета с ExportObjectGUID возвращает "Bad request") if (firstGuid != null) { itemNames.Add(HouseManagement.ItemsChoiceType34.ExportObjectGUID); items.Add(FormatGuid(firstGuid)); } var request = new HouseManagement.exportSupplyResourceContractObjectAddressRequest { Id = HcsConstants.SignedXmlElementId, Items = items.ToArray(), ItemsElementName = itemNames.ToArray(), // TODO: Проверить хардкод версии version = "13.1.1.1" // Номер версии из сообщения об ошибке сервера HCS }; try { var stateResult = await SendAndWaitResultAsync(request, async (portClient) => { var ackResponse = await portClient.exportSupplyResourceContractObjectAddressDataAsync( CreateRequestHeader(), request); return ackResponse.AckRequest.Ack; }, token); var result = RequireSingleItem (stateResult.Items); foreach (var x in result.ObjectAddress) { resultHandler(Adopt(x)); } return new HcsPagedResultState(result.Item); } catch (HcsNoResultsRemoteException) { return HcsPagedResultState.IsLastPageResultState; } } private ГисАдресныйОбъект Adopt( HouseManagement.exportSupplyResourceContractObjectAddressResultType source) { return new ГисАдресныйОбъект() { ТипЗдания = (source.HouseTypeSpecified ? source.HouseType.ToString() : null), ГуидЗданияФиас = ParseGuid(source.FIASHouseGuid), ГуидДоговора = ParseGuid(source.ContractRootGUID), ГуидВерсииДоговора = ParseGuid(source.ContractGUID), ГуидАдресногоОбъекта = ParseGuid(source.ObjectGUID), НомерПомещения = source.ApartmentNumber, НомерКомнаты = source.RoomNumber }; } } }