2025-06-03 23:01:46 +08:00

112 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using JiShe.CollectBus.Common.Consts;
using JiShe.CollectBus.Common.Enums;
using JiShe.CollectBus.Common.Extensions;
using JiShe.CollectBus.IotSystems.Devices;
using JiShe.CollectBus.Protocol.Contracts.Protocol.Dto;
using JiShe.CollectBus.Protocol.Dto;
using JiShe.CollectBus.Protocol.Interfaces;
using JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H.Ammeter;
using JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H.Watermeter;
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 TouchSocket.Core;
namespace JiShe.CollectBus.Protocol.T37612012.AnalysisData.AFN_10H
{
/// <summary>
/// 5.16 数据转发AFN=10H
/// </summary>
public class AFN16_F1_Analysis : IAnalysisStrategy<TB3761>
{
private readonly ILogger<AFN16_F1_Analysis> _logger;
private readonly AnalysisStrategyContext _analysisStrategyContext;
private readonly DataStorage _dataStorage;
public AFN16_F1_Analysis(ILogger<AFN16_F1_Analysis> logger, AnalysisStrategyContext analysisStrategyContext, DataStorage dataStorage)
{
_logger = logger;
_analysisStrategyContext = analysisStrategyContext;
_dataStorage = dataStorage;
}
public async Task<bool> ExecuteAsync(TB3761 input, Action<dynamic>? result = null)
{
try
{
ArgumentNullException.ThrowIfNull(input);
ArgumentNullException.ThrowIfNull(input.A.Code);
ArgumentNullException.ThrowIfNull(input.BaseHexMessage.HexMessageList);
ArgumentNullException.ThrowIfNull(input.UnitData.HexMessageString);
// TODO: 待定,等确认如何匹配规则
string value = input.UnitData.HexMessageString;
if (value.Contains(F10TranspondMatch.ReadNormal))
{
if (value.Contains(F10TranspondMatch.PowerHz))//电网频率
await _analysisStrategyContext.ExecuteAsync<TB3761>(nameof(AFN16_F97_Analysis), input, dto =>
{
result?.Invoke(dto);
});
else if (value.Contains(F10TranspondMatch.JumpClosingNormal) || value.Contains(F10TranspondMatch.JumpClosingError))//跳合闸
await _analysisStrategyContext.ExecuteAsync<TB3761>(nameof(AFN16_F98_Analysis), input, dto =>
{
result?.Invoke(dto);
});
else if (value.Contains(F10TranspondMatch.ES190_DC))
await _analysisStrategyContext.ExecuteAsync<TB3761>(nameof(ES190DC_Analysis), input, dto =>
{
result?.Invoke(dto);
});
else
{
//TODO 写入1条日志
var data = new AnalysisBaseDto<string?>()
{
FiledDesc = "透明转发",
ItemType = $"{input.AFN_FC.AFN.HexToDecStr().PadLeft(2, '0')}_{input.DT.Fn}"
};
// 查询设备信息
DeviceCacheInfo? deviceInfo = await _dataStorage.GetDeviceInfoAsync(input.A.Code);
if (deviceInfo != null)
{
data.ProjectId = deviceInfo.ProjectId;
data.DeviceId = deviceInfo.FocusId;
data.DatabaseBusiID = deviceInfo.DatabaseBusiID;
data.DeviceAddress = deviceInfo.FocusAddress;
data.DeviceType = MeterTypeEnum.Focus;
data.FocusId = deviceInfo.FocusId;
}
UnitDataAnalysis<AnalysisBaseDto<string?>> dto = new UnitDataAnalysis<AnalysisBaseDto<string?>>
{
Code = input.A.Code,
AFN = input.AFN_FC.AFN,
Fn = input.DT.Fn,
Pn = input.DA.Pn,
Data = data,
ReceivedHexMessage = input.BaseHexMessage.HexMessageString,
MessageId = input.MessageId,
ReceivedTime = input.ReceivedTime,
DensityUnit = DensityUnit.None,
TimeDensity = -1,
DataType = IOTDBDataTypeConst.Log
};
await _dataStorage.SaveDataToIotDbAsync<string?>(dto);
_logger.LogWarning($"未能找到透明传发解析方式:{input.BaseHexMessage.HexMessageString}");
}
}
return await Task.FromResult(true);
}
catch (Exception ex)
{
_logger.LogError(ex, $"10_1解析失败:{input.A?.Code}-{input.DT?.Fn ?? 0}-{input?.BaseHexMessage?.HexMessageString},{ex.Message}");
}
return await Task.FromResult(false);
}
}
}