Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
This commit is contained in:
@ -0,0 +1,133 @@
|
||||
using Hcs.ClientApi.DataTypes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using OrgRegistryCommon = Hcs.Service.Async.OrgRegistryCommon.v14_5_0_1;
|
||||
|
||||
namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Операции экспорта данных из реестра организаций ГИС ЖКХ
|
||||
/// </summary>
|
||||
public class HcsMethodExportOrgRegistry : HcsOrgRegistryCommonMethod
|
||||
{
|
||||
public HcsMethodExportOrgRegistry(HcsClientConfig config) : base(config)
|
||||
{
|
||||
EnableMinimalResponseWaitDelay = true;
|
||||
CanBeRestarted = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает карточки организации в ГИС ЖКХ по номеру ОГРН организации.
|
||||
/// При отсутствии результатов будет выброшено HcsNoResultsRemoteException.
|
||||
/// </summary>
|
||||
public async Task<IEnumerable<ГисОрганизация>> GetOrgByOgrn(
|
||||
string ogrn, string kpp, CancellationToken token)
|
||||
{
|
||||
if (string.IsNullOrEmpty(ogrn)) throw new ArgumentException("Не указан ОГРН для поиска организации");
|
||||
if (ogrn.Length != ГисОрганизация.ДлинаОГРН && ogrn.Length != ГисОрганизация.ДлинаОГРНИП)
|
||||
{
|
||||
throw new ArgumentException(
|
||||
$"В строке ОГРН допускается или {ГисОрганизация.ДлинаОГРН} или {ГисОрганизация.ДлинаОГРНИП} символов: {ogrn}");
|
||||
}
|
||||
|
||||
var criteria = new OrgRegistryCommon.exportOrgRegistryRequestSearchCriteria();
|
||||
if (!string.IsNullOrEmpty(kpp))
|
||||
{
|
||||
criteria.ItemsElementName = [OrgRegistryCommon.ItemsChoiceType3.OGRN, OrgRegistryCommon.ItemsChoiceType3.KPP];
|
||||
criteria.Items = [ogrn, kpp];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ogrn.Length == ГисОрганизация.ДлинаОГРНИП)
|
||||
criteria.ItemsElementName = [OrgRegistryCommon.ItemsChoiceType3.OGRNIP];
|
||||
else criteria.ItemsElementName = [OrgRegistryCommon.ItemsChoiceType3.OGRN];
|
||||
criteria.Items = [ogrn];
|
||||
}
|
||||
|
||||
var request = new OrgRegistryCommon.exportOrgRegistryRequest
|
||||
{
|
||||
Id = HcsConstants.SignedXmlElementId,
|
||||
SearchCriteria = [criteria]
|
||||
};
|
||||
|
||||
var stateResult = await SendAndWaitResultAsync(request, async (portClient) =>
|
||||
{
|
||||
var response = await portClient.exportOrgRegistryAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
// В возвращаемой структуре мало ценной информации, только ГУИД организации в ГИС ЖКХ
|
||||
// (необходимый для размещения договоров) и ГУИД поставщика информации OrgPPAGUID.
|
||||
// Для организаций с филиалами может вернуться список из нескольких ГУИД.
|
||||
return stateResult.Items
|
||||
.OfType<OrgRegistryCommon.exportOrgRegistryResultType>()
|
||||
.Select(x => Adopt(x));
|
||||
}
|
||||
|
||||
private ГисОрганизация Adopt(OrgRegistryCommon.exportOrgRegistryResultType orgResult)
|
||||
{
|
||||
if (orgResult.OrgVersion == null)
|
||||
throw new HcsException("В структуре exportOrgRegistryResultType не указано поле OrgVersion");
|
||||
|
||||
var организация = new ГисОрганизация()
|
||||
{
|
||||
ГуидОрганизации = ParseGuid(orgResult.orgRootEntityGUID),
|
||||
ГуидВерсииОрганизации = ParseGuid(orgResult.OrgVersion.orgVersionGUID),
|
||||
Действующая = orgResult.OrgVersion.IsActual
|
||||
};
|
||||
|
||||
switch (orgResult.OrgVersion.Item)
|
||||
{
|
||||
case OrgRegistryCommon.LegalType legal:
|
||||
организация.ТипОрганизации = ГисТипОрганизации.ЮЛ;
|
||||
организация.ИНН = legal.INN;
|
||||
организация.КПП = legal.KPP;
|
||||
организация.ОГРН = legal.OGRN;
|
||||
организация.ОКОПФ = legal.OKOPF;
|
||||
организация.КраткоеИмяОрганизации = legal.ShortName;
|
||||
организация.ПолноеИмяОрганизации = legal.FullName;
|
||||
организация.ЮридическийАдрес = legal.Address;
|
||||
if (legal.ActivityEndDateSpecified)
|
||||
организация.ДатаЛиквидации = legal.ActivityEndDate;
|
||||
break;
|
||||
|
||||
case OrgRegistryCommon.EntpsType entps:
|
||||
организация.ТипОрганизации = ГисТипОрганизации.ИП;
|
||||
организация.ИНН = entps.INN;
|
||||
организация.ОГРН = entps.OGRNIP;
|
||||
организация.Фамилия = entps.Surname;
|
||||
организация.Имя = entps.FirstName;
|
||||
организация.Отчество = entps.Patronymic;
|
||||
break;
|
||||
|
||||
case OrgRegistryCommon.SubsidiaryType sub:
|
||||
организация.ТипОрганизации = ГисТипОрганизации.Филиал;
|
||||
организация.ИНН = sub.INN;
|
||||
организация.КПП = sub.KPP;
|
||||
организация.ОГРН = sub.OGRN;
|
||||
организация.ОКОПФ = sub.OKOPF;
|
||||
организация.КраткоеИмяОрганизации = sub.ShortName;
|
||||
организация.ПолноеИмяОрганизации = sub.FullName;
|
||||
организация.ЮридическийАдрес = sub.Address;
|
||||
if (sub.ActivityEndDateSpecified)
|
||||
организация.ДатаЛиквидации = sub.ActivityEndDate;
|
||||
break;
|
||||
|
||||
case OrgRegistryCommon.ForeignBranchType foreign:
|
||||
организация.ТипОрганизации = ГисТипОрганизации.Иностранный;
|
||||
организация.ИНН = foreign.INN;
|
||||
организация.КПП = foreign.KPP;
|
||||
организация.КраткоеИмяОрганизации = foreign.ShortName;
|
||||
организация.ПолноеИмяОрганизации = foreign.FullName;
|
||||
организация.ЮридическийАдрес = foreign.Address;
|
||||
break;
|
||||
}
|
||||
|
||||
return организация;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
using Hcs.ClientApi.DataTypes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
{
|
||||
public class HcsOrgRegistryCommonApi
|
||||
{
|
||||
public HcsClientConfig Config { get; private set; }
|
||||
|
||||
public HcsOrgRegistryCommonApi(HcsClientConfig config)
|
||||
{
|
||||
this.Config = config;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает ГУИДы действующих организаций в ГИС ЖКХ по номеру ОГРН (КПП может быть не указан).
|
||||
/// Если организации не найдены, возвращается пустой список.
|
||||
/// </summary>
|
||||
public async Task<IEnumerable<Guid>> GetOrgRootEntityGuidByOgrn(
|
||||
string ogrn, string kpp, CancellationToken token = default)
|
||||
{
|
||||
var orgs = await GetOrgByOgrn(ogrn, kpp, token);
|
||||
return orgs.Where(x => x.Действующая).Select(x => x.ГуидОрганизации);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает карточки организации в ГИС ЖКХ по номеру ОГРН (КПП может быть не указан).
|
||||
/// Если организации не найдены, возвращается пустой список.
|
||||
/// </summary>
|
||||
public async Task<IEnumerable<ГисОрганизация>> GetOrgByOgrn(
|
||||
string ogrn, string kpp, CancellationToken token = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
var method = new HcsMethodExportOrgRegistry(Config);
|
||||
return await method.GetOrgByOgrn(ogrn, kpp, token);
|
||||
}
|
||||
catch (HcsNoResultsRemoteException)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,112 @@
|
||||
using Hcs.ClientApi.RemoteCaller;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using OrgRegistryCommon = Hcs.Service.Async.OrgRegistryCommon.v14_5_0_1;
|
||||
|
||||
namespace Hcs.Service.Async.OrgRegistryCommon.v14_5_0_1
|
||||
{
|
||||
public partial class AckRequestAck : IHcsAck { }
|
||||
public partial class getStateResult : IHcsGetStateResult { }
|
||||
public partial class Fault : IHcsFault { }
|
||||
public partial class HeaderType : IHcsHeaderType { }
|
||||
}
|
||||
|
||||
namespace Hcs.ClientApi.OrgRegistryCommonApi
|
||||
{
|
||||
public class HcsOrgRegistryCommonMethod : HcsRemoteCallMethod
|
||||
{
|
||||
public HcsEndPoints EndPoint => HcsEndPoints.OrgRegistryCommonAsync;
|
||||
|
||||
public OrgRegistryCommon.ISRequestHeader CreateRequestHeader() =>
|
||||
HcsRequestHelper.CreateHeader<OrgRegistryCommon.ISRequestHeader>(ClientConfig);
|
||||
|
||||
public HcsOrgRegistryCommonMethod(HcsClientConfig config) : base(config) { }
|
||||
|
||||
public System.ServiceModel.EndpointAddress RemoteAddress
|
||||
=> GetEndpointAddress(HcsConstants.EndPointLocator.GetPath(EndPoint));
|
||||
|
||||
private OrgRegistryCommon.RegOrgPortsTypeAsyncClient NewPortClient()
|
||||
{
|
||||
var client = new OrgRegistryCommon.RegOrgPortsTypeAsyncClient(_binding, RemoteAddress);
|
||||
ConfigureEndpointCredentials(client.Endpoint, client.ClientCredentials);
|
||||
return client;
|
||||
}
|
||||
|
||||
public async Task<IHcsGetStateResult> SendAndWaitResultAsync(
|
||||
object request,
|
||||
Func<OrgRegistryCommon.RegOrgPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
{
|
||||
token.ThrowIfCancellationRequested();
|
||||
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await SendAndWaitResultAsyncImpl(request, sender, token);
|
||||
}
|
||||
catch (HcsRestartTimeoutException e)
|
||||
{
|
||||
if (!CanBeRestarted) throw new HcsException("Превышен лимит ожидания выполнения запроса", e);
|
||||
Log($"Перезапускаем запрос типа {request.GetType().Name}...");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IHcsGetStateResult> SendAndWaitResultAsyncImpl(
|
||||
object request,
|
||||
Func<OrgRegistryCommon.RegOrgPortsTypeAsyncClient, Task<IHcsAck>> sender,
|
||||
CancellationToken token)
|
||||
{
|
||||
if (request == null) throw new ArgumentNullException("Null request");
|
||||
string version = HcsRequestHelper.GetRequestVersionString(request);
|
||||
_config.Log($"Отправляем запрос: {RemoteAddress.Uri}/{request.GetType().Name} в версии {version}...");
|
||||
|
||||
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
|
||||
|
||||
IHcsAck ack;
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
ack = await sender(client);
|
||||
}
|
||||
|
||||
stopWatch.Stop();
|
||||
_config.Log($"Запрос принят в обработку за {stopWatch.ElapsedMilliseconds}мс., подтверждение {ack.MessageGUID}");
|
||||
|
||||
var stateResult = await WaitForResultAsync(ack, true, token);
|
||||
|
||||
stateResult.Items.OfType<OrgRegistryCommon.ErrorMessageType>().ToList().ForEach(x =>
|
||||
{
|
||||
throw HcsRemoteException.CreateNew(x.ErrorCode, x.Description);
|
||||
});
|
||||
|
||||
return stateResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Выполняет однократную проверку наличия результата.
|
||||
/// Возвращает null если результата еще нет.
|
||||
/// </summary>
|
||||
protected override async Task<IHcsGetStateResult> TryGetResultAsync(IHcsAck sourceAck, CancellationToken token)
|
||||
{
|
||||
using (var client = NewPortClient())
|
||||
{
|
||||
var requestHeader = HcsRequestHelper.CreateHeader<OrgRegistryCommon.ISRequestHeader>(_config);
|
||||
var requestBody = new OrgRegistryCommon.getStateRequest { MessageGUID = sourceAck.MessageGUID };
|
||||
|
||||
var response = await client.getStateAsync(requestHeader, requestBody);
|
||||
var resultBody = response.getStateResult;
|
||||
|
||||
if (resultBody.RequestState == HcsAsyncRequestStateTypes.Ready)
|
||||
{
|
||||
return resultBody;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user