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

430 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//2021年4月14日16点36分 联动的时候不在多次登录NVR,
using Abp.Dependency;
using Newtonsoft.Json.Linq;
using System.Collections.Concurrent;
using VideoSurveillanceAdapter;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.AlarmQueue;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.DataCollection;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.Helper;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.Model;
using Yunda.ISAS.DataMonitoringServer.DataCenter;
using YunDa.ISAS.Core.Entity;
using YunDa.ISAS.DataTransferObject.DataMonitoring.LinkageExecuteActivityDto;
using YunDa.ISAS.DataTransferObject.VideoSurveillance.PresetPointDto;
using YunDa.ISAS.Entities.MySQL.DataMonitoring;
using YunDa.ISAS.ExternalInteraction.DataTransferObject.InspectionEquipment;
namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis.LinkageAnalysis
{
public class ImpletementLinkActives : ISingletonDependency
{
private readonly CameraDataCenter _cameraDataCenter;
private readonly WebApiRequest _webApiRequest;
private readonly ConfigurationHepler _configurationHepler;
private readonly RunningDataCache _runningDataCache;
private readonly TeleCommandDataSendTask _teleCommandDataSendTask;
private readonly AlarmQueueDataPublish _alarmQueueDataPublish;
public ImpletementLinkActives(CameraDataCenter cameraDataCenter,
WebApiRequest webApiRequest,
ConfigurationHepler configurationHepler,
RunningDataCache runningDataCache,
TeleCommandDataSendTask teleCommandDataSendTask,
AlarmQueueDataPublish alarmQueueDataPublish
)
{
_cameraDataCenter = cameraDataCenter;
_webApiRequest = webApiRequest;
_configurationHepler = configurationHepler;
_teleCommandDataSendTask = teleCommandDataSendTask;
_runningDataCache = runningDataCache;
_alarmQueueDataPublish = alarmQueueDataPublish;
}
private readonly object locker = new object();
/// <summary>
/// 执行联动
/// </summary>
/// <param name="linkageStrategy"></param>
public Task ExecuteLinkageDataAsync(LinkageStrategyModel linkageStrategy,
string reslutStr,
string code
)
{
List<Guid> cameraActives = new List<Guid>();
Task rstTask = null;
ConcurrentDictionary<Guid, List<LinkageExecuteActivityOutput>> _cameraActives
= new ConcurrentDictionary<Guid, List<LinkageExecuteActivityOutput>>();
var req = new LinkageResultInput
{
TransformerSubstationId = _configurationHepler.SubstationId,
LinkageStrategyId = linkageStrategy.Id,
LinkageStrategyName = linkageStrategy.Name,
LinkageStartTime = DateTime.Now,
AlarmLevel = linkageStrategy.DMAlarmCategory == null ? 0 : linkageStrategy.DMAlarmCategory.Level,
AlarmName = linkageStrategy.DMAlarmCategory?.Name,
DMAlarmCategoryId = linkageStrategy.DMAlarmCategoryId,
LinkageEndTime = null,
Result = reslutStr,
Status = 0,
Message = "",
};
try
{
JObject rstDataJObject = ToolLibrary.HttpHelper.HttpGetRequest<JObject>($"{ConstantModel.RequestLinkageExecuteActivityFindActivityByLinkageIdUri}?linkageId={linkageStrategy.Id}", null);
var rst = rstDataJObject?["result"]?["resultData"];//获取结果集
if (rst == null)
{
return rstTask;
}
var actives = rst.ToObject<List<LinkageExecuteActivityOutput>>();
var listFiles = new List<AttachmentFile>();
///当执行活动为摄像机时,需要异步处理
List<Task> tasks = new List<Task>();
foreach (var item in actives)
{
if (item.ActivityType == ActivityTypeEnum.Video)
{
if (item?.PresetPoint?.VideoDev == null)
{
continue;
}
if (_cameraActives.ContainsKey(item.PresetPoint.VideoDev.Id))
{
_cameraActives[item.PresetPoint.VideoDev.Id].Add(item);
}
else
{
while (!_cameraActives.TryAdd(item.PresetPoint.VideoDev.Id, new List<LinkageExecuteActivityOutput>() { item }))
{
Task.Delay(10).Wait();
}
}
}
else if (item.ActivityType == YunDa.ISAS.Entities.MySQL.DataMonitoring.ActivityTypeEnum.Telecommand) //遥控命令直接执行
{
var equipment = _webApiRequest.GetEquipmentInfo((Guid)item.EquipmentInfoId);
if (equipment != null)
{
if (!equipment.IsActive || equipment.SafetyStateType == YunDa.ISAS.Entities.GeneralInformation.SafetyStateTypeEnum.Disarming)
{
continue;
}
}
/// 执行 发送遥控命令操作
ImplementTeleCommandAction(item, ref req);
MonitoringEventBus.LogHandler(req.Message, "联动遥控信息");
}
}
foreach (var item in _cameraActives)
{
Task task = Task.Run(() =>
{
ExcuteCameraAction(item.Value, ref req, ref listFiles, code);
});
tasks.Add(task);
}
//bool isPersonInvasion = false;
if (linkageStrategy.IsPatternRecognize)
{
foreach (var item in listFiles)
{
var path = Path.GetFullPath("./CaptureJPEGPicture/" + item.FileName);
if (File.Exists(path))
{
var res = _webApiRequest.GetPatternRecongnozeResult(path);
if (res!="")
{
reslutStr += ";图形复核结果:"+ res;
//isPersonInvasion = true;
}
}
}
}
_alarmQueueDataPublish.LinkageAlarmAsync(linkageStrategy, reslutStr, _cameraActives);
//当动作执行完后进行异步上传文件
rstTask = Task.WhenAll(tasks.ToArray()).ContinueWith((t) =>
{
try
{
req.LinkageEndTime = DateTime.Now;
req.LinkageFiles = listFiles;
string filePath = _webApiRequest.GetRelativePath(ref req); //获取相对路径
foreach (var item in listFiles)
{
if (item.FileType == AttachmentFileType.Photo)
{
var path = Path.GetFullPath("./CaptureJPEGPicture/" + item.FileName);
if (File.Exists(path))
{
string result = _webApiRequest.ResumeFile(ConstantModel.RequestLinkageResultFileUploadUri, path, filePath, 0, 1024 * 128);
MonitoringEventBus.LogHandler($"{item.FileName}_{result}", "上传联动文件");
//File.Delete(path);
}
}
else if (item.FileType == AttachmentFileType.Video)
{
//var path = Path.GetFullPath("./RecordVideo/" + item.FileName);
//if (File.Exists(path))
//{
// string result = LinkCommuication.Instance.ResumeFile(ConstantModel.RequestLinkageResultFileUploadUri, path, filePath, 0, 1024 * 128);
// MonitoringEventBus.LogHandler($"{ item.FileName}_{result}", "上传联动文件");
// File.Delete(path);
//}
}
}
if (Directory.Exists("./CaptureJPEGPicture/"))
{
var files = Directory.GetFiles("./CaptureJPEGPicture/");
//var delefiles = new List<string>();
foreach (var file in files)
{
if (DateTime.Now - File.GetCreationTime(file) > TimeSpan.FromDays(1))
{
File.Delete(file);
}
}
}
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.ToString(), "异常信息");
}
});
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.ToString(), "异常信息");
}
return rstTask;
}
/// <summary>
/// 执行摄像机动作
/// </summary>
/// <param name="linkageExecuteActivities"></param>
/// <param name="req"></param>
/// <param name="listFiles"></param>
/// <param name="code"></param>
public void ExcuteCameraAction(List<LinkageExecuteActivityOutput> linkageExecuteActivities,
ref LinkageResultInput req,
ref List<AttachmentFile> listFiles,
string code
)
{
try
{
foreach (var linkageExecuteActivity in linkageExecuteActivities)
{
if (linkageExecuteActivity.KeepTime == null)
{
linkageExecuteActivity.KeepTime = 0;
}
var camera = _webApiRequest.GetVideoDevData(linkageExecuteActivity.PresetPointId).Item1;
if (camera == null)
{
break;
}
var apply = _webApiRequest.GetApplyControlToExternalstr(camera.Id,
(int)linkageExecuteActivity.KeepTime, code);
if (!apply)
{
MonitoringEventBus.LogHandler(camera.DevName + "权限获取失败", "摄像头error");
return;
}
var preset = _webApiRequest.GetVideoDevData(linkageExecuteActivity.PresetPointId).Item2;
var nvr = camera.Parent;
CameraBrand cb = CameraBrand.None;
Enum.TryParse(nvr.ManufacturerInfo.ManufacturerCode, out cb);
if (cb == CameraBrand.None)
{
MonitoringEventBus.LogHandler("[" + nvr.DevName + "]NVR厂商品牌不正确", "摄像头error");
return;
}
VideoPlayer videoPlayer = new VideoPlayer();
videoPlayer.CameraConfigure = new CameraConfigure
{
ID = nvr.Id.ToString(),
Name = nvr.DevName,
Ip = nvr.IP,
Port = (int)nvr.Port,
UserName = nvr.DevUserName,
Password = nvr.DevPassword,
IsRecordVideo = false,
//VideoPath = @".\Video\",
//CapturePath = @".\Capture\",
CameraBrand = cb,
//PlayChannel = Convert.ToInt32(camera.ChannelNo)
};
try
{
var player = _cameraDataCenter.FindCamera(videoPlayer);
if (player == null)
{
var isloginSuccess = videoPlayer.LoginCamera();
if (isloginSuccess)
{
_cameraDataCenter.CameraCollection.Add(videoPlayer);
}
else
{
MonitoringEventBus.LogHandler($"{videoPlayer.CameraConfigure.Name}登陆失败", "异常信息");
return;
}
}
else
{
videoPlayer = player;
}
bool isSccess = videoPlayer.GotoPreset(preset.Number, Convert.ToInt32(camera.ChannelNo)); ///转到预置位 枪机不同的型号表现不同,这里采用不管转预置位的成功与否
//是否拍照
if (linkageExecuteActivity.IsCapturePicture)
{
Task.Delay(linkageExecuteActivity.KeepTime.HasValue ? (int)linkageExecuteActivity.KeepTime * 1000 : 0).Wait();
// 执行拍照动作
var req1 = new ApplyControlToExternalInput()
{
Code = code,
CamNames = new List<string>() { camera.DevName }
};
_webApiRequest.SendFreeCamAuth(req1);
var res = LinkActivesCaptureJPEGPicture(videoPlayer, camera, preset, ref listFiles);
//if (camera.IsInfraredCamera)
//{
// var res = LinkActivesCaptureJPEGPicture(videoPlayer, camera, preset, ref listFiles);
// var filePath = res.Item2;
// if (res.Item1) //拍照成功
// {
// //根据预置点查找测温点信息
// List<MeasureTemperaturePoint> mesurePonitInfos = _webApiRequest.GetMeasurePointInfoByPresetPointId(preset.Id);
// DrawMeasurePointInfo(mesurePonitInfos, ref filePath);
// }
//}
//else
//{
// var res = LinkActivesCaptureJPEGPicture(videoPlayer, camera, preset, ref listFiles);
//}
}
//是否录像
if (linkageExecuteActivity.IsRecordVideo)
{
//var res = LinkActivesRecordVideoAsync(videoPlayer, camera, preset, linkageExecuteActivity.RecordDuration).GetAwaiter().GetResult();
//if (res.Item1)
//{
// req.Message += $"相机:{camera.DevName}\r\n预置点:{preset.Name}\r\n结果信息:录像成功\r\n";
// if (res.Item3 != null)
// listFiles.AddRange(res.Item3);
//}
//else
//{
// req.Message += $"相机:{camera.DevName}\r\n预置点:{preset.Name}\r\n结果信息:录像失败\r\n";
//}
}
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.ToString(), "摄像头error");
}
}
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.ToString(), "异常信息");
}
}
//private void DrawMeasurePointInfo(List<MeasureTemperaturePoint> mesurePonitInfos, ref string filePath)
//{
// foreach (var mesurePonitInfo in mesurePonitInfos)
// {
// var tmpValue = _webApiRequest.GetMeasurePointNearestValue((Guid)mesurePonitInfo.PresetPointId, mesurePonitInfo.Number);
// List<MeasureTempCoordinate> measureTempCoordinates = JsonConvert.DeserializeObject<List<MeasureTempCoordinate>>(mesurePonitInfo.CoordinateJsonStr);
// if (measureTempCoordinates != null && measureTempCoordinates.Count > 0)
// {
// SkiaSharpHandlePicture skiaSharpHandlePicture = new SkiaSharpHandlePicture();
// //温度值采用四舍五入的方式保留两位小数
// //绘图
// //返回的文件路径作为下次绘图的底图
// skiaSharpHandlePicture.Bitmap(measureTempCoordinates, ref filePath, $"{mesurePonitInfo.Name}:{ Math.Round(tmpValue, 2)}℃");
// }
// }
//}
/// <summary>
/// 截图
/// </summary>
/// <param name="videoPlayer"></param>
/// <param name="camera"></param>
/// <param name="preset"></param>
private (bool, string) LinkActivesCaptureJPEGPicture(VideoPlayer videoPlayer, VideoDev camera,
PresetPointProperty preset, ref List<AttachmentFile> listFiles)
{
if (!Directory.Exists("./CaptureJPEGPicture"))
{
Directory.CreateDirectory("./CaptureJPEGPicture");
}
var name = $"{camera.DevName}_{preset.Name}_{DateTime.Now.ToString("HHmmss")}_{Guid.NewGuid().ToString()}.jpg";
var fileName = $"./CaptureJPEGPicture/{name}";
var filePath = Path.GetFullPath(fileName);
var res = videoPlayer.CaptureJPEGPicture(filePath, Convert.ToInt32(camera.ChannelNo));
if (res)
{
listFiles.Add(new AttachmentFile
{
FileExtension = ".jpg",
FileName = name,
FileType = AttachmentFileType.Photo
});
}
return (res, filePath);
}
/// <summary>
/// 执行遥控联动
/// </summary>
/// <param name="item"></param>
public void ImplementTeleCommandAction(LinkageExecuteActivityOutput item, ref LinkageResultInput req)
{
try
{
var telecommand = _runningDataCache.TelecommandModels.FirstOrDefault(t => t.Id == item.TelecommandConfigurationId);
if (telecommand != null)
{
telecommand.CommandValue = item.TelecommandValue;
telecommand.Source = "服务联动";
telecommand.Sender = telecommand.Name;
//发送给104装置
_teleCommandDataSendTask.TelecommandTActionBlock.Post(new DataCollection.TelcommandDataModel()
{
Telecommand = telecommand
});
}
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.ToString(), "异常信息");
}
}
}
}