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 [.. элементыСправочника];
}
}
}