Files
hcs/Hcs.Client/ClientApi/NsiApi/HcsMethodExportNsi.cs
2025-08-14 12:23:40 +09:00

116 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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