Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
191 lines
8.9 KiB
C#
191 lines
8.9 KiB
C#
using Hcs.ClientApi.DataTypes;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
|
||
using HouseManagement = Hcs.Service.Async.HouseManagement.v14_5_0_1;
|
||
|
||
namespace Hcs.ClientApi.HouseManagementApi
|
||
{
|
||
/// <summary>
|
||
/// Метод получения реестра лицевых счетов
|
||
/// </summary>
|
||
public class HcsMethodExportAccountData : HcsHouseManagementMethod
|
||
{
|
||
public HcsMethodExportAccountData(HcsClientConfig config) : base(config)
|
||
{
|
||
CanBeRestarted = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получает реестр лицевых счетов по зданию с данным ГУИД ФИАС или по списку номеров ЕЛС
|
||
/// </summary>
|
||
public async Task<int> Query(
|
||
Guid? fiasHouseGuid, IEnumerable<string> unifiedAccountNumbers,
|
||
Action<ГисЛицевойСчет> resultHandler, CancellationToken token)
|
||
{
|
||
int numResults = 0;
|
||
|
||
var itemNames = new List<HouseManagement.ItemsChoiceType18> { };
|
||
List<string> items = new List<string> { };
|
||
|
||
if (fiasHouseGuid != null)
|
||
{
|
||
itemNames.Add(HouseManagement.ItemsChoiceType18.FIASHouseGuid);
|
||
items.Add(FormatGuid(fiasHouseGuid));
|
||
}
|
||
|
||
if (unifiedAccountNumbers != null)
|
||
{
|
||
if (unifiedAccountNumbers.Count() > 1000)
|
||
throw new HcsException($"Слишком много ЕЛС в запросе {unifiedAccountNumbers.Count()} > допустимых 1000");
|
||
foreach (var un in unifiedAccountNumbers)
|
||
{
|
||
itemNames.Add(HouseManagement.ItemsChoiceType18.UnifiedAccountNumber);
|
||
items.Add(un);
|
||
}
|
||
}
|
||
|
||
try
|
||
{
|
||
var request = new HouseManagement.exportAccountRequest
|
||
{
|
||
Id = HcsConstants.SignedXmlElementId,
|
||
Items = items.ToArray(),
|
||
ItemsElementName = itemNames.ToArray()
|
||
};
|
||
|
||
var stateResult = await SendAndWaitResultAsync(request, async (portClient) =>
|
||
{
|
||
var ackResponse = await portClient.exportAccountDataAsync(
|
||
CreateRequestHeader(), request);
|
||
return ackResponse.AckRequest.Ack;
|
||
}, token);
|
||
|
||
stateResult.Items.OfType<HouseManagement.exportAccountResultType>().ToList().ForEach(
|
||
account => { resultHandler(Adopt(account)); numResults += 1; });
|
||
}
|
||
catch (HcsNoResultsRemoteException)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return numResults;
|
||
}
|
||
|
||
private ГисЛицевойСчет Adopt(HouseManagement.exportAccountResultType source)
|
||
{
|
||
return new ГисЛицевойСчет()
|
||
{
|
||
ГуидЛицевогоСчета = ParseGuid(source.AccountGUID),
|
||
НомерЕЛС = source.UnifiedAccountNumber,
|
||
НомерЛицевогоСчета = source.AccountNumber,
|
||
ПолнаяПлощадь = (source.TotalSquareSpecified ? (decimal?)source.TotalSquare : null),
|
||
ЖилаяПлощадь = (source.ResidentialSquareSpecified ? (decimal?)source.ResidentialSquare : null),
|
||
КодЖКУ = source.ServiceID,
|
||
ДатаСоздания = (source.CreationDateSpecified ? (DateTime?)source.CreationDate : null),
|
||
ДатаЗакрытия = (source.Closed != null ? (DateTime?)source.Closed.CloseDate : null),
|
||
КодНсиПричиныЗакрытия = (source.Closed != null ? source.Closed.CloseReason.Code : null),
|
||
ИмяПричиныЗакрытия = (source.Closed != null ? source.Closed.Description : null),
|
||
Размещения = Adopt(source.Accommodation),
|
||
Основания = Adopt(source.AccountReasons)
|
||
};
|
||
}
|
||
|
||
private ГисОснованиеЛС[] Adopt(HouseManagement.exportAccountResultTypeAccountReasons source)
|
||
{
|
||
if (source == null) throw new ArgumentNullException("HouseManagement.exportAccountResultTypeAccountReasons");
|
||
|
||
var основания = new List<ГисОснованиеЛС>();
|
||
|
||
if (source.SupplyResourceContract != null)
|
||
{
|
||
foreach (var sr in source.SupplyResourceContract)
|
||
{
|
||
var основание = new ГисОснованиеЛС();
|
||
основание.ТипОснованияЛС = ГисТипОснованияЛС.ДоговорРСО;
|
||
|
||
for (int i = 0; i < sr.Items.Length; i++)
|
||
{
|
||
switch (sr.ItemsElementName[i])
|
||
{
|
||
case HouseManagement.ItemsChoiceType9.ContractGUID:
|
||
основание.ГуидДоговора = ParseGuid(sr.Items[i]);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (основание.ГуидДоговора == default(Guid))
|
||
throw new HcsException("Для основания ЛС не указан ГУИД договора РСО");
|
||
|
||
основания.Add(основание);
|
||
}
|
||
}
|
||
|
||
if (source.SocialHireContract != null)
|
||
{
|
||
var sh = source.SocialHireContract;
|
||
|
||
var основание = new ГисОснованиеЛС();
|
||
основание.ТипОснованияЛС = ГисТипОснованияЛС.Соцнайм;
|
||
|
||
for (int i = 0; i < sh.Items.Length; i++)
|
||
{
|
||
object itemValue = sh.Items[i];
|
||
switch (sh.ItemsElementName[i])
|
||
{
|
||
case HouseManagement.ItemsChoiceType10.ContractGUID:
|
||
основание.ГуидДоговора = ParseGuid(itemValue);
|
||
break;
|
||
case HouseManagement.ItemsChoiceType10.ContractNumber:
|
||
основание.НомерДоговора = (itemValue != null ? itemValue.ToString() : null);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (основание.ГуидДоговора == default(Guid))
|
||
throw new HcsException("Для основания ЛС не указан ГУИД договора соцнайма");
|
||
|
||
основания.Add(основание);
|
||
}
|
||
|
||
if (source.Contract != null)
|
||
{
|
||
var основание = new ГисОснованиеЛС();
|
||
основание.ТипОснованияЛС = ГисТипОснованияЛС.Договор;
|
||
основание.ГуидДоговора = ParseGuid(source.Contract.ContractGUID);
|
||
основания.Add(основание);
|
||
}
|
||
|
||
// TODO: Проверить комментарий
|
||
// Непонятно что делать с остальными типам основания и даже следует ли их
|
||
// расшифровывать или считать ошибкой пустого списка оснований
|
||
return основания.ToArray();
|
||
}
|
||
|
||
private ГисРазмещениеЛС[] Adopt(HouseManagement.AccountExportTypeAccommodation[] array)
|
||
{
|
||
if (array == null) throw new ArgumentNullException("HouseManagement.AccountExportTypeAccommodation");
|
||
return array.ToList().Select(x => Adopt(x)).ToArray();
|
||
}
|
||
|
||
private ГисРазмещениеЛС Adopt(HouseManagement.AccountExportTypeAccommodation source)
|
||
{
|
||
var размещение = new ГисРазмещениеЛС();
|
||
размещение.ПроцентДоли = (source.SharePercentSpecified ? (decimal?)source.SharePercent : null);
|
||
|
||
switch (source.ItemElementName)
|
||
{
|
||
case HouseManagement.ItemChoiceType7.FIASHouseGuid: размещение.ГуидЗдания = ParseGuid(source.Item); break;
|
||
case HouseManagement.ItemChoiceType7.PremisesGUID: размещение.ГуидПомещения = ParseGuid(source.Item); break;
|
||
case HouseManagement.ItemChoiceType7.LivingRoomGUID: размещение.ГуидЖилойКомнаты = ParseGuid(source.Item); break;
|
||
default: throw new HcsException("Неизвестный тип размещения ЛС: " + source.ItemElementName);
|
||
}
|
||
|
||
return размещение;
|
||
}
|
||
}
|
||
}
|