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)
{
// TODO: Добавить конвертацию типов
//var поляЭлементаСправочника = new List<ГисПолеЭлементаСправочника>();
//foreach (var field in element.NsiElementField)
//{
//}
элементыСправочника.Add(new ГисЭлементСправочника()
{
Код = element.Code,
Гуид = ParseGuid(element.GUID),
Актуальный = element.IsActual,
// TODO: Добавить конвертацию типов
//Поля = [.. поляЭлементаСправочника]
Поля = element.NsiElementField,
Элементы = element.ChildElement.Length > 0 ? AdoptNsiElementTypes(element.ChildElement) : null
});
}
return [.. элементыСправочника];
}
}
}