Pārlūkot izejas kodu

修复了刷新定位点很卡及数据处理服务时钟快速增加的BUG

zoule 8 mēneši atpakaļ
vecāks
revīzija
3c23739cc2

+ 7 - 1
Service/CheckServer/MainForm.cs

@@ -17,6 +17,7 @@ namespace CheckServer
     public partial class MainForm : Form
     {
         private EnumSvrType svrType = EnumSvrType.CheckSvr;
+        public string platAddr;
         public MainForm()
         {
             InitializeComponent();
@@ -54,7 +55,12 @@ namespace CheckServer
             }
             var port = AppConfigHelper.Get<int>("LocalHttpPort");
             var svrID = AppConfigHelper.Get("SvrID");
-            var posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr").AppendUrlSuffix("api/");
+            string posPlatformAddr = null;
+            if (!string.IsNullOrWhiteSpace(platAddr))//有命令行传递优先使用命令行传递,否则再使用配置
+                posPlatformAddr = platAddr;
+            else
+                posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr");
+            posPlatformAddr = posPlatformAddr.AppendUrlSuffix("api/");
             LogUI.BaseUrl = posPlatformAddr;
             this.Text = svrType.GetEnumDisplayName() + "-" + svrID;
             string localIp;

+ 4 - 0
Service/CheckServer/Program.cs

@@ -87,6 +87,10 @@ namespace CheckServer
             if (IsRunningAsAdmin())
             {
                 MainForm mainForm = new MainForm();
+                if (args.Length > 0)
+                {
+                    mainForm.platAddr = args[0].Trim();
+                }
                 System.Windows.Forms.Application.Run(mainForm);
             }
             else

+ 7 - 1
Service/CpuCgServer/MainForm.cs

@@ -17,6 +17,7 @@ namespace CpuCgServer
     public partial class MainForm : Form
     {
         private EnumSvrType svrType = EnumSvrType.CpuCgSvr;
+        public string platAddr;
         public MainForm()
         {
             InitializeComponent();
@@ -54,7 +55,12 @@ namespace CpuCgServer
             }
             var port = AppConfigHelper.Get<int>("LocalHttpPort");
             var svrID = AppConfigHelper.Get("SvrID");
-            var posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr").AppendUrlSuffix("api/");
+            string posPlatformAddr = null;
+            if (!string.IsNullOrWhiteSpace(platAddr))//有命令行传递优先使用命令行传递,否则再使用配置
+                posPlatformAddr = platAddr;
+            else
+                posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr");
+            posPlatformAddr = posPlatformAddr.AppendUrlSuffix("api/");
             LogUI.BaseUrl = posPlatformAddr;
             this.Text = svrType.GetEnumDisplayName() + "-" + svrID;
             string localIp;

+ 4 - 0
Service/CpuCgServer/Program.cs

@@ -87,6 +87,10 @@ namespace CpuCgServer
             if (IsRunningAsAdmin())
             {
                 MainForm mainForm = new MainForm();
+                if (args.Length > 0)
+                {
+                    mainForm.platAddr = args[0].Trim();
+                }
                 System.Windows.Forms.Application.Run(mainForm);
             }
             else

+ 7 - 1
Service/GpuCgServer/MainForm.cs

@@ -17,6 +17,7 @@ namespace GpuCgServer
     public partial class MainForm : Form
     {
         private EnumSvrType svrType = EnumSvrType.GpuCgSvr;
+        public string platAddr;
         public MainForm()
         {
             InitializeComponent();
@@ -54,7 +55,12 @@ namespace GpuCgServer
             }
             var port = AppConfigHelper.Get<int>("LocalHttpPort");
             var svrID = AppConfigHelper.Get("SvrID");
-            var posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr").AppendUrlSuffix("api/");
+            string posPlatformAddr = null;
+            if (!string.IsNullOrWhiteSpace(platAddr))//有命令行传递优先使用命令行传递,否则再使用配置
+                posPlatformAddr = platAddr;
+            else
+                posPlatformAddr = AppConfigHelper.Get("PosPlatformAddr");
+            posPlatformAddr = posPlatformAddr.AppendUrlSuffix("api/");
             LogUI.BaseUrl = posPlatformAddr;
             this.Text = svrType.GetEnumDisplayName() + "-" + svrID;
             string localIp;

+ 4 - 0
Service/GpuCgServer/Program.cs

@@ -87,6 +87,10 @@ namespace GpuCgServer
             if (IsRunningAsAdmin())
             {
                 MainForm mainForm = new MainForm();
+                if (args.Length > 0)
+                {
+                    mainForm.platAddr = args[0].Trim();
+                }
                 System.Windows.Forms.Application.Run(mainForm);
             }
             else

+ 15 - 9
Service/X2D1TaskServer/Service/TaskService.cs

@@ -90,6 +90,7 @@ namespace X2D1TaskServer.Service
         /// <param name="time"></param>
         internal void ResetTime(int formatFlag, ref DateTime time)
         {
+            var now = DateTime.Now;
             if (formatFlag == 0)
             {
                 time = DateTime.MaxValue;
@@ -97,12 +98,18 @@ namespace X2D1TaskServer.Service
             else if (formatFlag == 1)
             {
                 var newTime = new DateTime(time.Year, time.Month, time.Day, 0, 0, 0);
-                time = newTime.AddHours(24);
+                if (newTime.AddHours(24) <= DateTime.Now)
+                    time = newTime.AddHours(24);
+                else
+                    time = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
             }
             else
             {
                 var newTime = new DateTime(time.Year, time.Month, time.Day, time.Hour, 0, 0);
-                time = newTime.AddHours(1);
+                if (newTime.AddHours(1) <= DateTime.Now)
+                    time = newTime.AddHours(1);
+                else
+                    time = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
             }
         }
 
@@ -539,8 +546,6 @@ namespace X2D1TaskServer.Service
                             continue;
                         }
 
-
-
                         //执行参考信号
                         (var refDetects, bool needWait) = await DoRefAsync(dto, paramInfo, deteRes, data1, data2, cts);
                         if (!needWait)
@@ -549,7 +554,7 @@ namespace X2D1TaskServer.Service
                             string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]{capTime:yyyyMMddHHmmss}时刻,无参定位";
                             await LogUI.Info(msg);
                             var tar = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, deteRes, data1, data2, cts, msg);
-                            await DoX2D1NoParPosAsync(tar, cts, msg, dto.ForTest);
+                            await DoX2D1NoParPosAsync(tar, cts, msg, dto);
                         }
                         else
                         {
@@ -651,7 +656,7 @@ namespace X2D1TaskServer.Service
             return list;
         }
         Random r = new Random();
