using GatherService.WattMeter.AnalysisData.AFN_10H; using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Common.Helpers; using JiShe.CollectBus.IotSystems.Ammeters; using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto; using JiShe.CollectBus.Protocol.Dto; using JiShe.CollectBus.Protocol.Interfaces; using JiShe.CollectBus.Protocol.T37612012.Appendix; using JiShe.CollectBus.Protocol3761; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static FreeSql.Internal.GlobalFilter; namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H { public class AFN16_F97_Analysis : IAnalysisStrategy { private readonly ILogger _logger; private readonly AnalysisStrategyContext _analysisStrategyContext; private readonly DataStorage _dataStorage; public AFN16_F97_Analysis(ILogger logger, AnalysisStrategyContext analysisStrategyContext, DataStorage dataStorage) { _logger = logger; _analysisStrategyContext = analysisStrategyContext; _dataStorage = dataStorage; } public async Task ExecuteAsync(TB3761 input, Action? result = null) { try { ArgumentNullException.ThrowIfNull(input); ArgumentNullException.ThrowIfNull(input.UnitData?.HexMessageList); List datas = await AnalysisDataUnitAsync(input.UnitData.HexMessageList); AnalysisBaseDto data = GenerateFinalResult(datas); // 查询电表信息 AmmeterInfo ammeterInfo = await _dataStorage.GetMeterInfoAsync(data.DeviceType.ToString(), "15"); if (ammeterInfo != null) { data.ProjectId = ammeterInfo.ProjectID; data.DeviceId = ammeterInfo.MeterId; data.DatabaseBusiID = ammeterInfo.DatabaseBusiID; data.MeterAddress = ammeterInfo.AmmerterAddress; } UnitDataAnalysis> unitDataAnalysis = new UnitDataAnalysis> { Code = input.A.Code!, AFN = input.AFN_FC.AFN, Fn = input.DT.Fn, Pn = input.DA.Pn, MSA = input.A.A3!.D1_D7!, PSEQ = input.SEQ.PSEQ, Data = data, HexMessage = input.BaseHexMessage.HexMessageString, MessageId = input.MessageId, TimeDensity = 1,//密度-间隔, DensityUnit = DensityUnit.Hour, ReceivedTime = input.ReceivedTime }; await _dataStorage.SaveDataToIotDbAsync(unitDataAnalysis); result?.Invoke(unitDataAnalysis); return await Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, $"10_97解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}"); return await Task.FromResult(false); } } private AnalysisBaseDto GenerateFinalResult(List data) { AnalysisBaseDto meter = new AnalysisBaseDto(); decimal.TryParse(data[7], out decimal value); var errorCode = data[7].CheckErrorCode(); if (errorCode != null) { meter.ValidData = false; meter.ErrorCodeMsg = errorCode.Item2; } else meter.DataValue = value; meter.DataType = "10_97"; meter.ValidData = data[2].Equals("91") || data[2].Equals("B1"); meter.FiledDesc = "电网频率";//"电网频率"; meter.FiledName = meter.DataType.GetDataFieldByGatherDataType() ?? string.Empty; return meter; } private async Task> AnalysisDataUnitAsync(List hexMessageList) { List values = new List(); values.Add(hexMessageList.GetRange(4, 1)[0].HexToDec().ToString());//端口号 var contentLengthArr = hexMessageList.GetRange(5, 2); contentLengthArr.Reverse(); int contentLength = string.Join("", contentLengthArr).HexToDec(); //TODO:转发内容 List contentArr = hexMessageList.GetRange(7, contentLength); //TODO:表地址 var addressList = contentArr.GetRange(1, 6); addressList.Reverse(); var address = string.Join("", addressList); values.Add(address); //TODO:控制码 var controlCode = contentArr.GetRange(8, 1)[0]; values.Add(controlCode); //TODO:长度 var len = contentArr.GetRange(9, 1)[0].HexToDec(); //values.Add(len.ToString()); //TODO:数据域 var dataField = contentArr.GetRange(10, len); if (dataField.Count > 0) { string dataMark = string.Join("",dataField.GetRange(0, 4).ReduceHex33(true)); values.Add(dataMark);//数据标识 var readValue = dataField.GetRange(4, len - 4).ReduceHex33(true);//值 await _analysisStrategyContext.ExecuteAsync>($" Appendix_{dataMark}", readValue, (value) => { values.Add(value.ToString()); }); } return values; } } }