jeremy пре 9 месеци
родитељ
комит
58dd4eef9b

+ 197 - 7
Service/AIDiagnosisService.URM.cs

@@ -186,6 +186,61 @@ namespace WingAIDiagnosisService.Service
             return resultData;
         }
 
+        /// <summary>
+        /// URM后处理-预加载
+        /// </summary>
+        /// <param name="request">URM后处理请求实体</param>
+        /// <returns>URM后处理结果</returns>
+        /// <value></value>
+        /// <errorCodes></errorCodes>
+        public async Task<bool> LoadURMProcessAsync(URMProcessRequest request)
+        {
+            DeleteExpiredFolders(DateTime.Now.AddDays(-1));
+            var remedicalCode = request.RemedicalCode;
+            try
+            {
+                if (!string.IsNullOrWhiteSpace(remedicalCode))
+                {
+                    var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
+                    // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
+                    if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
+                        && remedical.UrmParameters != null && remedical.UrmParameters.Any())
+                    {
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMProcessAsync start, remedicalCode:{remedicalCode}");
+                        var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
+                        if (!Directory.Exists(currentFolder))
+                        {
+                            Directory.CreateDirectory(currentFolder);
+                        }
+                        await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
+                        try
+                        {
+                            File.WriteAllText(Path.Combine(currentFolder, "readme.txt"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+                        }
+                        catch
+                        {
+
+                        }
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMProcessAsync InitURMProcessor start, remedicalCode:{remedicalCode}");
+                        var urmProcessRequest = ConvertToUrmRequest<URMProcessRequest, UrmProcessRequest>(request, remedical, currentFolder);
+                        urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
+                        URMAnalysisManager.InitURMProcessor(urmProcessRequest);
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMProcessAsync InitURMProcessor end, remedicalCode:{remedicalCode}");
+                        return true;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"AIDiagnosisService LoadURMProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"AIDiagnosisService LoadURMProcessAsync finally, remedicalCode:{remedicalCode}");
+            }
+            return false;
+        }
+
         /// <summary>
         /// URM后处理
         /// </summary>
@@ -221,12 +276,19 @@ namespace WingAIDiagnosisService.Service
                         {
 
                         }
+                        Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync DoUrmProcess start, remedicalCode:{remedicalCode}");
                         var urmProcessRequest = ConvertToUrmRequest<URMProcessRequest, UrmProcessRequest>(request, remedical, currentFolder);
-                        var base64String = URMAnalysisManager.DoUrmProcess(urmProcessRequest);
-                        Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
+                        urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
+
+                        double urmMinVal = 0;
+                        double urmMaxVal = 0;
+                        var base64String = URMAnalysisManager.DoUrmProcess(urmProcessRequest, ref urmMinVal, ref urmMaxVal);
+                        Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync DoUrmProcess end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
                         return new URMProcessResult
                         {
                             Base64String = base64String,
+                            UrmMinVal = urmMinVal,
+                            UrmMaxVal = urmMaxVal,
                         };
                     }
                 }
@@ -287,6 +349,67 @@ namespace WingAIDiagnosisService.Service
             }
         }
 
