zoulei 1 年之前
父节点
当前提交
cbc7c55a99

+ 6 - 1
Service/CpuCgServer/AddIns/XcorrUtils.cs

@@ -49,6 +49,8 @@ namespace CpuCgServer
         public double dtRange { get; set; }         //时差范围
         public double dfRange { get; set; }         //频差范围
         public double snrThreshold { get; set; }	//信噪比门限
+
+        public int TimeoutSeconds { get; set; }
     }
     /// <summary>
     /// 时隙样点信息
@@ -149,7 +151,9 @@ namespace CpuCgServer
                 mucafp.Start();
                 Stopwatch stopWatch = new Stopwatch();
                 stopWatch.Start();
-                mucafp.WaitForExit();
+                bool succeed = mucafp.WaitForExit(xs.TimeoutSeconds * 1000);
+                if (!succeed)
+                    throw new Exception("CPU多时隙参估计算超时");
                 stopWatch.Stop();
                 TimeSpan ts = stopWatch.Elapsed;
                 var str = mucafp.StandardOutput.ReadToEnd();
@@ -173,6 +177,7 @@ namespace CpuCgServer
                     {
                         caf.dt = 0;
                         caf.df = 0;
+                        caf.snr = 0;
                     }
                     else
                     {

+ 5 - 5
Service/CpuCgServer/Controllers/CpuCgController.cs

@@ -110,6 +110,7 @@ namespace CpuCgServer.Controllers
             xItem.dtRange = dto.dtRange;
             xItem.dfRange = dto.dfRange;
             xItem.snrThreshold = dto.snrThreshold;
+            xItem.TimeoutSeconds= dto.TimeoutSeconds;
             xItem.xcorrSmps = dto.smpPositions.Select(m => new XcorrSmp(m.smpStart, m.smpCount)).ToList();
             List<CpuCgResDto> resDtos = new List<CpuCgResDto>();
 
@@ -128,15 +129,14 @@ namespace CpuCgServer.Controllers
                     resDto.Snr = item.snr.Value;
                     resDtos.Add(resDto);
                 }
-
+                return Success(resDtos);
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex, "执行CPU参估异常");
+                Serilog.Log.Error(ex, "CPU多时隙参估异常");
+                return Error<List<CpuCgResDto>>("CPU多时隙参估异常");
             }
 
-            return Success(resDtos);
-
         }
 
         /// <summary>
@@ -182,7 +182,7 @@ namespace CpuCgServer.Controllers
                 }
 
 
-                cafp.StartInfo.FileName = Path.Combine(cafp.StartInfo.WorkingDirectory, "AddIns\\检测Cpu参估\\XcorrCpu.exe");
+                cafp.StartInfo.FileName = Path.Combine(cafp.StartInfo.WorkingDirectory, "AddIns\\XcorrCpu.exe");
                 //cafp.StartInfo.Arguments = $"1 \"{xs.file1}\" \"{xs.file2}\" {(long)(xs.samplingRate)} {xs.dtCenter} {xs.dtRange} {xs.dfRange} {xs.smpStart} {xs.smpCount} {xs.snrThreshold} {outFile}";
                 cafp.StartInfo.CreateNoWindow = true;
                 cafp.StartInfo.RedirectStandardError = true;

+ 12 - 9
Service/X2D1NoRefTaskServer/Service/HistoryTaskService.cs

@@ -29,12 +29,12 @@ namespace X2D1NoRefTaskServer.Service
             cts = new CancellationTokenSource();
             if (!Directory.Exists(dto.CapDir))
             {
-                StopTask(dto.ID, $"文件路径[{dto.CapDir}]不存在,任务结束");
+                StopTask(dto.ID, EnumTaskStopType.Error, $"文件路径[{dto.CapDir}]不存在,任务结束");
                 return;
             }
             if (dto.DateDirFormat.Contains("\\"))
             {
-                StopTask(dto.ID, $"子目录日期格式不能包含多级目录格式");
+                StopTask(dto.ID, EnumTaskStopType.Error, $"子目录日期格式不能包含多级目录格式");
                 return;
             }
 
@@ -65,7 +65,7 @@ namespace X2D1NoRefTaskServer.Service
                 }
                 else
                 {
-                    StopTask(dto.ID, $"执行异常,不支持的日期目录格式");
+                    StopTask(dto.ID, EnumTaskStopType.Error, $"执行异常,不支持的日期目录格式");
                     return;
                 }
 
@@ -283,7 +283,7 @@ namespace X2D1NoRefTaskServer.Service
                         ResetTime(formatFlag, ref preTime);
                     }
                 }
-                StopTask(dto.ID, $"数据处理完成,任务结束");
+                StopTask(dto.ID, EnumTaskStopType.Properly, "数据处理完成,任务结束");
             }, cts.Token);
         }
         private void ResetTime(int formatFlag, ref DateTime time)
