Browse Source

Merge branch 'master' of http://139.155.15.221:3000/zoulei/XdCxRhDW

zoule 8 months ago
parent
commit
32ced0d857

+ 1 - 1
Service/CapMoni/App.config

@@ -2,7 +2,7 @@
 <configuration>
 	<appSettings>
 		<!--采集文件存放目录-->
-		<add key="FileDir" value="C:\"/>
+		<add key="FileDir" value="D:\"/>
 		<!--采集时长(S)-->
 		<add key="Duration" value="60"/>
 		<!--频点(MHz)多个 "310.85;310.95;311;312;313;314;315;316;317"-->

+ 0 - 0
Service/X2D1TaskServer/Log.db


+ 141 - 42
Service/X2D1TaskServer/Service/TaskService.cs

@@ -1,4 +1,5 @@
-using System;
+using Org.BouncyCastle.Security;
+using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Diagnostics;
@@ -528,22 +529,30 @@ namespace X2D1TaskServer.Service
                             await LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
                             continue;
                         }
+
+                        //执行参考信号
                         List<DetectResDto> refDetects = await DoRefAsync(dto, paramInfo, deteRes, data1, data2, cts);
-                        bool beFindRef = true;
-                        int fixedStationDto = dto.FixedStationDto != null ? dto.FixedStationDto.FixedStationId : 0;
-                        if (fixedStationDto <= 0)//无固定站,直接执行无参
-                        {
-                            beFindRef = false;
-                        }
-                        if (refDetects != null && refDetects.Count > 0)//有参考信号
+
+                        //目标信号
+                        string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]{capTime:yyyyMMddHHmmss}时刻";
+                        bool beFindRef = false;
+                        if (refDetects != null && refDetects.Count > 0)//有符合规则的固定站参考信号
                         {
+                            beFindRef = true;
                             data1 = data1.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
                             data2 = data2.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
                         }
-                        string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
+                        //构建目标信号定位模型
+                        var tar = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, deteRes, data1, data2, cts, msg);
 
-                        //目标信号
-                        await DoX2D1NoParPosAsync(dto, paramInfo, deteRes, data1, data2, cts, msg, fixedStationDto, beFindRef);
+                        if (beFindRef)//有符合规则的固定站参考信号就把目标信号添加目标缓存中
+                        {
+                            await AddTarCacheAsync(tar, msg);
+                        }
+                        else//其他都执行原有的无参流程
+                        {
+                            await DoX2D1NoParPosAsync(tar, paramInfo.Minfo.CapTime, cts, msg);
+                        }
 
                     }
                     catch (TaskCanceledException)
@@ -563,8 +572,10 @@ namespace X2D1TaskServer.Service
             return task;
         }
 
-        private async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg, int fixedStationId, bool beFindRef = false)
+
+        private List<X2D1NoXlNoParlPosDto> BuildX2D1NoXlNoParlPosDto(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg)
         {
+            int fixedStationId = dto.FixedStationDto != null ? dto.FixedStationDto.FixedStationId : 0;
             List<X2D1NoXlNoParlPosDto> list = new List<X2D1NoXlNoParlPosDto>();
             for (int i = 0; i < data1.Count; i++)
             {
@@ -587,7 +598,7 @@ namespace X2D1TaskServer.Service
                         CdbTxLat = dto.CdbLat,
                         FreqDown = paramInfo.Minfo.FreqHz,
                         FreqUp = paramInfo.Dinfo.FreqHz,
-                        BeFindRef = beFindRef,
+                        FixedStationId = fixedStationId,
                         CheckRes = new CheckResDto()
                         {
                             FileName = Path.GetFileName(paramInfo.Dinfo.FilePath),
@@ -601,10 +612,6 @@ namespace X2D1TaskServer.Service
                         }
 
                     };
-                    if (fixedStationId > 0)
-                    {
-                        x2D1.FixedStationId = fixedStationId;
-                    }
                     if (data1[i].Snr > 0 && data2[i].Snr > 0)
                     {
                         //卫星转发某些频点可能有时延,无参定位由于不能抵消需要减去这个时延
@@ -627,42 +634,71 @@ namespace X2D1TaskServer.Service
                             x2D1.XdSnr = data1[i].Snr;
                         }
                     }
-                    if (beFindRef)
-                    {
-                        list.Add(x2D1);
-                        continue;
-                    }
+                    list.Add(x2D1);
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}构建目标信号参数异常", ex).GetAwaiter();
+                }
+            }
+            return list;
+        }
+        private async Task DoX2D1NoParPosAsync(List<X2D1NoXlNoParlPosDto> x2D1s, DateTime capTime, CancellationTokenSource cts, string msg)
+        {
+
+            foreach (var x2D1 in x2D1s)
+            {
+                try
+                {
+                    if (cts.IsCancellationRequested) break;
+
                     var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1NoXlNoParAsync", x2D1);
                     if (result.code != 200)
                     {
-                        await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                        await LogHelper.Error($"{msg},{x2D1.SigTime:yyyyMMddHHmmss}时刻定位异常.{result.msg}");
                     }
                 }
                 catch (Exception ex)
                 {
-                    await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
+                    await LogHelper.Error($"{msg},{x2D1.SigTime:yyyyMMddHHmmss}时刻定位异常", ex);
                 }
             }
+            await LogHelper.Info($"{msg}定位完成");
+        }
+
+        private async Task AddTarCacheAsync(List<X2D1NoXlNoParlPosDto> x2D1s, string msg)
+        {
+            if (x2D1s.Count == 0) return;
             try
             {
-                if (beFindRef)
+                var result = await HttpHelper.PostRequestAsync(_config.baseUrl + "FindRef/AddX2D1TarCacheAsync", x2D1s);
+                if (result.code != 200)
                 {
-                    var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1BeFindRefListAsync", list);
-                    if (result.code != 200)
-                    {
-                        await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻找参考定位定位异常.{result.msg}");
-                    }
-
+                    await LogHelper.Error($"{msg},添加目标信号缓存异常.{result.msg}");
                 }
             }
             catch (Exception ex)
             {
-                await LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻找参考定位异常", ex);
+                await LogHelper.Error($"{msg}添加目标信号缓存异常", ex);
             }
-
-            await LogHelper.Info($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻定位完成");
         }
 
+        private async Task AddRefCacheAsync(List<TaskCgDto> dtos, string msg)
+        {
+            if (dtos.Count == 0) return;
+            try
+            {
+                var result = await HttpHelper.PostRequestAsync(_config.baseUrl + "FindRef/AddX2D1RefCacheAsync", dtos);
+                if (result.code != 200)
+                {
+                    await LogHelper.Error($"{msg},添加参考信号缓存异常.{result.msg}");
+                }
+            }
+            catch (Exception ex)
+            {
+                await LogHelper.Error($"{msg}添加参考信号缓存异常", ex);
+            }
+        }
         /// <summary>
         /// 做参考信号
         /// </summary>
@@ -675,7 +711,6 @@ namespace X2D1TaskServer.Service
         /// <returns></returns>
         private async Task<List<DetectResDto>> DoRefAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> detects, List<CpuCgResDto> cg1, List<CpuCgResDto> cg2, CancellationTokenSource cts)
         {
-
             bool beRef = false;
 
             //没有固定站时 做无参
@@ -697,9 +732,6 @@ namespace X2D1TaskServer.Service
             {
                 beRef = true;
             }
-            if (!beRef) return null;
-
-
             //获取满足固定站条件的参考信号 
             List<DetectResDto> refDetects = new List<DetectResDto>();
             for (int i = 0; i < detects.Count; i++)
@@ -717,21 +749,88 @@ namespace X2D1TaskServer.Service
                     refDetects.Add(nextdete);
                 }
             }
