using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using IStation.Calculation; namespace IStation.Server { /// /// 报警中断分析任务 /// [DisallowConcurrentExecution]//此特性标识 必须等待这次任务执行完成后,才能执行下次任务 public class AlarmInterruptAnalyJob : IJob { /// /// /// /// /// public Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { #region 加载目标客户 var corpIds = CorpHelper.GetCorpIds(); if (corpIds == null || corpIds.Count < 1) { LogHelper.Info("报警中断分析任务中,未检索到目标客户信息"); return; } #endregion #region 加载所有数据中断报警配置 var configureList = new Service.MonitorAlarmConfigure().GetByCorpIds(corpIds); if (configureList == null || configureList.Count < 1) { LogHelper.Info("报警中断分析任务中,未检索到监测报警配置!"); return; } configureList = configureList.Where(x => x.AlarmType == Alarm.Type_Interrupted).ToList(); if (configureList.Count < 1) { LogHelper.Info("报警中断分析任务中,未检索到数据中断监测报警配置!"); return; } configureList = configureList.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList(); if (configureList.Count < 1) { LogHelper.Info("报警中断分析任务中,未检索到有效数据中断监测报警配置!"); return; } #endregion #region 遍历分析 var service_record = new Service.MonitorRecord(); var service_monitor = new Service.MonitorPoint(); var service_signal = new Service.Signal(); var service_alarm = new Service.MonitorAlarmRecord(); foreach (var configure in configureList) { if (!configure.MonitorPointID.HasValue) continue; if (double.TryParse(configure.ThresholdValue, out double thresholdValue)) { var monitor = service_monitor.GetByID(configure.CorpID,configure.MonitorPointID.Value); if (monitor == null) continue; if (monitor.UseStatus != Model.eUseStatus.Enable) continue; Model.Signal signal = null; DateTime? lastTime = null; if (!configure.SignalID.HasValue) { var lastRecordList = service_record.GetLastRecord(configure.CorpID, configure.MonitorPointID.Value); if (lastRecordList != null && lastRecordList.Count > 0) { lastTime = lastRecordList.Max(t => t.DataTime); } } else { signal = service_signal.GetByID(configure.CorpID,configure.SignalID.Value); if (signal == null) continue; var lastRecord = service_record.GetLastRecord(configure.CorpID, configure.MonitorPointID.Value, configure.SignalID.Value); if (lastRecord != null) { lastTime = lastRecord.DataTime; } } if (AlarmInterruptAnalyHelper.IsAlarm(configure.CorpID, configure.MonitorPointID.Value, configure.SignalID, lastTime, thresholdValue)) { var alarm = MonitorAlarmCalcuHelper.Create(monitor,signal,configure,null); var bol = service_alarm.InsertLastRecord(alarm); if (!bol) { LogHelper.Error($"报警中断分析任务中,客户标识:{configure.CorpID},配置标识:{configure.ID},报警记录保存失败!"); } } } } #endregion } catch (Exception ex) { LogHelper.Error("报警中断分析任务出错", ex); var e = new JobExecutionException(ex); throw e; } }); } } }