@@ -410,14 +410,17 @@ namespace X2D1NoRefTaskServer.Service
                 return false;
             }
         }
-        void StopTask(int taskID, string stopReason)
+        void StopTask(int taskID, EnumTaskStopType type, string stopReason)
         {
-            TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopReason = stopReason };
-            if (string.IsNullOrWhiteSpace(stopReason))
-                LogHelper.Info($"【任务{taskID}】正常结束");
+            if (type == EnumTaskStopType.Properly)
+            {
+                LogHelper.Info($"【任务{taskID}】{stopReason}");
+            }
             else
+            {
                 LogHelper.Error($"【任务{taskID}】{stopReason}");
-
+            }
+            TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopType = type, StopReason = stopReason };
             var stopResp = HttpHelper.PostRequestAsync(baseUrl + "Task/StopTask", stopDto).Result;
             if (stopResp.code != 200)
             {

+ 15 - 15
XdCxRhDW.App/Controllers/DetectCgController.cs

@@ -27,13 +27,12 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<CpuCgResDto>> CpuCgCalc(CpuCgDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CpuCgSvr);
-            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
+            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
+            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
             var res = await HttpHelper.PostRequestAsync<CpuCgResDto>(svr.BaseHttpAddr + "/api/CpuCg/Calc", dto,dto.TimeoutSeconds);
             return res;
         }
 
-
         /// <summary>
         /// CPU参估多个时隙的参估计算(需要先上传文件)
         /// </summary>
@@ -43,11 +42,12 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<List<CpuCgResDto>>> CpuCgMultiCalc(CpuCgMultiDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CpuCgSvr);
-            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            var res = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(svr.BaseHttpAddr + "/api/CpuCg/MultiCalc", dto);
+            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync",dto.TimeoutSeconds);
+            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync",dto.TimeoutSeconds);
+            var res = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(svr.BaseHttpAddr + "/api/CpuCg/MultiCalc", dto,dto.TimeoutSeconds);
             return res;
         }
+
         /// <summary>
         /// 参估画图
         /// </summary>
@@ -56,8 +56,8 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<List<ImageResultDto>>> DrawImage(CpuCgDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CpuCgSvr);
-            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
+            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
+            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
             var res = await HttpHelper.PostRequestAsync<List<ImageResultDto>>(svr.BaseHttpAddr + "/api/CpuCg/DrawImage", dto, dto.TimeoutSeconds);
             return res;
         }
@@ -70,9 +70,9 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<List<GpuCgResponseDto>>> GpuCgCalc(GpuCgRequestDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.GpuCgSvr);
-            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            var res = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(svr.BaseHttpAddr + "/api/GpuCg/Calc", dto);
+            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync",dto.TimeoutSeconds);
+            dto.file2 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file2), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
+            var res = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(svr.BaseHttpAddr + "/api/GpuCg/Calc", dto,dto.TimeoutSeconds);
             return res;
         }
 
@@ -85,7 +85,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<List<DetectResDto>>> DetectCalc(DetectDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CheckSvr);
-            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
+            dto.file1 = await HttpHelper.UploadFileAsync(GetLocalFile(dto.file1), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
             var res = await HttpHelper.PostRequestAsync<List<DetectResDto>>(svr.BaseHttpAddr + "/api/Check/Calc", dto,dto.TimeoutSeconds);
             return res;
         }
@@ -112,9 +112,9 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<ResampleResponseDto>> Resample(ResampleRequestDto dto)
         {
             var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CheckSvr);
-            dto.File = await HttpHelper.UploadFileAsync(GetLocalFile(dto.File), svr.BaseHttpAddr + "/api/File/UploadFileAsync");
-            var res = await HttpHelper.PostRequestAsync<ResampleResponseDto>(svr.BaseHttpAddr + "/api/Check/Resample", dto);
-            await HttpHelper.DownloadFileAsync(svr.BaseHttpAddr, res.data.File, GetLocalFile(res.data.File));
+            dto.File = await HttpHelper.UploadFileAsync(GetLocalFile(dto.File), svr.BaseHttpAddr + "/api/File/UploadFileAsync", dto.TimeoutSeconds);
+            var res = await HttpHelper.PostRequestAsync<ResampleResponseDto>(svr.BaseHttpAddr + "/api/Check/Resample", dto,dto.TimeoutSeconds);
+            await HttpHelper.DownloadFileAsync(svr.BaseHttpAddr, res.data.File, GetLocalFile(res.data.File),dto.TimeoutSeconds);
             return res;
         }
     }

+ 4 - 1
XdCxRhDW.App/Controllers/TaskController.cs

@@ -43,7 +43,10 @@ namespace XdCxRhDW.App.Controllers
                     await db.SaveChangesAsync();
                 }
                 Messenger.Defalut.Pub("任务状态改变", dto.ID);
