Add export from nsi service

This commit is contained in:
2025-08-14 12:00:48 +09:00
parent de36ea2a13
commit c6c1b31575
8 changed files with 127 additions and 9 deletions

View File

@ -0,0 +1,6 @@
namespace Hcs.ClientApi.DataTypes
{
public class ГисПолеЭлементаСправочника
{
}
}

View File

@ -0,0 +1,17 @@
using Newtonsoft.Json;
using System;
namespace Hcs.ClientApi.DataTypes
{
public class ГисСправочник
{
public string РеестровыйНомер;
public DateTime ДатаФормирования;
public ГисЭлементСправочника[] Элементы;
public string ToJSON()
{
return JsonConvert.SerializeObject(this);
}
}
}

View File

@ -0,0 +1,15 @@
using System;
namespace Hcs.ClientApi.DataTypes
{
public class ГисЭлементСправочника
{
public string Код;
public Guid Гуид;
public bool Актуальный;
// TODO: Добавить конвертацию типов
//public ГисПолеЭлементаСправочника[] Поля;
public Hcs.Service.Async.Nsi.v15_7_0_1.NsiElementFieldType[] Поля;
public ГисЭлементСправочника[] Элементы;
}
}

View File

@ -1,4 +1,8 @@
using System.Threading; using Hcs.ClientApi.DataTypes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Nsi = Hcs.Service.Async.Nsi.v15_7_0_1; using Nsi = Hcs.Service.Async.Nsi.v15_7_0_1;
@ -19,12 +23,15 @@ namespace Hcs.ClientApi.NsiApi
/// <summary> /// <summary>
/// Возвращает данные справочников поставщика информации /// Возвращает данные справочников поставщика информации
/// </summary> /// </summary>
public async Task<object[]> GetNsiItem(int regNum, CancellationToken token) /// <param name="regNum">Реестровый номер справочника</param>
/// <param name="token">Токен отмены</param>
/// <returns>Список справочников</returns>
public async Task<IEnumerable<ГисСправочник>> GetNsiItem(int regNum, CancellationToken token)
{ {
var request = new Nsi.exportDataProviderNsiItemRequest var request = new Nsi.exportDataProviderNsiItemRequest
{ {
Id = HcsConstants.SignedXmlElementId, Id = HcsConstants.SignedXmlElementId,
RegistryNumber = (Nsi.exportDataProviderNsiItemRequestRegistryNumber)regNum, RegistryNumber = GetRegNumFromInt(regNum),
// http://open-gkh.ru/Nsi/exportDataProviderNsiItemRequest.html // http://open-gkh.ru/Nsi/exportDataProviderNsiItemRequest.html
version = "10.0.1.2" version = "10.0.1.2"
}; };
@ -35,7 +42,69 @@ namespace Hcs.ClientApi.NsiApi
return response.AckRequest.Ack; return response.AckRequest.Ack;
}, token); }, token);
return stateResult.Items; 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)
{
// 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 [.. элементыСправочника];
} }
} }
} }

View File

@ -1,4 +1,6 @@
using System.Threading; using Hcs.ClientApi.DataTypes;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Hcs.ClientApi.NsiApi namespace Hcs.ClientApi.NsiApi
@ -12,7 +14,13 @@ namespace Hcs.ClientApi.NsiApi
Config = config; Config = config;
} }
public async Task<object[]> GetNsiItem(int regNum, CancellationToken token = default) /// <summary>
/// Возвращает данные справочников поставщика информации
/// </summary>
/// <param name="regNum">Реестровый номер справочника</param>
/// <param name="token">Токен отмены</param>
/// <returns>Список справочников</returns>
public async Task<IEnumerable<ГисСправочник>> GetNsiItem(int regNum, CancellationToken token = default)
{ {
try try
{ {

View File

@ -73,8 +73,11 @@
<Compile Include="ClientApi\DataTypes\ГисЛицевойСчет.cs" /> <Compile Include="ClientApi\DataTypes\ГисЛицевойСчет.cs" />
<Compile Include="ClientApi\DataTypes\ГисОрганизация.cs" /> <Compile Include="ClientApi\DataTypes\ГисОрганизация.cs" />
<Compile Include="ClientApi\DataTypes\ГисПоказания.cs" /> <Compile Include="ClientApi\DataTypes\ГисПоказания.cs" />
<Compile Include="ClientApi\DataTypes\ГисПолеЭлементаСправочника.cs" />
<Compile Include="ClientApi\DataTypes\ГисПомещение.cs" /> <Compile Include="ClientApi\DataTypes\ГисПомещение.cs" />
<Compile Include="ClientApi\DataTypes\ГисПриборУчета.cs" /> <Compile Include="ClientApi\DataTypes\ГисПриборУчета.cs" />
<Compile Include="ClientApi\DataTypes\ГисСправочник.cs" />
<Compile Include="ClientApi\DataTypes\ГисЭлементСправочника.cs" />
<Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringApi.cs" /> <Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringApi.cs" />
<Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringMethod.cs" /> <Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringMethod.cs" />
<Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringUtil.cs" /> <Compile Include="ClientApi\DeviceMeteringApi\HcsDeviceMeteringUtil.cs" />

View File

@ -5,13 +5,13 @@ namespace Hcs.ClientDemo
{ {
public class NsiDemo public class NsiDemo
{ {
public static void DemoExportNsiItem(HcsClient client) public static void DemoExportNsiItem51(HcsClient client)
{ {
var result = client.Nsi.GetNsiItem(51).Result; var result = client.Nsi.GetNsiItem(51).Result;
Console.WriteLine($"Результат операции:\r\n"); Console.WriteLine($"Результат операции:\r\n");
foreach (var obj in result) foreach (var obj in result)
{ {
Console.WriteLine(obj?.ToString()); Console.WriteLine(obj.ToJSON());
} }
} }
} }

View File

@ -67,7 +67,7 @@ namespace Hcs.ClientDemo
if (false) FileStoreDemo.DemoGetFileLength(client); if (false) FileStoreDemo.DemoGetFileLength(client);
if (false) FileStoreDemo.DemoGostHash(client); if (false) FileStoreDemo.DemoGostHash(client);
if (true) NsiDemo.DemoExportNsiItem(client); if (true) NsiDemo.DemoExportNsiItem51(client);
} }
catch (Exception ex) catch (Exception ex)
{ {