116 lines
5.0 KiB
C#
116 lines
5.0 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// Операции экспорта данных справочников поставщика информации ГИС ЖКХ
|
||
/// </summary>
|
||
internal class HcsMethodExportNsi : HcsNsiMethod
|
||
{
|
||
public HcsMethodExportNsi(HcsClientConfig config) : base(config)
|
||
{
|
||
EnableMinimalResponseWaitDelay = true;
|
||
CanBeRestarted = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращает данные справочников поставщика информации
|
||
/// </summary>
|
||
/// <param name="regNum">Реестровый номер справочника</param>
|
||
/// <param name="token">Токен отмены</param>
|
||
/// <returns>Список справочников</returns>
|
||
public async Task<IEnumerable<ГисСправочник>> 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<Nsi.NsiItemType>()
|
||
.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)
|
||
{
|
||
var поляЭлементаСправочника = new List<ГисПолеЭлементаСправочника>();
|
||
foreach (var field in element.NsiElementField)
|
||
{
|
||
CallOnType<Nsi.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 [.. элементыСправочника];
|
||
}
|
||
}
|
||
}
|