-                Serilog.Log.Information($"任务停止完成,ID={dto.ID}.停止原因:{dto.StopReason}");
+                if (dto.StopType == EnumTaskStopType.Properly)
+                    Serilog.Log.Information($"任务停止完成,ID={dto.ID},停止原因={dto.StopReason}");
+                else
+                    Serilog.Log.Error($"任务停止完成,ID={dto.ID},停止原因={dto.StopReason}");
                 return Success();
             }
             catch (Exception ex)

+ 1 - 0
XdCxRhDW.App/CorTools/CgImageForm.cs

@@ -68,6 +68,7 @@ namespace XdCxRhDW.App.CorTools
             var maxX = (list[0].XMax - 1 + list[0].XFlag) * 1e6 / list[0].FsHz;
             var minX = (list[0].XFlag) * 1e6 / list[0].FsHz;
             var maxY = list.Max(p => p.YValue) + 100;
+            if (maxY < 0) maxY = -maxY;
             (this.chartControl1.AnnotationRepository[2] as TextAnnotation).Text = $"共{list.Count}个点";
             (this.chartControl1.Diagram as XYDiagram).AxisX.WholeRange.SetMinMaxValues(minX, maxX);
             (this.chartControl1.Diagram as XYDiagram).AxisX.VisualRange.SetMinMaxValues(minX, maxX);

+ 86 - 71
XdCxRhDW.App/CorTools/DetectToolForm.cs

@@ -50,77 +50,86 @@ namespace XdCxRhDW.App.CorTools
                         t.file2 = Path.GetFileName(btnFile2.Text);
                     });
                     gridView1.RefreshData();
-                    foreach (var item in data)
+                    string file1 = null, file2 = null;
+                    try
                     {
-                        string file1 = null, file2 = null;
-                        try
-                        {
-                            file1 = await HttpHelper.UploadFileAsync(btnFile1.Text, baseUrl + "File/UploadFileAsync");
-                        }
-                        catch (Exception ex)
-                        {
-                            layoutControl1.Enabled = true;
-                            Serilog.Log.Error(ex, ex.Message);
-                            DxHelper.MsgBoxHelper.ShowError(ex.Message);
-                            break;
-                        }
-                        try
-                        {
-                            file2 = await HttpHelper.UploadFileAsync(btnFile2.Text, baseUrl + "File/UploadFileAsync");
-                        }
-                        catch (Exception ex)
-                        {
-                            layoutControl1.Enabled = true;
-                            Serilog.Log.Error(ex, ex.Message);
-                            DxHelper.MsgBoxHelper.ShowError(ex.Message);
-                            break;
-                        }
-                        CpuCgDto xItem = null;
-                        try
+                        file1 = await HttpHelper.UploadFileAsync(btnFile1.Text, baseUrl + "File/UploadFileAsync");
+                    }
+                    catch (Exception ex)
+                    {
+                        layoutControl1.Enabled = true;
+                        Serilog.Log.Error(ex, ex.Message);
+                        DxHelper.MsgBoxHelper.ShowError(ex.Message);
+                        return;
+                    }
+                    try
+                    {
+                        file2 = await HttpHelper.UploadFileAsync(btnFile2.Text, baseUrl + "File/UploadFileAsync");
+                    }
+                    catch (Exception ex)
+                    {
+                        layoutControl1.Enabled = true;
+                        Serilog.Log.Error(ex, ex.Message);
+                        DxHelper.MsgBoxHelper.ShowError(ex.Message);
+                        return;
+                    }
+                    CpuCgMultiDto dto = null;
+                    try
+                    {
+                        dto = new CpuCgMultiDto()
                         {
-                            xItem = new CpuCgDto()
-                            {
-                                file1 = file1,
-                                file2 = file2,
-                                smpCount = item.smplen,
-                                samplingRate = double.Parse(tefs.Text) * 1e6,
-                                dtCenter = double.Parse(teCenter.Text),
-                                dtRange = double.Parse(teRange.Text),
-                                dfRange = int.Parse(teDfRange.Text),
-                                smpStart = item.smpstart,
-                                snrThreshold = int.Parse(teSnr.Text),
-                                TimeoutSeconds=int.Parse(txtTimeout.Text),
-                            };
-                        }
-                        catch (Exception ex)
+                            file1 = file1,
+                            file2 = file2,
+                            samplingRate = double.Parse(tefs.Text) * 1e6,
+                            dtCenter = double.Parse(teCenter.Text),
+                            dtRange = double.Parse(teRange.Text),
+                            dfRange = int.Parse(teDfRange.Text),
+                            snrThreshold = int.Parse(teSnr.Text),
+                            TimeoutSeconds = int.Parse(txtTimeout.Text),
+                        };
+                        dto.smpPositions.AddRange(data.Select(p => new SmpPosition()
                         {
-                            Serilog.Log.Error(ex, "CPU时隙参估参数错误");
-                            DxHelper.MsgBoxHelper.ShowError($"CPU时隙参估参数错误");
-                            break;
-                        }
-
-                        try
+                            smpStart = p.smpstart,
+                            smpCount = p.smplen,
+                        }));
+                    }
+                    catch (Exception ex)
+                    {
+                        layoutControl1.Enabled = true;
+                        Serilog.Log.Error(ex, "CPU多时隙参估参数错误");
+                        DxHelper.MsgBoxHelper.ShowError($"CPU多时隙参估参数错误");
+                        return;
+                    }
+                    try
+                    {
+                        var result = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", dto, dto.TimeoutSeconds);
+                        if (result.code == 200)
                         {
-                            var result = await HttpHelper.PostRequestAsync<CpuCgResDto>(baseUrl + "DetectCg/CpuCgCalc", xItem, xItem.TimeoutSeconds);
-                            if (result.code == 200)
-                            {
-                                item.dt = result.data.Dt;
-                                item.df = result.data.Df;
-                                item.snr = result.data.Snr;
-                                item.tm = result.data.TimeMs;
-                                this.gridView1.RefreshData();
-                            }
-                            else
+                            for (int i = 0; i < result.data.Count; i++)
                             {
-                                Serilog.Log.Error(result.msg);
-                                continue;
+                                data[i].dt = result.data[i].Dt;
+                                data[i].df = result.data[i].Df;
+                                data[i].snr = result.data[i].Snr;
+                                data[i].tm = result.data[i].TimeMs;
                             }
+                            this.gridView1.RefreshData();
+                            WriteIni();
                         }
-                        catch
+                        else
                         {
-                            break;
+                            DxHelper.MsgBoxHelper.ShowError(result.msg);
+                            Serilog.Log.Error(result.msg);
                         }
                     }
