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();
});
}
}
}