-        private async Task DoX2D1NoParPosAsync(List<X2D1NoXlNoParlPosDto> x2D1s, CancellationTokenSource cts, string msg, bool forTest)
+        private async Task DoX2D1NoParPosAsync(List<X2D1NoXlNoParlPosDto> x2D1s, CancellationTokenSource cts, string msg, X2D1TaskHandleDto dto)
         {
 
             foreach (var x2D1 in x2D1s)
@@ -659,7 +664,7 @@ namespace X2D1TaskServer.Service
                 try
                 {
                     if (cts.IsCancellationRequested) break;
-                    if (forTest)
+                    if (dto.ForTest)
                     {
                         X2D1NoParPosDto dto2 = new X2D1NoParPosDto()
                         {
@@ -694,9 +699,10 @@ namespace X2D1TaskServer.Service
                             XdDfo = x2D1.XdDfo,
                             XdDto = x2D1.XdDto,
                             XdSnr = x2D1.XdSnr,
-                            Target = "固定站",
 
                         };
+                        if (dto.FixedStationDto != null && dto.FixedStationDto.FreqUp == x2D1.FreqUp)
+                            dto2.Target = "固定站";
                         dto2.SatTxLon = 43;
                         dto2.SatTxLat = 11.57;
                         dto2.CdbTxLon = 43;
@@ -843,7 +849,7 @@ namespace X2D1TaskServer.Service
             //构建参考信号定位模型
             var refSigDto = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, refDetects, data1, data2, cts, msg, "固定站");
             //执行三星无参定位
-            await DoX2D1NoParPosAsync(refSigDto, cts, msg, dto.ForTest);
+            await DoX2D1NoParPosAsync(refSigDto, cts, msg, dto);
 
             List<TaskCgDto> cgItems = new List<TaskCgDto>();
             foreach (var item in refSigDto)

+ 2 - 0
XdCxRhDW.App/App.config

@@ -21,6 +21,8 @@
 		<add key="UseMapCluster" value="0" />
 		<!--是否启用平台设备状态收集功能 启用=1,禁用=0-->
 		<add key="UseGatherDevState" value="0" />
+		<!--定位点刷新间隔(秒)-->
+		<add key="RefreshPosTime" value="5"/>
 		<!--参估绘图外部程序的路径(可设置为绝对路径,也可设置为平台目录的相对路径)-->
 		<add key="CgDrawExe" value="Draw\Everything.exe" />
 		<!--星地任务是否使用仿真时频差等进行流程测试-->

+ 3 - 2
XdCxRhDW.App/ExtensionsDev/MapControlEx.cs

@@ -660,7 +660,7 @@ public static class MapControlEx
         List<MapDot> list = new List<MapDot>();
         foreach (var item in items)
         {
-            if (item.PosLon > 180) return;
+            if (item.PosLon > 180) continue;
             var mapItem = new MapDot()
             {
                 EnableHighlighting = DefaultBoolean.True,
@@ -676,7 +676,8 @@ public static class MapControlEx
             list.Add(mapItem);
             innerData._dataCache.Add(item, mapItem);
         }
-        innerData.posStorge.Items.AddRange(list);
+        if (list.Any())
+            innerData.posStorge.Items.AddRange(list);
     }
 
 

+ 40 - 9
XdCxRhDW.App/MainForm.cs

@@ -215,10 +215,15 @@ namespace XdCxRhDW
                     continue;
                 }
                 DirectoryInfo dir = new DirectoryInfo(SysConfig.Config.XLDirectory);
-                var backUpDir = dir.Parent.FullName;
-                var files = Directory.EnumerateFiles(SysConfig.Config.XLDirectory, "*", SearchOption.AllDirectories);
+                var backupSucceed = Path.Combine(dir.FullName, "Backup","Succeed");
+                var backupFailed = Path.Combine(dir.FullName, "Backup", "Failed");
+                Directory.CreateDirectory(backupSucceed);
+                Directory.CreateDirectory(backupFailed);
+
+                var files = Directory.EnumerateFiles(SysConfig.Config.XLDirectory, "*", SearchOption.TopDirectoryOnly);
                 foreach (string file in files)
                 {
+                    bool succeed = false;
                     try
                     {
                         var fileName = await HttpHelper.UploadFileAsync(file, SysConfig.GetBaseUrl());
@@ -227,22 +232,48 @@ namespace XdCxRhDW
                         if (res.code == 200)
                         {
                             LogUI.Info($"星历文件[{file}]自动导入成功!").Wait(5000);
-                            //导入完成的文件放在备份目录
-                            var baseDirectory = Path.Combine(backUpDir, "TleBackUp");
-                            Directory.CreateDirectory(baseDirectory);
-                            var newFile = Path.Combine(baseDirectory, Path.GetFileName(file));
-                            if (File.Exists(newFile))
-                                File.Delete(newFile);
-                            File.Move(file, newFile);
+                            try
+                            {
+                                //导入完成的文件放在备份目录
+                                var newFile = Path.Combine(backupSucceed, Path.GetFileName(file));
+                                if (File.Exists(newFile))
+                                    File.Delete(newFile);
+                                File.Move(file, newFile);
+                            }
+                            catch
+                            { 
+                            }
                         }
                         else
                         {
                             LogUI.Error($"星历文件[{file}]自动导入失败.{res.msg}").Wait(5000);
+                            try
+                            {
+                                //导入完成的文件放在备份目录
+                                var newFile = Path.Combine(backupFailed, Path.GetFileName(file));
+                                if (File.Exists(newFile))
+                                    File.Delete(newFile);
+                                File.Move(file, newFile);
+                            }
+                            catch
+                            {
+                            }
                         }
                     }
                     catch (Exception ex)
                     {
                         LogUI.Error($"星历文件[{file}]自动导入失败", ex).Wait(5000);
+                        try
+                        {
+                            //导入完成的文件放在备份目录
+                            var newFile = Path.Combine(backupFailed, Path.GetFileName(file));
+                            if (File.Exists(newFile))
+                                File.Delete(newFile);
+                            File.Move(file, newFile);
+                        }
+                        catch
+                        {
+                        }
                         await Task.Delay(5000);
                     }
                     finally

+ 80 - 73
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -42,6 +42,7 @@ namespace XdCxRhDW.App.UserControl
         TaskInfo tsk;
         List<CancellationTokenSource> listCts = new List<CancellationTokenSource>();
         Dictionary<int, CancellationTokenSource> dicCts = new Dictionary<int, CancellationTokenSource>();
+        List<ModelPosRes> cache = new List<ModelPosRes>();//定位点缓存,最多1000条记录
         public CtrlHome()
         {
             InitializeComponent();
@@ -175,6 +176,80 @@ namespace XdCxRhDW.App.UserControl
             btnIncludeInvalidate.CheckedChanged += BtnIncludeInvalidate_CheckedChanged;
             txtTimeCho_SelectedIndexChanged(null, null);
             WaitHelper.CloseForm();
+
+            await Task.Run(() =>
+           {
+               var refreshPosTime = AppConfigHelper.Get("RefreshPosTime", 5);
+               if (refreshPosTime < 1)
+                   refreshPosTime = 5;
+               refreshPosTime = refreshPosTime * 1000;
+               while (!this.IsDisposed && !this.Disposing)
+               {
+                   try
+                   {
+                       //表格处于筛选状态,不刷新数据
+                       if (!string.IsNullOrWhiteSpace(gridView2.FindFilterText) || !string.IsNullOrWhiteSpace(gridView2.FilterPanelText))
+                       {
+                           continue;
+                       }
+                       var currentTask = gridView1.GetFocusedRow() as TaskInfo;
+                       IQueryable<ModelPosRes> refreshQuery = null;
+                       List<ModelPosRes> updateItems = null;
+                       long? currentFreq = null;
+                       if (txtFrequpMHz.EditValue != null)
+                           currentFreq = Convert.ToInt64(txtFrequpMHz.EditValue);
+                       List<long> freqs = null;
+                       lock (this)
+                       {
+                           refreshQuery = cache.AsQueryable();
+                           refreshQuery = refreshQuery.Where(p => p.TaskInfoID == currentTask.ID);
+                           freqs = refreshQuery.Select(p => p.FreqUpHz).Distinct().OrderBy(p => p).ToList();
+                           if (currentFreq != null)
+                               refreshQuery = refreshQuery.Where(p => p.FreqUpHz == currentFreq.Value);
+
+                           if (!btnIncludeInvalidate.Checked)
+                           {
+                               refreshQuery = refreshQuery.Where(p => p.PosLon != 999);
+                           }
+                           updateItems = refreshQuery.Reverse().ToList();
+                           cache.Clear();
+                       }
+
+                       var items = txtFrequpMHz.Properties.Items.Where(p => p.Value != null).Select(t => Convert.ToInt64(t.Value)).ToList();
+                       foreach (var item in freqs)
+                       {
+                           if (!items.Contains(item))
+                           {
+                               this.Invoke(new Action(() =>
+                               {
+                                   this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((item / 1e6).ToString("f3"), item));
+                               }));
+                           }
+                       }
+                       if (txtTimeCho.Text == "自定义") continue;
+                       if (!updateItems.Any()) continue;
+                       var hours = Convert.ToInt32(txtTimeCho.EditValue);
+                       var ds = this.gridHomePosRes.DataSource as List<ModelPosRes>;
+                       ds.InsertRange(0, updateItems);
+                       var max = ds.First().SigTime;
+                       ds.RemoveAll(p => (max - p.SigTime).TotalHours > hours);
+                       this.Invoke(new Action(() =>
+                       {
+                           mapControl1.DelPosItem<ModelPosRes>(p => (max - p.SigTime).TotalHours > hours);
+                           mapControl1.AddPosItems(updateItems);
+                           gridView2.RefreshData();
+                       }));
+                   }
+                   catch (Exception ex)
+                   {
+                       _ = LogHelper.Error("刷新定位点出错", ex);
+                   }
+                   finally
+                   {
+                       Thread.Sleep(refreshPosTime);
+                   }
+               }
+           });
         }
 
         private void GridView2_ColumnFilterChanged(object sender, EventArgs e)
@@ -221,82 +296,15 @@ namespace XdCxRhDW.App.UserControl
                 }
             }
         }
