89 lines
3.7 KiB
C#
89 lines
3.7 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// Операции экспорта общих справочников подсистемы НСИ
|
||
/// </summary>
|
||
internal class HcsMethodExportNsiCommon : HcsNsiCommonMethod
|
||
{
|
||
public HcsMethodExportNsiCommon(HcsClientConfig config) : base(config)
|
||
{
|
||
EnableMinimalResponseWaitDelay = true;
|
||
CanBeRestarted = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращает общий справочник подсистемы НСИ
|
||
/// </summary>
|
||
/// <param name="regNum">Реестровый номер справочника</param>
|
||
/// <param name="token">Токен отмены</param>
|
||
/// <returns>Справочник</returns>
|
||
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<NsiCommon.NsiElementStringFieldType>(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 [.. элементыСправочника];
|
||
}
|
||
}
|
||
}
|