using Hcs.ClientApi.DataTypes; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using HouseManagement = Hcs.Service.Async.HouseManagement.v14_5_0_1; namespace Hcs.ClientApi.HouseManagementApi { /// /// Метод добавления/изменения/удаления элементов списка адресных объектов /// в договоре ресурсоснабжения /// public class HcsMethodImportSupplyResourceContractObjectAddress : HcsHouseManagementMethod { public HcsMethodImportSupplyResourceContractObjectAddress (HcsClientConfig config) : base(config) { EnableMinimalResponseWaitDelay = true; CanBeRestarted = true; } public async Task ImportObjectAddresses( ГисДоговор договор, IEnumerable<ГисАдресныйОбъект> адресаДляРазмещения, IEnumerable<ГисАдресныйОбъект> адресаДляУдаления, CancellationToken token) { if (договор == null) throw new ArgumentNullException(nameof(договор)); var list = new List(); if (адресаДляРазмещения != null) list.AddRange(адресаДляРазмещения.Select(AdoptForLoading)); if (адресаДляУдаления != null) list.AddRange(адресаДляУдаления.Select(AdoptForRemoval)); var request = new HouseManagement.importSupplyResourceContractObjectAddressRequest() { Id = HcsConstants.SignedXmlElementId, Item = FormatGuid(договор.ГуидДоговора), ItemElementName = HouseManagement.ItemChoiceType28.ContractRootGUID, ObjectAddress = list.ToArray() // TODO: Проверить комментарий //version = "13.1.1.1" // Версия указана в API }; var stateResult = await SendAndWaitResultAsync(request, async (portClient) => { var ackResponse = await portClient.importSupplyResourceContractObjectAddressDataAsync( CreateRequestHeader(), request); return ackResponse.AckRequest.Ack; }, token); ParseImportResults(stateResult, list.Count(), true); } /// /// Готовит структуру адресного объекта для удаления в ГИС /// private HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddress AdoptForRemoval( ГисАдресныйОбъект адрес) { if (адрес == null) throw new ArgumentNullException(nameof(адрес)); Guid transportGuid = Guid.NewGuid(); bool deleteObject = true; return new HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddress() { TransportGUID = FormatGuid(transportGuid), ObjectGUID = FormatGuid(адрес.ГуидАдресногоОбъекта), Item = deleteObject }; } /// /// Готовит структуру адресного объекта для добавления/обновления в ГИС /// private HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddress AdoptForLoading( ГисАдресныйОбъект адрес) { if (адрес == null) throw new ArgumentNullException(nameof(адрес)); Guid transportGuid = Guid.NewGuid(); var serviceType = new HouseManagement.ContractSubjectObjectAdressTypeServiceType() { Code = HcsHouseManagementNsi.ElectricSupplyServiceType.Code, GUID = HcsHouseManagementNsi.ElectricSupplyServiceType.GUID, Name = HcsHouseManagementNsi.ElectricSupplyServiceType.Name }; var municipalResource = new HouseManagement.ContractSubjectObjectAdressTypeMunicipalResource() { Code = HcsHouseManagementNsi.ElectricSupplyMunicipalResource.Code, GUID = HcsHouseManagementNsi.ElectricSupplyMunicipalResource.GUID, Name = HcsHouseManagementNsi.ElectricSupplyMunicipalResource.Name }; var pair = new HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddressLoadObjectPair() { // TODO: Проверить комментарий TransportGUID = FormatGuid(Guid.NewGuid()), // Получал BadRequest пока не сделал здесь новый GUID ServiceType = serviceType, MunicipalResource = municipalResource, // TODO: Проверить комментарий StartSupplyDate = DateTime.Now // В договоре нет даты начала снабжения адреса, ставлю что-нибудь }; var loadObject = new HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddressLoadObject() { FIASHouseGuid = FormatGuid(адрес.ГуидЗданияФиас), ApartmentNumber = MakeEmptyNull(адрес.НомерПомещения), RoomNumber = MakeEmptyNull(адрес.НомерКомнаты), Pair = [pair] }; var address = new HouseManagement.importSupplyResourceContractObjectAddressRequestObjectAddress() { TransportGUID = FormatGuid(transportGuid), Item = loadObject }; if (адрес.ГуидАдресногоОбъекта != default) { address.ObjectGUID = FormatGuid(адрес.ГуидАдресногоОбъекта); } return address; } } }