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.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, IBaseHandler { private static readonly ILog Log = LogManager.GetLogger(typeof(UpAlarmHandler)); public EquipAlarmRecordRepository EquipAlarmRecordRepository { get; set; } public EquipAlarmDefineRepository EquipAlarmDefineRepository { get; set; } public EquipAlarmProcessRecordRepository EquipAlarmProcessRecordRepository { get; set; } 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}"); if (msg != null && msg.BatteryFaultCode > 4000) { SaveAlarmInfo(new List { msg.BatteryFaultCode.ToString() }, sn); } } } private void SaveAlarmInfo(List lstAlarm, string sn) { string charger = "charger"; if (lstAlarm.Count > 0) { #region 有报警比较两边差异,新出现的报警就添加,消失的报警就处理并记录 var lstEquipAlarmRecord = EquipAlarmRecordRepository.QueryListByClause(e => e.EquipTypeCode == 0).ToList(); var sqllstAlarm = lstEquipAlarmRecord.Select(obj => obj.ErrorCode).ToList(); // 找出实时报警中存在但数据库中不存在的元素 List uniqueToList1 = lstAlarm.Except(sqllstAlarm).ToList(); // 找出数据库中存在但实时报警中不存在的元素 List uniqueToList2 = sqllstAlarm.Except(lstAlarm).ToList(); if (uniqueToList1.Count > 0) { //这里要添加新的报警数据 foreach (var errorCode in uniqueToList1) { EquipAlarmDefine? alarmDefine = EquipAlarmDefineRepository.SelectByEquipCodeAndErrorCode(0, charger, errorCode); if (alarmDefine != null) { EquipAlarmRecord record = new EquipAlarmRecord() { EquipTypeCode = alarmDefine.EquipTypeCode, EquipCode = sn, 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 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(e => e.EquipTypeCode == 0).ToList(); 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(e => e.EquipTypeCode == 0); } #endregion } } } }