using Cis.Application.Cb; using Cis.Application.Cm; using Cis.Application.Tb; using System.Collections.Concurrent; namespace Cis.Application.Core; public class CameraDataCenter { #region Attr private readonly SqlSugarRepository _cbCameraRep; private readonly SqlSugarRepository _cmMarkLableRep; private readonly SqlSugarRepository _tbPtzCameraRep; private readonly PtzServerApi _ptzServerApi; private readonly CameraDataOptions options = App.GetOptions(); private Thread _thread { get; set; } /// /// (cbCameraId, MarkSearcherBase) /// private ConcurrentDictionary _markSearcherDict { get; set; } = new(); /// /// (cbCameraId, cbCameraIp) /// private Dictionary _cbCameraId2IpDict { get; set; } = new(); /// /// (cameraIp, TbPtzCamera) /// private ConcurrentDictionary _tbPtzCameraDict { get; set; } = new(); /// /// (cameraIp, PtzInfo) /// private ConcurrentDictionary _cameraPtzInfoDict { get; set; } = new(); #endregion Attr public CameraDataCenter() { _cbCameraRep = App.GetService>(); _cmMarkLableRep = App.GetService>(); _tbPtzCameraRep = App.GetService>(); _ptzServerApi = App.GetService(); Init(); } private void Init() { if (!options.LazyInit) { List list = _tbPtzCameraRep.GetList(); // 根据 Ip 去重 foreach (TbPtzCamera item in list) { if (!_tbPtzCameraDict.ContainsKey(item.Ip)) _tbPtzCameraDict[item.Ip] = item; } } // 初始化 thread _thread = new Thread(WorkLoop) { IsBackground = true// 设置后台线程 }; _thread.Start(); } #region Loop /// /// 循环运行 /// private void WorkLoop() { while (true) { RefreshPtzInfoByApi(); RefreshMarkSearcher(); Thread.Sleep(options.LoopInterval); } } private void RefreshPtzInfoByApi() { foreach (TbPtzCamera item in _tbPtzCameraDict.Values) { PtzInfo ptzInfo = _ptzServerApi.GetPtzInfo(item.CameraId); _cameraPtzInfoDict[item.Ip] = ptzInfo; } } private void RefreshMarkSearcher() { foreach (KeyValuePair pair in _markSearcherDict) { long cameraId = pair.Key; MarkSearcherBase markSearcher = pair.Value; string cameraIp = _cbCameraId2IpDict[cameraId]; if (cameraIp == null) continue; PtzInfo ptzInfo = _cameraPtzInfoDict[cameraIp]; if (ptzInfo == null) continue; markSearcher.UpdateCameraCalcInfo(ptzInfo); List resultList = markSearcher.Calc(); } } #endregion Loop #region external call /// /// 激活 cbCamera 进入运算 /// /// /// public bool ActiveCamera(long cameraId) { CbCamera cbCamera = _cbCameraRep.GetById(cameraId); if (cbCamera == null) return false; TbPtzCamera tbPtzCamera; string cameraIp = cbCamera.Ip; if (!_tbPtzCameraDict.IsExistKey(cameraIp)) { tbPtzCamera = _tbPtzCameraRep.GetFirst(u => u.Ip == cameraIp); if (tbPtzCamera == null) return false; _tbPtzCameraDict[cameraIp] = tbPtzCamera; } else { tbPtzCamera = _tbPtzCameraDict[cameraIp]; } _cbCameraId2IpDict[cbCamera.Id] = cameraIp; CameraCalcInfo cameraCalcInfo = CameraCalcInfo.New(cameraId, _ptzServerApi.GetPtzInfo(tbPtzCamera.Id)); HikMarkSeacher markSeacher = new(cameraCalcInfo); List cmMarkLabelList = _cmMarkLableRep.GetList(u => u.CbCameraId == cameraId); foreach (CmMarkLabel item in cmMarkLabelList) { MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( item.Id, PtzInfo.New(item.PanPosition, item.TiltPosition, item.ZoomPosition), item.CanvasWidth, item.CanvasHeight, item.CanvasLeft, item.CanvasTop ); markSeacher.AddMarkLabelCalcInfo(markLabelCalcInfo); } _markSearcherDict[cameraId] = markSeacher; return true; } /// /// 解除 cbCamera 进入运算 /// /// /// public bool DeActiveCamera(long cameraId) { return false; } public bool UpdateCamera(long cameraId, long markLabelId) { return false; } #endregion external call }