-        bool canQuery = true;
-        private DateTime lasetUpdateTime = DateTime.MinValue;
         private void OnPosAdd(ModelPosRes posRes)
         {
-            try
-            {
-                //表格处于筛选状态,不刷新数据
-                if (!string.IsNullOrWhiteSpace(gridView2.FindFilterText) || !string.IsNullOrWhiteSpace(gridView2.FilterPanelText))
-                {
-                    return;
-                }
-                var currentTask = gridView1.GetFocusedRow() as TaskInfo;
-                if (currentTask.ID == posRes.TaskInfoID)
-                {
-                    lock (this)
-                    {
-                        var items = txtFrequpMHz.Properties.Items.Where(p => p.Value != null).Select(t => Convert.ToInt64(t.Value)).ToList();
-                        if (!items.Contains(posRes.FreqUpHz))
-                        {
-                            canQuery = false;
-                            items.Add(posRes.FreqUpHz);
-                            items.Sort();
-                            var selectdItem = this.txtFrequpMHz.SelectedItem;
-                            this.Invoke(new Action(() =>
-                            {
-                                this.txtFrequpMHz.Properties.Items.Clear();
-                                this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem("全部", null));
-                                foreach (var item in items)
-                                {
-                                    this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((item / 1e6).ToString("f3"), item));
-                                }
-                                this.txtFrequpMHz.SelectedItem = selectdItem;
-                            }));
-                            canQuery = true;
-                        }
-                    }
-                    if (txtFrequpMHz.EditValue != null && posRes.FreqUpHz != Convert.ToInt64(txtFrequpMHz.EditValue))
-                        return;
-                    if (posRes.PosLon == 999 && !btnIncludeInvalidate.Checked)
-                        return;
-                    if (txtTimeCho.Text == "自定义")
-                    {
-                        return;
-                    }
-                    var hours = Convert.ToInt32(txtTimeCho.EditValue);
-                    var ds = this.gridHomePosRes.DataSource as List<ModelPosRes>;
-                    List<ModelPosRes> removeItems = null;
-                    lock (this)
-                    {
-                        ds.Insert(0, posRes);
-                        var max = ds.Max(p => p.SigTime);
-                        removeItems = ds.Where(p => (max - p.SigTime).TotalHours > hours).ToList();
-                        foreach (var item in removeItems)
-                        {
-                            ds.Remove(item);
-                        }
-                    }
-                    this.Invoke(new Action(() =>
-                    {
-                        mapControl1.DelPosItem(removeItems);
-                        mapControl1.AddPosItem(posRes);
-                    }));
-                    //if ((DateTime.Now - lasetUpdateTime).TotalSeconds > 5)
-                    {
-                        this.Invoke(new Action(() =>
-                        {
-                            gridView2.RefreshData();
-                        }));
-                        lasetUpdateTime = DateTime.Now;
-                    }
-                }
-            }
-            catch (Exception ex)
+            lock (this)
             {
-                _ = LogHelper.Error("定位完成后刷新UI出错", ex);
+                cache.Add(posRes);
+                if (cache.Count > 1000)
+                    cache.RemoveAt(0);
             }