+                    catch (TaskCanceledException)
+                    {
+                        DxHelper.MsgBoxHelper.ShowInfo($"CPU多时隙参估计算超时");
+                    }
+                    catch (Exception ex)
+                    {
+                        Serilog.Log.Error(ex, "CPU多时隙参估计算异常");
+                        DxHelper.MsgBoxHelper.ShowError($"CPU多时隙参估计算异常");
+                    }
                     layoutControl1.Enabled = true;
                 }, false)
                 .AddContentMenu<CafResultDto>("信号识别", SvgHelper.CreateSigProc(), async data =>
@@ -234,7 +243,7 @@ namespace XdCxRhDW.App.CorTools
                 dto.fsHz = double.Parse(tefs.Text) * 1e6;
                 dto.band = double.Parse(txtBand.Text);
                 dto.TimeoutSeconds = int.Parse(txtTimeout.Text);
-                var dmcResult = await HttpHelper.PostRequestAsync<IEnumerable<DetectResDto>>(baseUrl + "DetectCg/DetectCalc", dto,dto.TimeoutSeconds);
+                var dmcResult = await HttpHelper.PostRequestAsync<IEnumerable<DetectResDto>>(baseUrl + "DetectCg/DetectCalc", dto, dto.TimeoutSeconds);
                 if (dmcResult.code == 200)
                 {
                     foreach (var dmcItem in dmcResult.data)
@@ -268,6 +277,10 @@ namespace XdCxRhDW.App.CorTools
                 }
                 WriteIni();
             }
