using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using IStation.Calculation; namespace IStation.Server { /// /// 当前报警分析任务辅助类 /// public class AlarmCurrentAnalyJobHelper : IJobHelper { private readonly RabbitMqExChangeHelper _queueHelper = new RabbitMqExChangeHelper(); /// /// 开始任务 /// public Task StartJob() { return Task.Run(() => { _queueHelper.Receive>(ConfigHelper.RunExchangeName, (list) => { try { if (list == null || list.Count < 1) { LogHelper.Info("当前报警分析任务中,数据序列化失败"); return true; } var service_monitor = new Service.MonitorPoint(); var service_signal = new Service.Signal(); var service_alarm_configure = new Service.MonitorAlarmConfigure(); var service_alarm_record = new Service.MonitorAlarmRecord(); var group_list = list.GroupBy(x => new { x.CorpID, x.MonitorPointID }).ToList(); //循环遍历 foreach (var group in group_list) { var monitor = service_monitor.GetByID(group.Key.CorpID, group.Key.MonitorPointID); if (monitor == null) continue; if (monitor.UseStatus != Model.eUseStatus.Enable) continue; var configure_only_list = service_alarm_configure.GetOnlyByMonitorPointID(group.Key.CorpID, group.Key.MonitorPointID); configure_only_list = configure_only_list?.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList(); if (configure_only_list != null&&configure_only_list.Count>0) { foreach (var configure_only in configure_only_list) { if (MonitorAlarmCalcuHelper.Verify(configure_only, null, () => MonitorRecord4AlarmCacheHelper.GetFirstByMonitorPointID(monitor.CorpID, monitor.ID), () => MonitorRecord4AlarmCacheHelper.GetFirstUnChangedByMonitorPointID(monitor.CorpID, monitor.ID))) { var alarm = MonitorAlarmCalcuHelper.Create(monitor, null, configure_only, null); service_alarm_record.InsertLastRecord(alarm); } } } foreach (var record in group) { var signal = service_signal.GetByID(record.CorpID, record.SignalID); if (signal == null) continue; var configure_list = service_alarm_configure.GetBySignalID(signal.CorpID, signal.MonitorPointID, signal.ID); if (configure_list == null || configure_list.Count < 1) { configure_list = service_alarm_configure.GetCommonBySignalType(signal.CorpID, signal.SignalType); if (configure_list == null || configure_list.Count < 1) continue; } configure_list = configure_list.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList(); if (configure_list != null && configure_list.Count > 0) { foreach (var configure in configure_list) { if (MonitorAlarmCalcuHelper.Verify(configure, record, () => MonitorRecord4AlarmCacheHelper.GetBySignalID(signal.CorpID, signal.MonitorPointID, signal.ID), () => MonitorRecord4AlarmCacheHelper.GetUnChangedBySignalID(signal.CorpID, signal.MonitorPointID, signal.ID))) { var alarm = MonitorAlarmCalcuHelper.Create(monitor, signal, configure, record); service_alarm_record.InsertLastRecord(alarm); } } } } } //设置缓存 MonitorRecord4AlarmCacheHelper.Set(list); return true; } catch (Exception ex) { LogHelper.Error("当前报警分析任务中,数据消息队列出错,自动跳过", ex); return true; } }); }); } /// /// 取消任务 /// public Task CancelJob() { return Task.Run(() => { if (_queueHelper == null) return; _queueHelper.Close(); }); } } }