zoule 7 months ago
parent
commit
7ba0326da0
45 changed files with 623 additions and 357 deletions
  1. 0 0
      Service/CapMoni/Database.db
  2. 23 22
      Service/CheckServer/AddIns/CheckHelper.cs
  3. 1 0
      Service/CheckServer/AddIns/DmcResult.cs
  4. BIN
      Service/CheckServer/AddIns/PSignalCheck.dll
  5. 2 22
      Service/CheckServer/Controllers/CheckController.cs
  6. 1 1
      Service/X2D1TaskServer/App.config
  7. 2 2
      XdCxRhDW.App/Controllers/FindRefController.cs
  8. 49 24
      XdCxRhDW.App/Controllers/PosController.cs
  9. 52 32
      XdCxRhDW.App/Controllers/ResultController.cs
  10. 1 1
      XdCxRhDW.App/Controllers/TaskController.cs
  11. 41 31
      XdCxRhDW.App/Controllers/XlController.cs
  12. 1 1
      XdCxRhDW.App/CorTools/XlCalculateForm.cs
  13. 1 1
      XdCxRhDW.App/EditForms/EditorTar.cs
  14. 2 2
      XdCxRhDW.App/EditForms/FixedStationEditor.cs
  15. 1 1
      XdCxRhDW.App/EditForms/RHDTOParamEditor.cs
  16. 1 1
      XdCxRhDW.App/EditForms/SatEditor.cs
  17. 20 18
      XdCxRhDW.App/EditForms/SigDelayEditor.cs
  18. 1 1
      XdCxRhDW.App/EditForms/SigEditor.cs
  19. 1 1
      XdCxRhDW.App/EditForms/TargetEditor.cs
  20. 16 14
      XdCxRhDW.App/EditForms/TaskEditor.cs
  21. 1 1
      XdCxRhDW.App/EditForms/TaskEditorSignal.cs
  22. 1 1
      XdCxRhDW.App/EditForms/X1D1DTOParamEditor.cs
  23. 1 1
      XdCxRhDW.App/EditForms/X2D1DTOParamEditor.cs
  24. 1 1
      XdCxRhDW.App/EditForms/X2DTOParamEditor.cs
  25. 1 1
      XdCxRhDW.App/EditForms/X3DTOParamEditor.cs
  26. 1 1
      XdCxRhDW.App/EditForms/X3DfoParamEditor.cs
  27. 18 0
      XdCxRhDW.App/ExtensionsDev/MapControlEx.cs
  28. 22 25
      XdCxRhDW.App/MainForm.cs
  29. 62 5
      XdCxRhDW.App/Model/ModelPosRes.cs
  30. 2 2
      XdCxRhDW.App/PopupControl/ShowCgCtrl.cs
  31. 65 0
      XdCxRhDW.App/PosResViewModel.cs
  32. 11 10
      XdCxRhDW.App/UserControl/CtrlCgRes.cs
  33. 4 4
      XdCxRhDW.App/UserControl/CtrlFixedStation.cs
  34. 73 72
      XdCxRhDW.App/UserControl/CtrlHome.cs
  35. 4 4
      XdCxRhDW.App/UserControl/CtrlSat.cs
  36. 8 8
      XdCxRhDW.App/UserControl/CtrlSignal.cs
  37. 11 15
      XdCxRhDW.App/UserControl/CtrlSysSettings.cs
  38. 4 4
      XdCxRhDW.App/UserControl/CtrlTarget.cs
  39. 3 5
      XdCxRhDW.App/UserControl/CtrlTx.cs
  40. 2 2
      XdCxRhDW.App/UserControl/CtrlXl.cs
  41. 5 1
      XdCxRhDW.Entity/BaseEntity.cs
  42. 87 10
      XdCxRhDW.Repostory/EFContext/RHDWContext.cs
  43. 5 5
      XdCxRhDW.Repostory/XlRepository.cs
  44. 0 4
      XdCxRhDw.Dto/DetectDto.cs
  45. 15 0
      XdCxRhDw.Dto/PosResDto.cs

+ 0 - 0
Service/CapMoni/Database.db


+ 23 - 22
Service/CheckServer/AddIns/CheckHelper.cs

@@ -21,35 +21,34 @@ namespace CheckServer
             BPSK = 1,
             QPSK = 2
         }
-
         struct slot
         {
-            public SigFlag sigflag;
+            public SigMod mode;
             public int start;
             public int len;
-            public SigMod mode;
+            public SigFlag sigflag;
             public double ps;//码元速率
         };
         enum SigMod : int
         {
             bp96_ccow = 0,
-            bp96_01 = 1,
-            bp96_02 = 2,
-            bp96_03 = 3,
-            bp96_04 = 4,
+            bp96_a8_10258 = 1,
+            bp96_rccow = 2,
+            bp96_b5_10169 = 3,
+            bp96_b5_10171 = 4,
 
-            bp192_01 = 5,
-            bp192_02 = 6,
-            bp192_03 = 7,
-            qp16_01 = 8,
-            qp16_02 = 9,
-            qp16_03 = 10,
-            qp16_04 = 11,
-            qp16_05 = 12,
-            qp16_06 = 13,
-            qp16_07 = 14,
-            qp16_08 = 15,
-            qp16_09 = 16,
+            bp192_c7_10241 = 5,
+            bp192_c7_10242 = 6,
+            bp192_c8_10274 = 7,
+            qp160_a8_10257 = 8,
+            qp160_b5_10166 = 9,
+            qp160_b5_10167 = 10,
+            qp160_b5_10168 = 11,
+            qp160_b5_10170 = 12,
+            qp160_b5_10172 = 13,
+            qp160_c8_10273 = 14,
+            qp160_c8_10275 = 15,
+            qp160_c8_10276 = 16,
         }
 
 
@@ -80,8 +79,6 @@ namespace CheckServer
             {
                 case EnumSigCheckTypeDto.DAMA:
                     dmcCmd = "dm";
-                    if (fsHz != 96000)
-                        throw new Exception("DAMA只支持96K采样率");
                     pArguments = $"{dmcCmd} \"{fileName}\" -c true";//-c包含ccow
                     break;
                 case EnumSigCheckTypeDto.IBS:
@@ -141,12 +138,16 @@ namespace CheckServer
 
                        pSignalFree(res);
                        stopWatch.Stop();
+                       foreach (var item in rcontainer)
+                       {
+                          var s= item.mode.ToString();
+                       }
                        return rcontainer.Select(t => new DmcResult()
                        {
                            DmcType = dmcType.GetEnumDisplayName(),
                            Length = t.len,
                            Start = t.start,
-                           //UserName = t.mode.ToString(),
+                           UserName = t.mode.ToString(),
                            Times = (int)stopWatch.ElapsedMilliseconds,
                        });
                    });

+ 1 - 0
Service/CheckServer/AddIns/DmcResult.cs

@@ -32,4 +32,5 @@ namespace CheckServer
 
         public int Times { get; set; }//ms
     }
+
 }

BIN
Service/CheckServer/AddIns/PSignalCheck.dll


+ 2 - 22
Service/CheckServer/Controllers/CheckController.cs