+            catch (TaskCanceledException)
+            {
+                DxHelper.MsgBoxHelper.ShowInfo($"信号检测超时");
+            }
             catch (Exception ex)
             {
                 Serilog.Log.Error(ex, "信号检测出错");
@@ -348,8 +361,7 @@ namespace XdCxRhDW.App.CorTools
             }
             catch (TaskCanceledException)
             {
-                Serilog.Log.Warning("CPU文件参估Http接口调用超时");
-                DxHelper.MsgBoxHelper.ShowInfo("CPU文件参估Http接口调用超时");
+                DxHelper.MsgBoxHelper.ShowInfo($"CPU文件参估计算超时");
             }
             catch (Exception ex)
             {
@@ -363,7 +375,6 @@ namespace XdCxRhDW.App.CorTools
         {
             if (!ValidateFiles(btnFile1.Text, btnFile2.Text)) return;
             layoutControl1.Enabled = false;
-            List<ImageResultDto> res = null;
             try
             {
                 CpuCgDto par = new CpuCgDto()
@@ -378,11 +389,11 @@ namespace XdCxRhDW.App.CorTools
                     smpCount = double.Parse(teCount.Text),
                     snrThreshold = int.Parse(teSnr.Text),
                     TimeoutSeconds = int.Parse(txtTimeout.Text)
-            };
+                };
                 par.file1 = await HttpHelper.UploadFileAsync(btnFile1.Text, baseUrl + "File/UploadFileAsync");
                 par.file2 = await HttpHelper.UploadFileAsync(btnFile2.Text, baseUrl + "File/UploadFileAsync");
-              
-                var resp = await HttpHelper.PostRequestAsync<List<ImageResultDto>>(baseUrl + "DetectCg/DrawImage", par,par.TimeoutSeconds);
+
+                var resp = await HttpHelper.PostRequestAsync<List<ImageResultDto>>(baseUrl + "DetectCg/DrawImage", par, par.TimeoutSeconds);
                 if (resp.code != 200)
                 {
                     Serilog.Log.Error(resp.msg);
@@ -390,9 +401,9 @@ namespace XdCxRhDW.App.CorTools
                 }
                 else
                 {
-                    if (res != null && res.Any())
+                    if (resp.data != null && resp.data.Any())
                     {
-                        new CgImageForm(res).ShowDialog();
+                        new CgImageForm(resp.data).ShowDialog();
                     }
                     else
                     {
@@ -401,6 +412,10 @@ namespace XdCxRhDW.App.CorTools
                 }
                 WriteIni();
             }
+            catch (TaskCanceledException)
+            {
+                DxHelper.MsgBoxHelper.ShowInfo($"参估绘图超时");
+            }
             catch (Exception ex)
             {
                 Serilog.Log.Error(ex, "参估绘图失败");
@@ -411,7 +426,7 @@ namespace XdCxRhDW.App.CorTools
             {
                 layoutControl1.Enabled = true;
             }
-            
+
         }
 
         private void chkDama_CheckedChanged(object sender, EventArgs e)

+ 18 - 2
XdCxRhDW.App/DxHelper/SvgHelper.cs

@@ -553,14 +553,30 @@ namespace DxHelper
             return svg;
         }
         /// <summary>
