123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- using DevExpress.Utils.About;
- 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)
- {
- this.Dto = x2D1;
- this.CreateTime = DateTime.Now;
- }
- public X2D1NoXlNoParlPosDto Dto { get; set; }
- public DateTime CreateTime { get; set; }
- }
- /// <summary>
- /// 两星一地定位取参考
- /// </summary>
- public class X2D1PosHandle
- {
- public int TaskId;
- //多少分钟时间内的参考信号数据
- private double takeRefTimeSeconds;
- private bool isRuning = true;
- BlockingCollection<X2D1PosItem> posItems = new BlockingCollection<X2D1PosItem>();
- public X2D1PosHandle(int taskId, double takeRefTime)
- {
- takeRefTimeSeconds = takeRefTime * 60;//秒
- TaskId = taskId;
- StartMonitor();
- }
- public void StartMonitor()
- {
- Task.Run(async () =>
- {
- while (isRuning)
- {
- try
- {
- var posItem = posItems.Take();
- var dto = posItem.Dto;
- FixedStation fixedStation;
- int fixedStationId = dto.FixedStationId.HasValue ? dto.FixedStationId.Value : 0;
- using (RHDWContext db = new RHDWContext())
- {
- fixedStation = await db.FixedStation.FirstOrDefaultAsync(f => f.ID == fixedStationId);
- }
- if (fixedStation == null)//没有固定站
- {
- SendX2D1NoXlNoParAsync(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)//若参考频点未出结果,查找目标信号出
- {
- 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)//目标未出结果
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}目标未出结果");
- posItems.Add(posItem);
- continue;
- }
- else if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//目标两分钟之内未出结果走无参
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}目标未出结果超时");
- SendX2D1NoXlNoParAsync(dto);
- continue;
- }
- }
- if (point1 != null && point2 != null)
- {
- //通过双星时差及超短波时差怎么计算参考信息的时差
- 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,
- };
- var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), X2D1NoXlPosDto);
- if (result.code != 200)
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}");
- }
- else
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}");
- }
- }
- }
- }
- catch (Exception ex)
- {
- await LogHelper.Error($"【取参考信号流程异常{ex.Message}", ex);
- }
- }
- });
- }
- /// <summary>
- /// 发送两星一地无参定位
- /// </summary>
- /// <param name="dto"></param>
- private async void SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
- {
- dto.BeFindRef = false;
- dto.FixedStationId = null;
- var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
- if (result.code != 200)
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
- }
- else
- {
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
- }
- }
- public void Append(X2D1NoXlNoParlPosDto dto)
- {
- X2D1PosItem posItem = new X2D1PosItem(dto);
- bool ret = posItems.TryAdd(posItem);
- if (!ret)
- {
- Serilog.Log.Information($"【任务{dto.TaskID}】添加取参考Dto");
- }
- }
- public void Stop()
- {
- //当前任务停止处理
- isRuning = false;
- }
- }
- }
|