@@ -51,28 +51,8 @@ namespace CheckServer.Controllers
                 List<DmcResult> kyResults = new List<DmcResult>();
                 if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA))
                 {
-                    //var damaVersion = AppConfigHelper.Get("DamaVersion");
-                    //if (string.IsNullOrWhiteSpace(damaVersion) || damaVersion.Trim() == "1")
-                    //{
-                    //    var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
-                    //    dmcResults.AddRange(dmcResult);
-                    //}
-                    //else if (damaVersion.Trim() == "2")
-                    //{
-                    //    var dmcResult = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
-                    //    dmcResults.AddRange(dmcResult);
-                    //}
-                    //else
-                    //{
-                    var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
-                    dmcResults.AddRange(dmcResult);
-                    if (dmcResult == null || !dmcResult.Any())
-                    {
-                        var dmcResult2 = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
-                        dmcResults.AddRange(dmcResult2);
-                    }
-                    //}
-
+                    var dmcResult2 = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
+                    dmcResults.AddRange(dmcResult2);
                 }
                 if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.IBS))
                 {

+ 1 - 1
Service/X2D1TaskServer/App.config

@@ -12,7 +12,7 @@
 		<add key="LocalHttpPort" value="8930" />
 
 		<!--融合定位平台Http地址-->
-		<add key="PosPlatformAddr" value="http://127.0.0.1:8092" />
+		<add key="PosPlatformAddr" value="http://127.0.0.1:8090" />
 
 		<!--实时任务采集时长(秒)-->
 		<add key="CapSeconds" value="60" />

+ 2 - 2
XdCxRhDW.App/Controllers/FindRefController.cs

@@ -28,7 +28,7 @@ namespace XdCxRhDW.App.Controllers
             try
             {
                 TaskInfo runTask;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -76,7 +76,7 @@ namespace XdCxRhDW.App.Controllers
             try
             {
                 TaskInfo runTask;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {

+ 49 - 24
XdCxRhDW.App/Controllers/PosController.cs

@@ -36,7 +36,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX1D1Async(X1D1PosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -140,7 +140,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX1D1NoXlAsync(X1D1NoXlPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -268,7 +268,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -289,7 +289,11 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -413,7 +417,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -434,7 +438,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -628,7 +635,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -649,7 +656,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -765,7 +775,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -786,7 +796,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -946,7 +959,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosRhAsync(RHPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -1061,7 +1074,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosRhNoXlAsync(RHNoXlPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -1216,7 +1229,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -1237,7 +1250,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -1363,7 +1379,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -1384,7 +1400,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -1556,7 +1575,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -1577,7 +1596,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -1697,7 +1719,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 TaskInfo runTask;
                 TargetInfo target = null;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (dto.TaskID == null)
                     {
@@ -1718,7 +1740,10 @@ namespace XdCxRhDW.App.Controllers
                             return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
                         }
                     }
-                    if (!string.IsNullOrWhiteSpace(dto.Target))
+                }
+                if (!string.IsNullOrWhiteSpace(dto.Target))
+                {
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
                         if (target == null)
@@ -1884,7 +1909,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -2004,7 +2029,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -2172,7 +2197,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {
@@ -2285,7 +2310,7 @@ namespace XdCxRhDW.App.Controllers
         public async Task<AjaxResult<PosResDto>> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
         {
             TaskInfo runTask;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (dto.TaskID == null)
                 {

+ 52 - 32
XdCxRhDW.App/Controllers/ResultController.cs

@@ -16,6 +16,7 @@ using DPP_YH_Core.Extensions;
 using XdCxRhDW.App.Model;
 using System.Diagnostics;
 using System.Configuration;
+using DevExpress.Mvvm.Native;
 
 namespace XdCxRhDW.App.Controllers
 {
@@ -52,10 +53,10 @@ namespace XdCxRhDW.App.Controllers
                 foreach (var item in list)
                 {
                     var dayFile = Path.Combine(dir, item);
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile, readOnly: true))
                     {
                         if (db == null) continue;
-                        var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
+                        var query = db.PosRes.Where(p => p.Deleted == 0 && p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
                         if (!dto.IncludeInvalidate)
                             query = query.Where(p => p.PosLon != 999);
                         if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
@@ -104,11 +105,11 @@ namespace XdCxRhDW.App.Controllers
                     var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
                     foreach (var dayFile in dayFiles)
                     {
-                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile, readOnly: true))
                         {
                             if (db == null) continue;
 
-                            var listFrequp = await db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID).Select(p => p.FreqUpHz).Distinct().ToListAsync();
+                            var listFrequp = await db.PosRes.Where(p => p.Deleted == 0 && p.TaskInfoID == dto.TaskInfoID).Select(p => p.FreqUpHz).Distinct().ToListAsync();
                             foreach (var item in listFrequp)
                             {
                                 if (!posList.Contains(item))
@@ -136,7 +137,7 @@ namespace XdCxRhDW.App.Controllers
         {
             try
             {
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var tasks = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
                     var res = tasks.Select(t => new TaskQueryResDto()
@@ -208,9 +209,9 @@ namespace XdCxRhDW.App.Controllers
         /// <exception cref="Exception"></exception>
         [HttpPost]
         [Obsolete]
-        public async Task<AjaxResult<List<PosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
+        public async Task<AjaxResult<List<ModelPosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
         {
-            List<PosRes> posList = new List<PosRes>();
+            List<ModelPosRes> posList = new List<ModelPosRes>();
             try
             {
                 DateTime start = dto.BeginTime;
@@ -226,26 +227,29 @@ namespace XdCxRhDW.App.Controllers
                 }
                 end = dto.EndTime;
                 List<TargetInfo> targets;
-                using (RHDWContext dbBasic = new RHDWContext())
+                using (RHDWContext dbBasic = RHDWContext.GetContext(true))
                 {
                     targets = await dbBasic.TargetInfos.ToListAsync();
                 }
                 foreach (var item in list)
                 {
                     var dayFile = Path.Combine(dir, item);
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile, readOnly: true))
                     {
                         for (int i = 0; i < 2; i++)
                         {
                             try
                             {
                                 if (db == null) continue;
-                                var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
+                                var query = db.PosRes.Where(p => p.Deleted == 0 && p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
                                 if (!dto.IncludeInvalidate)
                                     query = query.Where(p => p.PosLon != 999);
                                 if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
                                     query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
-                                var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
+                                var posRes = await query
+                                    .Include(p => p.CheckRes)
+                                    .Include(p => p.CgRes)
+                                    .OrderByDescending(p => p.SigTime).ToListAsync();
 
                                 foreach (var itemPos in posRes)
                                 {
@@ -256,13 +260,14 @@ namespace XdCxRhDW.App.Controllers
                                             itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
 
                                     }
+                                    var mp = ModelPosRes.GetVm(itemPos);
+                                    posList.Add(mp);
                                 }
-                                posList.AddRange(posRes);
                                 break;
                             }
                             catch (Exception ex)
                             {
-                                LogHelper.Error($"同步分区表结构异常,DayFile={dayFile}", ex).Wait(5000);
+                                LogHelper.Warning($"分区表结构不是最新,DayFile={dayFile},即将自动修改结构", ex).Wait(5000);
                                 db.SyncDb();
                             }
                         }
@@ -275,7 +280,7 @@ namespace XdCxRhDW.App.Controllers
             {
                 string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
                 XdCxRhDW.Framework.LogHelper.Error(msg, ex);
-                return Error<List<PosRes>>("定位结果时间范围查询异常");
+                return Error<List<ModelPosRes>>("定位结果时间范围查询异常");
             }
         }
         /// <summary>
@@ -304,17 +309,17 @@ namespace XdCxRhDW.App.Controllers
                 }
                 end = dto.EndTime;
                 List<TargetInfo> targets;
-                using (RHDWContext dbBasic = new RHDWContext())
+                using (RHDWContext dbBasic = RHDWContext.GetContext(true))
                 {
                     targets = await dbBasic.TargetInfos.ToListAsync();
                 }
                 foreach (var item in list)
                 {
                     var dayFile = Path.Combine(dir, item);
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                    using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile, readOnly: true))
                     {
                         if (db == null) continue;
-                        var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
+                        var query = db.PosRes.Where(p => p.Deleted == 0 && p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
                         if (!dto.IncludeInvalidate)
                             query = query.Where(p => p.PosLon != 999);
                         if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
@@ -371,26 +376,30 @@ namespace XdCxRhDW.App.Controllers
         /// <exception cref="Exception"></exception>
         [HttpPost]
         [Obsolete]
-        public async Task<AjaxResult<List<PosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
+        public async Task<AjaxResult<List<ModelPosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
         {
-            List<PosRes> posList = new List<PosRes>();
+            List<ModelPosRes> posList = new List<ModelPosRes>();
             try
             {
                 var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
                 if (!Directory.Exists(dir)) return Success(posList);
                 var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
-                DateTime max = DateTime.MinValue;
+                DateTime? max = null;
                 foreach (var yearDir in yearDirs)
                 {
-                    if (max != DateTime.MinValue) break;
                     //每一天的db文件,倒序排列
                     var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
                     foreach (var dayFile in dayFiles)
                     {
-                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                        string fileName = Path.GetFileNameWithoutExtension(dayFile);
+                        {
+                            if (!int.TryParse(fileName, out _))
+                                continue;//副本db文件之类的不查询
+                        }
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile, readOnly: true))
                         {
                             if (db == null) continue;
-                            var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
+                            var query = db.PosRes.Where(p => p.Deleted == 0 && p.TaskInfoID == dto.TaskInfoID);
                             if (!dto.IncludeInvalidate)
                             {
                                 query = query.Where(p => p.PosLon != 999);
@@ -400,23 +409,21 @@ namespace XdCxRhDW.App.Controllers
                             {
                                 query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
                             }
-                            bool any = await query.AnyAsync();
-                            if (any)
-                                max = await query.MaxAsync(p => p.SigTime);
+                            max = await query.MaxAsync(p => (DateTime?)p.SigTime);
                         }
-                        if (max != DateTime.MinValue)
+                        if (max == null)
                         {
                             break;
                         }
                     }
                 }
-                if (max == DateTime.MinValue) return Success(posList);
-                DateTime min = max.AddHours(-dto.Hours);
+                if (max == null) return Success(posList);
+                DateTime min = max.Value.AddHours(-dto.Hours);
                 var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto()
                 {
                     TaskInfoID = dto.TaskInfoID,
                     BeginTime = min,
-                    EndTime = max,
+                    EndTime = max.Value,
                     IncludeInvalidate = dto.IncludeInvalidate,
                     TarFrequpHz = dto.TarFrequpHz,
                 });
@@ -426,14 +433,14 @@ namespace XdCxRhDW.App.Controllers
             {
                 string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}";
                 XdCxRhDW.Framework.LogHelper.Error(msg, ex);
-                return Error<List<PosRes>>("定位结果查询最新数据异常");
+                return Error<List<ModelPosRes>>("定位结果查询最新数据异常");
             }
         }
         #endregion
 
         private PosResDto MapDto(PosRes res)
         {
-            return new PosResDto()
+            var item = new PosResDto()
             {
                 ID = res.ID,
                 FreqUpHz = res.FreqUpHz,
@@ -449,7 +456,20 @@ namespace XdCxRhDW.App.Controllers
                 PosResType = (EnumPosResTypeDto)res.PosResType,
                 Confidence = res.Confidence,
                 CreateTime = res.CreateTime,
+                UserName = res.CheckRes?.UserName,
+                Snr1 = res.CgRes?.Snr1,
             };
+            if (res.CgRes != null)
+            {
+                if (res.CgRes.SnrCdb != null || res.CgRes.Snr2 != null)
+                {
+                    if (res.CgRes.Snr2 != null)
+                        item.Snr2 = res.CgRes.Snr2;
+                    else
+                        item.Snr2 = res.CgRes.SnrCdb;
+                }
+            }
+            return item;
         }
 
         private List<CgResDto> MapCgDto(List<CgRes> listCg)

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

@@ -52,7 +52,7 @@ namespace XdCxRhDW.App.Controllers
         {
             try
             {
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.ID);
                     if (item == null)

+ 41 - 31
XdCxRhDW.App/Controllers/XlController.cs

@@ -41,41 +41,51 @@ namespace XdCxRhDW.App.Controllers
                      List<XlInfo> tmp = new List<XlInfo>();
                      for (int i = 0; i < lines.Count; i += 3)
                      {
-                         line = lines[i];
-                         var satName = lines[i].Trim();
-                         if (satName.StartsWith("0 "))
-                             satName = satName.Substring(2).Trim();
-                         if (satName.StartsWith("TBA"))//待发布的卫星
-                             continue;
-                         var line1 = lines[i + 1];
-                         var line2 = lines[i + 2];
-                         if (line1.Length != 69 || line2.Length != 69)
+                         try
                          {
-                             throw new Exception("星历文件内容错误格式");
+                             line = lines[i];
+                             var satName = lines[i].Trim();
+                             if (satName.StartsWith("0 "))
+                                 satName = satName.Substring(2).Trim();
+                             if (satName.StartsWith("TBA"))//待发布的卫星
+                                 continue;
+                             var line1 = lines[i + 1];
+                             var line2 = lines[i + 2];
+                             if (line1.Length != 69 || line2.Length != 69)
+                             {
+                                 throw new Exception("星历文件内容错误格式");
+                             }
+                             XlInfo xl = new XlInfo()
+                             {
+                                 SatName = satName,
+                                 Line1 = line1,
+                                 Line2 = line2,
+                                 SatCode = Convert.ToInt32(line1.Substring(2, 5))
+                             };
+                             var timeStr = line1.Substring(18, 14).Replace(" ", "");//https://www.space-track.org/documentation#tle星历接口中说这里面可以接受空格
+                             var yearStr = timeStr.Substring(0, 2);
+                             var dayStr = timeStr.Substring(2, timeStr.Length - 2);
+                             var day = Convert.ToDouble(dayStr);
+                             var year = 2000 + Convert.ToInt32(yearStr);
+                             DateTime dt = new DateTime(year, 1, 1, 0, 0, 0);
+                             dt = dt.AddDays(day - 1);
+                             xl.TimeUTC = dt;
+                             tmp.Add(xl);
                          }
-                         XlInfo xl = new XlInfo()
+                         catch (Exception ex)
                          {
-                             SatName = satName,
-                             Line1 = line1,
-                             Line2 = line2,
-                             SatCode = Convert.ToInt32(line1.Substring(2, 5))
-                         };
-                         var timeStr = line1.Substring(18, 14).Replace(" ", "");//https://www.space-track.org/documentation#tle星历接口中说这里面可以接受空格
-                         var yearStr = timeStr.Substring(0, 2);
-                         var dayStr = timeStr.Substring(2, timeStr.Length - 2);
-                         var day = Convert.ToDouble(dayStr);
-                         var year = 2000 + Convert.ToInt32(yearStr);
-                         DateTime dt = new DateTime(year, 1, 1, 0, 0, 0);
-                         dt = dt.AddDays(day - 1);
-                         xl.TimeUTC = dt;
-                         tmp.Add(xl);
+                             XdCxRhDW.Framework.LogHelper.Error($"星历导入第{i + 1}行格式错误,跳过此行数据", ex);
+                         }
                      }
-                     using (RHDWContext db = new RHDWContext())
+                     Parallel.For(0, 50, i =>
                      {
-                         db.XlInfos.AddRange(tmp);
-                         await db.SaveChangesAsync();
-                     }
-                     return tmp.Count;
+                         using (RHDWContext db = RHDWContext.GetContext())
+                         {
+                             db.XlInfos.AddRange(tmp);
+                             db.SaveChanges();
+                         }
+                     });
+                     return 1;
                  });
 
                 XdCxRhDW.Framework.LogHelper.Info($"星历导入成功,共{count}条");
@@ -83,7 +93,7 @@ namespace XdCxRhDW.App.Controllers
             }
             catch (Exception ex)
             {
-                XdCxRhDW.Framework.LogHelper.Error($"{line}星历导入异常,不支持的格式", ex);
+                XdCxRhDW.Framework.LogHelper.Error($"星历导入异常", ex);
                 return Error<RecordRes>(ex.Message);
 
             }

+ 1 - 1
XdCxRhDW.App/CorTools/XlCalculateForm.cs

@@ -30,7 +30,7 @@ namespace XdCxRhDW.App.CorTools
             InitializeComponent();
             this.itemTle.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
             List<SatInfo> list1 = new List<SatInfo>();//配置的卫星
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 list1 = db.SatInfos.OrderBy(p=>p.SatCode).ToList();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/EditorTar.cs

@@ -31,7 +31,7 @@ namespace XdCxRhDW.App.EditForms
         private async void SatEditor_Load(object sender, EventArgs e)
         {
             infos = new List<TargetInfo>();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 var res = await db.TargetInfos.OrderBy(p => p.TargetName).ToListAsync();
                 infos.AddRange(res);

+ 2 - 2
XdCxRhDW.App/EditForms/FixedStationEditor.cs

@@ -40,15 +40,15 @@ namespace XdCxRhDW.App.EditForms
         {
             infos = new List<FixedStation>();
             List<SigInfo> sigs;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 var res = await db.FixedStation.ToListAsync();
                 infos.AddRange(res);
                 sigs = await db.SigInfos.ToListAsync();
                 if (sigs == null)
                     sigs = new List<SigInfo>();
-                this.txtFreqUp.UseDefault().SetData(sigs, nameof(SigInfo.FreqUpDis)).UseDoubleClickToSelectAll();
             }
+            this.txtFreqUp.UseDefault().SetData(sigs, nameof(SigInfo.FreqUpDis)).UseDoubleClickToSelectAll();
 
             if (this.Text == "固定站编辑" && info != null)
             {

+ 1 - 1
XdCxRhDW.App/EditForms/RHDTOParamEditor.cs

@@ -41,7 +41,7 @@ namespace XdCxRhDW.App.EditForms
 
             StationRes station = null;
             CxRes cx = null;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/SatEditor.cs

@@ -48,7 +48,7 @@ namespace XdCxRhDW.App.EditForms
                 this.searchLookUpEdit1.EditValue = info.Sat;
             }
             infos = new List<SatInfo>();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 var res = await db.SatInfos.ToListAsync();
                 infos.AddRange(res);

+ 20 - 18
XdCxRhDW.App/EditForms/SigDelayEditor.cs

@@ -42,15 +42,16 @@ namespace XdCxRhDW.App.EditForms
         }
         private async void SatEditor_Load(object sender, EventArgs e)
         {
-            using (RHDWContext db = new RHDWContext())
+            List<SatInfo> sats;
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
-                var sats = await db.SatInfos.ToListAsync();
-                this.txtSat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
-                if (this.Text == "编辑转发延迟" && info != null)
-                {
-                    this.txtSat.EditValue = sats.FirstOrDefault(f=>f.SatCode== info.SatInfoSatCode);
-                    this.txtDelay.EditValue = info.Delay;
-                }
+                sats = await db.SatInfos.ToListAsync();
+            }
+            this.txtSat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
+            if (this.Text == "编辑转发延迟" && info != null)
+            {
+                this.txtSat.EditValue = sats.FirstOrDefault(f => f.SatCode == info.SatInfoSatCode);
+                this.txtDelay.EditValue = info.Delay;
             }
         }
 
@@ -74,21 +75,22 @@ namespace XdCxRhDW.App.EditForms
                     return;
                 }
                 var satInfo = (SatInfo)txtSat.EditValue;
-                using (RHDWContext db = new RHDWContext())
+                List<SigDelay> list;
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
-                    var list = await db.SigDelays.Where(w => w.SigInfoId == sigId).ToListAsync();
-                    if (list.Where(w => w.ID != info.ID).Any(a => a.SatInfoSatCode == satInfo.SatCode))
-                    {
-                        DxHelper.MsgBoxHelper.ShowInfo("已添加该卫星");
-                        return;
-                    }
+                    list = await db.SigDelays.Where(w => w.SigInfoId == sigId).ToListAsync();
+                }
+                if (list.Where(w => w.ID != info.ID).Any(a => a.SatInfoSatCode == satInfo.SatCode))
+                {
+                    DxHelper.MsgBoxHelper.ShowInfo("已添加该卫星");
+                    return;
                 }
                 info.SigInfoId = sigId;
                 info.SatInfoSatCode = satInfo.SatCode;
-                info.Sat = $"[{satInfo.SatLon}°]{satInfo.SatName}({satInfo.SatCode})"; 
+                info.Sat = $"[{satInfo.SatLon}°]{satInfo.SatName}({satInfo.SatCode})";
                 info.Delay = Convert.ToDouble(txtDelay.EditValue);
-              
-               
+
+
                 this.DialogResult = DialogResult.OK;
             }
             catch (Exception ex)

+ 1 - 1
XdCxRhDW.App/EditForms/SigEditor.cs

@@ -59,7 +59,7 @@ namespace XdCxRhDW.App.EditForms
                 }
             }
             infos = new List<SigInfo>();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 var res = await db.SigInfos.ToListAsync();
                 infos.AddRange(res);

+ 1 - 1
XdCxRhDW.App/EditForms/TargetEditor.cs

@@ -45,7 +45,7 @@ namespace XdCxRhDW.App.EditForms
                 this.txtTarColor.EditValue = clolrRes;
             }
             infos = new List<TargetInfo>();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 var res =await db.TargetInfos.ToListAsync();
                 infos.AddRange(res);

+ 16 - 14
XdCxRhDW.App/EditForms/TaskEditor.cs

@@ -65,29 +65,31 @@ namespace XdCxRhDW.App.EditForms
 
         private async void TaskEditor_Load(object sender, EventArgs e)
         {
-            using (RHDWContext db = new RHDWContext())
+            List<SatInfo> sats;
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
-                var sats = await db.SatInfos.ToListAsync();
-                this.txtMainSat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
-                this.txtAdja1Sat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
-                this.txtAdja2Sat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
+                sats = await db.SatInfos.ToListAsync();
             }
+            this.txtMainSat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
+            this.txtAdja1Sat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
+            this.txtAdja2Sat.UseDefault().SetData(sats, nameof(SatInfo.Sat)).UseDoubleClickToSelectAll();
+
             if (this.Text.StartsWith("编辑任务") && info != null)
             {
-                using (RHDWContext db = new RHDWContext())
+                this.txtTaskName.Text = info.TaskName;
+                this.txtPosType.SelectedIndex = (int)info.PosType;
+                this.txtTaskType.SelectedIndex = (int)info.TaskType;
+                txtCapDir.Text = info.CapDir;
+                txtCapDirFormat.Text = info.CapDirFormat;
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var satMain = await db.SatInfos.Where(w => w.SatCode == info.MainSat).FirstOrDefaultAsync();
                     var satAdja1 = await db.SatInfos.Where(w => w.SatCode == info.Adja1Sat).FirstOrDefaultAsync();
                     var satAdja2 = await db.SatInfos.Where(w => w.SatCode == info.Adja2Sat).FirstOrDefaultAsync();
-
-                    this.txtTaskName.Text = info.TaskName;
-                    this.txtPosType.SelectedIndex = (int)info.PosType;
-                    this.txtTaskType.SelectedIndex = (int)info.TaskType;
                     this.txtMainSat.EditValue = satMain;
                     this.txtAdja1Sat.EditValue = satAdja1;
                     this.txtAdja2Sat.EditValue = satAdja2;
-                    txtCapDir.Text = info.CapDir;
-                    txtCapDirFormat.Text = info.CapDirFormat;
+          
                 }
             }
         }