-            if (refDetects.Count == 0) return null;
+
             var capTime = paramInfo.Minfo.CapTime;
+            string msg = $"【任务{dto.ID}】参考信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]{capTime:yyyyMMddHHmmss}时刻";
+            if (refDetects.Count == 0)
+            {
+                await SendZeroRefCacheAsync(dto, capTime, msg);
+                beRef = false;
+            }
+            if (!beRef) return null;
+
             await LogHelper.Info($"【任务{dto.ID}】参考信号[{dto.FixedStationDto.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻{_config.checkFileTypeStr}检测完成,共{refDetects.Count}个时隙");
             var smps = refDetects.Select(m => new SmpPosition(m.Start, m.Length)).ToList();//怎么补0?
             var data1 = cg1.Where(c => refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
             var data2 = cg2.Where(c => refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
             if (data1.Count != data2.Count || data1.Count != refDetects.Count)
             {
+                await SendZeroRefCacheAsync(dto, capTime, msg);
                 await LogHelper.Error($"【任务{dto.ID}】参考信号[{dto.FixedStationDto.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
                 return null;
             }
-            string msg = $"【任务{dto.ID}】参考信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
-            //参考信号要存储固定站编号,标记是参考信号
-            await DoX2D1NoParPosAsync(dto, paramInfo, refDetects, data1, data2, cts, msg, dto.FixedStationDto.FixedStationId);
+            //构建参考信号定位模型
+            var refSigDto = BuildX2D1NoXlNoParlPosDto(dto, paramInfo, refDetects, data1, data2, cts, msg);
+            //执行三星无参定位
+            await DoX2D1NoParPosAsync(refSigDto, paramInfo.Minfo.CapTime, cts, msg);
+
+            List<TaskCgDto> cgItems = new List<TaskCgDto>();
+            foreach (var item in refSigDto)
+            {
+                var ephMain = await GetSatEphAsync(dto.MainSatCode, item.SigTime);
+                var ephAdja = await GetSatEphAsync(dto.AdjaSatCode, item.SigTime);
+                if (ephMain == null || ephAdja == null) continue;
+                var tarEcef = PhysicsHelper.GeoToEcef((dto.FixedStationDto.Lon, dto.FixedStationDto.Lat, 0));
+                var ecefXl1 = (ephMain.X, ephMain.Y, ephMain.Z);
+                var ecefXl2 = (ephAdja.X, ephAdja.Y, ephAdja.Z);
+                var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbLon, dto.CdbLat, 0));
+                var ecefRec = PhysicsHelper.GeoToEcef((dto.CapLon , dto.CapLat, 0));
+                var mtdt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec);
+                var atdt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec);
+                TaskCgDto cgItem = new TaskCgDto
+                {
+                    TaskID = dto.ID,
+                    FixedLon = dto.FixedStationDto.Lon,
+                    FixedLat = dto.FixedStationDto.Lat,
+                    SigTime = item.SigTime,
+                    MainYbDto = mtdt1,
+                    AdjaYbDto = atdt2,
+                    YbSnr =40,
+                };
+                cgItems.Add(cgItem);
+            }
+            //添加参考信号缓存
+            await AddRefCacheAsync(cgItems, msg);
             return refDetects;
         }
+
+        private async Task SendZeroRefCacheAsync(X2D1TaskHandleDto dto, DateTime capTime, string msg)
+        {
+            List<TaskCgDto> cgItems = new List<TaskCgDto>();
+            TaskCgDto cgItem = new TaskCgDto
+            {
+                TaskID = dto.ID,
+                FixedLon = dto.FixedStationDto.Lon,
+                FixedLat = dto.FixedStationDto.Lat,
+                SigTime = capTime.AddSeconds(_config.capSeconds),
+                MainYbDto = 0,
+                AdjaYbDto = 0,
+                YbSnr = 0,
+            };
+            cgItems.Add(cgItem);
+            //添加参考信号缓存
+            await AddRefCacheAsync(cgItems, msg);
+        }
+
+        private async Task<SatEphResDto> GetSatEphAsync(int satcode, DateTime sigtime)
+        {
+            var result = await HttpHelper.PostRequestAsync<SatEphResDto>(_config.baseUrl + "Xl/XLCalc", new SatDto() { SatCode = satcode, SigTime = sigtime });
+            if (result.code != 200)
+            {
+                await LogHelper.Error($"卫星:{satcode},{sigtime:yyyyMMddHHmmss}时刻获取星历异常.{result.msg}");
+                return null;
+            }
+            return result.data;
+        }
     }
 }

+ 112 - 0
XdCxRhDW.App/Controllers/FindRefController.cs

