using Hcs.ClientApi.DataTypes; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Nsi = Hcs.Service.Async.Nsi.v15_7_0_1; namespace Hcs.ClientApi.NsiApi { /// /// Операции экспорта данных справочников поставщика информации ГИС ЖКХ /// internal class HcsMethodExportNsi : HcsNsiMethod { public HcsMethodExportNsi(HcsClientConfig config) : base(config) { EnableMinimalResponseWaitDelay = true; CanBeRestarted = true; } /// /// Возвращает данные справочников поставщика информации /// /// Реестровый номер справочника /// Токен отмены /// Список справочников public async Task> GetNsiItem(int regNum, CancellationToken token) { var request = new Nsi.exportDataProviderNsiItemRequest { Id = HcsConstants.SignedXmlElementId, RegistryNumber = GetRegNumFromInt(regNum), // http://open-gkh.ru/Nsi/exportDataProviderNsiItemRequest.html version = "10.0.1.2" }; var stateResult = await SendAndWaitResultAsync(request, async (portClient) => { var response = await portClient.exportDataProviderNsiItemAsync(CreateRequestHeader(), request); return response.AckRequest.Ack; }, token); return stateResult.Items .OfType() .Select(x => AdoptNsiItemType(x)); } private Nsi.exportDataProviderNsiItemRequestRegistryNumber GetRegNumFromInt(int regNum) { switch (regNum) { case 1: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item1; case 51: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item51; case 59: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item59; case 219: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item219; case 272: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item272; case 302: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item302; case 337: return Nsi.exportDataProviderNsiItemRequestRegistryNumber.Item337; default: throw new NotImplementedException($"Cannot convert {regNum} to {typeof(Nsi.exportDataProviderNsiItemRequestRegistryNumber)}"); } } private ГисСправочник AdoptNsiItemType(Nsi.NsiItemType input) { var справочник = new ГисСправочник() { реестровыйНомер = input.NsiItemRegistryNumber, датаФормирования = input.Created, элементы = AdoptNsiElementTypes(input.NsiElement) }; return справочник; } private ГисЭлементСправочника[] AdoptNsiElementTypes(Nsi.NsiElementType[] input) { var элементыСправочника = new List<ГисЭлементСправочника>(); foreach (var element in input) { var поляЭлементаСправочника = new List<ГисПолеЭлементаСправочника>(); foreach (var field in element.NsiElementField) { CallOnType(field, x => { поляЭлементаСправочника.Add(new ГисПолеЭлементаСправочника() { наименование = x.Name, значение = x.Value }); }); } элементыСправочника.Add(new ГисЭлементСправочника() { код = element.Code, гуид = ParseGuid(element.GUID), актуальный = element.IsActual, поля = [.. поляЭлементаСправочника], элементы = element.ChildElement?.Length > 0 ? AdoptNsiElementTypes(element.ChildElement) : null }); } return [.. элементыСправочника]; } } }