Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
166 lines
8.4 KiB
C#
166 lines
8.4 KiB
C#
using Hcs.ClientApi.DataTypes;
|
||
using Hcs.Service.Async.HouseManagement.v14_5_0_1;
|
||
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 HcsMethodExportMeteringDeviceData : HcsHouseManagementMethod
|
||
{
|
||
public HcsMethodExportMeteringDeviceData(HcsClientConfig config) : base(config)
|
||
{
|
||
CanBeRestarted = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получение списка приборов учета для одного здания
|
||
/// </summary>
|
||
public async Task<int> ExportByHouse(
|
||
Guid fiasHouseGuid, Action<ГисПриборУчета> resultHandler, CancellationToken token)
|
||
{
|
||
List<HouseManagement.ItemsChoiceType4> itemNames = [HouseManagement.ItemsChoiceType4.FIASHouseGuid];
|
||
List<string> items = [FormatGuid(fiasHouseGuid)];
|
||
|
||
var request = new HouseManagement.exportMeteringDeviceDataRequest
|
||
{
|
||
Id = HcsConstants.SignedXmlElementId,
|
||
Items = items.ToArray(),
|
||
ItemsElementName = itemNames.ToArray(),
|
||
// TODO: Проверить комментарий
|
||
//version = "11.1.0.2" // Версия указана в API
|
||
};
|
||
|
||
int numResults = 0;
|
||
try
|
||
{
|
||
var stateResult = await SendAndWaitResultAsync(request, async (portClient) =>
|
||
{
|
||
var ackResponse = await portClient.exportMeteringDeviceDataAsync(CreateRequestHeader(), request);
|
||
return ackResponse.AckRequest.Ack;
|
||
}, token);
|
||
|
||
stateResult.Items.OfType<HouseManagement.exportMeteringDeviceDataResultType>().ToList().ForEach(
|
||
device => { resultHandler(Adopt(device)); numResults += 1; }
|
||
);
|
||
}
|
||
catch (HcsNoResultsRemoteException)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return numResults;
|
||
}
|
||
|
||
private ГисПриборУчета Adopt(HouseManagement.exportMeteringDeviceDataResultType source)
|
||
{
|
||
var прибор = new ГисПриборУчета()
|
||
{
|
||
ГуидПрибораУчета = ParseGuid(source.MeteringDeviceRootGUID),
|
||
ГуидВерсииПрибора = ParseGuid(source.MeteringDeviceVersionGUID),
|
||
НомерПрибораУчетаГис = source.MeteringDeviceGISGKHNumber,
|
||
ЗаводскойНомер = source.BasicChatacteristicts.MeteringDeviceNumber,
|
||
МодельПрибораУчета = source.BasicChatacteristicts.MeteringDeviceModel,
|
||
ДатаРазмещенияВерсии = source.UpdateDateTime
|
||
};
|
||
|
||
if (!IsArrayEmpty(source.MeteringOwner))
|
||
{
|
||
прибор.ГуидВладельцаПрибора = ParseGuid(source.MeteringOwner[0]);
|
||
}
|
||
|
||
switch (source.StatusRootDoc)
|
||
{
|
||
case HouseManagement.exportMeteringDeviceDataResultTypeStatusRootDoc.Active:
|
||
прибор.СтатусПрибораУчета = ГисСтатусПрибораУчета.Активный;
|
||
break;
|
||
case HouseManagement.exportMeteringDeviceDataResultTypeStatusRootDoc.Archival:
|
||
прибор.СтатусПрибораУчета = ГисСтатусПрибораУчета.Архивный;
|
||
break;
|
||
default:
|
||
throw new HcsException($"Неизвестный статус ПУ {source.StatusRootDoc} для №{прибор.ЗаводскойНомер}");
|
||
}
|
||
|
||
var basic = source.BasicChatacteristicts;
|
||
|
||
прибор.ДатаУстановки = basic.InstallationDateSpecified ? basic.InstallationDate : null;
|
||
прибор.ДатаВводаВЭксплуатацию = basic.CommissioningDateSpecified ? basic.CommissioningDate : null;
|
||
прибор.ДатаПоследнейПоверки = basic.FirstVerificationDateSpecified ? basic.FirstVerificationDate : null;
|
||
прибор.ДатаИзготовления = basic.FactorySealDateSpecified ? basic.FactorySealDate : null;
|
||
|
||
прибор.РежимДистанционногоОпроса = basic.RemoteMeteringMode;
|
||
прибор.ОписаниеДистанционногоОпроса = basic.RemoteMeteringInfo;
|
||
|
||
object basicItem = basic.Item;
|
||
bool типНайден = false;
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeResidentialPremiseDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID);
|
||
прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилоеПомещение;
|
||
типНайден = true;
|
||
});
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeNonResidentialPremiseDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID);
|
||
прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.НежилоеПомещение;
|
||
типНайден = true;
|
||
});
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeCollectiveDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЗданийФиас = ParseGuidArray(x.FIASHouseGuid);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.ОДПУ;
|
||
типНайден = true;
|
||
});
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeCollectiveApartmentDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID);
|
||
прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.КоммунальнаяКвартира;
|
||
типНайден = true;
|
||
});
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeLivingRoomDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID);
|
||
прибор.ГуидыЖилыхКомнат = ParseGuidArray(x.LivingRoomGUID);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилаяКомната;
|
||
типНайден = true;
|
||
});
|
||
|
||
CallOnType<HouseManagement.MeteringDeviceBasicCharacteristicsTypeApartmentHouseDevice>(basicItem, x =>
|
||
{
|
||
прибор.ГуидыЗданийФиас = ParseGuidArray(x.FIASHouseGuid);
|
||
прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID);
|
||
прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилойДом;
|
||
типНайден = true;
|
||
});
|
||
|
||
if (!типНайден) throw new HcsException($"Неизвестный тип ПУ {basicItem} для №{прибор.ЗаводскойНомер}");
|
||
|
||
foreach (var electric in source.Items.OfType<MunicipalResourceElectricExportType>())
|
||
{
|
||
прибор.КоэффициентТрансформации =
|
||
(electric.TransformationRatioSpecified ? electric.TransformationRatio : 0);
|
||
прибор.ПоказаниеТ1 = electric.MeteringValueT1;
|
||
прибор.ПоказаниеТ2 = electric.MeteringValueT2;
|
||
прибор.ПоказаниеТ3 = electric.MeteringValueT3;
|
||
}
|
||
|
||
return прибор;
|
||
}
|
||
}
|
||
}
|