@@ -111,7 +113,7 @@ namespace XdCxRhDW.App.EditForms
 
                 if (this.Text == "添加任务")
                 {
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext(true))
                     {
                         if (db.TaskInfos.Any(p => p.TaskName == txtTaskName.Text))
                         {
@@ -122,7 +124,7 @@ namespace XdCxRhDW.App.EditForms
                 }
                 else
                 {
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext(true))
                     {
                         if (db.TaskInfos.Any(p => p.ID != info.ID && p.TaskName == txtTaskName.Text))
                         {

+ 1 - 1
XdCxRhDW.App/EditForms/TaskEditorSignal.cs

@@ -56,7 +56,7 @@ namespace XdCxRhDW.App.EditForms
             try
             {
                 gridTaskSignal.UseDefault(listSigInfo).UseMultiSelect().UseRowNumber().DrawGridColumnHeaderCheckBox();
-                using (var db = new RHDWContext())
+                using (var db = RHDWContext.GetContext(true))
                 {
                     var fixedStations = await db.FixedStation.Where(p => p.Enable).ToListAsync();
                     var items = await db.SigInfos.OrderBy(p => p.FreqUp).ToListAsync();

+ 1 - 1
XdCxRhDW.App/EditForms/X1D1DTOParamEditor.cs

@@ -40,7 +40,7 @@ namespace XdCxRhDW.App.EditForms
         private async void X1D1DTOParamEditor_Load(object sender, EventArgs e)
         {
             this.layoutControl1.BestFit();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/X2D1DTOParamEditor.cs

@@ -43,7 +43,7 @@ namespace XdCxRhDW.App.EditForms
         {
             this.layoutControl1.BestFit();
             StationRes station = null;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/X2DTOParamEditor.cs

@@ -32,7 +32,7 @@ namespace XdCxRhDW.App.EditForms
         private async void X2DTOParamEditor_Load(object sender, EventArgs e)
         {
             this.layoutControl1.BestFit();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/X3DTOParamEditor.cs

@@ -32,7 +32,7 @@ namespace XdCxRhDW.App.EditForms
         {
             this.layoutControl1.BestFit();
             StationRes station = null;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 1 - 1
XdCxRhDW.App/EditForms/X3DfoParamEditor.cs

@@ -32,7 +32,7 @@ namespace XdCxRhDW.App.EditForms
         private async void X3DTOParamEditor_Load(object sender, EventArgs e)
         {
             this.layoutControl1.BestFit();
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 listSat = await db.SatInfos.ToListAsync();
             }

+ 18 - 0
XdCxRhDW.App/ExtensionsDev/MapControlEx.cs

@@ -744,6 +744,24 @@ public static class MapControlEx
         ctrl.Refresh();
     }
 
+    /// <summary>
+    /// 定位图层数据源删除大量的定位点
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="ctrl"></param>
+    /// <param name="data"></param>
+    public static void DelHugePosItem<T>(this MapControl ctrl, IEnumerable<T> data) where T : PosData, new()
+    {
+        var innerData = ctrl.Tag as InnerData;
+        var ds = innerData._dataCache.Keys.ToList();
+        foreach (var item in data)
+        {
+            ds.Remove(item);
+        }
+        ctrl.SetPosDataSource(ds);
+        //ctrl.Refresh();
+    }
+
     /// <summary>
     /// 更新定位数据(可以更新可见性、颜色、经纬度、选中状态)
     /// </summary>

+ 22 - 25
XdCxRhDW.App/MainForm.cs

@@ -76,7 +76,7 @@ namespace XdCxRhDW
         {
             this.text = this.Text;
             this.HtmlText = $"<size=12>{this.text}";
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 SysConfig.Config = db.SysSetings.FirstOrDefault();
             }
@@ -139,7 +139,7 @@ namespace XdCxRhDW
         {
             try
             {
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     if (File.Exists(db.DbFile))
                     {
@@ -163,7 +163,7 @@ namespace XdCxRhDW
                         }
                     }
                 }
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     db.SyncDb();
                 }
@@ -215,7 +215,7 @@ namespace XdCxRhDW
                     continue;
                 }
                 DirectoryInfo dir = new DirectoryInfo(SysConfig.Config.XLDirectory);
-                var backupSucceed = Path.Combine(dir.FullName, "Backup","Succeed");
+                var backupSucceed = Path.Combine(dir.FullName, "Backup", "Succeed");
                 var backupFailed = Path.Combine(dir.FullName, "Backup", "Failed");
                 Directory.CreateDirectory(backupSucceed);
                 Directory.CreateDirectory(backupFailed);
@@ -241,7 +241,7 @@ namespace XdCxRhDW
                                 File.Move(file, newFile);
                             }
                             catch
-                            { 
+                            {
                             }
                         }
                         else
@@ -292,7 +292,7 @@ namespace XdCxRhDW
                 try
                 {
                     List<XlInfo> clearData = new List<XlInfo>();
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         DateTime dt = DateTime.Now.AddYears(-1);
                         clearData = await db.XlInfos.Where(p => p.UpdateTime < dt).Take(1000).ToListAsync();
@@ -329,7 +329,7 @@ namespace XdCxRhDW
                 {
                     List<XlInfo> calcItems = null;
                     List<SatInfo> satInfo = null;
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext(true))
                     {
                         calcItems = await db.XlInfos.Where(p => p.Lon == null).OrderByDescending(p => p.SatCode).Take(100).ToListAsync();
                         satInfo = await db.SatInfos.ToListAsync();
@@ -358,7 +358,7 @@ namespace XdCxRhDW
                             }
                             if (Level1.Any())
                             {
-                                using (RHDWContext db = new RHDWContext())
+                                using (RHDWContext db = RHDWContext.GetContext())
                                 {
                                     db.XlInfos.AddOrUpdate(Level1.ToArray());
                                     db.SaveChanges();
@@ -381,13 +381,14 @@ namespace XdCxRhDW
                             }
                             if (Level2.Any())
                             {
-                                using (RHDWContext db = new RHDWContext())
+                                using (RHDWContext db = RHDWContext.GetContext())
                                 {
                                     db.XlInfos.AddOrUpdate(Level2.ToArray());
                                     db.SaveChanges();
                                 }
                             }
                         });
+                        await Task.Delay(2000);
                     }
                     else
                     {
@@ -510,23 +511,19 @@ namespace XdCxRhDW
 
         private void btnOpenApi_ItemClick(object sender, ItemClickEventArgs e)
         {
-            using (RHDWContext db = new RHDWContext())
+            if (SysConfig.Config == null)
             {
-                if (SysConfig.Config == null)
-                {
-                    DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置基础信息");
-                    return;
-                }
-                string addr = $"http://{IpHelper.GetLocalIp()}:{SysConfig.Config.HttpPort}/swagger";
-                try
-                {
-                    System.Diagnostics.Process.Start(addr);
-                }
-                catch
-                {
-                    db.Dispose();
-                    DxHelper.MsgBoxHelper.ShowError($"无法打开默认浏览器,请手动打开浏览器查看接口文档.地址{addr}");
-                }
+                DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置基础信息");
+                return;
+            }
+            string addr = $"http://{IpHelper.GetLocalIp()}:{SysConfig.Config.HttpPort}/swagger";
+            try
+            {
+                System.Diagnostics.Process.Start(addr);
+            }
+            catch
+            {
+                DxHelper.MsgBoxHelper.ShowError($"无法打开默认浏览器,请手动打开浏览器查看接口文档.地址{addr}");
             }
         }
 

+ 62 - 5
XdCxRhDW.App/Model/ModelPosRes.cs

@@ -11,18 +11,75 @@ namespace XdCxRhDW.App.Model
 {
     public class ModelPosRes : PosRes
     {
-        public ModelPosRes()
+        public static ModelPosRes GetVm(PosRes res)
         {
-            if (TargetInfo != null && !string.IsNullOrWhiteSpace(TargetInfo.TargeColor))
-                ColorKey = this.TargetInfo?.TargeColor;
+            var item = new ModelPosRes()
+            {
+                ID = res.ID,
+                CgResID = res.CgResID,
+                UserName = res.CheckRes?.UserName,
+                CheckResID = res.CheckResID,
+                Confidence = res.Confidence,
+                CreateTime = res.CreateTime,
+                CxResID = res.CxResID,
+                Deleted = res.Deleted,
+                FreqUpHz = res.FreqUpHz,
+                PosLat = res.PosLat,
+                MirrLon = res.MirrLon,
+                MirrLat = res.MirrLat,
+                PosResType = res.PosResType,
+                SigTime = res.SigTime,
+                Snr1 = res.CgRes?.Snr1,
+                PosLon = res.PosLon,
+                StationResID = res.StationResID,
+                TaskInfoID = res.TaskInfoID,
+                UpdateTime = res.UpdateTime,
+                TargetState = res.TargetState,
+                TargetInfoID = res.TargetInfoID,
+                ColorKey = res.ColorKey,
+                CheckType = res.CheckRes?.PosCheckType.GetEnumDisplayName(),
+                TargetName = res.TargetInfo?.TargetName,
+            };
+            if (res.CgRes != null)
+            {
+                if (res.CgRes.SnrCdb != null || res.CgRes.Snr2 != null)
+                {
+                    if (res.CgRes.Snr2 != null)
+                        item.Snr2 = res.CgRes.Snr2;
+                    else
+                        item.Snr2 = res.CgRes.SnrCdb;
+                }
+            }
+            return item;
+
         }
+
         [Display(Name = "目标名称")]
         [ToolTip]
-        public string TargetName => TargetInfo?.TargetName;
+        public string TargetName { get; set; }// => TargetInfo?.TargetName;
 
         [Display(Name = "检测方式")]
         [ToolTip]
-        public string CheckType => CheckRes?.PosCheckType?.GetEnumDisplayName();
+        public string CheckType { get; set; }// => CheckRes?.PosCheckType?.GetEnumDisplayName();
+
+
+        /// <summary>
+        /// 用户名称(只有DAMA和IBS有)
+        /// </summary>
+        [Display(Name = "用户名称")]
+        public string UserName { get; set; }// => CheckRes?.UserName;
+
+        /// <summary>
+        /// 第一路信噪比
+        /// </summary>
+        [Display(Name = "第1路信噪比")]
+        public double? Snr1 { get; set; }// => CgRes?.Snr1;
+
+        /// <summary>
+        /// 第二路信噪比
+        /// </summary>
+        [Display(Name = "第2路信噪比")]
+        public double? Snr2 { get; set; }// => CgRes?.Snr2;
 
         public override int GetHashCode()
         {

+ 2 - 2
XdCxRhDW.App/PopupControl/ShowCgCtrl.cs

@@ -37,7 +37,7 @@ namespace XdCxRhDW.App.PopupControl
         private async void ShowCgCtrl_Load(object sender, EventArgs e)
         {
             List<SatInfo> sats = null;
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 sats = await db.SatInfos.ToListAsync();
             }
@@ -135,7 +135,7 @@ namespace XdCxRhDW.App.PopupControl
                 {
                     if (db != null)
                     {
-                        var data = await db.CgXgfRes.Where(p => p.CgResID == cgItem.ID && p.CgType == cgItem.CgType).ToListAsync();
+                        var data = await db.CgXgfRes.Where(p => p.Deleted == 0 && p.CgResID == cgItem.ID && p.CgType == cgItem.CgType).ToListAsync();
                         listXgf.AddRange(data.Select(p => new ModelCgXgf
                         {
                             ID = p.ID,

+ 65 - 0
XdCxRhDW.App/PosResViewModel.cs

@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XdCxRhDW.Entity;
+
+namespace XdCxRhDW.App
+{
+    public class PosResViewModel : PosRes
+    {
+        public PosResViewModel()
+        {
+        }
+
+        public static PosResViewModel GetVm(PosRes res)
+        {
+            return new PosResViewModel()
+            {
+                ID = res.ID,
+                CgResID = res.CgResID,
+                CheckName = res.CheckRes?.UserName,
+                CheckResID = res.CheckResID,
+                Confidence = res.Confidence,
+                CreateTime = res.CreateTime,
+                CxResID = res.CxResID,
+                Deleted = res.Deleted,
+                FreqUpHz = res.FreqUpHz,
+                PosLat = res.PosLat,
+                MirrLon = res.MirrLon,
+                MirrLat = res.MirrLat,
+                PosResType = res.PosResType,
+                SigTime = res.SigTime,
+                Snr1 = res.CgRes?.Snr1,
+                Snr2 = res.CgRes?.Snr2,
+                PosLon = res.PosLon,
+                StationResID = res.StationResID,
+                TaskInfoID = res.TaskInfoID,
+                UpdateTime = res.UpdateTime,
+                TargetState = res.TargetState,
+                TargetInfoID = res.TargetInfoID,
+                ColorKey = res.ColorKey,
+
+            };
+        }
+        /// <summary>
+        /// 用户名称(只有DAMA和IBS有)
+        /// </summary>
+        [Display(Name = "用户名称")]
+        public string CheckName { get; set; }
+
+        /// <summary>
+        /// 第一路信噪比
+        /// </summary>
+        [Display(Name = "第1路信噪比")]
+        public double? Snr1 { get; set; }
+
+        /// <summary>
+        /// 第二路信噪比
+        /// </summary>
+        [Display(Name = "第2路信噪比")]
+        public double? Snr2 { get; set; }
+    }
+}

+ 11 - 10
XdCxRhDW.App/UserControl/CtrlCgRes.cs

@@ -37,7 +37,7 @@ namespace XdCxRhDW.App.UserControl
             layoutControl1.UseDefault();
             txtStartTime.UseDefault();
             txtEndTime.UseDefault();
-            gridCg.UseDefault(list, showScrollH: true).UseDeleteAsync<CgRes>(DelCg);
+            gridCg.UseDefault(list, showScrollH: true).UseDeleteAsync<CgRes>(DelCg).UseRowNumber().UseExportXlsx();
         }
 
         private async void CtrlCgRes_Load(object sender, EventArgs e)
@@ -45,7 +45,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 List<TaskInfo> tskList = new List<TaskInfo>();
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     tskList = await db.TaskInfos.OrderByDescending(p => p.UpdateTime).ToListAsync();
                 }
@@ -72,8 +72,9 @@ namespace XdCxRhDW.App.UserControl
                     {
                         if (db != null)
                         {
-                            var list = await db.CgRes.Where(p => ids.Contains(p.ID)).ToListAsync();
-                            db.CgRes.RemoveRange(list);
+                            if (db == null) continue;
+                            string sql = $"update cgres set deleted=1 where deleted=0 and id in ({string.Join(",", ids)})";
+                            await db.Database.ExecuteSqlCommandAsync(sql);
                             await db.SaveChangesAsync();
                         }
                     }
@@ -164,11 +165,11 @@ namespace XdCxRhDW.App.UserControl
                         var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
                         foreach (var dayFile in dayFiles)
                         {
-                            using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
+                            using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile,readOnly:true))
                             {
                                 if (db == null) continue;
                                 if (db.CgRes.Any(p => p.TaskID == ((TaskInfo)txtTask.EditValue).ID))
-                                    end = await db.CgRes.Where(p => p.TaskID == ((TaskInfo)txtTask.EditValue).ID).MaxAsync(p => p.SigTime);
+                                    end = await db.CgRes.Where(p => p.Deleted == 0 && p.TaskID == ((TaskInfo)txtTask.EditValue).ID).MaxAsync(p => p.SigTime);
                             }
                             if (end != DateTime.MinValue)
                             {
@@ -178,7 +179,7 @@ namespace XdCxRhDW.App.UserControl
                         }
                     }
                 }
-                skip:
+            skip:
                 if (end == DateTime.MinValue)
                 {
                     return new List<CgRes>();//没有数据不查询
@@ -189,7 +190,7 @@ namespace XdCxRhDW.App.UserControl
                 List<CgRes> list = new List<CgRes>();
                 while (endDay >= startDay)
                 {
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(endDay))
+                    using (RHDWPartContext db = RHDWPartContext.GetContext(endDay, readOnly: true))
                     {
                         if (db != null)
                         {
@@ -197,13 +198,13 @@ namespace XdCxRhDW.App.UserControl
                             {
                                 try
                                 {
-                                    var cgRes = await db.CgRes.Where(w => w.SigTime >= start && w.SigTime <= end && w.TaskID == ((TaskInfo)txtTask.EditValue).ID).OrderByDescending(o => o.SigTime).ToListAsync();
+                                    var cgRes = await db.CgRes.Where(w => w.Deleted == 0 && w.SigTime >= start && w.SigTime <= end && w.TaskID == ((TaskInfo)txtTask.EditValue).ID).OrderByDescending(o => o.SigTime).ToListAsync();
                                     list.AddRange(cgRes);
                                     break;
                                 }
                                 catch (Exception ex)
                                 {
-                                    LogHelper.Error($"同步分区表结构异常,Time={endDay:yyyyMMdd}",ex).Wait(5000);
+                                    LogHelper.Error($"同步分区表结构异常,Time={endDay:yyyyMMdd}", ex).Wait(5000);
                                     db.SyncDb();
                                 }
                             }

+ 4 - 4
XdCxRhDW.App/UserControl/CtrlFixedStation.cs

@@ -26,7 +26,7 @@ namespace XdCxRhDW.App.UserControl
                     .UseAddAsync(Add)
                     .UseEditAsync<FixedStation>(Edit)
                     .UseDeleteAsync<FixedStation>(Delete).SetDisplayText(nameof(FixedStation.Value), val => $"{val}秒");
-                using (var db = new RHDWContext())
+                using (var db = RHDWContext.GetContext(true))
                 {
                     var items = await db.FixedStation.OrderBy(p => p.StationName).ToListAsync();
                     list.AddRange(items);
@@ -46,7 +46,7 @@ namespace XdCxRhDW.App.UserControl
                 FixedStationEditor frm = new FixedStationEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 var addItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     db.FixedStation.Add(addItem);
                     await db.SaveChangesAsync();
@@ -68,7 +68,7 @@ namespace XdCxRhDW.App.UserControl
                 FixedStationEditor frm = new FixedStationEditor(editItem);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 editItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var find = await db.FixedStation.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
                     find.StationName = editItem.StationName;
@@ -95,7 +95,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delItems = await db.SatInfos.Where(p => ids.Contains(p.ID)).ToListAsync();
                     db.SatInfos.RemoveRange(delItems);

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

@@ -64,7 +64,7 @@ namespace XdCxRhDW.App.UserControl
             {
                 var find = list.FirstOrDefault(p => p.ID == id);
                 if (find == null) return;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == id);
                     if (item == null) return;
@@ -137,7 +137,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 List<TxInfo> txList = new List<TxInfo>();
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var tasks = db.TaskInfos.OrderByDescending(p => p.UpdateTime).ToList();
                     list.AddRange(tasks);
@@ -358,19 +358,19 @@ namespace XdCxRhDW.App.UserControl
                 this.gridHomePosRes.DataSource = listPos;
                 mapControl1.SetPosDataSource(listPos);
             }
-
-            using (RHDWContext db = new RHDWContext())
+            SatInfo sat1, sat2, sat3;
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
-                var sat1 = db.SatInfos.Where(p => p.SatCode == tsk.MainSat).FirstOrDefault();
-                var sat2 = db.SatInfos.Where(p => p.SatCode == tsk.Adja1Sat).FirstOrDefault();
-                var sat3 = db.SatInfos.Where(p => p.SatCode == tsk.Adja2Sat).FirstOrDefault();
-                if (sat1 != null && sat1.SatLon != null)
-                    mapControl1.DrawFixedImg("Sat", "Sat1", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"主星\r\n{sat1.Sat}");
-                if (sat2 != null && sat2.SatLon != null)
-                    mapControl1.DrawFixedImg("Sat", "Sat2", 0, sat2.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻1星\r\n{sat2.Sat}");
-                if (sat3 != null && sat3.SatLon != null)
-                    mapControl1.DrawFixedImg("Sat", "Sat3", 0, sat3.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻2星\r\n{sat3.Sat}");
+                sat1 = db.SatInfos.Where(p => p.SatCode == tsk.MainSat).FirstOrDefault();
+                sat2 = db.SatInfos.Where(p => p.SatCode == tsk.Adja1Sat).FirstOrDefault();
+                sat3 = db.SatInfos.Where(p => p.SatCode == tsk.Adja2Sat).FirstOrDefault();
             }
+            if (sat1 != null && sat1.SatLon != null)
+                mapControl1.DrawFixedImg("Sat", "Sat1", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"主星\r\n{sat1.Sat}");
+            if (sat2 != null && sat2.SatLon != null)
+                mapControl1.DrawFixedImg("Sat", "Sat2", 0, sat2.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻1星\r\n{sat2.Sat}");
+            if (sat3 != null && sat3.SatLon != null)
+                mapControl1.DrawFixedImg("Sat", "Sat3", 0, sat3.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻2星\r\n{sat3.Sat}");
 
         }
         private void GridView1_DoubleClick(object sender, EventArgs e)
@@ -464,7 +464,7 @@ namespace XdCxRhDW.App.UserControl
                     if (frm.ShowDialog() != DialogResult.OK) return;
                     addItem = frm.info;
                     var addItemSignal = frm.selectedItem;
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         if (addItem.PosType == EnumPosType.X1D1CX)
                         {
@@ -508,7 +508,7 @@ namespace XdCxRhDW.App.UserControl
                 {
                     var editItem = gridView1.GetFocusedRow() as TaskInfo;
                     if (editItem == null) return;
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
 
                         List<TaskSig> taskSig = await db.TaskSigs.Where(w => w.TaskInfoID == editItem.ID).ToListAsync();
@@ -521,6 +521,7 @@ namespace XdCxRhDW.App.UserControl
                         var editItemSig = frm.selectedItem;
                         if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
                         {
+                            db.Dispose();
                             DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
                             return;
                         }
@@ -580,7 +581,7 @@ namespace XdCxRhDW.App.UserControl
                     if (tsk == null) return;
                     if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
                         return;
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
                         db.TaskInfos.Remove(item);
@@ -613,7 +614,7 @@ namespace XdCxRhDW.App.UserControl
                         TxInfo cdb;
                         List<TaskSigDto> tskSigsDto = new List<TaskSigDto>();
                         List<FixedStation> fixedStations = null;
-                        using (RHDWContext db = new RHDWContext())
+                        using (RHDWContext db = RHDWContext.GetContext(true))
                         {
                             var dbSigs = await db.TaskSigs.Where(w => w.TaskInfoID == tsk.ID).Include(p => p.SigInfo).ToListAsync();
                             if (!dbSigs.Any())
@@ -640,17 +641,15 @@ namespace XdCxRhDW.App.UserControl
                                 sigDto.SigDelay.AddRange(sigDelay.MapTo<List<SigDelayDto>>());
                                 tskSigsDto.Add(sigDto);
                             }
-
                             tx = db.TxInfos.FirstOrDefault(p => p.TxType == EnumTxType.Rec);
                             cdb = db.TxInfos.FirstOrDefault(p => p.TxType == EnumTxType.Cdb);
-                            if (tx == null || cdb == null)
-                            {
-                                DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息");
-                                return;
-                            }
                             fixedStations = await db.FixedStation.Where(p => p.Enable).ToListAsync();
                         }
-
+                        if (tx == null || cdb == null)
+                        {
+                            DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息");
+                            return;
+                        }
                         if (tsk.PosType == EnumPosType.X2D1)
                         {
                             //下发任务
@@ -720,15 +719,14 @@ namespace XdCxRhDW.App.UserControl
                             return;
                         }
                     }
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
                         item.TaskState = EnumTaskState.Running;
                         await db.SaveChangesAsync();
                         tsk.TaskState = EnumTaskState.Running;
-                        XdCxRhDW.Framework.LogHelper.Info($"用户启动了任务,ID={tsk.ID}");
                     }
-
+                    XdCxRhDW.Framework.LogHelper.Info($"用户启动了任务,ID={tsk.ID}");
                 }
                 catch (Exception ex)
                 {
@@ -740,7 +738,7 @@ namespace XdCxRhDW.App.UserControl
             {
                 try
                 {
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext())
                     {
                         var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
                         item.TaskState = EnumTaskState.Stopped;
@@ -950,19 +948,21 @@ namespace XdCxRhDW.App.UserControl
         {
             try
             {
+                var listId = items.Select(p => p.ID);
                 var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd"));
+
                 foreach (var groupItem in groupItems)
                 {
                     var ids = groupItem.Select(m => m.ID).ToList();
                     using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
                     {
                         if (db == null) continue;
-                        var array = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync();
-                        db.PosRes.RemoveRange(array);
+                        string sql = $"update posres set deleted=1 where deleted=0 and id in ({string.Join(",", ids)})";
+                        await db.Database.ExecuteSqlCommandAsync(sql);
                         await db.SaveChangesAsync();
-                        mapControl1.DelPosItem(array);
                     }
                 }
+                mapControl1.DelHugePosItem(items);
                 return true;
             }
             catch (Exception ex)
@@ -972,6 +972,42 @@ namespace XdCxRhDW.App.UserControl
                 return false;
             }
         }
+        //地图批量删除
+        private async Task DeletePosRes(List<ModelPosRes> items)
+        {
+            if (items == null || items.Count() == 0)
+            {
+                DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!");
+                return;
+            }
+            try
+            {
+                if (!MsgBoxHelper.ShowConfirm($"确认删除定位点?共{items.Count}条记录")) return;
+                var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd"));
+                foreach (var groupItem in groupItems)
+                {
+                    var ids = groupItem.Select(m => m.ID).ToList();
+                    using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
+                    {
+                        if (db == null) continue;
+                        string sql = $"update posres set deleted=1 where deleted=0 and id in ({string.Join(",", ids)})";
+                        await db.Database.ExecuteSqlCommandAsync(sql);
+                        await db.SaveChangesAsync();
+                    }
+                }
+                mapControl1.DelHugePosItem(items);
+                var ds = this.gridHomePosRes.DataSource as List<ModelPosRes>;
+                ds.RemoveAll(m => items.Select(p => p.ID).Contains(m.ID));
+                gridView2.RefreshData();
+                XdCxRhDW.Framework.LogHelper.Warning($"用户删除了{items.Count()}个定位点");
+                MsgBoxHelper.ShowInfo($"共删除了{items.Count()}个定位点");
+            }
+            catch (Exception ex)
+            {
+                XdCxRhDW.Framework.LogHelper.Error("删除定位点失败", ex);
+                MsgBoxHelper.ShowError("删除定位点失败!");
+            }
+        }
         //绘制时差线
         public void DrawDtoLine(ModelPosRes item)
         {
@@ -1319,7 +1355,7 @@ namespace XdCxRhDW.App.UserControl
                     using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
                     {
                         if (db == null) continue;
-                        var tarItems = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync();
+                        var tarItems = await db.PosRes.Where(p => p.Deleted == 0 && ids.Contains(p.ID)).ToArrayAsync();
                         tarItems.ForEach(t =>
                         {
                             var repos = items.First(p => p.ID == t.ID);
@@ -1412,14 +1448,14 @@ namespace XdCxRhDW.App.UserControl
                     if (db != null)
                     {
                         var idRes = items.First().ID;
-                        var target = await db.PosRes.Where(p => p.ID == idRes).FirstOrDefaultAsync() as PosRes;
+                        var target = await db.PosRes.Where(p => p.Deleted == 0 && p.ID == idRes).FirstOrDefaultAsync() as PosRes;
                         targetID = target.TargetInfoID;
                     }
                 }
                 TargetInfo info = null;
                 if (targetID > 0)
                 {
-                    using (RHDWContext db = new RHDWContext())
+                    using (RHDWContext db = RHDWContext.GetContext(true))
                     {
                         info = db.TargetInfos.FirstOrDefault(p => p.ID == targetID);
                     }
@@ -1436,7 +1472,7 @@ namespace XdCxRhDW.App.UserControl
                     using (RHDWPartContext db = RHDWPartContext.GetContext(groupItems.First().SigTime))
                     {
                         if (db == null) continue;
-                        var tarItems = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync();
+                        var tarItems = await db.PosRes.Where(p => p.Deleted == 0 && ids.Contains(p.ID)).ToArrayAsync();
                         tarItems.ForEach(t =>
                         {
                             t.TargetInfoID = tar.ID;
@@ -1512,7 +1548,7 @@ namespace XdCxRhDW.App.UserControl
                     using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
                     {
                         if (db == null) continue;
-                        var array = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync();
+                        var array = await db.PosRes.Where(p => p.Deleted == 0 && ids.Contains(p.ID)).ToArrayAsync();
                         UseMirror(array);
                         await db.SaveChangesAsync();
                     }
@@ -1530,42 +1566,7 @@ namespace XdCxRhDW.App.UserControl
             }
 
         }
-        //批量删除
-        private async Task DeletePosRes(List<ModelPosRes> items)
-        {
-            if (items == null || items.Count() == 0)
-            {
-                DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!");
-                return;
-            }
-            try
-            {
-                if (!MsgBoxHelper.ShowConfirm($"确认删除定位点?共{items.Count}条记录")) return;
-                var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd"));
-                foreach (var groupItem in groupItems)
-                {
-                    var ids = groupItem.Select(m => m.ID).ToList();
-                    using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
-                    {
-                        if (db == null) continue;
-                        var list = await db.PosRes.Where(p => ids.Contains(p.ID)).ToListAsync();
-                        db.PosRes.RemoveRange(list);
-                        await db.SaveChangesAsync();
-                    }
-                }
-                mapControl1.DelPosItem(items);
-                var ds = this.gridHomePosRes.DataSource as List<ModelPosRes>;
-                ds.RemoveAll(m => items.Select(p => p.ID).Contains(m.ID));
-                gridView2.RefreshData();
-                XdCxRhDW.Framework.LogHelper.Warning($"用户删除了{items.Count()}个定位点");
-                MsgBoxHelper.ShowInfo($"共删除了{items.Count()}个定位点");
-            }
-            catch (Exception ex)
-            {
-                XdCxRhDW.Framework.LogHelper.Error("删除定位点失败", ex);
-                MsgBoxHelper.ShowError("删除定位点失败!");
-            }
-        }
+
         private void UseMirror(IEnumerable<PosRes> pos)
         {
             foreach (var item in pos)

+ 4 - 4
XdCxRhDW.App/UserControl/CtrlSat.cs

@@ -26,7 +26,7 @@ namespace XdCxRhDW.App.UserControl
                     .UseAddAsync(Add)
                     .UseEditAsync<SatInfo>(Edit)
                     .UseDeleteAsync<SatInfo>(Delete);
-                using (var db = new RHDWContext())
+                using (var db = RHDWContext.GetContext(true))
                 {
                     var items = await db.SatInfos.OrderBy(p => p.SatName).ToListAsync();
                     list.AddRange(items);
@@ -46,7 +46,7 @@ namespace XdCxRhDW.App.UserControl
                 SatEditor frm = new SatEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 var addItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     db.SatInfos.Add(addItem);
                     await db.SaveChangesAsync();
@@ -68,7 +68,7 @@ namespace XdCxRhDW.App.UserControl
                 SatEditor frm = new SatEditor(editItem);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 editItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var find = await db.SatInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
                     find.SatName = editItem.SatName;
@@ -92,7 +92,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delItems = await db.SatInfos.Where(p => ids.Contains(p.ID)).ToListAsync();
                     db.SatInfos.RemoveRange(delItems);

+ 8 - 8
XdCxRhDW.App/UserControl/CtrlSignal.cs

@@ -38,7 +38,7 @@ namespace XdCxRhDW.App.UserControl
                    .UseEditAsync<SigDelay>(EditSigDelay)
                    .UseDeleteAsync<SigDelay>(DeleteSigDelay);
 
-                using (var db = new RHDWContext())
+                using (var db = RHDWContext.GetContext(true))
                 {
                     var items = await db.SigInfos.OrderBy(p=>p.FreqUp).ToListAsync();
                     listSigInfo.AddRange(items);
@@ -69,7 +69,7 @@ namespace XdCxRhDW.App.UserControl
                 SigEditor frm = new SigEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 var addItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var sig = db.SigInfos.Add(addItem);
                     await db.SaveChangesAsync();
@@ -90,7 +90,7 @@ namespace XdCxRhDW.App.UserControl
                 SigEditor frm = new SigEditor(editItem);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 editItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var find = await db.SigInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
                     find.FreqUp = editItem.FreqUp;
@@ -115,7 +115,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delayItems= db.SigDelays.Where(p => ids.Contains(p.SigInfoId));
                     db.SigDelays.RemoveRange(delayItems);
@@ -141,7 +141,7 @@ namespace XdCxRhDW.App.UserControl
                 SigDelayEditor frm = new SigDelayEditor(sigInfoId.ID);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 var addItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     addItem.SigInfoId = sigInfoId.ID;
                     var sig = db.SigDelays.Add(addItem);
@@ -165,7 +165,7 @@ namespace XdCxRhDW.App.UserControl
                 SigDelayEditor frm = new SigDelayEditor(editItem, sigInfoId.ID);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 editItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var find = await db.SigDelays.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
                     find.SigInfoId = editItem.SigInfoId;
@@ -187,7 +187,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delItems = await db.SigDelays.Where(p => ids.Contains(p.ID)).ToListAsync();
                     db.SigDelays.RemoveRange(delItems);
@@ -208,7 +208,7 @@ namespace XdCxRhDW.App.UserControl
             listSigDelay.Clear();
             var sigInfoId = gridViewSignal.GetFocusedRow() as SigInfo;
             if (sigInfoId == null) return;
-            using (var db = new RHDWContext())
+            using (var db = RHDWContext.GetContext(true))
             {
                 var delayItems = await db.SigDelays.Where(w => w.SigInfoId == sigInfoId.ID).OrderBy(p=>p.SatInfo.SatName).ToListAsync();
                 var sats = await db.SatInfos.ToListAsync();

+ 11 - 15
XdCxRhDW.App/UserControl/CtrlSysSettings.cs

@@ -105,11 +105,12 @@ namespace XdCxRhDW.App.UserControl
                     DxHelper.MsgBoxHelper.ShowError("系统时区错误!");
                     return;
                 }
-                using (RHDWContext db = new RHDWContext())
+                bool needStartHttpSvr = false;
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var res = await db.SysSetings.FirstOrDefaultAsync();
                     if (res == null) res = new SysSetings();
-                    bool needStartHttpSvr = res.HttpPort != port;
+                    needStartHttpSvr = res.HttpPort != port;
                     if (!needStartHttpSvr)
                     {
                         needStartHttpSvr = res.TimeZoneID != txtTimeZone.TimeZoneId;
@@ -134,7 +135,7 @@ namespace XdCxRhDW.App.UserControl
                     res.MapType = txtMapType.SelectedIndex;
                     if (txtMapType.SelectedIndex != 0)
                     {
-                        var wmtsSource= (EnumWmtsSource)txtWmtsSource.EditValue;
+                        var wmtsSource = (EnumWmtsSource)txtWmtsSource.EditValue;
                         if (!mapChanged)
                         {
                             mapChanged = res.WmtsSource != wmtsSource;
@@ -161,16 +162,11 @@ namespace XdCxRhDW.App.UserControl
                     if (mapChanged)
                         Messenger.Defalut.Pub("地图类型改变", res);
                     Messenger.Defalut.Pub("时区改变", res);
-                    DxHelper.MsgBoxHelper.ShowInfo("配置信息保存成功!");
-                    if (needStartHttpSvr)
-                    {
-                        //var files=Directory.GetFiles("Service", "*.exe.config");
-                        //foreach (var f in files) 
-                        //{
-                        //    File.ReadAllText(f);
-                        //}
-                        Application.Restart();
-                    }
+                }
+                DxHelper.MsgBoxHelper.ShowInfo("配置信息保存成功!");
+                if (needStartHttpSvr)
+                {
+                    Application.Restart();
                 }
             }
             catch (Exception ex)
@@ -210,12 +206,12 @@ namespace XdCxRhDW.App.UserControl
                     var val = (EnumWmtsSource)rg.Properties.Items[i].Value;
                     if (val == EnumWmtsSource.ZCJ)
                     {
-                        var str =AppConfigHelper.Get("ZCJ_URL","");
+                        var str = AppConfigHelper.Get("ZCJ_URL", "");
                         e.Info = new ToolTipControlInfo(i, $"{rg.Properties.Items[i].Description}:{str}");
                     }
                     else
                     {
-                        var str = AppConfigHelper.Get("SJZX_URL","");
+                        var str = AppConfigHelper.Get("SJZX_URL", "");
                         e.Info = new ToolTipControlInfo(i, $"{rg.Properties.Items[i].Description}:{str}");
                     }
                     break;

+ 4 - 4
XdCxRhDW.App/UserControl/CtrlTarget.cs

@@ -33,7 +33,7 @@ namespace XdCxRhDW.App.UserControl
                 gridTar.UseDefault(list).UseMultiSelect().UseRowNumber()
                     .UseAddAsync(Add).UseEditAsync<TargetInfo>(Edit).UseDeleteAsync<TargetInfo>(Del);
 
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var res = db.TargetInfos.OrderBy(p => p.TargetName).OrderBy(p => p.TargetName);
                     list.AddRange(await res.ToListAsync());
@@ -54,7 +54,7 @@ namespace XdCxRhDW.App.UserControl
                 TargetEditor frm = new TargetEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 var addItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     db.TargetInfos.Add(addItem);
                     await db.SaveChangesAsync();
@@ -75,7 +75,7 @@ namespace XdCxRhDW.App.UserControl
                 TargetEditor frm = new TargetEditor(editItem);
                 if (frm.ShowDialog() != DialogResult.OK) return null;
                 editItem = frm.info;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var find = await db.TargetInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
                     find.TargetName = editItem.TargetName;
@@ -98,7 +98,7 @@ namespace XdCxRhDW.App.UserControl
             {
 
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delItems = await db.TargetInfos.Where(p => ids.Contains(p.ID)).ToListAsync();
                     db.TargetInfos.RemoveRange(delItems);

+ 3 - 5
XdCxRhDW.App/UserControl/CtrlTx.cs

@@ -35,7 +35,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
 
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     list = await db.TxInfos.ToListAsync();
                     var recTx = list.Find(p => p.TxType == EnumTxType.Rec);
@@ -131,9 +131,8 @@ namespace XdCxRhDW.App.UserControl
                 txRef.Lat = refLat;
                 tmp.Add(txRef);
 
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
-
                     foreach (var item in tmp)
                     {
                         var find = await db.TxInfos.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
@@ -149,9 +148,8 @@ namespace XdCxRhDW.App.UserControl
                         {
                             db.TxInfos.Add(item);
                         }
-                        await db.SaveChangesAsync();
-
                     }
+                    await db.SaveChangesAsync();
                 }
                 DxHelper.MsgBoxHelper.ShowInfo("保存成功!");
             }

+ 2 - 2
XdCxRhDW.App/UserControl/CtrlXl.cs

@@ -169,7 +169,7 @@ namespace XdCxRhDW.App.UserControl
             {
                 this.Enabled = false;
                 var ids = list.Select(p => p.ID);
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     var delItems = await db.XlInfos.Where(p => ids.Contains(p.ID)).ToListAsync();
                     db.XlInfos.RemoveRange(delItems);
@@ -195,7 +195,7 @@ namespace XdCxRhDW.App.UserControl
             try
             {
                 this.Enabled = false;
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext())
                 {
                     if (satCode == null)
                     {

+ 5 - 1
XdCxRhDW.Entity/BaseEntity.cs

@@ -21,7 +21,7 @@ namespace XdCxRhDW.Entity
         [Key]   // 主键
         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]       // 自增列
         [Autoincrement]
-        [Display(Name ="编号")]
+        [Display(Name = "编号")]
         public int ID { get; set; }
 
         [Display(Name = "创建时间")]
@@ -52,5 +52,9 @@ namespace XdCxRhDW.Entity
         [Display(Name = "更新时间")]
         public DateTime UpdateTime { get; set; }
 
+        [Index]
+        [Display(AutoGenerateField = false)]
+        public int Deleted { get; set; } = 0;
+
     }
 }

+ 87 - 10
XdCxRhDW.Repostory/EFContext/RHDWContext.cs

@@ -2,6 +2,7 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations.Schema;
+using System.Configuration;
 using System.Data.Common;
 using System.Data.Entity;
 using System.Data.Entity.Core.Common;
@@ -44,7 +45,7 @@ namespace XdCxRhDW.Repostory
         }
         public DbContextBase(DbConnection con, bool contextOwnsConnection)
             : base(con, contextOwnsConnection)
-        { 
+        {
         }
 
         /// <summary>
@@ -277,6 +278,10 @@ namespace XdCxRhDW.Repostory
                         {
                             typeStr = "datetime";
                         }
+                        else if (type == typeof(bool))
+                        {
+                            typeStr = "int";
+                        }
                         bool isNullable = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>);
 
                         string updateTableSql;
@@ -329,11 +334,58 @@ namespace XdCxRhDW.Repostory
     public class RHDWContext : DbContextBase
     {
         public string DbFile;
-        public RHDWContext() : base("DbCon") //配置使用的连接名
+        private bool readOnly = false;
+        private static RHDWContext rContext;
+        private static RHDWContext wContext;
+        public static RHDWContext GetContext(bool readOnly=false)
         {
-            //|DataDirectory|在mvc等程序中代表了App_Data,在普通程序中代表程序根目录
-            this.DbFile = Database.Connection.ConnectionString.Replace("Data Source=", "").Replace("|DataDirectory|\\", "");
+            if (readOnly)
+            {
+                if (rContext == null)
+                {
+                    string conStr = ConfigurationManager.ConnectionStrings["DbCon"].ConnectionString.Trim();
+                    if (conStr.EndsWith(";"))
+                        conStr = conStr.Substring(0, conStr.Length - 1);
+                    conStr = $"{conStr};Version=3;Journal Mode=Off;Read Only=True";
+                    SQLiteConnection con = new SQLiteConnection(conStr);
+                    var res = new RHDWContext(con);
+                    res.readOnly= readOnly;
+                    rContext = res;
+                    return res;
+                }
+                else
+                    return rContext;
+            }
+            else
+            {
+                if (wContext == null)
+                {
+                    string conStr = ConfigurationManager.ConnectionStrings["DbCon"].ConnectionString.Trim();
+                    if (conStr.EndsWith(";"))
+                        conStr = conStr.Substring(0, conStr.Length - 1);
+                    conStr = $"{conStr};Version=3;Journal Mode=Off";
+                    SQLiteConnection con = new SQLiteConnection(conStr);
+                    var res = new RHDWContext(con);
+                    wContext = res;
+                    return res;
+                }
+                else
+                    return wContext;
+            }
+           
+
         }
+        private RHDWContext(DbConnection con)
+         : base(con, true)
+        {
+            var dbFile = Database.Connection.ConnectionString.Replace("Data Source=", "").Replace("|DataDirectory|\\", "");
+            this.DbFile = dbFile;
+        }
+        //public RHDWContext() : base("DbCon") //配置使用的连接名
+        //{
+        //    //|DataDirectory|在mvc等程序中代表了App_Data,在普通程序中代表程序根目录
+        //    this.DbFile = Database.Connection.ConnectionString.Replace("Data Source=", "").Replace("|DataDirectory|\\", "");
+        //}
 
         public Task<List<T>> SqlQueryAsync<T>(string sql)
         {
@@ -351,6 +403,15 @@ namespace XdCxRhDW.Repostory
             this.Database.Log = msg =>
             {
             };
+            if (!readOnly)
+            {
+                if (this.Database.Connection.State == System.Data.ConnectionState.Open)
+                {
+                    var cmd = this.Database.Connection.CreateCommand();
+                    cmd.CommandText = "PRAGMA journal_mode=WAL";
+                    cmd.ExecuteNonQuery();
+                }
+            }
             modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
             modelBuilder.Configurations.AddFromAssembly(typeof(RHDWContext).Assembly);//自动加载Entity-Type
             var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<RHDWContext>(modelBuilder);
@@ -386,25 +447,41 @@ namespace XdCxRhDW.Repostory
     public class RHDWPartContext : DbContextBase
     {
         private string DbFile;
-        public static RHDWPartContext GetContext(string dbFile, bool createDb = false)
+        public static RHDWPartContext GetContext(string dbFile, bool createDb = false, bool readOnly = false)
         {
             if (!File.Exists(dbFile) && !createDb)
             {
                 return null;
             }
-            var connectionString = $@"Data Source={dbFile}";
+            string connectionString;
+            if (readOnly)
+            {
+                connectionString = $@"Data Source={dbFile};RAGMA mode=ReadOnly;Journal=WAL";
+            }
+            else
+            {
+                connectionString = $@"Data Source={dbFile};Journal=WAL";
+            }
             SQLiteConnection con = new SQLiteConnection(connectionString);
             return new RHDWPartContext(con);
         }
-        public static RHDWPartContext GetContext(DateTime partTime, bool createDb = false, string prefix = "")
+        public static RHDWPartContext GetContext(DateTime partTime, bool createDb = false, bool readOnly = false)
         {
             var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
-            var dayFile = Path.Combine(dir, $@"{partTime.Year}\{prefix}{partTime:MMdd}.db");
+            var dayFile = Path.Combine(dir, $@"{partTime.Year}\{partTime:MMdd}.db");
             if (!File.Exists(dayFile) && !createDb)
             {
                 return null;
             }
-            var connectionString = $@"Data Source=|DataDirectory|\DbPart\{partTime.Year}\{prefix}{partTime:MMdd}.db";
+            string connectionString;
+            if (readOnly)
+            {
+                connectionString = $@"Data Source=|DataDirectory|\DbPart\{partTime.Year}\{partTime:MMdd}.db;PRAGMA mode=ReadOnly;Journal=WAL";
+            }
+            else
+            {
+                connectionString = $@"Data Source=|DataDirectory|\DbPart\{partTime.Year}\{partTime:MMdd}.db;Journal=WAL";
+            }
             SQLiteConnection con = new SQLiteConnection(connectionString);
             return new RHDWPartContext(con);
         }
@@ -414,7 +491,7 @@ namespace XdCxRhDW.Repostory
             var dbFile = Database.Connection.ConnectionString.Replace("Data Source=", "").Replace("|DataDirectory|\\", "");
             this.DbFile = dbFile;
         }
-      
+
         protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
             this.Database.Log = msg =>

+ 5 - 5
XdCxRhDW.Repostory/XlRepository.cs

@@ -20,7 +20,7 @@ namespace XdCxRhDW.Repostory
         {
             try
             {
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var res = await db.XlInfos.OrderByDescending(p => p.TimeUTC).OrderByDescending(p => p.Lon).Take(5000).ToListAsync();
                     return res;
@@ -34,7 +34,7 @@ namespace XdCxRhDW.Repostory
         }
         public static async Task<int> GetCount(int? satCode)
         {
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 if (satCode == null)
                 {
@@ -50,7 +50,7 @@ namespace XdCxRhDW.Repostory
         }
         public static async Task<List<SatInfo>> GetAllSat()
         {
-            using (RHDWContext db = new RHDWContext())
+            using (RHDWContext db = RHDWContext.GetContext(true))
             {
                 string sql = "select * from XlInfo where id in (select max(id) maxid from xlinfo group by satcode) order by satcode";
                 var data = await db.Database.SqlQuery<XlInfo>(sql).ToListAsync();
@@ -71,7 +71,7 @@ namespace XdCxRhDW.Repostory
         {
             try
             {
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     var topNumber = (currentPage - 1) * pageSize;
                     StringBuilder sb = new StringBuilder();
@@ -106,7 +106,7 @@ namespace XdCxRhDW.Repostory
                 //GetLatestAsync方法在索引列上使用了加减运算会导致索引失效,运算变慢,这个函数是对GetLatestAsyncOld的优化
                 //老的SQL很慢
                 //SELECT min(abs(JULIANDAY(TimeUTC)-JULIANDAY('2024-10-09 23:59:53'))) as NearDaySpan,* FROM XlInfo where satcode=40892
-                using (RHDWContext db = new RHDWContext())
+                using (RHDWContext db = RHDWContext.GetContext(true))
                 {
                     string sql = $"select * from XlInfo where SatCode={satCode} and TimeUTC>='{sigTime:yyyy-MM-dd HH:mm:ss}' order by TimeUTC limit 1";
                     var max = await db.Database.SqlQuery<XlInfo>(sql).FirstOrDefaultAsync();

+ 0 - 4
XdCxRhDw.Dto/DetectDto.cs

@@ -73,10 +73,6 @@ namespace XdCxRhDW.Dto
                 {
                     yield return new ValidationResult("常规信号不需要检测", new[] { nameof(this.dmcType) });
                 }
-                if (dmcType.HasFlag(EnumSigCheckTypeDto.DAMA) && fsHz != 96000)
-                {
-                    yield return new ValidationResult("DAMA检测采样率只支持96K", new[] { nameof(this.fsHz) });
-                }
                 if (dmcType.HasFlag(EnumSigCheckTypeDto.IBS) && band != 5 && band != 25)
                 {
                     yield return new ValidationResult("IBS检测信号带宽只支持5K、25K两种", new[] { nameof(this.band) });

+ 15 - 0
XdCxRhDw.Dto/PosResDto.cs

@@ -78,6 +78,21 @@ namespace XdCxRhDW.Dto
         /// </summary>
         public int Confidence { get; set; }
 
+        /// <summary>
+        /// 检测出的序列名称(只有DAMA和IBS有)
+        /// </summary>
+        public string UserName{ get; set; }
+
+        /// <summary>
+        /// 第1路信噪比
+        /// </summary>
+        public double? Snr1 { get; set; }
+
+        /// <summary>
+        /// 第2路信噪比
+        /// </summary>
+        public double? Snr2 { get; set; }
+
         /// <summary>
         /// 数据创建时间
         /// </summary>