@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Entity;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+using XdCxRhDW.Repostory;
+using XdCxRhDW.WebApi;
+
+namespace XdCxRhDW.App.Controllers
+{
+    /// <summary>
+    /// 取参考相关接口
+    /// </summary>
+    public class FindRefController : BaseController
+    {
+        /// <summary>
+        /// 添加两星一地参考信号缓存
+        /// </summary>
+        /// <returns>返回请求结果</returns>
+        [HttpPost]
+        public async Task<AjaxResult> AddX2D1RefCacheAsync(List<TaskCgDto> dtos)
+        {
+            var dto = dtos.First();
+            try
+            {
+                TaskInfo runTask;
+                using (RHDWContext db = new RHDWContext())
+                {
+                    if (dto.TaskID == null)
+                    {
+                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
+                        && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
+                        if (runTask == null)
+                        {
+                            Serilog.Log.Warning($"接收到两星一地无参参考信号参数,由于找不到执行中的任务忽略本次定位");
+                            return Error($"多模式融合定位平台没有启动两星一地定位任务");
+                        }
+                    }
+                    else
+                    {
+                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
+                        if (runTask == null)
+                        {
+                            Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
+                            return Error($"找不到ID={dto.TaskID}的任务");
+                        }
+                    }
+                }
+               
+                TaskRefCache.Instance.AddRange(dto.TaskID.Value, dtos);
+                return Success();
+
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, $"添加两星一地参考信号.ID={dto.TaskID}");
+                return Error(ex.Message);
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// 添加两星一地目标信号缓存
+        /// </summary>
+        /// <returns>返回请求结果</returns>
+        [HttpPost]
+        public async Task<AjaxResult> AddX2D1TarCacheAsync(List<X2D1NoXlNoParlPosDto> dtos)
+        {
+            var dto = dtos.First();
+            try
+            {
+                TaskInfo runTask;
+                using (RHDWContext db = new RHDWContext())
+                {
+                    if (dto.TaskID == null)
+                    {
+                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
+                        && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
+                        if (runTask == null)
+                        {
+                            Serilog.Log.Warning($"接收到两星一地无参目标信号参数,由于找不到执行中的任务忽略本次定位");
+                            return Error($"多模式融合定位平台没有启动两星一地定位任务");
+                        }
+                    }
+                    else
+                    {
+                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
+                        if (runTask == null)
+                        {
+                            Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
+                            return Error($"找不到ID={dto.TaskID}的任务");
+                        }
+                    }
+                }
+                TaskTarCache.Instance.AddRange(dto.TaskID.Value, dtos);
+                return Success();
+
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, $"添加两星一地目标信号.ID={dto.TaskID}");
+                return Error(ex.Message);
+            }
+        }
+    }
+}

+ 3 - 88
XdCxRhDW.App/Controllers/PosController.cs

@@ -540,6 +540,7 @@ namespace XdCxRhDW.App.Controllers
                         Confidence = (int)res[6],
                         PosResType = EnumPosResType.X2D1,
                     };
+                    /*
                     if (posRes.PosLon == 999 || posRes.PosLat == 999)//有参无结果时做无参
                     {
                         res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
@@ -559,7 +560,7 @@ namespace XdCxRhDW.App.Controllers
                         };
 
                     }
-
+                    */
                     if (dto.TheoryDfoCalc && posRes.PosLon != 999)
                         posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
                     posRes = db.PosRes.Add(posRes);
@@ -697,93 +698,7 @@ namespace XdCxRhDW.App.Controllers
             }
         }
 
-        Random r = new Random();
-
-        /// <summary>
-        /// 两星一地无参定位(无星历)
-        /// </summary>
-        /// <returns>返回定位结果ID</returns>
-        [HttpPost]
-        public async Task<AjaxResult<PosResDto>> PosX2D1BeFindRefListAsync(List<X2D1NoXlNoParlPosDto> dtos)
-        {
-            var dto = dtos.First();
-            try
-            {
-                TaskInfo runTask;
-                using (RHDWContext db = new RHDWContext())
-                {
-                    if (dto.TaskID == null)
-                    {
-                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
-                        && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
-                        if (runTask == null)
-                        {
-                            Serilog.Log.Warning($"接收到两星一地无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
-                            return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
-                        }
-                    }
-                    else
-                    {
-                        runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
-                        if (runTask == null)
-                        {
-                            Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
-                            return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
-                        }
-                    }
-                }
-                var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
-                if (xl1 == null)
-                {
-                    Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
-                    return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
-                }
-                Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
-                var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
-                if (xl2 == null)
-                {
-                    Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
-                    return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
-                }
-
-
-
-                Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
-                //dto.SigTime = new DateTime(2023, 12, 24, 18, 0, 0);
-                //dto.CdbTxLon = 45;
-                //dto.CdbTxLat = 20;
-                //dto.SatTxLon = 45;
-                //dto.SatTxLat = 20;
-                var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
-                var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
-                if (ephMain.code != 200)
-                {
-                    Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
-                    return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
-                }
-                var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
-                var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
-                if (ephAdja.code != 200)
-                {
-                    Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
-                    return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
-                }
-
-                X2D1PosRefService.Instance.AddPosDto(dtos);
-                PosRes posRes = new PosRes();
-                return Success(MapDto(posRes));
-
-            }
-            catch (Exception)
-            {
-                using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
-                {
-                    db.SyncDb();
-                }
-                throw;
-            }
-        }
-
+       
         /// <summary>
         /// 两星一地无参定位(无星历)
         /// </summary>

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

@@ -65,7 +65,6 @@ namespace XdCxRhDW.App.Controllers
                     item.TaskState = EnumTaskState.Stopped;
                     await db.SaveChangesAsync();
                 }
-                X2D1PosRefService.Instance.Stop(dto.ID);
                 Messenger.Defalut.Pub("任务状态改变", dto.ID);
                 if (dto.StopType == EnumTaskStopType.Properly)
                     Serilog.Log.Information($"任务停止完成,ID={dto.ID},停止原因={dto.StopReason}");

+ 38 - 0
XdCxRhDW.App/Controllers/XlController.cs

@@ -159,5 +159,43 @@ namespace XdCxRhDW.App.Controllers
                 return Error<List<EphResDto>>(ex.Message);
             }
         }
+
+        /// <summary>
+        /// 推算卫星某个时间点XYZ星历
+        /// </summary>
+        /// <param name="dto">推算参数</param>
+        /// <returns></returns>
+        [HttpPost]
+        public AjaxResult<SatEphResDto> XLCalc(SatDto dto)
+        {
+            try
+            {
+                var xl1 = XlRepository.GetLatestAsync(dto.SatCode, dto.SigTime).GetAwaiter().GetResult();
+                if (xl1 == null)
+                {
+                    Serilog.Log.Error($"系统缺少编号{dto.SatCode}卫星的星历!");
+                    return Error<SatEphResDto>($"系统缺少编号{dto.SatCode}卫星的星历!");
+                }
+                Serilog.Log.Information($"卫星{dto.SatCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
+                var p = EphHelper.Calc(xl1.TwoLine, dto.SigTime.ToUtc());
+                return Success(new SatEphResDto()
+                {
+                    SatId = p.SatId,
+                    SatTime = p.SatTime.AddHours(SysConfig.Config.ZoneHours),
+                    TleTime = p.TleTime.AddHours(SysConfig.Config.ZoneHours),
+                    Lon = p.Lon,
+                    X = p.X,
+                    Y = p.Y,
+                    Z = p.Z,
+                    VX = p.VX,
+                    VY = p.VY,
+                    VZ = p.VZ,
+                });
+            }
+            catch (Exception ex)
+            {
+                return Error<SatEphResDto>(ex.Message);
+            }
+        }
     }
 }

