123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- 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;
- }
- 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<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 = 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;
- }
- }
- }
|