|
@@ -1,4 +1,5 @@
|
|
|
using DevExpress.Utils.About;
|
|
|
+using DevExpress.XtraTreeList;
|
|
|
using System;
|
|
|
using System.Collections.Concurrent;
|
|
|
using System.Collections.Generic;
|
|
@@ -17,15 +18,17 @@ namespace XdCxRhDW.App
|
|
|
|
|
|
public class X2D1PosItem
|
|
|
{
|
|
|
- public X2D1PosItem(X2D1NoXlNoParlPosDto x2D1)
|
|
|
+ public X2D1PosItem(X2D1NoXlNoParlPosDto x2D1, DateTime date)
|
|
|
{
|
|
|
this.Dto = x2D1;
|
|
|
- this.CreateTime = DateTime.Now;
|
|
|
+ this.CreateTime = date;
|
|
|
+ this.IsDw = false;
|
|
|
|
|
|
}
|
|
|
public X2D1NoXlNoParlPosDto Dto { get; set; }
|
|
|
|
|
|
public DateTime CreateTime { get; set; }
|
|
|
+ public bool IsDw { get; set; }
|
|
|
|
|
|
}
|
|
|
/// <summary>
|
|
@@ -40,7 +43,7 @@ namespace XdCxRhDW.App
|
|
|
|
|
|
private bool isRuning = true;
|
|
|
|
|
|
- BlockingCollection<X2D1PosItem> posItems = new BlockingCollection<X2D1PosItem>();
|
|
|
+ BlockingCollection<List<X2D1PosItem>> posItems = new BlockingCollection<List<X2D1PosItem>>();
|
|
|
public X2D1PosHandle(int taskId, double takeRefTime)
|
|
|
{
|
|
|
takeRefTimeSeconds = takeRefTime * 60;//秒
|
|
@@ -57,99 +60,117 @@ namespace XdCxRhDW.App
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- var posItem = posItems.Take();
|
|
|
- var dto = posItem.Dto;
|
|
|
+ var X2D1PosItems = posItems.Take();
|
|
|
+
|
|
|
+ var firstdto = X2D1PosItems.First().Dto;
|
|
|
FixedStation fixedStation;
|
|
|
- int fixedStationId = dto.FixedStationId.HasValue ? dto.FixedStationId.Value : 0;
|
|
|
+ int fixedStationId = firstdto.FixedStationId.HasValue ? firstdto.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();
|
|
|
+ List<X2D1NoXlNoParlPosDto> listNoRef = new List<X2D1NoXlNoParlPosDto>();
|
|
|
+ List<X2D1NoXlPosDto> listRef = new List<X2D1NoXlPosDto>();
|
|
|
|
|
|
- if (point1 == null || point2 == null)//若参考频点未出结果,查找目标信号出
|
|
|
+ foreach (var posItem in X2D1PosItems)
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
- 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)//目标未出结果
|
|
|
+ var dto = posItem.Dto;
|
|
|
+ if (fixedStation == null)//没有固定站
|
|
|
{
|
|
|
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}目标未出结果");
|
|
|
- posItems.Add(posItem);
|
|
|
+ posItem.IsDw = true;
|
|
|
+ listNoRef.Add(dto);
|
|
|
continue;
|
|
|
}
|
|
|
- else if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//目标两分钟之内未出结果走无参
|
|
|
+ using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
|
|
|
{
|
|
|
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}目标未出结果超时");
|
|
|
- SendX2D1NoXlNoParAsync(dto);
|
|
|
- continue;
|
|
|
+ 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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- if (point1 != null && point2 != null)
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
- //通过双星时差及超短波时差怎么计算参考信息的时差
|
|
|
- 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}");
|
|
|
- }
|
|
|
+ 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)
|
|
|
{
|
|
@@ -160,32 +181,93 @@ namespace XdCxRhDW.App
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private void SendPos(List<X2D1NoXlNoParlPosDto> listNoRef, List<X2D1NoXlPosDto> listRef)
|
|
|
+ {
|
|
|
+ SendX2D1NoXlNoParAsync(listNoRef);
|
|
|
+ SendX2D1RefAsync(listRef);
|
|
|
+
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 发送两星一地无参定位
|
|
|
/// </summary>
|
|
|
- /// <param name="dto"></param>
|
|
|
- private async void SendX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
|
|
|
+ /// <param name="dtos"></param>
|
|
|
+ private void SendX2D1NoXlNoParAsync(List<X2D1NoXlNoParlPosDto> dtos)
|
|
|
{
|
|
|
- dto.BeFindRef = false;
|
|
|
- dto.FixedStationId = null;
|
|
|
- var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
|
|
|
- if (result.code != 200)
|
|
|
+ Task.Run(async () =>
|
|
|
{
|
|
|
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ 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 () =>
|
|
|
{
|
|
|
- Serilog.Log.Information($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
|
|
|
- }
|
|
|
+ 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(X2D1NoXlNoParlPosDto dto)
|
|
|
+ public void Append(List<X2D1NoXlNoParlPosDto> dtos)
|
|
|
{
|
|
|
- X2D1PosItem posItem = new X2D1PosItem(dto);
|
|
|
- bool ret = posItems.TryAdd(posItem);
|
|
|
+ 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)
|
|
|
{
|
|
|
- Serilog.Log.Information($"【任务{dto.TaskID}】添加取参考Dto");
|
|
|
+ LogHelper.Warning($"【任务{dtos.First().TaskID}】添加取参考Dto").GetAwaiter();
|
|
|
}
|
|
|
}
|
|
|
|