+        /// <summary>
+        /// URM视频后处理-预加载
+        /// </summary>
+        /// <param name="request">URM视频后处理请求实体</param>
+        /// <returns>URM视频后处理结果</returns>
+        /// <value></value>
+        /// <errorCodes></errorCodes>
+        public async Task<bool> LoadURMVideoProcessAsync(URMVideoProcessRequest request)
+        {
+            DeleteExpiredFolders(DateTime.Now.AddDays(-1));
+            var remedicalCode = request.RemedicalCode;
+            try
+            {
+                if (!string.IsNullOrWhiteSpace(remedicalCode))
+                {
+                    var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
+                    // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
+                    if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
+                        && remedical.UrmParameters != null && remedical.UrmParameters.Any())
+                    {
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMVideoProcessAsync start, remedicalCode:{remedicalCode}");
+                        var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
+                        if (!Directory.Exists(currentFolder))
+                        {
+                            Directory.CreateDirectory(currentFolder);
+                        }
+                        await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
+                        try
+                        {
+                            File.WriteAllText(Path.Combine(currentFolder, "readme.txt"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+                        }
+                        catch { }
+                        var urmProcessRequest = ConvertToUrmRequest<URMVideoProcessRequest, DoUrmVideoProcessRequest>(request, remedical, currentFolder);
+                        urmProcessRequest.VideoFrame = request.VideoFrame;
+                        urmProcessRequest.URMVideoScaler = request.URMVideoScaler;
+                        urmProcessRequest.URMVideoParameter = request.URMVideoParameter;
+                        urmProcessRequest.URMVideoType = request.URMVideoType;
+                        var pointsPath = Path.Combine(currentFolder, "URMPoints.bin");
+                        var pointNumsPath = Path.Combine(currentFolder, "URMPointNums.bin");
+                        urmProcessRequest.PointsDataPath = File.Exists(pointsPath) ? pointsPath : string.Empty;
+                        urmProcessRequest.PointNumsDataPath = File.Exists(pointNumsPath) ? pointNumsPath : string.Empty;
+                        urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
+
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMVideoProcessAsync InitVideoProcessor start, remedicalCode:{remedicalCode}");
+                        URMAnalysisManager.InitVideoProcessor(urmProcessRequest);
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMVideoProcessAsync InitVideoProcessor end, remedicalCode:{remedicalCode}");
+                        return true;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"AIDiagnosisService LoadURMVideoProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"AIDiagnosisService LoadURMVideoProcessAsync finally, remedicalCode:{remedicalCode}");
+            }
+            return false;
+        }
+
         /// <summary>
         /// URM视频后处理
         /// </summary>
@@ -330,8 +453,9 @@ namespace WingAIDiagnosisService.Service
                         urmProcessRequest.PointNumsDataPath = File.Exists(pointNumsPath) ? pointNumsPath : string.Empty;
                         urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
 
+                        Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync DoUrmVideoProcess start, remedicalCode:{remedicalCode}");
                         var base64String = URMAnalysisManager.DoUrmVideoProcess(urmProcessRequest);
-                        Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
+                        Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync DoUrmVideoProcess end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
                         return new URMVideoProcessResult
                         {
                             Base64String = base64String,
@@ -350,6 +474,65 @@ namespace WingAIDiagnosisService.Service
             return new URMVideoProcessResult();
         }
 
+        /// <summary>
+        /// URM测量-预加载
+        /// </summary>
+        /// <param name="request">URM测量后处理测量请求实体</param>
+        /// <returns>URM测量后处理结果</returns>
+        /// <value></value>
+        /// <errorCodes></errorCodes>
+        public async Task<bool> LoadURMMeasureProcessAsync(URMMeasureProcessRequest request)
+        {
+            DeleteExpiredFolders(DateTime.Now.AddDays(-1));
+            var remedicalCode = request.RemedicalCode;
+            try
+            {
+                if (!string.IsNullOrWhiteSpace(remedicalCode))
+                {
+                    var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
+                    // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
+                    if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
+                        && remedical.UrmParameters != null && remedical.UrmParameters.Any())
+                    {
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMMeasureProcessAsync start, remedicalCode:{remedicalCode}");
+                        var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
+                        if (!Directory.Exists(currentFolder))
+                        {
+                            Directory.CreateDirectory(currentFolder);
+                        }
+                        await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
+                        try
+                        {
+                            File.WriteAllText(Path.Combine(currentFolder, "readme.txt"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+                        }
+                        catch { }
+                        var urmProcessRequest = ConvertToUrmRequest<URMMeasureProcessRequest, UrmMeasureProcessRequest>(request, remedical, currentFolder);
+                        urmProcessRequest.UrmMeasureType = (URMMeasureType)request.UrmMeasureType;
+                        urmProcessRequest.SrcDPoints = request.SrcDPoints?.Select(p => new DPoint { X = p.X, Y = p.Y })?.ToList() ?? new List<DPoint>();
+                        urmProcessRequest.CMlength = request.CMlength;
+                        urmProcessRequest.Phywidth = request.Phywidth;
+                        urmProcessRequest.ROIType = (URMROIType)request.ROIType;
+                        urmProcessRequest.ShellWidth = request.ShellWidth;
+                        urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
+
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMMeasureProcessAsync InitURMMeasureProcessor start, remedicalCode:{remedicalCode}");
+                        URMAnalysisManager.InitURMMeasureProcessor(urmProcessRequest);
+                        Logger.WriteLineInfo($"AIDiagnosisService LoadURMMeasureProcessAsync InitURMMeasureProcessor end, remedicalCode:{remedicalCode}");
+                        return true;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"AIDiagnosisService LoadURMMeasureProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"AIDiagnosisService LoadURMMeasureProcessAsync finally, remedicalCode:{remedicalCode}");
+            }
+            return false;
+        }
+
         /// <summary>
         /// URM测量
         /// </summary>
@@ -389,13 +572,19 @@ namespace WingAIDiagnosisService.Service
                         urmProcessRequest.Phywidth = request.Phywidth;
                         urmProcessRequest.ROIType = (URMROIType)request.ROIType;
                         urmProcessRequest.ShellWidth = request.ShellWidth;
+                        urmProcessRequest.GUID = urmProcessRequest.GetUniqueCode();
 
-                        var output = URMAnalysisManager.MeasureProcess(remedicalCode, urmProcessRequest, out string perfusionImgBase64);
-                        Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync end, remedicalCode:{remedicalCode}, ResultFlag: {output?.ResultFlag}");
+                        Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync MeasureProcess start, remedicalCode:{remedicalCode}");
+                        double urmMinVal = 0;
+                        double urmMaxVal = 0;
+                        var output = URMAnalysisManager.MeasureProcess(remedicalCode, urmProcessRequest, out string perfusionImgBase64, ref urmMinVal, ref urmMaxVal);
+                        Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync MeasureProcess end, remedicalCode:{remedicalCode}, ResultFlag: {output?.ResultFlag}");
                         if (output != null)
                         {
                             var result = JsonConvert.DeserializeObject<URMMeasureProcessResult>(JsonConvert.SerializeObject(output));
                             result.PerfusionImgBase64 = perfusionImgBase64;
+                            result.UrmMinVal = urmMinVal;
+                            result.UrmMaxVal = urmMaxVal;
                             return result;
                         }
                     }
@@ -550,9 +739,10 @@ namespace WingAIDiagnosisService.Service
                             using (var image1 = Image.Load(bgImageBytes))
                             using (var image2 = Image.Load(currImageBytes))
                             {
-                                image1.Mutate(ctx => {
+                                image1.Mutate(ctx =>
+                                {
                                     ctx.DrawImage(image2, new Point(0, 0), 1f);
-                                    ctx.Resize(new Size(image1.Width/2, image1.Height/2)); // 等比例缩放
+                                    ctx.Resize(new Size(image1.Width / 2, image1.Height / 2)); // 等比例缩放
                                 });
                                 using (MemoryStream ms = new MemoryStream())
                                 {

+ 124 - 76
URMManage/ImagePostProcess.cs

@@ -8,13 +8,14 @@ using Vinno.DataManager.Infrastructure;
 using Vinno.DataManager.Utilities;
 using Vinno.DataTypes;
 using WingServerCommon.Log;
-using static WingAIDiagnosisService.URMManage.UrmProcessRequest;
 
 namespace WingAIDiagnosisService.URMManage
 {
     public partial class URMAnalysisManager
     {
+        public static List<URMProcessorClass> UrmProcessorList = new List<URMProcessorClass>();
         public static List<URMProcessorClass> VideoProcessorList = new List<URMProcessorClass>();
+        public static List<URMProcessorClass> MeasureProcessorList = new List<URMProcessorClass>();
 
         private void WatchingVideoProcessor()
         {
@@ -27,15 +28,33 @@ namespace WingAIDiagnosisService.URMManage
                     {
                         await Task.Delay(TimeSpan.FromSeconds(60));
 
+                        for (int i = UrmProcessorList.Count - 1; i >= 0; i--)
+                        {
+                            var item = UrmProcessorList[i];
+                            if (item.LastActiveTime <= DateTime.UtcNow.AddMinutes(-5))
+                            {
+                                item.Processor.Dispose();
+                                UrmProcessorList.Remove(item);
+                            }
+                        }
                         for (int i = VideoProcessorList.Count - 1; i >= 0; i--)
                         {
                             var item = VideoProcessorList[i];
                             if (item.LastActiveTime <= DateTime.UtcNow.AddMinutes(-5))
                             {
-                                item.VideoProcessor.Dispose();
+                                item.Processor.Dispose();
                                 VideoProcessorList.Remove(item);
                             }
                         }
+                        for (int i = MeasureProcessorList.Count - 1; i >= 0; i--)
+                        {
+                            var item = MeasureProcessorList[i];
+                            if (item.LastActiveTime <= DateTime.UtcNow.AddMinutes(-5))
+                            {
+                                item.Processor.Dispose();
+                                MeasureProcessorList.Remove(item);
+                            }
+                        }
                     }
                 }
                 catch (Exception e)
@@ -49,20 +68,16 @@ namespace WingAIDiagnosisService.URMManage
         /// URM后处理 Draw Image
         /// </summary>
         /// <param name="request"></param>
-        public string DoUrmProcess(UrmProcessRequest request)
+        public string DoUrmProcess(UrmProcessRequest request, ref double urmMinVal, ref double urmMaxVal)
         {
             var imgBase64 = "";
+            InitURMProcessor(request);
             try
             {
-                var initResult = InitURMProcess(request);
-                var UrmProcessor = initResult.Item1;
-                var URMProcessInitSuccess = initResult.Item2;
-                if (URMProcessInitSuccess)
-                {
-                    UrmProcessor.CalTracePointMask(request.UrmTraceDPoints);
-                    imgBase64 = UrmProcessor.getURMImageBase64();
-                }
-                UrmProcessor.Dispose();
+                var processor = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
+                processor.LastActiveTime = DateTime.UtcNow;
+                processor.Processor.CalTracePointMask(request.UrmTraceDPoints);
+                imgBase64 = processor.Processor.getURMImageBase64(ref urmMinVal, ref urmMaxVal);
             }
             catch (Exception ex)
             {
@@ -76,25 +91,23 @@ namespace WingAIDiagnosisService.URMManage
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
-        public URMMeasureDataOutput MeasureProcess(string remedicalCode, UrmMeasureProcessRequest request, out string perfusionImgBase64)
+        public URMMeasureDataOutput MeasureProcess(string remedicalCode, UrmMeasureProcessRequest request, out string perfusionImgBase64, ref double urmMinVal, ref double urmMaxVal)
         {
+            InitURMMeasureProcessor(request);
             try
             {
-                var initResult = InitURMMeasureProcess(request);
-                var UrmProcessor = initResult.Item1;
-                var URMProcessInitSuccess = initResult.Item2;
-                double urmMaxVal = 0;
-                double urmMinVal = 0;
-                if (URMProcessInitSuccess)
-                {
-                    UrmProcessor.getUrmVal(ref urmMaxVal, ref urmMinVal);
-                }
+                var processor = MeasureProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
+                processor.LastActiveTime = DateTime.UtcNow;
+
+                urmMinVal = 0;
+                urmMaxVal = 0;
+                processor.Processor.getUrmVal(ref urmMinVal, ref urmMaxVal);
                 int samplingPoints = 256; // 采样点数量 (cmlength 不传的话,默认是 256)
                 if (request.CMlength != null)
                 {
                     samplingPoints = (int)(request.CMlength * 1000);
                 }
-                URMMeasure urmMeasure = new URMMeasure(UrmProcessor);
+                URMMeasure urmMeasure = new URMMeasure(processor.Processor);
                 var param = new URMMeasureDataInput();
                 param.SrcDPoints = request.SrcDPoints;
                 param.phywidth = request.Phywidth;
@@ -109,7 +122,6 @@ namespace WingAIDiagnosisService.URMManage
                 // 获取灌注图 example
                 IntPtr imgPtr = outresult.PerfusionImgData.Start;
                 perfusionImgBase64 = ConvertImageToBase64(remedicalCode, imgPtr, outresult.PerfusionPiexlRect.Width, outresult.PerfusionPiexlRect.Height);
-                UrmProcessor.Dispose();
                 return outresult;
             }
             catch (Exception ex)
@@ -164,7 +176,7 @@ namespace WingAIDiagnosisService.URMManage
             {
                 var videoProcessor = VideoProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
                 videoProcessor.LastActiveTime = DateTime.UtcNow;
-                imgBase64 = videoProcessor.VideoProcessor.getURMVideoImg(request.VideoFrame);
+                imgBase64 = videoProcessor.Processor.getURMVideoImg(request.VideoFrame);
             }
             catch (Exception ex)
             {
@@ -174,13 +186,16 @@ namespace WingAIDiagnosisService.URMManage
         }
 
 
-        private void InitVideoProcessor(DoUrmVideoProcessRequest request)
+        public URMProcessorClass InitVideoProcessor(DoUrmVideoProcessRequest request)
         {
-
+            URMProcessorClass processorClass = null;
             try
             {
-                if (!VideoProcessorList.Select(x => x.GUID).Contains(request.GUID))
+                processorClass = VideoProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
+                if (processorClass == null)
                 {
+                    double urmMaxVal = 0;
+                    double urmMinVal = 0;
                     NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
                     NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
                     NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
@@ -210,67 +225,100 @@ namespace WingAIDiagnosisService.URMManage
                         );
                     videoProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight
                         );
-                    videoProcessor.PreURMVideo(URMPoints, URMPointNums);
+                    videoProcessor.PreURMVideo(URMPoints, URMPointNums, ref urmMaxVal, ref urmMinVal);
                     videoProcessor.CalTracePointMask(request.UrmTraceDPoints);
-                    VideoProcessorList.Add(new URMProcessorClass { GUID = request.GUID, VideoProcessor = videoProcessor, LastActiveTime = DateTime.UtcNow });
+
+                    processorClass = new URMProcessorClass { GUID = request.GUID, Processor = videoProcessor, LastActiveTime = DateTime.UtcNow, UrmMinVal = urmMinVal, UrmMaxVal = urmMaxVal };
+                    VideoProcessorList.Add(processorClass);
                 }
             }
             catch (Exception ex)
             {
                 Logger.WriteLineWarn($"AIService URMAnalysisManager InitVideoProcessor error, ex:{ex}");
             }
+            return processorClass;
         }
 
-        private Tuple<URMProcess, bool> InitURMProcess(UrmProcessRequest request)
+        public URMProcessorClass InitURMProcessor(UrmProcessRequest request)
         {
-            NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
-            NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
-            NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
-            NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
-            NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
-                                                                                                                                                // 参数设置
-            var UrmProcessor = new URMProcess();
-            var URMProcessInitSuccess = UrmProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
-            UrmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
-            UrmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
-            UrmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
-            UrmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
-            UrmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
-            UrmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
-            UrmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
-            UrmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
-            UrmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
-            UrmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
-            UrmProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer, request.Isliner);
-            UrmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
-            return new Tuple<URMProcess, bool>(UrmProcessor, URMProcessInitSuccess);
+            URMProcessorClass processorClass = null;
+            try
+            {
+                processorClass = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
+                if (processorClass == null)
+                {
+                    NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
+                    NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
+                    NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
+                    NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
+                    NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
+                                                                                                                                                        // 参数设置
+                    var UrmProcessor = new URMProcess();
+                    var URMProcessInitSuccess = UrmProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
+                    UrmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
+                    UrmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
+                    UrmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
+                    UrmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
+                    UrmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
+                    UrmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
+                    UrmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
+                    UrmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
+                    UrmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
+                    UrmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
+                    UrmProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer, request.Isliner);
+                    UrmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
+
+                    processorClass = new URMProcessorClass { GUID = request.GUID, Processor = UrmProcessor, LastActiveTime = DateTime.UtcNow };
+                    UrmProcessorList.Add(processorClass);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"AIService URMAnalysisManager InitURMProcessor error, ex:{ex}");
+            }
+            return processorClass;
         }
 
-        private Tuple<URMProcess, bool> InitURMMeasureProcess(UrmMeasureProcessRequest request)
+        public URMProcessorClass InitURMMeasureProcessor(UrmMeasureProcessRequest request)
         {
-            NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
-            NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
-            NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
-            NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
-            NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
-            // 参数设置
-            var UrmProcessor = new URMProcess();
-            var URMProcessInitSuccess = UrmProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
-            UrmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
-            UrmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
-            UrmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
-            UrmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
-            UrmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
-            UrmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
-            UrmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
-            UrmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
-            UrmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
-            UrmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
-            UrmProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer, request.Isliner);
-            UrmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
-            UrmProcessor.CalTracePointMask(request.UrmTraceDPoints);
-            UrmProcessor.GetURMImage();
-            return new Tuple<URMProcess, bool>(UrmProcessor, URMProcessInitSuccess);
+            URMProcessorClass processorClass = null;
+            try
+            {
+                processorClass = MeasureProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
+                if (processorClass == null)
+                {
+                    NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
+                    NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
+                    NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
+                    NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
+                    NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
+                                                                                                                                                        // 参数设置
+                    var UrmProcessor = new URMProcess();
+                    var URMProcessInitSuccess = UrmProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
+                    UrmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
+                    UrmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
+                    UrmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
+                    UrmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
+                    UrmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
+                    UrmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
+                    UrmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
+                    UrmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
+                    UrmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
+                    UrmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
+                    UrmProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer, request.Isliner);
+                    UrmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
+                    UrmProcessor.CalTracePointMask(request.UrmTraceDPoints);
+                    UrmProcessor.GetURMImage();
+
+                    processorClass = new URMProcessorClass { GUID = request.GUID, Processor = UrmProcessor, LastActiveTime = DateTime.UtcNow };
+                    MeasureProcessorList.Add(processorClass);
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"AIService URMAnalysisManager InitURMMeasureProcessor error, ex:{ex}");
+            }
+            return processorClass;
         }
 
 

+ 3 - 1
URMManage/URMAnalysisManager.cs

@@ -133,6 +133,8 @@ namespace WingAIDiagnosisService.URMManage
                         coverImageWidth = image.Width;
                         coverImageHeight = image.Height;
                     }
+                    double urmMinVal = 0;
+                    double urmMaxVal = 0;
                     var imgBase64 = DoUrmProcess(new UrmProcessRequest
                     {
                         FamilyName = familyName,
@@ -174,7 +176,7 @@ namespace WingAIDiagnosisService.URMManage
                         Roiheight = (int)(coverImageHeight * roiHPercent),
                         ScreenWidth = coverImageWidth,
                         ScreenHeight = coverImageHeight,
-                    });
+                    }, ref urmMinVal, ref urmMaxVal);
                     var mergeFilePath = coverFile;
                     if (!string.IsNullOrWhiteSpace(imgBase64))
                     {

+ 6 - 6
URMManage/URMProcess.cs

@@ -236,11 +236,11 @@ namespace WingAIDiagnosisService.URMManage
             Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
         }
 
-        public string getURMImageBase64()
+        public string getURMImageBase64(ref double urmMinVal, ref double urmMaxVal)
         {
             _urmProcessAlg.SetURMParam(_urmProcessParams);
-            double urmMaxVal = 0; // 这个输出需要给到前端
-            double urmMinVal = 0; // 这个输出需要给到前端
+            urmMinVal = 0; // 这个输出需要给到前端
+            urmMaxVal = 0; // 这个输出需要给到前端
             _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
             Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
             var urmcolormapname = getColormapname((int)_urmType.Current);
@@ -331,11 +331,11 @@ namespace WingAIDiagnosisService.URMManage
             _urmProcessAlg.CalTraceMaskImg(ScreenWidth, ScreenHeight, validPoints);
         }
 
-        public void PreURMVideo(URMPoint[] urmPoints, int[] Pointsnums)
+        public void PreURMVideo(URMPoint[] urmPoints, int[] Pointsnums, ref double urmMaxVal, ref double urmMinVal)
         {
             var vediotable = GetURMColorMap("SRColorMap:ColorMap4");
-            double urmMaxVal = 0;
-            double urmMinVal = 0;
+            urmMaxVal = 0;
+            urmMinVal = 0;
             _urmProcessAlg.SetURMParam(_urmProcessParams);
             _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
             unsafe

+ 175 - 122
URMManage/UrmProcessRequest.cs

@@ -8,6 +8,10 @@ namespace WingAIDiagnosisService.URMManage
 {
     public class UrmProcessRequest
     {
+        /// <summary>
+        /// GUID
+        /// </summary>
+        public string GUID { get; set; }
         //文件路径
         public string DenDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcDenArray.bin";
         public string DirDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\srcDirArray.bin";
@@ -57,148 +61,197 @@ namespace WingAIDiagnosisService.URMManage
         public int ScreenWidth { get; set; } = 666;// 输出的图像的尺寸
         public int ScreenHeight { get; set; } = 650; // 输出的图像的尺寸
 
+        public DPoint[] UrmTraceDPoints { get; set; } = new DPoint[0];
 
-        public class UrmMeasureProcessRequest : UrmProcessRequest
+        protected virtual string GetUniqueValue()
         {
-            /// <summary>
-            /// 测量项枚举
-            /// </summary>
-            public URMMeasureType UrmMeasureType { get; set; }
-            /// <summary>
-            /// 点集
-            /// </summary>
-            public List<DPoint> SrcDPoints { get; set; }
-
-            /// <summary>
-            /// 两点物理距离
-            /// </summary>
-            public double? CMlength { get; set; }
-
-            /// <summary>
-            /// 画布物理宽度
-            /// </summary>
-            public double Phywidth { get; set; }
-
-            /// <summary>
-            /// ROI 类型
-            /// </summary>
-            public URMROIType ROIType { get; set; }
-
-            /// <summary>
-            /// Rim 宽度
-            /// </summary>
-            public double ShellWidth { get; set; }
+            var datas = new StringBuilder();
+            datas.Append(DenDataPath);
+            datas.Append(DirDataPath);
+            datas.Append(VelDataPath);
+            datas.Append(AngleDataPath);
+            datas.Append(MaskDataPath);
+            datas.Append(FamilyName);
+            datas.Append(TypeInfo);
+            datas.Append(NativeId);
+            datas.Append(UrmImageType);
+            datas.Append(UrmBlend);
+            datas.Append(DownsampleIndex);
+            datas.Append(IntPowerDen);
+            datas.Append(IntPowerDir);
+            datas.Append(SigmaGauss);
+            datas.Append(VessScale);
+            datas.Append(VelMaxScaler);
+            datas.Append(VelMinScaler);
+            datas.Append(Iterations);
+            datas.Append(Res);
+            datas.Append(Urmsrcwidth);
+            datas.Append(Urmsrcheight);
+            datas.Append(ScaleOfPixel_x);
+            datas.Append(ScaleOfPixel_y);
+            datas.Append(ImgProcessVer);
+            datas.Append(Isliner);
+            datas.Append(ZoomOn);
+            datas.Append(ZoomRoix);
+            datas.Append(ZoomRoiy);
+            datas.Append(ZoomRoiwidth);
+            datas.Append(ZoomRoiheight);
+            datas.Append(Roix);
+            datas.Append(Roiy);
+            datas.Append(Roiwidth);
+            datas.Append(Roiheight);
+            datas.Append(LeftRight);
+            datas.Append(UpDown);
+            datas.Append(ScreenWidth);
+            datas.Append(ScreenHeight);
+            datas.Append(Newtonsoft.Json.JsonConvert.SerializeObject(UrmTraceDPoints));
+            return datas.ToString();
+        }
 
+        public virtual string GetUniqueCode()
+        {
+            try
+            {
+                return ToSHA256(GetUniqueValue());
+            }
+            catch
+            {
+                return Guid.NewGuid().ToString("N");
+            }
         }
 
-        public class URMProcessorClass
+
+        protected string ToSHA256(string originalString)
         {
-            /// <summary>
-            /// GUID
-            /// </summary>
-            public string GUID { get; set; }
+            using (SHA256 sha256Hash = SHA256.Create())
+            {
+                byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(originalString));
 
-            public URMProcess VideoProcessor { get; set; }
+                StringBuilder builder = new StringBuilder();
+                for (int i = 0; i < bytes.Length; i++)
+                {
+                    builder.Append(bytes[i].ToString("x2"));
+                }
 
-            public DateTime LastActiveTime { get; set; }
+                string encryptedString = builder.ToString().Substring(0, 32); // 获取前32位作为加密后的字符串
+                return encryptedString;
+            }
         }
 
+    }
 
+    public class UrmMeasureProcessRequest : UrmProcessRequest
+    {
+        /// <summary>
+        /// 测量项枚举
+        /// </summary>
+        public URMMeasureType UrmMeasureType { get; set; }
+        /// <summary>
+        /// 点集
+        /// </summary>
+        public List<DPoint> SrcDPoints { get; set; }
 
-        public class DoUrmVideoProcessRequest : UrmProcessRequest
+        /// <summary>
+        /// 两点物理距离
+        /// </summary>
+        public double? CMlength { get; set; }
+
+        /// <summary>
+        /// 画布物理宽度
+        /// </summary>
+        public double Phywidth { get; set; }
+
+        /// <summary>
+        /// ROI 类型
+        /// </summary>
+        public URMROIType ROIType { get; set; }
+
+        /// <summary>
+        /// Rim 宽度
+        /// </summary>
+        public double ShellWidth { get; set; }
+
+
+        protected override string GetUniqueValue()
         {
-            /// <summary>
-            /// GUID
-            /// </summary>
-            public string GUID { get; set; }
-
-            // 当前播放帧
-            public int VideoFrame { get; set; } = 0;
-
-            // 视频配置
-            public float URMVideoScaler { get; set; } = 3;
-            public float URMVideoParameter { get; set; } = 2;
-            public float URMVideoType { get; set; } = 1;
-            //数据路径
-            public string PointsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPoints.bin";
-            public string PointNumsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPointNums.bin";
-
-            public string GetUniqueCode()
+            var datas = new StringBuilder();
+            datas.Append(UrmMeasureType);
+            datas.Append(CMlength);
+            datas.Append(Phywidth);
+            datas.Append(ROIType);
+            datas.Append(ShellWidth);
+            datas.Append(Newtonsoft.Json.JsonConvert.SerializeObject(SrcDPoints));
+            return base.GetUniqueValue() + datas.ToString();
+        }
+
+        public override string GetUniqueCode()
+        {
+            try
             {
-                try
-                {
-                    var datas = new StringBuilder();
-                    datas.Append(DenDataPath);
-                    datas.Append(DirDataPath);
-                    datas.Append(VelDataPath);
-                    datas.Append(AngleDataPath);
-                    datas.Append(MaskDataPath);
-                    datas.Append(FamilyName);
-                    datas.Append(TypeInfo);
-                    datas.Append(NativeId);
-                    datas.Append(UrmImageType);
-                    datas.Append(UrmBlend);
-                    datas.Append(DownsampleIndex);
-                    datas.Append(IntPowerDen);
-                    datas.Append(IntPowerDir);
-                    datas.Append(SigmaGauss);
-                    datas.Append(VessScale);
-                    datas.Append(VelMaxScaler);
-                    datas.Append(VelMinScaler);
-                    datas.Append(Iterations);
-                    datas.Append(Res);
-                    datas.Append(Urmsrcwidth);
-                    datas.Append(Urmsrcheight);
-                    datas.Append(ScaleOfPixel_x);
-                    datas.Append(ScaleOfPixel_y);
-                    datas.Append(ImgProcessVer);
-                    datas.Append(Isliner);
-                    datas.Append(ZoomOn);
-                    datas.Append(ZoomRoix);
-                    datas.Append(ZoomRoiy);
-                    datas.Append(ZoomRoiwidth);
-                    datas.Append(ZoomRoiheight);
-                    datas.Append(Roix);
-                    datas.Append(Roiy);
-                    datas.Append(Roiwidth);
-                    datas.Append(Roiheight);
-                    datas.Append(LeftRight);
-                    datas.Append(UpDown);
-                    datas.Append(ScreenWidth);
-                    datas.Append(ScreenHeight);
-                    datas.Append(Newtonsoft.Json.JsonConvert.SerializeObject(UrmTraceDPoints));
-                    datas.Append(URMVideoScaler);
-                    datas.Append(URMVideoParameter);
-                    datas.Append(URMVideoType);
-                    datas.Append(PointsDataPath);
-                    datas.Append(PointNumsDataPath);
-                    return ToSHA256(datas.ToString());
-                }
-                catch (Exception ex)
-                {
-                    return Guid.NewGuid().ToString("N");
-                }
+                return ToSHA256(GetUniqueValue());
             }
-
-            public string ToSHA256(string originalString)
+            catch
             {
-                using (SHA256 sha256Hash = SHA256.Create())
-                {
-                    byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(originalString));
+                return Guid.NewGuid().ToString("N");
+            }
+        }
+
+    }
+
+    public class URMProcessorClass
+    {
+        /// <summary>
+        /// GUID
+        /// </summary>
+        public string GUID { get; set; }
+
+        public URMProcess Processor { get; set; }
+
+        public DateTime LastActiveTime { get; set; }
+
+        public double UrmMinVal { get; set; }
+
+        public double UrmMaxVal { get; set; }
+    }
 
-                    StringBuilder builder = new StringBuilder();
-                    for (int i = 0; i < bytes.Length; i++)
-                    {
-                        builder.Append(bytes[i].ToString("x2"));
-                    }
 
-                    string encryptedString = builder.ToString().Substring(0, 32); // 获取前32位作为加密后的字符串
-                    return encryptedString;
-                }
-            }
 
+    public class DoUrmVideoProcessRequest : UrmProcessRequest
+    {
+        // 当前播放帧
+        public int VideoFrame { get; set; } = 0;
+
+        // 视频配置
+        public float URMVideoScaler { get; set; } = 3;
+        public float URMVideoParameter { get; set; } = 2;
+        public float URMVideoType { get; set; } = 1;
+        //数据路径
+        public string PointsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPoints.bin";
+        public string PointNumsDataPath { get; set; } = "D:\\Projects\\URMDemo\\URMDemo\\bin\\Debug\\URMTemp\\393f5673dc424b5e87334f8ba4a90aae\\URMPointNums.bin";
+
+
+        protected override string GetUniqueValue()
+        {
+            var datas = new StringBuilder();
+            datas.Append(URMVideoScaler);
+            datas.Append(URMVideoParameter);
+            datas.Append(URMVideoType);
+            datas.Append(PointsDataPath);
+            datas.Append(PointNumsDataPath);
+            return base.GetUniqueValue() + datas.ToString();
+        }
+
+        public override string GetUniqueCode()
+        {
+            try
+            {
+                return ToSHA256(GetUniqueValue());
+            }
+            catch
+            {
+                return Guid.NewGuid().ToString("N");
+            }
         }
-        public DPoint[] UrmTraceDPoints { get; set; } = new DPoint[0];
 
     }
 }