+        /// 目标轨迹
+        /// </summary>
+        /// <returns></returns>
+        public static SvgImage CreateTrack(int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<polygon fill='#039C23' points='4,8 10,2 16,8 12,8 12,14 8,14 8,8'/>"
+                + $"<path fill='#FFB115' d='M19.5,4H28v8.5l-2.8-2.8l-4.2,4.2l-2.8-2.8l4.2-4.2L19.5,4z M14,19.5V28H5.5l2.8-2.8l-4.2-4.2l2.8-2.8l4.2,4.2L14,19.5z'/>"
+                +$"<polygon fill='#D11C1C' points='18,24 24,30 30,24 26,24 26,18 22,18 22,24'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
+        /// <summary>
         /// Info
         /// </summary>
         /// <returns></returns>
         public static SvgImage CreateInfo (string color= "#1177D7", int width = 24, int height = 24)
         {
             string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
-                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M16,6c1.1,0,2,0.9,2,2s-0.9,2-2,2s-2-0.9-2-2S14.9,6,16,6z M20,24h-8v-2h2v-8h-2v-2h2h4v10h2V24z'/>\r\n"
-                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M16,6c1.1,0,2,0.9,2,2s-0.9,2-2,2s-2-0.9-2-2S14.9,6,16,6z M20,24h-8v-2h2v-8h-2v-2h2h4v10h2V24z'/>\r\n"
+                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M16,6c1.1,0,2,0.9,2,2s-0.9,2-2,2s-2-0.9-2-2S14.9,6,16,6z M20,24h-8v-2h2v-8h-2v-2h2h4v10h2V24z'/>"
+                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M16,6c1.1,0,2,0.9,2,2s-0.9,2-2,2s-2-0.9-2-2S14.9,6,16,6z M20,24h-8v-2h2v-8h-2v-2h2h4v10h2V24z'/>"
                 + "</svg>";
             MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
             var svg = SvgLoader.LoadFromStream(ms);

+ 2 - 3
XdCxRhDW.App/EditForms/X2D1PosParamEditor.cs

@@ -20,7 +20,6 @@ namespace XdCxRhDW.App.EditForms
     {
         private PosRes info;
         private CgRes cg;
-        private SysSetings settings = new SysSetings();
         public X2D1PosParamEditor(PosRes info)
         {
             InitializeComponent();
@@ -145,7 +144,7 @@ namespace XdCxRhDW.App.EditForms
                 };
 
 
-                string url = string.Format("http://{0}:{1}/Api/Pos/", IpHelper.GetLocalIp(), settings.HttpPort);
+                string url = string.Format("http://{0}:{1}/Api/Pos/", IpHelper.GetLocalIp(), SysConfig.Config.HttpPort);
                 if (info.PosResType == EnumPosResType.X2D1NoRef)
                 {
                     url += "PosX2D1NoParAsync";
@@ -276,7 +275,7 @@ namespace XdCxRhDW.App.EditForms
                     return;
                 }
                 var XlCalcDto = new XlCalcDto() { tleStr = mainxlInfo.TwoLine, SigTime = sigTime };
-                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
+                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), SysConfig.Config.HttpPort);
                 var maineph = await HttpHelper.PostRequestAsync<SatEphResDto>(url, XlCalcDto);
 
                 ucEphXYZMain.SetXYZ("主星", cg.MainCode.Value, (maineph.data.X, maineph.data.Y, maineph.data.Z), Color.Red);

+ 0 - 1
XdCxRhDW.App/EditForms/X3DfoPosParamEditor.cs

@@ -25,7 +25,6 @@ namespace XdCxRhDW.App.EditForms
     {
         private PosRes info;
         private CgRes cg;
-        private SysSetings settings = new SysSetings();
         public X3DfoPosParamEditor(PosRes info)
         {
             InitializeComponent();

+ 87 - 33
XdCxRhDW.App/ExtensionsDev/MapControlEx.cs

@@ -84,6 +84,7 @@ public static class MapControlEx
         internal ToolTipControllerShowEventArgs hoverTip;
         internal ToolTipController mapToolTip;
         internal MapItemStorage posStorge;
+        internal MapItemStorage trackStorge;//航迹专用
         internal MapRectangle rangeItem;
         internal MapDot dotItem = new MapDot() { Tag = "DrawRect" };
         internal bool drawingRect = false;
@@ -339,7 +340,6 @@ public static class MapControlEx
         ctrl.Layers.Add(layerDrawFixed);
         innerData.mMapStorageFixed = drawDataStorageFixed;
 
-
         //定位点专用PosLayer
         var layerPos = new VectorItemsLayer() { Name = "PosLayer" };
         layerPos.ToolTipPattern = " ";//随便给一个,不然不会显示定位点的tooltip
@@ -558,39 +558,7 @@ public static class MapControlEx
             innerData._dataCache.Add(p, mapItem);
 
         }
-        var itemList = items.OrderBy(p => p.SigTime).ToList().GroupBy(t => t.ColorKey);
-        List<MapPolyline> listLine = new List<MapPolyline>();
-        foreach (var groupItems in itemList)
-        {
-            var targets = groupItems.ToList();
-            var colorKey = targets.First().ColorKey;
-            for (int i = 0; i < targets.Count - 1; i++)
-            {
-                var line = new MapPolyline();
-                line.CanEdit = false;
-                line.CanMove = false;
-                line.CanResize = false;
-                line.CanRotate = false;
-                line.EnableSelection = DefaultBoolean.False;
-                line.EnableHighlighting = DefaultBoolean.False;
-                line.IsGeodesic = true;
-                line.Stroke = ColorHelper.IsHtmlColor(colorKey) ? ColorTranslator.FromHtml(colorKey) : ColorHelper.GetColor(colorKey);
-                line.EndLineCap.Width = 12;
-                line.EndLineCap.Length = 20;
-                line.EndLineCap.Visible = true;
-                line.EndLineCap.IsFilled = false;
-                line.StrokeWidth = 2;
-                //line.EndLineCap.Length = 100;
-                var p1 = new GeoPoint(targets[i].PosLat, targets[i].PosLon);
-                var p2 = new GeoPoint(targets[i + 1].PosLat, targets[i + 1].PosLon);
-                line.Points.Add(p1);
-                line.Points.Add(p2);
-                listLine.Add(line);
-            }
-        }
-
         innerData.posStorge.Items.AddRange(list);
-        innerData.posStorge.Items.AddRange(listLine);
     }
 
     /// <summary>
@@ -1142,6 +1110,33 @@ public static class MapControlEx
         return ctrl;
     }
 
+    /// <summary>
+    /// 显示目标轨迹
+    /// </summary>
+    /// <param name="ctrl"></param>
+    /// <returns></returns>
+    public static MapControl UseTrack(this MapControl ctrl)
+    {
+        var innerData = ctrl.Tag as InnerData;
+
+        //航迹线图层
+        var trackLayer = new VectorItemsLayer() { Name = "TrackLayer" };
+        var trackStorage = new MapItemStorage();
+        trackLayer.Data = trackStorage;
+        ctrl.Layers.Add(trackLayer);
+        innerData.trackStorge = trackStorage;
+
+        var btnMarkDot = new BarButtonItem() { Caption = "目标轨迹" };
+        btnMarkDot.ImageOptions.SvgImage = SvgHelper.CreateTrack();
+        btnMarkDot.Tag = ctrl;
+        btnMarkDot.ItemClick += ShowTrack_ItemClick;
+        innerData.barM.BeginInit();
+        innerData.barM.Items.Add(btnMarkDot);
+        innerData.mapMenu.LinksPersistInfo.Add(new LinkPersistInfo(btnMarkDot));
+        innerData.barM.EndInit();
+        return ctrl;
+    }
+
     /// <summary>
     /// 为地图添加清除功能
     /// </summary>
