2024-08-21 16:50:14 +08:00

188 lines
7.7 KiB
C#

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<AlarmListRedis> _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<AlarmListRedis>(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;
}
/// <summary>
/// 处理联动报警
/// </summary>
/// <param name="linkageStrategyModel"></param>
/// <param name="configurationId"></param>
/// <param name="resStr"></param>
/// <param name="_cameraActives"></param>
public Task LinkageAlarmAsync(LinkageStrategyModel linkageStrategyModel,
//Guid configurationId,
string resStr,
ConcurrentDictionary<Guid, List<LinkageExecuteActivityOutput>> _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<VideoDevProperty>();
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);
});
}
/// <summary>
/// 处理遥信报警
/// </summary>
/// <param name="e"></param>
/// <param name="selesignal"></param>
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);
}
});
}
/// <summary>
/// 处理遥测报警
/// </summary>
/// <param name="e"></param>
/// <param name="telemetering"></param>
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);
}
});
}
}
}