+ 0 - 0
XdCxRhDW.App/X2D1PosRef/LinearInterpolation.cs → XdCxRhDW.App/FindRef/LinearInterpolation.cs


+ 235 - 0
XdCxRhDW.App/FindRef/PosWithRefFind.cs

@@ -0,0 +1,235 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+using XdCxRhDW.Repostory;
+
+namespace XdCxRhDW.App
+{
+
+    public class PosWithRefFind
+    {
+        /// <summary>
+        /// 任务编号
+        /// </summary>
+        private int _taskId;
+
+        public void Start(int taskId, CancellationToken token)
+        {
+            this._taskId = taskId;
+            Task.Run(async () =>
+            {
+
+                while (!token.IsCancellationRequested)
+                {
+                    try
+                    {
+                        var taskTars = TaskTarCache.Instance.GetTaskTar(_taskId);
+                        if (taskTars.Count == 0)
+                        {
+                            await Task.Delay(5000);
+                            LogHelper.Info($"等待任务[{_taskId}]添加目标信号缓存").Wait(5000);
+                            continue;
+                        }
+                        var taritem = taskTars[0];
+                        var refcgDto = GetRefCg(taritem, out bool needWait);
+                        if (needWait)
+                        {
+                            await Task.Delay(10 * 1000);
+                            continue;
+                        }
+
+                        if (refcgDto.MainYbDto == 0 || refcgDto.AdjaYbDto == 0)
+                        {
+                            await SendX2D1NoXlNoParAsync(taritem);
+                        }
+                        else
+                        { //执行两星一地有参定位
+                            X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
+                            {
+                                SigTime = taritem.SigTime,
+                                MainCode = taritem.MainCode,
+                                AdjaCode = taritem.AdjaCode,
+                                SxDto = taritem.SxDto,
+                                XdDto = taritem.XdDto,
+                                MainYbDto = refcgDto.MainYbDto,
+                                AdjaYbDto = refcgDto.AdjaYbDto,
+                                SatTxLon = taritem.SatTxLon,
+                                SatTxLat = taritem.SatTxLat,
+                                CdbTxLon = taritem.CdbTxLon,
+                                CdbTxLat = taritem.CdbTxLat,
+                                RefLon = refcgDto.FixedLon,
+                                RefLat = refcgDto.FixedLat,
+                                FreqDown = taritem.FreqDown,
+                                FreqUp = taritem.FreqUp,
+                                XdDfo = taritem.XdDfo,
+                                XdSnr = taritem.XdSnr,
+                                SxDfo = taritem.SxDfo,
+                                SxSnr = taritem.SxSnr,
+                                CalcConfidence = true,
+                                TheoryDfoCalc = true,
+                                TaskID = taritem.TaskID,
+                                CheckRes = taritem.CheckRes,
+                            };
+                            await SendX2D1RefAsync(X2D1NoXlPosDto);
+                        }
+                        TaskTarCache.Instance.Remove(_taskId, taritem);
+                        TaskRefCache.Instance.ClearExpireRef(_taskId);
+                    }
+                    catch (Exception ex)
+                    {
+
+                        await LogHelper.Error($"【启动任务[{this._taskId}]目标取参考信号缓存异常{ex.Message}", ex);
+                    }
+
+                }
+                await ClearCacheAsync(_taskId);
+
+            });
+        }
+        /// <summary>
+        /// 获取参考参估
+        /// </summary>
+        /// <param name="taritem"></param>
+        /// <param name="needWait"></param>
+        /// <returns></returns>
+        public TaskCgDto GetRefCg(X2D1NoXlNoParlPosDto taritem, out bool needWait)
+        {
+            needWait = true;
+            var cgdto = new TaskCgDto();
+            var _tarkRefTime = TaskTarCache.Instance.TakeRefTimeSeconds;
+            DateTime startTime = taritem.SigTime.AddSeconds(-_tarkRefTime);
+            DateTime endTime = taritem.SigTime.AddSeconds(_tarkRefTime);
+            //获取指定任务时间范围内的参考信号
+            var taskRefs = TaskRefCache.Instance.GetTaskRef(_taskId, startTime, endTime);
+            //没有参考信号时 做无参考
+            if (taskRefs.Count == 0)
+            {
+                needWait = false;
+                return cgdto;
+            }
+            var cgOrderList = taskRefs.OrderBy(d => d.SigTime).ToList();//注意记得时间排序,根据时间取最接近的信号时刻
+            var point1s = cgOrderList.Where(c => c.SigTime <= taritem.SigTime);
+            var point2s = cgOrderList.Where(c => c.SigTime >= taritem.SigTime);
+            if (point2s == null || point2s.Count() == 0)//若没有比目标信号时刻大的参考信号则需要等待
+            {
+                needWait = true;
+                return null;
+            }
+            var point1 = point1s.Where(c => c.YbSnr != 0).FirstOrDefault();
+            var point2 = point2s.Where(c => c.YbSnr != 0).FirstOrDefault();
+
+            if (point2 == null || point1 == null)//若查找到比目标信号时刻大的参考信号信噪比为0则表示参考信号已经做过了
+            {
+                cgdto.MainYbDto = 0;
+                cgdto.AdjaYbDto = 0;
+            }
+            else
+            {
+                double refMainYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.MainYbDto, point2.MainYbDto);
+                double refAdjaYbDto = LinearInterpolation.CalSigTimeDto(taritem.SigTime, point1.SigTime, point2.SigTime, point1.AdjaYbDto, point2.AdjaYbDto);
+                cgdto.MainYbDto = refMainYbDto;
+                cgdto.AdjaYbDto = refAdjaYbDto;
+                cgdto.FixedLon = point1.FixedLon;
+                cgdto.FixedLat = point1.FixedLat;
+
+            }
+            needWait = false;
+            return cgdto;
+        }
+
+        /// <summary>
+        /// 发送两星一地无参定位
+        /// </summary>
+        /// <param name="dto"></param>
+        private async Task SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
+        {
+            try
+            {
+                var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
+                if (result.code != 200)
+                {
+                    await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
+
+                }
+                else
+                {
+                    await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
+                }
+            }
+            catch (Exception ex)
+            {
+                await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{ex.Message}");
+            }
+
+        }
+
+        /// <summary>
+        /// 发送两星一地无参定位
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        private async Task SendX2D1RefAsync(X2D1NoXlPosDto dto)
+        {
+            try
+            {
+                var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto);
+                if (result.code != 200)
+                {
+                    await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}");
+                }
+                else
+                {
+                    await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}");
+                }
+            }
+            catch (Exception ex)
+            {
+                await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{ex.Message}");
+            }
+        }
+        public async Task ClearCacheAsync(int taskID)
+        {
+            try
+            {
+                await Task.Run(() =>
+                {
+                    TaskTarCache.Instance.ClearCache(taskID);
+                    TaskRefCache.Instance.ClearCache(taskID);
+                });
+                await LogHelper.Info($"【停止任务[{this._taskId}]目标取参考信号缓存");
+            }
+            catch (Exception ex)
+            {
+                await LogHelper.Error($"【清除任务[{taskID}]目标参考信号缓存异常{ex.Message}", ex);
+            }
+
+
+        }
+
+        public async Task ClearAllAsync()
+        {
+            try
+            {
+                await Task.Run(() =>
+                {
+                    TaskTarCache.Instance.ClearAll();
+                    TaskRefCache.Instance.ClearAll();
+                });
+                await LogHelper.Info($"【停止所有任务目标取参考信号缓存");
+            }
+            catch (Exception ex)
+            {
+                await LogHelper.Error($"【清除所有目标参考信号缓存异常{ex.Message}", ex);
+            }
+
+        }
+
+
+
+    }
+}

