using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.IotSystems.Ammeters; using JiShe.CollectBus.Protocol; using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto; using JiShe.CollectBus.Protocol.Dto; using JiShe.CollectBus.Protocol.Interfaces; using JiShe.CollectBus.Protocol.T37612012.AnalysisData; using JiShe.CollectBus.Protocol3761; using Microsoft.Extensions.Logging; namespace GatherService.WattMeter.AnalysisData.AFN_10H { /// /// 透明转发---跳合闸 /// public class AFN16_F98_Analysis : IAnalysisStrategy { private readonly ILogger _logger; private readonly AnalysisStrategyContext _analysisStrategyContext; private readonly DataStorage _dataStorage; public AFN16_F98_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 = AnalysisDataUnit(input.UnitData.HexMessageList); var data = new AnalysisBaseDto() { FiledDesc = "跳合闸", DataValue = (datas[2].Equals("9C") || datas[2].Equals("94")) ? true : false }; // 查询电表信息 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.DeviceAddress = 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, ReceivedHexMessage = input.BaseHexMessage.HexMessageString, MessageId = input.MessageId, ReceivedTime = input.ReceivedTime, DensityUnit = DensityUnit.None, TimeDensity = -1 }; result?.Invoke(unitDataAnalysis); await _dataStorage.SaveDataToIotDbAsync(unitDataAnalysis); return await Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, $"10_98跳合闸解析失败:{input.A.Code}-{input.DT.Fn}-{input.BaseHexMessage.HexMessageString},{ex.Message}"); } return await Task.FromResult(false); } private List AnalysisDataUnit(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].DataConvert(16); //values.Add(len.ToString()); //TODO:数据域 //var dataField = contentArr.GetRange(10, len); //if (dataField.Count > 0) //{ // string dataMark = string.Join("", CalculateErrControl(dataField.GetRange(0, 4))); // values.Add(dataMark);//数据标识 // var readValue = CalculateErrControl(dataField.GetRange(4, len - 4));//值 // var valueData = GetValue>(readValue, (AppendixEnums)Enum.Parse(typeof(AppendixEnums), dataMark)); // values.AddRange(valueData); //} return values; } } }