using Hcs.ClientApi.DataTypes; using Hcs.Service.Async.HouseManagement.v15_7_0_1; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using HouseManagement = Hcs.Service.Async.HouseManagement.v15_7_0_1; namespace Hcs.ClientApi.HouseManagementApi { /// /// Метод получения списка приборов учета /// public class HcsMethodExportMeteringDeviceData : HcsHouseManagementMethod { public HcsMethodExportMeteringDeviceData(HcsClientConfig config) : base(config) { CanBeRestarted = true; } /// /// Получение списка приборов учета для одного здания /// public async Task ExportByHouse( Guid fiasHouseGuid, Action<ГисПриборУчета> resultHandler, CancellationToken token) { List itemNames = [HouseManagement.ItemsChoiceType24.FIASHouseGuid]; List 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().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(basicItem, x => { прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID); прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID); прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилоеПомещение; типНайден = true; }); CallOnType(basicItem, x => { прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID); прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID); прибор.ВидПрибораУчета = ГисВидПрибораУчета.НежилоеПомещение; типНайден = true; }); CallOnType(basicItem, x => { прибор.ГуидыЗданийФиас = ParseGuidArray(x.FIASHouseGuid); прибор.ВидПрибораУчета = ГисВидПрибораУчета.ОДПУ; типНайден = true; }); CallOnType(basicItem, x => { прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID); прибор.ГуидыПомещений = ParseGuidArray(x.PremiseGUID); прибор.ВидПрибораУчета = ГисВидПрибораУчета.КоммунальнаяКвартира; типНайден = true; }); CallOnType(basicItem, x => { прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID); прибор.ГуидыЖилыхКомнат = ParseGuidArray(x.LivingRoomGUID); прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилаяКомната; типНайден = true; }); CallOnType(basicItem, x => { прибор.ГуидыЗданийФиас = ParseGuidArray(x.FIASHouseGuid); прибор.ГуидыЛицевыхСчетов = ParseGuidArray(x.AccountGUID); прибор.ВидПрибораУчета = ГисВидПрибораУчета.ЖилойДом; типНайден = true; }); if (!типНайден) throw new HcsException($"Неизвестный тип ПУ {basicItem} для №{прибор.ЗаводскойНомер}"); foreach (var electric in source.Items.OfType()) { прибор.КоэффициентТрансформации = (electric.TransformationRatioSpecified ? electric.TransformationRatio : 0); прибор.ПоказаниеТ1 = electric.MeteringValueT1; прибор.ПоказаниеТ2 = electric.MeteringValueT2; прибор.ПоказаниеТ3 = electric.MeteringValueT3; } return прибор; } } }