+ 93 - 0
XdCxRhDW.App/FindRef/TaskRefCache.cs

@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+
+namespace XdCxRhDW.App
+{
+    /// <summary>
+    /// 任务参考信号缓存
+    /// </summary>
+    public class TaskRefCache
+    {
+        public static TaskRefCache Instance { get; private set; } = new TaskRefCache();
+        /// <summary>
+        /// 缓存参考信号信息
+        /// </summary>
+        private Dictionary<int, List<TaskCgDto>> _cahceRefs = new Dictionary<int, List<TaskCgDto>>();
+
+        public void AddRange(int taskId, List<TaskCgDto> cgItems)
+        {
+            lock (this)
+            {
+                if (!_cahceRefs.ContainsKey(taskId))
+                    _cahceRefs[taskId] = new List<TaskCgDto>();
+                _cahceRefs[taskId].AddRange(cgItems);
+            }
+        }
+
+        public void ClearCache(int taskID)
+        {
+            lock (this)
+            {
+                if (_cahceRefs.ContainsKey(taskID))
+                {
+                    _cahceRefs.Remove(taskID);
+                }
+            }
+        }
+        /// <summary>
+        /// 获取相同任务时间内的参考信号
+        /// </summary>
+        /// <param name="taskID"></param>
+        /// <param name="start">开始时间</param>
+        /// <param name="end">结束时间</param>
+        /// <returns></returns>
+        public List<TaskCgDto> GetTaskRef(int taskID, DateTime start, DateTime end)
+        {
+            lock (this)
+            {
+                if (_cahceRefs.ContainsKey(taskID))
+                {
+                    var filterRefs = _cahceRefs[taskID].Where(r => r.SigTime >= start && r.SigTime <= end).ToList();
+                    return filterRefs;
+                }
+                else
+                {
+                    return new List<TaskCgDto>();
+                }
+            }
+        }
+        /// <summary>
+        /// 清理过期参考信号
+        /// </summary>
+        /// <param name="taskID"></param>
+        /// <returns></returns>
+        public void ClearExpireRef(int taskID)
+        {
+            lock (this)
+            {
+                if (_cahceRefs.ContainsKey(taskID))
+                {
+                    var maxtime = _cahceRefs[taskID].Max(m => m.SigTime);
+                    var mintime = maxtime.AddHours(-1);//清理一个小时的参考信号
+                    _cahceRefs[taskID].RemoveAll(r => r.SigTime <= mintime);
+                }
+              
+            }
+        }
+
+      
+        public void ClearAll()
+        {
+            lock (this)
+            {
+                _cahceRefs.Clear();
+            }
+        }
+    }
+}

+ 90 - 0
XdCxRhDW.App/FindRef/TaskTarCache.cs

@@ -0,0 +1,90 @@
+using DevExpress.XtraScheduler.Outlook.Interop;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+using XdCxRhDW.Framework;
+
+namespace XdCxRhDW.App
+{
+    /// <summary>
+    /// 任务目标信号缓存
+    /// </summary>
+    public class TaskTarCache
+    {
+        public static TaskTarCache Instance { get; private set; } = new TaskTarCache();
+
+        //取参考时间 单位:秒
+        public double TakeRefTimeSeconds;
+        public TaskTarCache()
+        {
+            //取参考时间 单位:分钟
+            var takeRefTime = AppConfigHelper.Get("TakeRefTime", 10);
+            TakeRefTimeSeconds = takeRefTime * 60;//秒
+        }
+        /// <summary>
+        /// 缓存目标信号信息
+        /// </summary>
+        private Dictionary<int, List<X2D1NoXlNoParlPosDto>> _cahceTars = new Dictionary<int, List<X2D1NoXlNoParlPosDto>>();
+
+        public void AddRange(int taskId, List<X2D1NoXlNoParlPosDto> tarItems)
+        {
+            lock (this)
+            {
+                if (!_cahceTars.ContainsKey(taskId))
+                    _cahceTars[taskId] = new List<X2D1NoXlNoParlPosDto>();
+                _cahceTars[taskId].AddRange(tarItems);
+            }
+        }
+
+        public void Remove(int taskId, X2D1NoXlNoParlPosDto tarItem)
+        {
+            lock (this)
+            {
+                if (_cahceTars.ContainsKey(taskId))
+                {
+                    _cahceTars[taskId].Remove(tarItem);
+                }
+            }
+        }
+
+        public void ClearCache(int taskID)
+        {
+            lock (this)
+            {
+                if (_cahceTars.ContainsKey(taskID))
+                {
+                    _cahceTars.Remove(taskID);
+                }
+            }
+
+
+        }
+
+        public List<X2D1NoXlNoParlPosDto> GetTaskTar(int taskID)
+        {
+            lock (this)
+            {
+                if (_cahceTars.ContainsKey(taskID))
+                {
+                    return _cahceTars[taskID];
+                }
+                else
+                {
+                    return new List<X2D1NoXlNoParlPosDto>();
+                }
+            }
+        }
+        public void ClearAll()
+        {
+            lock (this)
+            {
+                _cahceTars.Clear();
+
+            }
+        }
+    }
+}

+ 5 - 9
XdCxRhDW.App/MainForm.cs

