using Hcs.ClientApi.DataTypes; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using DeviceMetering = Hcs.Service.Async.DeviceMetering.v15_7_0_1; namespace Hcs.ClientApi.DeviceMeteringApi { /// /// Размещение в ГИС показаний прибора учета /// http://open-gkh.ru/DeviceMetering/importMeteringDeviceValuesRequest.html /// public class HcsMethodImportMeteringDevicesValues : HcsDeviceMeteringMethod { public HcsMethodImportMeteringDevicesValues(HcsClientConfig config) : base(config) { CanBeRestarted = false; } public async Task ImportMeteringDevicesValues( ГисПриборУчета прибор, ГисПоказания показания, CancellationToken token) { if (прибор == null) throw new ArgumentNullException(nameof(прибор)); if (показания == null) throw new ArgumentNullException(nameof(показания)); var current = new DeviceMetering.importMeteringDeviceValuesRequestMeteringDevicesValuesElectricDeviceValueCurrentValue() { TransportGUID = FormatGuid(Guid.NewGuid()), DateValue = показания.ДатаСнятия, MeteringValueT1 = HcsDeviceMeteringUtil.ConvertMeterReading(показания.ПоказанияТ1, false), MeteringValueT2 = HcsDeviceMeteringUtil.ConvertMeterReading(показания.ПоказанияТ2, false), MeteringValueT3 = HcsDeviceMeteringUtil.ConvertMeterReading(показания.ПоказанияТ3, false) }; var electric = new DeviceMetering.importMeteringDeviceValuesRequestMeteringDevicesValuesElectricDeviceValue() { CurrentValue = current }; var value = new DeviceMetering.importMeteringDeviceValuesRequestMeteringDevicesValues() { ItemElementName = DeviceMetering.ItemChoiceType.MeteringDeviceRootGUID, Item = FormatGuid(прибор.ГуидПрибораУчета), Item1 = electric }; var request = new DeviceMetering.importMeteringDeviceValuesRequest() { Id = HcsConstants.SignedXmlElementId, MeteringDevicesValues = [value] }; var stateResult = await SendAndWaitResultAsync(request, async (portClient) => { var ackResponse = await portClient.importMeteringDeviceValuesAsync( CreateRequestHeader(), request); return ackResponse.AckRequest.Ack; }, token); if (IsArrayEmpty(stateResult.Items)) throw new HcsException("Пустой stateResult.Items"); stateResult.Items.OfType().ToList() .ForEach(error => { throw HcsRemoteException.CreateNew(error.ErrorCode, error.Description); }); var commonResult = RequireSingleItem(stateResult.Items); if (IsArrayEmpty(commonResult.Items)) throw new HcsException("Пустой commonResult.Items"); DateTime датаПриема = commonResult.Items.OfType().FirstOrDefault(); if (датаПриема == default) throw new HcsException("Сервер не вернул дату приема им показаний"); return датаПриема; } } }