@@ -2052,6 +2047,10 @@ public static class MapControlEx
                 {
                     innerData.mMapStorage.Items.Clear();
                 }
+                if (innerData.trackStorge != null)
+                {
+                    innerData.trackStorge.Items.Clear();
+                }
             }
             catch (Exception)
             {
@@ -2099,7 +2098,62 @@ public static class MapControlEx
         ctrl.MouseEnter += MapControl_MouseEnter;
         ctrl.DoubleClick += EndDistinct;
     }
+    private static void ShowTrack_ItemClick(object sender, ItemClickEventArgs e)
+    {
+        var ctrl = e.Item.Tag as MapControl;
+        var innerData = ctrl.Tag as InnerData;
+        innerData.trackStorge.Items.Clear();
+        var posData = innerData._dataCache.Keys.OrderBy(p => p.SigTime);
+        var itemList = posData.GroupBy(t => t.ColorKey);
+        List<MapPolyline> listLine = new List<MapPolyline>();
+        int w = 12;
+        int h = 20;
+        if (ctrl.ZoomLevel < 4)
+        {
+            w = 2;
+            h = 4;
+        }
+        else if (ctrl.ZoomLevel < 6)
+        {
+            w = 6;
+            h = 12;
+        }
+        else
+        {
+            w = 10;
+            h = 20;
+        }
+        foreach (var groupItems in itemList)
+        {
+            var targets = groupItems.ToList();
+            var colorKey = targets.First().ColorKey;
+            for (int i = 0; i < targets.Count - 1; i++)
+            {
+                var line = new MapPolyline();
+                line.CanEdit = false;
+                line.CanMove = false;
+                line.CanResize = false;
+                line.CanRotate = false;
+                line.EnableSelection = DefaultBoolean.False;
+                line.EnableHighlighting = DefaultBoolean.False;
+                line.IsGeodesic = true;
+                line.Stroke = ColorHelper.IsHtmlColor(colorKey) ? ColorTranslator.FromHtml(colorKey) : ColorHelper.GetColor(colorKey);
+                line.EndLineCap.Width = w;
+                line.EndLineCap.Length = h;
+                line.EndLineCap.Visible = true;
+                line.EndLineCap.IsFilled = false;
+                line.StrokeWidth = 2;
+                //line.EndLineCap.Length = 100;
+                var p1 = new GeoPoint(targets[i].PosLat, targets[i].PosLon);
+                var p2 = new GeoPoint(targets[i + 1].PosLat, targets[i + 1].PosLon);
+                line.Points.Add(p1);
+                line.Points.Add(p2);
+                listLine.Add(line);
+            }
+        }
+        innerData.trackStorge.Items.AddRange(listLine);
 
+    }
     private static void MarkDot_ItemClick(object sender, ItemClickEventArgs e)
     {
         var ctrl = e.Item.Tag as MapControl;

+ 25 - 3
XdCxRhDW.App/MainForm.cs

@@ -29,6 +29,8 @@ using System.Windows.Documents;
 using XdCxRhDW.App;
 using System.Diagnostics;
 using DevExpress.Utils.Extensions;
+using System.Net;
+using XdCxRhDW.WebApi;
 
 namespace XdCxRhDW
 {
@@ -78,7 +80,27 @@ namespace XdCxRhDW
             {
                 this.HtmlText = $"<size=12>{text}(<size=9>{settings.TimeZoneDisplayName}</size>)";
             });
-            await Task.Delay(5000);
+            try
+            {
+                Startup.Start(SysConfig.Config.HttpPort, "多模式融合定位平台.Xml", "XdCxRhDW.Dto.xml", SysConfig.Config.TimeZoneUTC);
+            }
+            catch (System.Reflection.TargetInvocationException ex)
+            {
+                Serilog.Log.Error(ex, $"启动Http服务失败!");
+                if (ex.InnerException is HttpListenerException)
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"{ex.InnerException.Message}");
+                }
+                else
+                {
+                    DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
+                }
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, $"启动Http服务失败!");
+                DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
+            }
             StartProcess();
             _ = XlScan();
             _ = XlClear();
@@ -193,7 +215,7 @@ namespace XdCxRhDW
                                     db.SaveChangesAsync();
                                     calcItems.Remove(item);
                                 }
-                               
+
                                 foreach (var item in calcItems)
                                 {
                                     try
@@ -211,7 +233,7 @@ namespace XdCxRhDW
                                     db.SaveChangesAsync();
                                 }
                             });
-                    
+
                         }
                     }
                 }

+ 2 - 27
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -90,42 +90,17 @@ namespace XdCxRhDW.App.UserControl
             //mapService = "http://ows.mundialis.de/services/service";
             mapControl1.UseDefalutOptions()
             //.UseCluster()//定位点使用内置聚合