@@ -264,19 +264,15 @@ namespace XdCxRhDW
                     {
                         DateTime dt = DateTime.Now.AddYears(-1);
                         clearData = await db.XlInfos.Where(p => p.UpdateTime < dt).Take(1000).ToListAsync();
-                    }
-                    if (!clearData.Any())
-                    {
-                        await Task.Delay(60 * 1000);
-                    }
-                    else
-                    {
-                        using (RHDWContext db = new RHDWContext())
+                        if (clearData.Any())
                         {
                             db.XlInfos.RemoveRange(clearData);
                             await db.SaveChangesAsync();
                         }
-
+                    }
+                    if (!clearData.Any())
+                    {
+                        await Task.Delay(60 * 1000);
                     }
 
                 }

+ 26 - 1
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -41,6 +41,7 @@ namespace XdCxRhDW.App.UserControl
         List<TaskInfo> list = new List<TaskInfo>();
         TaskInfo tsk;
         List<CancellationTokenSource> listCts = new List<CancellationTokenSource>();
+        Dictionary<int, CancellationTokenSource> dicCts = new Dictionary<int, CancellationTokenSource>();
         public CtrlHome()
         {
             InitializeComponent();
@@ -68,6 +69,12 @@ namespace XdCxRhDW.App.UserControl
                     if (item == null) return;
                     find.TaskState = item.TaskState;
                 }
+                //停止查找参考信号
+                if (dicCts.ContainsKey(id))
+                {
+                    dicCts[id]?.Cancel();
+                    dicCts.Remove(id);
+                }
                 this.Invoke(new Action(() =>
                 {
                     var idx = gridView1.FindRow(find);
@@ -183,7 +190,7 @@ namespace XdCxRhDW.App.UserControl
                 Serilog.Log.Error(ex, "筛选定位结果异常");
                 DxHelper.MsgBoxHelper.ShowError("筛选定位结果异常");
             }
-          
+
         }
 
         private void OnSysSetingsChanged(SysSetings settings)
@@ -683,6 +690,14 @@ namespace XdCxRhDW.App.UserControl
                                 DxHelper.MsgBoxHelper.ShowError($"{res.msg}");
                                 return;
                             }
+                            if (fixedStation != null)//有固定站
+                            {
+                                var cts = new CancellationTokenSource();
+                                PosWithRefFind refFind = new PosWithRefFind();
+                                refFind.Start(dto.ID, cts.Token);
+                                dicCts[dto.ID] = cts;
+                            }
+
                         }
                         else
                         {
@@ -698,6 +713,7 @@ namespace XdCxRhDW.App.UserControl
                         tsk.TaskState = EnumTaskState.Running;
                         Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
                     }
+
                 }
                 catch (Exception ex)
                 {
@@ -739,6 +755,15 @@ namespace XdCxRhDW.App.UserControl
                             Serilog.Log.Error(res.msg);
                             DxHelper.MsgBoxHelper.ShowWarning(res.msg);
                         }
+
+                        //停止查找参考信号
+                        if (dicCts.ContainsKey(dto.ID))
+                        {
+                            dicCts[dto.ID]?.Cancel();
+                            dicCts.Remove(dto.ID);
+                        }
+
+
                     }
                     Serilog.Log.Warning($"用户停止了任务,ID={tsk.ID}");
                 }

+ 0 - 286
XdCxRhDW.App/X2D1PosRef/X2D1PosHandle.cs

