using Hcs.ClientApi.DataTypes; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using NsiCommon = Hcs.Service.Async.NsiCommon.v15_7_0_1; namespace Hcs.ClientApi.NsiCommonApi { /// /// Операции экспорта общих справочников подсистемы НСИ /// internal class HcsMethodExportNsiCommon : HcsNsiCommonMethod { public HcsMethodExportNsiCommon(HcsClientConfig config) : base(config) { EnableMinimalResponseWaitDelay = true; CanBeRestarted = true; } /// /// Возвращает общий справочник подсистемы НСИ /// /// Реестровый номер справочника /// Токен отмены /// Справочник public async Task<ГисСправочник> GetNsiItem(int regNum, CancellationToken token) { var request = new NsiCommon.exportNsiItemRequest { Id = HcsConstants.SignedXmlElementId, RegistryNumber = regNum.ToString(), // http://open-gkh.ru/NsiCommon/exportNsiItemRequest.html version = "10.0.1.2" }; var stateResult = await SendAndWaitResultAsync(request, async (portClient) => { var response = await portClient.exportNsiItemAsync(CreateRequestHeader(), request); return response.AckRequest.Ack; }, token); return AdoptNsiItemType(stateResult.Item as NsiCommon.NsiItemType); } private ГисСправочник AdoptNsiItemType(NsiCommon.NsiItemType input) { var справочник = new ГисСправочник() { реестровыйНомер = input.NsiItemRegistryNumber, датаФормирования = input.Created, элементы = AdoptNsiElementTypes(input.NsiElement) }; return справочник; } private ГисЭлементСправочника[] AdoptNsiElementTypes(NsiCommon.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 [.. элементыСправочника]; } } }