using Abp.Dependency; using System.Collections.Concurrent; using System.Threading.Tasks.Dataflow; using ToolLibrary.LogHelper; using Yunda.ISAS.DataMonitoringServer.DataAnalysis.Model; using Yunda.ISAS.DataMonitoringServer.DataCenter; using Yunda.ISAS.DataMonitoringServer.WebSocket; using Yunda.ISAS.DataMonitoringServer.WebSocket.Model; using YunDa.ISAS.DataTransferObject.DataMonitoring.LinkageExecuteActivityDto; using YunDa.ISAS.DataTransferObject.DataMonitoring.TelemeteringAlarmStrategyDto; using YunDa.ISAS.DataTransferObject.EquipmentLiveData; using YunDa.ISAS.DataTransferObject.VideoSurveillance.VideoDevDto; using YunDa.ISAS.Redis.Entities.AlarmCategory; namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis.AlarmQueue { public class AlarmQueueDataPublish : ISingletonDependency { private ActionBlock _alarmListRedisBlock; private readonly RedisDataRepository _redisDataRepository; private readonly WebApiRequest _webApiRequest; private readonly WebSocketServer _webSocketServer; public AlarmQueueDataPublish(RedisDataRepository redisDataRepository , WebApiRequest webApiRequest , WebSocketServer webSocketServer) { _webSocketServer = webSocketServer; _redisDataRepository = redisDataRepository; _webApiRequest = webApiRequest; _alarmListRedisBlock = new ActionBlock(async t => { try { var dic = _redisDataRepository.AlarmListRedis.HashSetGetDicAll(nameof(AlarmListRedis)); if (dic.ContainsKey(t.Id.ToString())) { t.IsClear = dic[t.Id.ToString()].IsClear; } else { dic.Add(t.Id.ToString(), t); } await _redisDataRepository.AlarmListRedis.HashSetUpdateOneAsync(nameof(AlarmListRedis), t.Id.ToString(), t); var orders = dic.Values.OrderByDescending(t => DateTime.Parse(t.AlarmDateTime)); var msg = new DataMonitorMessageModel() { MessageType = MessgeTypeEnum.AlarmQueue, Content = orders, GroupType = GroupTypeEnum.All }; _webSocketServer.SendMsg(msg); } catch (Exception ex) { Log4Helper.Error(this.GetType(), "处理报警队列发生错误", ex); } }, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 1 }); } public bool IsClearAlarm(Guid id) { var alarmStra = _redisDataRepository.AlarmListRedis.HashSetGetOne(nameof(AlarmListRedis), id); if (alarmStra != null) { return alarmStra.IsClear; } return false; } /// /// 处理联动报警 /// /// /// /// /// public Task LinkageAlarmAsync(LinkageStrategyModel linkageStrategyModel, //Guid configurationId, string resStr, ConcurrentDictionary> _cameraActives) { return Task.Run(() => { AlarmListRedis alarmListRedis = new AlarmListRedis() { Id = linkageStrategyModel.Id, IsRecord = false, DMAlarmCategory = linkageStrategyModel.DMAlarmCategory, IsClear = false, AlarmContent = "", AlarmDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), AlarmLevelName = linkageStrategyModel.DMAlarmCategory.Name, VideoDevs = null, Professional = linkageStrategyModel.Professional, }; if (_cameraActives.Count > 0) { alarmListRedis.IsRecord = true; var videoDevids = _cameraActives.Keys; alarmListRedis.VideoDevs = new List(); foreach (var cameraId in _cameraActives.Keys) { var video = _webApiRequest.GetVideoDevDataByCameraId(cameraId); alarmListRedis.VideoDevs.Add(video); } } else { alarmListRedis.IsRecord = false; alarmListRedis.VideoDevs = null; } alarmListRedis.AlarmContent = $"{linkageStrategyModel.Name}_{resStr}数据触发报警联动"; _alarmListRedisBlock.Post(alarmListRedis); }); } /// /// 处理遥信报警 /// /// /// public Task TelesignalAlarmAsync(EquipmentDataModel e, TelesignalisationModel selesignal) { return Task.Run(() => { try { AlarmListRedis alarmListRedis = new AlarmListRedis() { Id = selesignal.Id, IsRecord = false, DMAlarmCategory = selesignal.DMAlarmCategory, IsClear = false, AlarmContent = "", AlarmDateTime = selesignal.ResultTime.ToString("yyyy-MM-dd HH:mm:ss"), AlarmLevelName = selesignal.DMAlarmCategory.Name, VideoDevs = null, Professional = e.EquipmentTypeTypeName }; alarmListRedis.AlarmContent = $"{e.EquipmentInfoName} {selesignal.Name} {selesignal.ResultValueStr}"; _alarmListRedisBlock.Post(alarmListRedis); } catch (Exception ex) { Log4Helper.Error(this.GetType(), ex); } }); } /// /// 处理遥测报警 /// /// /// public Task TelemeteringAlarmAsync(EquipmentDataModel e, TelemeteringModel telemetering, TelemeteringAlarmStrategyProperty alarm) { return Task.Run(() => { try { AlarmListRedis alarmListRedis = new AlarmListRedis() { Id = alarm.Id, IsRecord = false, DMAlarmCategory = alarm.DMAlarmCategory, IsClear = false, AlarmContent = "", AlarmDateTime = telemetering.ResultTime.ToString("yyyy-MM-dd HH:mm:ss"), AlarmLevelName = alarm.DMAlarmCategory.Name, VideoDevs = null, Professional= e.EquipmentTypeTypeName }; alarmListRedis.AlarmContent = $"{e.EquipmentInfoName} {telemetering.Name}:{telemetering.ResultValue}{telemetering.Unit} 数值异常"; _alarmListRedisBlock.Post(alarmListRedis); } catch (Exception ex) { Log4Helper.Error(this.GetType(), ex); } }); } } }