@@ -1,286 +0,0 @@
-using DevExpress.Utils.About;
-using DevExpress.XtraTreeList;
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Data.Entity;
-using System.Linq;
-using System.Security.Policy;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Documents;
-using XdCxRhDW.Dto;
-using XdCxRhDW.Entity;
-using XdCxRhDW.Repostory;
-
-namespace XdCxRhDW.App
-{
-
-    public class X2D1PosItem
-    {
-        public X2D1PosItem(X2D1NoXlNoParlPosDto x2D1, DateTime date)
-        {
-            this.Dto = x2D1;
-            this.CreateTime = date;
-            this.IsDw = false;
-
-        }
-        public X2D1NoXlNoParlPosDto Dto { get; set; }
-
-        public DateTime CreateTime { get; set; }
-        public bool IsDw { get; set; }
-
-    }
-    /// <summary>
-    /// 两星一地定位取参考
-    /// </summary>
-    public class X2D1PosHandle
-    {
-
-        public int TaskId;
-        //多少分钟时间内的参考信号数据
-        private double takeRefTimeSeconds;
-
-        private bool isRuning = true;
-
-        BlockingCollection<List<X2D1PosItem>> posItems = new BlockingCollection<List<X2D1PosItem>>();
-        public X2D1PosHandle(int taskId, double takeRefTime)
-        {
-            takeRefTimeSeconds = takeRefTime * 60;//秒
-            TaskId = taskId;
-            StartMonitor();
-        }
-
-        public void StartMonitor()
-        {
-            Task.Run(async () =>
-            {
-
-                while (isRuning)
-                {
-                    try
-                    {
-                        var X2D1PosItems = posItems.Take();
-
-                        var firstdto = X2D1PosItems.First().Dto;
-                        FixedStation fixedStation;
-                        int fixedStationId = firstdto.FixedStationId.HasValue ? firstdto.FixedStationId.Value : 0;
-                        using (RHDWContext db = new RHDWContext())
-                        {
-                            fixedStation = await db.FixedStation.FirstOrDefaultAsync(f => f.ID == fixedStationId);
-                        }
-
-                        List<X2D1NoXlNoParlPosDto> listNoRef = new List<X2D1NoXlNoParlPosDto>();
-                        List<X2D1NoXlPosDto> listRef = new List<X2D1NoXlPosDto>();
-
-                        foreach (var posItem in X2D1PosItems)
-                        {
-                            try
-                            {
-                                var dto = posItem.Dto;
-                                if (fixedStation == null)//没有固定站
-                                {
-                                    posItem.IsDw = true;
-                                    listNoRef.Add(dto);
-                                    continue;
-                                }
-                                List<CgRes> cgResRefs = new List<CgRes>();
-                                using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
-                                {
-                                    DateTime min = dto.SigTime.AddSeconds(-takeRefTimeSeconds);
-                                    DateTime max = dto.SigTime.AddSeconds(takeRefTimeSeconds);
-                                    //获取设定分钟之内的固定站数据
-                                    cgResRefs = await db.CgRes.Where(m => m.TaskID == dto.TaskID && m.FixedStationID == dto.FixedStationId && m.SigTime >= min && m.SigTime <= max).OrderBy(d => d.SigTime).ToListAsync();
-                                }
-
-                                List<CgRes> matchCgList = new List<CgRes>();
-                                cgResRefs.ForEach(c =>
-                                {
-                                    if ((dto.SigTime - c.SigTime).TotalSeconds <= takeRefTimeSeconds)
-                                    {
-                                        matchCgList.Add(c);
-                                    }
-                                });
-                                var cgOrderList = matchCgList.OrderBy(d => d.SigTime).ToList();
-                                var point1 = cgOrderList.Where(c => c.SigTime <= dto.SigTime).FirstOrDefault();
-                                var point2 = cgOrderList.Where(c => c.SigTime >= dto.SigTime).FirstOrDefault();
-
-                                if (point1 == null || point2 == null)//若参考频点未出结果,查找目标信号出
-                                {
-                                    if ((DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//两分钟之内未出结果走无参
-                                    {
-                                        await LogHelper.Warning($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}参考未出结果超时");
-                                        posItem.IsDw = true;
-                                        listNoRef.Add(dto);
-                                        continue;
-                                    }
-                                    bool isTarAny = false;
-                                    using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
-                                    {
-                                        isTarAny = await db.CgRes.AnyAsync(m => m.TaskID == dto.TaskID && !m.FixedStationID.HasValue && m.TarFreqUp.HasValue && m.TarFreqUp.Value == fixedStation.FreqUpHz && m.SigTime >= dto.SigTime);
-                                    }
-                                    if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes < 2)//目标未出结果
-                                    {
-                                        posItem.IsDw = false;
-                                        continue;
-                                    }
-
-                                }
-                                if (point1 != null && point2 != null)
-                                {
-                                    posItem.IsDw = true;
-                                    //通过双星时差及超短波时差怎么计算参考信息的时差
-                                    double refDto = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.Dto1.Value, point2.Dto1.Value);
-                                    double refDtoCdb = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.DtoCdb.Value, point2.DtoCdb.Value);
-
-                                    //执行两星一地有参定位
-                                    X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
-                                    {
-                                        SigTime = dto.SigTime,
-                                        MainCode = dto.MainCode,
-                                        AdjaCode = dto.AdjaCode,
-                                        SxDto = dto.SxDto,
-                                        XdDto = dto.XdDto,
-                                        MainYbDto = refDto,
-                                        AdjaYbDto = refDtoCdb,
-                                        SatTxLon = dto.SatTxLon,
-                                        SatTxLat = dto.SatTxLat,
-                                        CdbTxLon = dto.CdbTxLon,
-                                        CdbTxLat = dto.CdbTxLat,
-                                        RefLon = fixedStation.Lon,
-                                        RefLat = fixedStation.Lat,
-                                        FreqDown = dto.FreqDown,
-                                        FreqUp = dto.FreqUp,
-                                        XdDfo = dto.XdDfo,
-                                        XdSnr = dto.XdSnr,
-                                        SxDfo = dto.SxDfo,
-                                        SxSnr = dto.SxSnr,
-                                        CalcConfidence = true,
-                                        TheoryDfoCalc = true,
-                                        TaskID = dto.TaskID,
-                                        CheckRes = dto.CheckRes,
-                                    };
-                                    listRef.Add(X2D1NoXlPosDto);
-                                }
-
-                            }
-                            catch (Exception ex)
-                            {
-                                posItem.IsDw = false;
-                                await LogHelper.Error($"【取参考信号流程异常{ex.Message}", ex);
-                            }
-
-                        }
-                        var poslist = X2D1PosItems.Where(x => !x.IsDw);
-                        if (poslist.Count() > 0)
-                        {
-                            posItems.Add(poslist.ToList());
-                        }
-                        SendPos(listNoRef, listRef);
-                    }
-                    catch (Exception ex)
-                    {
-                        await LogHelper.Error($"【取参考信号流程异常{ex.Message}", ex);
-                    }
-
-                }
-            });
-        }
-
-
-        private void SendPos(List<X2D1NoXlNoParlPosDto> listNoRef, List<X2D1NoXlPosDto> listRef)
-        {
-            SendX2D1NoXlNoParAsync(listNoRef);
-            SendX2D1RefAsync(listRef);
-
-        }
-        /// <summary>
-        /// 发送两星一地无参定位
-        /// </summary>
-        /// <param name="dtos"></param>
-        private void SendX2D1NoXlNoParAsync(List<X2D1NoXlNoParlPosDto> dtos)
-        {
-            Task.Run(async () =>
-            {
-                foreach (var dto in dtos)
-                {
-                    try
-                    {
-                        dto.BeFindRef = false;
-                        dto.FixedStationId = null;
-                        var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
-                        if (result.code != 200)
-                        {
-                            await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
-
-                        }
-                        else
-                        {
-                            await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
-                        }
-                    }
-                    catch (Exception ex)
-                    {
-                        await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{ex.Message}");
-                    }
-
-                }
-            });
-
-        }
-
-        /// <summary>
-        /// 发送两星一地无参定位
-        /// </summary>
-        /// <param name="dtos"></param>
-        private void SendX2D1RefAsync(List<X2D1NoXlPosDto> dtos)
-        {
-            Task.Run(async () =>
-            {
-                foreach (var dto in dtos)
-                {
-                    try
-                    {
-                        var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto);
-                        if (result.code != 200)
-                        {
-                            await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}");
-                        }
-                        else
-                        {
-                            await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}");
-                        }
-                    }
-                    catch (Exception ex)
-                    {
-                        await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{ex.Message}");
-                    }
-
-                }
-            });
-
-        }
-        public void Append(List<X2D1NoXlNoParlPosDto> dtos)
-        {
-            DateTime dt = DateTime.Now;
-            List<X2D1PosItem> list = new List<X2D1PosItem>();
-            foreach (var dtoitem in dtos)
-            {
-                X2D1PosItem posItem = new X2D1PosItem(dtoitem, dt);
-                list.Add(posItem);
-            }
-
-            bool ret = posItems.TryAdd(list);
-            if (!ret)
-            {
-                LogHelper.Warning($"【任务{dtos.First().TaskID}】添加取参考Dto").GetAwaiter();
-            }
-        }
-
-        public void Stop()
-        {
-            //当前任务停止处理
-            isRuning = false;
-        }
-    }
-}

+ 0 - 76
XdCxRhDW.App/X2D1PosRef/X2D1PosRefService.cs