+           .UseTrack()
            .UseClearAll()
            .UseDistanceLine()
            .UseMarkDot()
            .UseExportImg()
-           .UseExportXlsx()
-           .UseExportCsv()
-           .UseDrawRect(rect =>
-           {
-               (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
-           });
+           .UseExportXlsx();
             if (SysConfig.Config == null)
             {
                 mapControl1.UseLocalDb();
                 return;
             }
-            try
-            {
-                Startup.Start(SysConfig.Config.HttpPort, "多模式融合定位平台.Xml", "XdCxRhDW.Dto.xml", SysConfig.Config.TimeZoneUTC);
-            }
-            catch (System.Reflection.TargetInvocationException ex)
-            {
-                Serilog.Log.Error(ex, $"启动Http服务失败!");
-                if (ex.InnerException is HttpListenerException)
-                {
-                    DxHelper.MsgBoxHelper.ShowWarning($"{ex.InnerException.Message}");
-                }
-                else
-                {
-                    DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
-                }
-            }
-            catch (Exception ex)
-            {
-                Serilog.Log.Error(ex, $"启动Http服务失败!");
-                DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
-            }
             OnSysSetingsChanged(SysConfig.Config);
             gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
             gridView2.FocusedRowObjectChanged += GridView2_FocusedRowObjectChanged;

+ 2 - 1
XdCxRhDW.Entity/PosRes.cs

@@ -46,7 +46,8 @@ namespace XdCxRhDW.Entity
         public int? TargetInfoID { get; set; }
 
         [Display(AutoGenerateField = false)]
-        public virtual TargetInfo TargetInfo { get; set; }
+        [NotMapped]
+        public TargetInfo TargetInfo { get; set; }
 
         [Display(Name = "检测编号")]
         public long? CheckResID { get; set; }

+ 2 - 2
XdCxRhDw.Dto/CpuCgDto.cs

@@ -71,9 +71,9 @@ namespace XdCxRhDW.Dto
         public double snrThreshold { get; set; }
 
         /// <summary>
-        /// 超时时间(秒)
+        /// 超时时间(单位秒,默认30秒)
         /// </summary>
-        [RangeInt(1)]
+        [RangeInt(1, 600, IncludeMin = true)]
         public int TimeoutSeconds { get; set; } = 30;
 
         /// <summary>

+ 7 - 1
XdCxRhDw.Dto/CpuCgMultiDto.cs

@@ -29,7 +29,7 @@ namespace XdCxRhDW.Dto
         /// 样点位置
         /// </summary>
 
-        public List<SmpPosition> smpPositions { get; set; }  
+        public List<SmpPosition> smpPositions { get; set; } = new List<SmpPosition>();
         /// <summary>
         /// 采样率(Hz)
         /// </summary>
@@ -59,6 +59,12 @@ namespace XdCxRhDW.Dto
         [RangeDouble(10, 50, IncludeMin = true)]
         public double snrThreshold { get; set; }
 
+        /// <summary>
+        /// 超时时间(单位秒,默认30秒)
+        /// </summary>
+        [RangeInt(1, 600, IncludeMin = true)]
+        public int TimeoutSeconds { get; set; } = 30;
+
         /// <summary>
         /// 模型参数自定义验证(复杂的验证逻辑在这里面写)
         /// </summary>

+ 2 - 2
XdCxRhDw.Dto/DetectDto.cs

@@ -38,9 +38,9 @@ namespace XdCxRhDW.Dto
         public double? band { get; set; } = 25;
 
         /// <summary>
-        /// 超时时间(秒)
+        /// 超时时间(单位秒,默认30秒)
         /// </summary>
-        [RangeInt(1)]
+        [RangeInt(10, 600, IncludeMin = true)]
         public int TimeoutSeconds { get; set; } = 30;
         /// <summary>
         /// 

+ 16 - 0
XdCxRhDw.Dto/DtoEnum.cs

@@ -207,4 +207,20 @@ namespace XdCxRhDW.Dto
         Normal = 8,
     }
 
+    /// <summary>
+    /// 任务停止原因枚举
+    /// </summary>
+    public enum EnumTaskStopType
+    {
+        /// <summary>
+        /// 正常结束
+        /// </summary>
+        Properly,
+
+        /// <summary>
+        /// 异常结束
+        /// </summary>
+        Error,
+    }
+
 }

+ 5 - 0
XdCxRhDw.Dto/TaskHandleDto/TaskStopHandleDto.cs

@@ -17,10 +17,15 @@ namespace XdCxRhDW.Dto
         public int ID { get; set; }
 
 
+        /// <summary>
+        /// 任务停止类型
+        /// </summary>
+        public EnumTaskStopType StopType { get; set; }
 
         /// <summary>
         /// 停止原因(可空)
         /// </summary>
         public string StopReason { get; set; }
+
     }
 }