You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
13 KiB

using DotNetty.Transport.Channels;
using HybirdFrameworkCore.Autofac.Attribute;
using log4net;
using Service.Charger.Client;
using Service.Charger.Msg.Charger.Resp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common.Const;
using Entity.DbModel.Station;
using Repository.Station;
namespace Service.Charger.Handler
{
[Order(8)]
[Scope("InstancePerDependency")]
public class UpAlarmHandler : SimpleChannelInboundHandler<UpAlarm>, IBaseHandler
{
private static readonly ILog Log = LogManager.GetLogger(typeof(UpAlarmHandler));
private EquipAlarmRecordRepository EquipAlarmRecordRepository { get; set; }
private EquipAlarmProcessRecordRepository EquipAlarmProcessRecordRepository { get; set; }
private EquipAlarmDefineRepository EquipAlarmDefineRepository { get; set; }
public UpAlarmHandler(
EquipAlarmRecordRepository _EquipAlarmRecordRepository,
EquipAlarmProcessRecordRepository _EquipAlarmProcessRecordRepository,
EquipAlarmDefineRepository _EquipAlarmDefineRepository)
{
EquipAlarmRecordRepository = _EquipAlarmRecordRepository;
EquipAlarmProcessRecordRepository = _EquipAlarmProcessRecordRepository;
EquipAlarmDefineRepository = _EquipAlarmDefineRepository;
}
/// <summary>
/// 报警数据处理
/// </summary>
/// <param name="svalue">报警类型</param>
/// <param name="equipCode">报警编码</param>
/// <param name="sn">设备编码</param>
private void AlarmMsg(bool bvalue, string equipCode, string sn)
{
if (bvalue)
{
var define = EquipAlarmDefineRepository.QueryByClause(i => i.EquipCode == equipCode);
//查询数据表中是否有此报警信息,有则不用处理,无则添加实时报警
EquipAlarmRecord equipAlarm =
EquipAlarmRecordRepository.QueryByClause(i => i.ErrorCode == sn + define.ErrorCode);
if (equipAlarm == null) //实时报警表中没有这条报警信息
{
EquipAlarmRecord record = new EquipAlarmRecord()
{
EquipTypeCode = equipAlarm.EquipTypeCode,
EquipCode = sn,
ErrorCode = equipAlarm.ErrorCode,
ErrorLevel = equipAlarm.ErrorLevel,
ErrorMsg = equipAlarm.ErrorMsg,
ProcessMethod = equipAlarm.ProcessMethod,
StartTime = DateTime.Now
};
EquipAlarmRecordRepository.Insert(record);
}
}
else
{
var define = EquipAlarmDefineRepository.QueryByClause(i => i.EquipCode == equipCode);
//查询数据表中是否有此报警信息,有则不用处理,无则添加实时报警
EquipAlarmRecord equipAlarm =
EquipAlarmRecordRepository.QueryByClause(i => i.ErrorCode == sn + define.ErrorCode);
if (equipAlarm != null) //报警消除实时报警里面数据还有此报警
{
EquipAlarmProcessRecord EquipAlarmProcessRecord = new EquipAlarmProcessRecord();
EquipAlarmProcessRecord.EquipTypeCode = equipAlarm.EquipTypeCode;
EquipAlarmProcessRecord.EquipCode = equipAlarm.EquipCode;
EquipAlarmProcessRecord.ErrorCode = equipAlarm.ErrorCode;
EquipAlarmProcessRecord.ErrorLevel = equipAlarm.ErrorLevel;
EquipAlarmProcessRecord.ErrorMsg = equipAlarm.ErrorMsg;
EquipAlarmProcessRecord.ProcessMethod = equipAlarm.ProcessMethod;
EquipAlarmProcessRecord.StartTime = equipAlarm.StartTime;
EquipAlarmProcessRecord.ProcessTime = DateTime.Now;
EquipAlarmProcessRecordRepository.Insert(EquipAlarmProcessRecord);
EquipAlarmRecordRepository.Delete(equipAlarm);
}
}
}
protected override void ChannelRead0(IChannelHandlerContext ctx, UpAlarm msg)
{
if (ClientMgr.TryGetClient(ctx.Channel, out string sn, out var client))
{
Log.Info($"receive {msg} from {sn}");
#region 故障处理
string bms = "bms";
List<string> lstAlarm = new List<string>();
if (msg.SingleBattery == 1)
{
lstAlarm.Add(bms + sn + "100");
}
else if (msg.SingleBattery == 2)
{
lstAlarm.Add(bms + sn + "101");
}
if (msg.VoltageOvershoot == 2)
{
lstAlarm.Add(bms + sn + "102");
}
if (msg.TemperatureExceedance == 1)
{
lstAlarm.Add(bms + sn + "103");
}
else if (msg.TemperatureExceedance == 2)
{
lstAlarm.Add(bms + sn + "104");
}
if (msg.TemperatureDifference == 2)
{
lstAlarm.Add(bms + sn + "105");
}
if (msg.LowSOC == 1)
{
lstAlarm.Add(bms + sn + "106");
}
if (msg.DischargeCurrent == 2)
{
lstAlarm.Add(bms + sn + "107");
}
if (msg.ChargingCurrentLimit == 1)
{
lstAlarm.Add(bms + sn + "108");
}
else if (msg.ChargingCurrentLimit == 2)
{
lstAlarm.Add(bms + sn + "109");
}
if (msg.TotalTemp == 2)
{
lstAlarm.Add(bms + sn + "110");
}
if (msg.HighVoltageLow == 2)
{
lstAlarm.Add(bms + sn + "111");
}
if (msg.MonomerLimit == 1)
{
lstAlarm.Add(bms + sn + "112");
}
else if (msg.MonomerLimit == 1)
{
lstAlarm.Add(bms + sn + "113");
}
if (msg.VoltageDifference == 2)
{
lstAlarm.Add(bms + sn + "114");
}
if (msg.TemperatureOvershoot == 1)
{
lstAlarm.Add(bms + sn + "115");
}
else if (msg.TemperatureOvershoot == 2)
{
lstAlarm.Add(bms + sn + "116");
}
if (msg.TempDifference == 2)
{
lstAlarm.Add(bms + sn + "117");
}
if (msg.VeryLowSoc == 1)
{
lstAlarm.Add(bms + sn + "118");
}
if (msg.DischargeCurrentLimit == 2)
{
lstAlarm.Add(bms + sn + "119");
}
if (msg.ChargingCurrent == 2)
{
lstAlarm.Add(bms + sn + "120");
}
if (msg.TotalTempLimit == 2)
{
lstAlarm.Add(bms + sn + "121");
}
if (msg.HighVoltageInsulation == 1)
{
lstAlarm.Add(bms + sn + "122");
}
if (msg.HardwareFailure == 1)
{
lstAlarm.Add(bms + sn + "123");
}
if (msg.BatteryFaultCode != 0)
{
lstAlarm.Add(bms + sn + msg.BatteryFaultCode.ToString());
}
SaveAlarmInfo(lstAlarm);
#endregion
}
}
#region 故障处理方法
private void SaveAlarmInfo(List<string> lstAlarm)
{
string bms = "bms";
if (lstAlarm.Count > 0)
{
#region 有报警比较两边差异,新出现的报警就添加,消失的报警就处理并记录
var lstEquipAlarmRecord = EquipAlarmRecordRepository.QueryListByClause(i => i.EquipTypeCode == (int)EquipmentType.BMS);
var sqllstAlarm = lstEquipAlarmRecord.Select(obj => obj.ErrorCode).ToList();
// 找出实时报警中存在但数据库中不存在的元素
List<string> uniqueToList1 = lstAlarm.Except(sqllstAlarm).ToList();
// 找出数据库中存在但实时报警中不存在的元素
List<string> uniqueToList2 = sqllstAlarm.Except(lstAlarm).ToList();
if (uniqueToList1.Count > 0)
{
//这里要添加新的报警数据
foreach (var errorCode in uniqueToList1)
{
EquipAlarmDefine? alarmDefine =
EquipAlarmDefineRepository.SelectByEquipCodeAndErrorCode((int)EquipmentType.BMS, bms);
if (alarmDefine != null)
{
EquipAlarmRecord record = new EquipAlarmRecord()
{
EquipTypeCode = alarmDefine.EquipTypeCode,
EquipCode = alarmDefine.EquipCode,
ErrorCode = alarmDefine.ErrorCode,
ErrorLevel = alarmDefine.ErrorLevel,
ErrorMsg = alarmDefine.ErrorMsg,
ProcessMethod = alarmDefine.ProcessMethod,
StartTime = DateTime.Now
};
EquipAlarmRecordRepository.Insert(record);
}
}
}
if (uniqueToList2.Count > 0)
{
//这些是要清除实时报警,并且处理记录的。
// 使用LINQ找出ErrorCode在uniqueToList2中的EquipAlarmRecord对象
List<EquipAlarmRecord> filteredObjectList = lstEquipAlarmRecord
.Where(obj => uniqueToList2.Contains(obj.ErrorCode))
.ToList();
foreach (var VARIABLE in filteredObjectList)
{
EquipAlarmProcessRecord EquipAlarmProcessRecord = new EquipAlarmProcessRecord();
EquipAlarmProcessRecord.EquipTypeCode = VARIABLE.EquipTypeCode;
EquipAlarmProcessRecord.EquipCode = VARIABLE.EquipCode;
EquipAlarmProcessRecord.ErrorCode = VARIABLE.ErrorCode;
EquipAlarmProcessRecord.ErrorLevel = VARIABLE.ErrorLevel;
EquipAlarmProcessRecord.ErrorMsg = VARIABLE.ErrorMsg;
EquipAlarmProcessRecord.ProcessMethod = VARIABLE.ProcessMethod;
EquipAlarmProcessRecord.StartTime = VARIABLE.StartTime;
EquipAlarmProcessRecord.ProcessTime = DateTime.Now;
EquipAlarmProcessRecordRepository.Insert(EquipAlarmProcessRecord);
}
EquipAlarmRecordRepository.Delete(filteredObjectList);
}
#endregion
}
else
{
#region 没报警把已处理记录更新并删除实时报警
var lstEquipAlarmRecord = EquipAlarmRecordRepository.QueryListByClause(i => i.EquipTypeCode == (int)EquipmentType.BMS);
if (lstEquipAlarmRecord.Count > 0)
{
foreach (var VARIABLE in lstEquipAlarmRecord)
{
EquipAlarmProcessRecord EquipAlarmProcessRecord = new EquipAlarmProcessRecord();
EquipAlarmProcessRecord.EquipTypeCode = VARIABLE.EquipTypeCode;
EquipAlarmProcessRecord.EquipCode = VARIABLE.EquipCode;
EquipAlarmProcessRecord.ErrorCode = VARIABLE.ErrorCode;
EquipAlarmProcessRecord.ErrorLevel = VARIABLE.ErrorLevel;
EquipAlarmProcessRecord.ErrorMsg = VARIABLE.ErrorMsg;
EquipAlarmProcessRecord.ProcessMethod = VARIABLE.ProcessMethod;
EquipAlarmProcessRecord.StartTime = VARIABLE.StartTime;
EquipAlarmProcessRecord.ProcessTime = DateTime.Now;
EquipAlarmProcessRecordRepository.Insert(EquipAlarmProcessRecord);
}
}
EquipAlarmRecordRepository.Delete(lstEquipAlarmRecord);
#endregion
}
}
#endregion
}
}