@@ -1,76 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Data.Entity;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using XdCxRhDW.Dto;
-using XdCxRhDW.Entity;
-using XdCxRhDW.Framework;
-using XdCxRhDW.Repostory;
-namespace XdCxRhDW.App
-{
-    /// <summary>
-    /// 两星一地定位取参考服务 
-    /// </summary>
-    public class X2D1PosRefService
-    {
-        public static X2D1PosRefService Instance { get; private set; } = new X2D1PosRefService();
-
-        readonly List<X2D1PosHandle> handles = new List<X2D1PosHandle>();
-
-        public double TakeRefTime;
-
-        public X2D1PosRefService()
-        {
-            TakeRefTime = AppConfigHelper.Get("TakeRefTime", 10);
-        }
-       
-        public void AddPosDto(List<X2D1NoXlNoParlPosDto> dtos)
-        {
-            try
-            {
-                var dto = dtos.First();
-                lock (this)
-                {
-
-                    var firstDto = handles.FirstOrDefault(m => m.TaskId == dto.TaskID);
-                    if (firstDto == null)
-                    {
-                        firstDto = new X2D1PosHandle(dto.TaskID.Value, TakeRefTime);
-                        handles.Add(firstDto);
-                    }
-                    firstDto.Append(dtos);
-                }
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Error($"【任务{dtos.First().TaskID}】添加取参考信号流程异常,{ex.Message}", ex).GetAwaiter();
-
-            }
-        }
-        public void Stop(int taskID)
-        {
-            try
-            {
-                lock (this)
-                {
-                    var firstDto = handles.FirstOrDefault(m => m.TaskId == taskID);
-                    if (firstDto != null)
-                    {
-                        firstDto.Stop();
-                        handles.Remove(firstDto);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Error($"停止【任务{taskID}】取参考信号流程异常,{ex.Message}", ex).GetAwaiter();
-
-            }
-        }
-
-    }
-}

+ 6 - 3
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -158,6 +158,7 @@
     <Compile Include="Basic\BindingData.cs" />
     <Compile Include="Basic\IOverlayFormService.cs" />
     <Compile Include="Controllers\DetectCgController.cs" />
+    <Compile Include="Controllers\FindRefController.cs" />
     <Compile Include="Controllers\LogController.cs" />
     <Compile Include="Controllers\ResultController.cs" />
     <Compile Include="Controllers\PosController.cs" />
@@ -318,6 +319,9 @@
       <DependentUpon>PopupControlDocker.cs</DependentUpon>
     </Compile>
     <Compile Include="ExtensionsDev\SearchLookUpEditExtension.cs" />
+    <Compile Include="FindRef\PosWithRefFind.cs" />
+    <Compile Include="FindRef\TaskRefCache.cs" />
+    <Compile Include="FindRef\TaskTarCache.cs" />
     <Compile Include="Localizer\ChsLocalizer.cs" />
     <Compile Include="LogHelper.cs" />
     <Compile Include="MainForm.cs">
@@ -340,8 +344,7 @@
     <Compile Include="UserControl\CtrlDraw.Designer.cs">
       <DependentUpon>CtrlDraw.cs</DependentUpon>
     </Compile>
-    <Compile Include="X2D1PosRef\LinearInterpolation.cs" />
-    <Compile Include="X2D1PosRef\X2D1PosRefService.cs" />
+    <Compile Include="FindRef\LinearInterpolation.cs" />
     <Compile Include="PopupControl\ShowCgCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -477,7 +480,6 @@
     <Compile Include="UserControl\X2D1GDOPParam.Designer.cs">
       <DependentUpon>X2D1GDOPParam.cs</DependentUpon>
     </Compile>
-    <Compile Include="X2D1PosRef\X2D1PosHandle.cs" />
     <EmbeddedResource Include="CorTools\GpuCalcForm.resx">
       <DependentUpon>GpuCalcForm.cs</DependentUpon>
     </EmbeddedResource>
@@ -694,6 +696,7 @@
       <Install>false</Install>
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
   <Import Project="packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />

+ 2 - 0
XdCxRhDw.Dto/02.XdCxRhDW.Dto.csproj

@@ -74,6 +74,7 @@
     <Compile Include="DetectResDto.cs" />
     <Compile Include="CpuCgResDto.cs" />
     <Compile Include="FileUploadResDto.cs" />
+    <Compile Include="TaskCgDto.cs" />
     <Compile Include="TaskFreqResDto.cs" />
     <Compile Include="TaskHandleDto\TaskStopHandleDto.cs" />
     <Compile Include="PosDto\CheckResDto.cs" />
@@ -111,6 +112,7 @@
     <Compile Include="TaskHandleDto\X2D1TaskHandleDto.cs" />
     <Compile Include="TaskQueryResDto.cs" />
     <Compile Include="TaskSigDto.cs" />
+    <Compile Include="XlCalcDto\SatDto.cs" />
     <Compile Include="XlCalcDto\XlImportDto.cs" />
     <Compile Include="XlCalcDto\XlCalcMultDto.cs" />
     <Compile Include="XlCalcDto\XlCalcDto.cs" />

+ 0 - 7
XdCxRhDw.Dto/PosDto/X2D1NoXlNoParlPosDto.cs

@@ -123,13 +123,6 @@ namespace XdCxRhDW.Dto
         /// </summary>
         [Obsolete]
         public int? FixedStationId { get; set; }
-
-        /// <summary>
-        /// 获取参考信号
-        /// </summary>
-        [Obsolete]
-        public bool BeFindRef { get; set; }
-
     }
 
 }

+ 40 - 0
XdCxRhDw.Dto/TaskCgDto.cs

@@ -0,0 +1,40 @@
+using System;
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 任务参考信号信息
+    /// </summary>
+    public class TaskCgDto
+    {
+        /// <summary>
+        /// 任务ID(可空)
+        /// </summary>
+        public int? TaskID { get; set; }
+        /// <summary>
+        /// 信号时刻
+        /// </summary>
+        public DateTime SigTime { get; set; }
+        /// <summary>
+        /// 主星样本时差(>0,单位us)
+        /// </summary>
+        public double MainYbDto { get; set; }
+        /// <summary>
+        /// 邻星样本时差(>0,单位us)
+        /// </summary>
+        public double AdjaYbDto { get; set; }
+
+        /// <summary>
+        /// 样本信噪比
+        /// </summary>
+        public double YbSnr { get; set; }
+        /// <summary>
+        /// 固定站经度
+        /// </summary>
+        public double FixedLon { get; set; }
+
+        /// <summary>
+        /// 固定站纬度
+        /// </summary>
+        public double FixedLat { get; set; }
+    }
+}

+ 32 - 0
XdCxRhDw.Dto/XlCalcDto/SatDto.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XdCxRhDW.Dto.Attribute;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 卫星
+    /// </summary>
+    public class SatDto
+    {
+        /// <summary>
+        /// 卫星编号
+        /// </summary>
+        public int SatCode { get; set; }
+
+        /// <summary>
+        /// 信号时刻
+        /// </summary>
+        public DateTime SigTime { get; set; }
+
+        /// <summary>
+        /// 超时时间(单位秒,默认30秒)
+        /// </summary>
+        [RangeInt(10, 600, IncludeMin = true)]
+        public int TimeoutSeconds { get; set; } = 30;
+
+    }
+}