Add export from nsi-common service
This commit is contained in:
@ -0,0 +1,88 @@
|
||||
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 [.. элементыСправочника];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user