From c6c1b31575a2dd7b11d4be49a42fdff6ce55cb30 Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Thu, 14 Aug 2025 12:00:48 +0900 Subject: [PATCH] Add export from nsi service --- .../DataTypes/ГисПолеЭлементаСправочника.cs | 6 ++ .../ClientApi/DataTypes/ГисСправочник.cs | 17 ++++ .../DataTypes/ГисЭлементСправочника.cs | 15 ++++ .../ClientApi/NsiApi/HcsMethodExportNsi.cs | 77 ++++++++++++++++++- Hcs.Client/ClientApi/NsiApi/HcsNsiApi.cs | 12 ++- Hcs.Client/Hcs.Client.csproj | 3 + Hcs.TestApp/ClientDemo/NsiDemo.cs | 4 +- Hcs.TestApp/ClientDemo/Program.cs | 2 +- 8 files changed, 127 insertions(+), 9 deletions(-) create mode 100644 Hcs.Client/ClientApi/DataTypes/ГисПолеЭлементаСправочника.cs create mode 100644 Hcs.Client/ClientApi/DataTypes/ГисСправочник.cs create mode 100644 Hcs.Client/ClientApi/DataTypes/ГисЭлементСправочника.cs diff --git a/Hcs.Client/ClientApi/DataTypes/ГисПолеЭлементаСправочника.cs b/Hcs.Client/ClientApi/DataTypes/ГисПолеЭлементаСправочника.cs new file mode 100644 index 0000000..9e8af23 --- /dev/null +++ b/Hcs.Client/ClientApi/DataTypes/ГисПолеЭлементаСправочника.cs @@ -0,0 +1,6 @@ +namespace Hcs.ClientApi.DataTypes +{ + public class ГисПолеЭлементаСправочника + { + } +} diff --git a/Hcs.Client/ClientApi/DataTypes/ГисСправочник.cs b/Hcs.Client/ClientApi/DataTypes/ГисСправочник.cs new file mode 100644 index 0000000..88274f5 --- /dev/null +++ b/Hcs.Client/ClientApi/DataTypes/ГисСправочник.cs @@ -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); + } + } +} diff --git a/Hcs.Client/ClientApi/DataTypes/ГисЭлементСправочника.cs b/Hcs.Client/ClientApi/DataTypes/ГисЭлементСправочника.cs new file mode 100644 index 0000000..54a8b6d --- /dev/null +++ b/Hcs.Client/ClientApi/DataTypes/ГисЭлементСправочника.cs @@ -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 ГисЭлементСправочника[] Элементы; + } +} diff --git a/Hcs.Client/ClientApi/NsiApi/HcsMethodExportNsi.cs b/Hcs.Client/ClientApi/NsiApi/HcsMethodExportNsi.cs index 5e26032..26ab5b7 100644 --- a/Hcs.Client/ClientApi/NsiApi/HcsMethodExportNsi.cs +++ b/Hcs.Client/ClientApi/NsiApi/HcsMethodExportNsi.cs @@ -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 Nsi = Hcs.Service.Async.Nsi.v15_7_0_1; @@ -19,12 +23,15 @@ namespace Hcs.ClientApi.NsiApi /// /// Возвращает данные справочников поставщика информации /// - public async Task GetNsiItem(int regNum, CancellationToken token) + /// Реестровый номер справочника + /// Токен отмены + /// Список справочников + public async Task> GetNsiItem(int regNum, CancellationToken token) { var request = new Nsi.exportDataProviderNsiItemRequest { Id = HcsConstants.SignedXmlElementId, - RegistryNumber = (Nsi.exportDataProviderNsiItemRequestRegistryNumber)regNum, + RegistryNumber = GetRegNumFromInt(regNum), // http://open-gkh.ru/Nsi/exportDataProviderNsiItemRequest.html version = "10.0.1.2" }; @@ -35,7 +42,69 @@ namespace Hcs.ClientApi.NsiApi return response.AckRequest.Ack; }, token); - return stateResult.Items; + 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 [.. элементыСправочника]; } } } diff --git a/Hcs.Client/ClientApi/NsiApi/HcsNsiApi.cs b/Hcs.Client/ClientApi/NsiApi/HcsNsiApi.cs index 91c5093..a9e9b4e 100644 --- a/Hcs.Client/ClientApi/NsiApi/HcsNsiApi.cs +++ b/Hcs.Client/ClientApi/NsiApi/HcsNsiApi.cs @@ -1,4 +1,6 @@ -using System.Threading; +using Hcs.ClientApi.DataTypes; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace Hcs.ClientApi.NsiApi @@ -12,7 +14,13 @@ namespace Hcs.ClientApi.NsiApi Config = config; } - public async Task GetNsiItem(int regNum, CancellationToken token = default) + /// + /// Возвращает данные справочников поставщика информации + /// + /// Реестровый номер справочника + /// Токен отмены + /// Список справочников + public async Task> GetNsiItem(int regNum, CancellationToken token = default) { try { diff --git a/Hcs.Client/Hcs.Client.csproj b/Hcs.Client/Hcs.Client.csproj index d32c608..30861ce 100644 --- a/Hcs.Client/Hcs.Client.csproj +++ b/Hcs.Client/Hcs.Client.csproj @@ -73,8 +73,11 @@ + + + diff --git a/Hcs.TestApp/ClientDemo/NsiDemo.cs b/Hcs.TestApp/ClientDemo/NsiDemo.cs index 8880403..64bd95f 100644 --- a/Hcs.TestApp/ClientDemo/NsiDemo.cs +++ b/Hcs.TestApp/ClientDemo/NsiDemo.cs @@ -5,13 +5,13 @@ namespace Hcs.ClientDemo { public class NsiDemo { - public static void DemoExportNsiItem(HcsClient client) + public static void DemoExportNsiItem51(HcsClient client) { var result = client.Nsi.GetNsiItem(51).Result; Console.WriteLine($"Результат операции:\r\n"); foreach (var obj in result) { - Console.WriteLine(obj?.ToString()); + Console.WriteLine(obj.ToJSON()); } } } diff --git a/Hcs.TestApp/ClientDemo/Program.cs b/Hcs.TestApp/ClientDemo/Program.cs index d05697d..51fea78 100644 --- a/Hcs.TestApp/ClientDemo/Program.cs +++ b/Hcs.TestApp/ClientDemo/Program.cs @@ -67,7 +67,7 @@ namespace Hcs.ClientDemo if (false) FileStoreDemo.DemoGetFileLength(client); if (false) FileStoreDemo.DemoGostHash(client); - if (true) NsiDemo.DemoExportNsiItem(client); + if (true) NsiDemo.DemoExportNsiItem51(client); } catch (Exception ex) {