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; } } /// /// 两星一地定位取参考 /// public class X2D1PosHandle { public int TaskId; //多少分钟时间内的参考信号数据 private double takeRefTimeSeconds; private bool isRuning = true; BlockingCollection> posItems = new BlockingCollection>(); 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 listNoRef = new List(); List listRef = new List(); foreach (var posItem in X2D1PosItems) { try { var dto = posItem.Dto; if (fixedStation == null)//没有固定站 { posItem.IsDw = true; listNoRef.Add(dto); continue; } using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true)) { DateTime min = dto.SigTime.AddSeconds(-takeRefTimeSeconds); DateTime max = dto.SigTime.AddSeconds(takeRefTimeSeconds); //获取设定分钟之内的固定站数据 var 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 matchCgList = new List(); 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 = 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 listNoRef, List listRef) { SendX2D1NoXlNoParAsync(listNoRef); SendX2D1RefAsync(listRef); } /// /// 发送两星一地无参定位 /// /// private void SendX2D1NoXlNoParAsync(List dtos) { Task.Run(async () => { foreach (var dto in dtos) { try { dto.BeFindRef = false; dto.FixedStationId = null; var result = await HttpHelper.PostRequestAsync(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}"); } } }); } /// /// 发送两星一地无参定位 /// /// private void SendX2D1RefAsync(List dtos) { Task.Run(async () => { foreach (var dto in dtos) { try { var result = await HttpHelper.PostRequestAsync(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 dtos) { DateTime dt = DateTime.Now; List list = new List(); 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; } } }