+
         }
         private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
         {
@@ -787,7 +795,6 @@ namespace XdCxRhDW.App.UserControl
 
         private void txtFrequpMHz_SelectedIndexChanged(object sender, EventArgs e)
         {
-            if (!canQuery) return;
             txtTimeCho_SelectedIndexChanged(null, null);
         }
         private async void txtTimeCho_SelectedIndexChanged(object sender, EventArgs e)

+ 5 - 0
XdCxRhDW.App/UserControl/CtrlSysSettings.cs

@@ -164,6 +164,11 @@ namespace XdCxRhDW.App.UserControl
                     DxHelper.MsgBoxHelper.ShowInfo("配置信息保存成功!");
                     if (needStartHttpSvr)
                     {
+                        //var files=Directory.GetFiles("Service", "*.exe.config");
+                        //foreach (var f in files) 
+                        //{
+                        //    File.ReadAllText(f);
+                        //}
                         Application.Restart();
                     }
                 }

+ 0 - 1
XdCxRhDW.WebApi/FileController.cs

@@ -36,7 +36,6 @@ namespace XdCxRhDW.WebApi
         {
             if (!Request.Content.IsMimeMultipartContent("form-data"))
             {
-                bool s = Request.Content.IsFormData();
                 return Error<string>("请求数据不是form-data类型");
             }
             var provider = new MultipartMemoryStreamProvider();