X2D1PosHandle.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using DevExpress.Utils.About;
  2. using DevExpress.XtraTreeList;
  3. using System;
  4. using System.Collections.Concurrent;
  5. using System.Collections.Generic;
  6. using System.Data.Entity;
  7. using System.Linq;
  8. using System.Security.Policy;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Documents;
  12. using XdCxRhDW.Dto;
  13. using XdCxRhDW.Entity;
  14. using XdCxRhDW.Repostory;
  15. namespace XdCxRhDW.App
  16. {
  17. public class X2D1PosItem
  18. {
  19. public X2D1PosItem(X2D1NoXlNoParlPosDto x2D1, DateTime date)
  20. {
  21. this.Dto = x2D1;
  22. this.CreateTime = date;
  23. this.IsDw = false;
  24. }
  25. public X2D1NoXlNoParlPosDto Dto { get; set; }
  26. public DateTime CreateTime { get; set; }
  27. public bool IsDw { get; set; }
  28. }
  29. /// <summary>
  30. /// 两星一地定位取参考
  31. /// </summary>
  32. public class X2D1PosHandle
  33. {
  34. public int TaskId;
  35. //多少分钟时间内的参考信号数据
  36. private double takeRefTimeSeconds;
  37. private bool isRuning = true;
  38. BlockingCollection<List<X2D1PosItem>> posItems = new BlockingCollection<List<X2D1PosItem>>();
  39. public X2D1PosHandle(int taskId, double takeRefTime)
  40. {
  41. takeRefTimeSeconds = takeRefTime * 60;//秒
  42. TaskId = taskId;
  43. StartMonitor();
  44. }
  45. public void StartMonitor()
  46. {
  47. Task.Run(async () =>
  48. {
  49. while (isRuning)
  50. {
  51. try
  52. {
  53. var X2D1PosItems = posItems.Take();
  54. var firstdto = X2D1PosItems.First().Dto;
  55. FixedStation fixedStation;
  56. int fixedStationId = firstdto.FixedStationId.HasValue ? firstdto.FixedStationId.Value : 0;
  57. using (RHDWContext db = new RHDWContext())
  58. {
  59. fixedStation = await db.FixedStation.FirstOrDefaultAsync(f => f.ID == fixedStationId);
  60. }
  61. List<X2D1NoXlNoParlPosDto> listNoRef = new List<X2D1NoXlNoParlPosDto>();
  62. List<X2D1NoXlPosDto> listRef = new List<X2D1NoXlPosDto>();
  63. foreach (var posItem in X2D1PosItems)
  64. {
  65. try
  66. {
  67. var dto = posItem.Dto;
  68. if (fixedStation == null)//没有固定站
  69. {
  70. posItem.IsDw = true;
  71. listNoRef.Add(dto);
  72. continue;
  73. }
  74. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  75. {
  76. DateTime min = dto.SigTime.AddSeconds(-takeRefTimeSeconds);
  77. DateTime max = dto.SigTime.AddSeconds(takeRefTimeSeconds);
  78. //获取设定分钟之内的固定站数据
  79. 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();
  80. List<CgRes> matchCgList = new List<CgRes>();
  81. cgResRefs.ForEach(c =>
  82. {
  83. if ((dto.SigTime - c.SigTime).TotalSeconds <= takeRefTimeSeconds)
  84. {
  85. matchCgList.Add(c);
  86. }
  87. });
  88. var cgOrderList = matchCgList.OrderBy(d => d.SigTime).ToList();
  89. var point1 = cgOrderList.Where(c => c.SigTime <= dto.SigTime).FirstOrDefault();
  90. var point2 = cgOrderList.Where(c => c.SigTime >= dto.SigTime).FirstOrDefault();
  91. if (point1 == null || point2 == null)//若参考频点未出结果,查找目标信号出
  92. {
  93. if ((DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//两分钟之内未出结果走无参
  94. {
  95. await LogHelper.Warning($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}参考未出结果超时");
  96. posItem.IsDw = true;
  97. listNoRef.Add(dto);
  98. continue;
  99. }
  100. 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);
  101. if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes < 2)//目标未出结果
  102. {
  103. posItem.IsDw = false;
  104. continue;
  105. }
  106. }
  107. if (point1 != null && point2 != null)
  108. {
  109. posItem.IsDw = true;
  110. //通过双星时差及超短波时差怎么计算参考信息的时差
  111. double refDto = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.Dto1.Value, point2.Dto1.Value);
  112. double refDtoCdb = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.DtoCdb.Value, point2.DtoCdb.Value);
  113. //执行两星一地有参定位
  114. X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
  115. {
  116. SigTime = dto.SigTime,
  117. MainCode = dto.MainCode,
  118. AdjaCode = dto.AdjaCode,
  119. SxDto = dto.SxDto,
  120. XdDto = dto.XdDto,
  121. MainYbDto = refDto,
  122. AdjaYbDto = refDtoCdb,
  123. SatTxLon = dto.SatTxLon,
  124. SatTxLat = dto.SatTxLat,
  125. CdbTxLon = dto.CdbTxLon,
  126. CdbTxLat = dto.CdbTxLat,
  127. RefLon = fixedStation.Lon,
  128. RefLat = fixedStation.Lat,
  129. FreqDown = dto.FreqDown,
  130. FreqUp = dto.FreqUp,
  131. XdDfo = dto.XdDfo,
  132. XdSnr = dto.XdSnr,
  133. SxDfo = dto.SxDfo,
  134. SxSnr = dto.SxSnr,
  135. CalcConfidence = true,
  136. TheoryDfoCalc = true,
  137. TaskID = dto.TaskID,
  138. CheckRes = dto.CheckRes,
  139. };
  140. listRef.Add(X2D1NoXlPosDto);
  141. }
  142. }
  143. }
  144. catch (Exception ex)
  145. {
  146. posItem.IsDw = false;
  147. await LogHelper.Error($"【取参考信号流程异常{ex.Message}", ex);
  148. }
  149. }
  150. var poslist = X2D1PosItems.Where(x => !x.IsDw);
  151. if (poslist.Count() > 0)
  152. {
  153. posItems.Add(poslist.ToList());
  154. }
  155. SendPos(listNoRef, listRef);
  156. }
  157. catch (Exception ex)
  158. {
  159. await LogHelper.Error($"【取参考信号流程异常{ex.Message}", ex);
  160. }
  161. }
  162. });
  163. }
  164. private void SendPos(List<X2D1NoXlNoParlPosDto> listNoRef, List<X2D1NoXlPosDto> listRef)
  165. {
  166. SendX2D1NoXlNoParAsync(listNoRef);
  167. SendX2D1RefAsync(listRef);
  168. }
  169. /// <summary>
  170. /// 发送两星一地无参定位
  171. /// </summary>
  172. /// <param name="dtos"></param>
  173. private void SendX2D1NoXlNoParAsync(List<X2D1NoXlNoParlPosDto> dtos)
  174. {
  175. Task.Run(async () =>
  176. {
  177. foreach (var dto in dtos)
  178. {
  179. try
  180. {
  181. dto.BeFindRef = false;
  182. dto.FixedStationId = null;
  183. var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
  184. if (result.code != 200)
  185. {
  186. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
  187. }
  188. else
  189. {
  190. await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
  191. }
  192. }
  193. catch (Exception ex)
  194. {
  195. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{ex.Message}");
  196. }
  197. }
  198. });
  199. }
  200. /// <summary>
  201. /// 发送两星一地无参定位
  202. /// </summary>
  203. /// <param name="dtos"></param>
  204. private void SendX2D1RefAsync(List<X2D1NoXlPosDto> dtos)
  205. {
  206. Task.Run(async () =>
  207. {
  208. foreach (var dto in dtos)
  209. {
  210. try
  211. {
  212. var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), dto);
  213. if (result.code != 200)
  214. {
  215. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{result.msg}");
  216. }
  217. else
  218. {
  219. await LogHelper.Info($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位完成{result.msg}");
  220. }
  221. }
  222. catch (Exception ex)
  223. {
  224. await LogHelper.Error($"找参考任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地定位失败{ex.Message}");
  225. }
  226. }
  227. });
  228. }
  229. public void Append(List<X2D1NoXlNoParlPosDto> dtos)
  230. {
  231. DateTime dt = DateTime.Now;
  232. List<X2D1PosItem> list = new List<X2D1PosItem>();
  233. foreach (var dtoitem in dtos)
  234. {
  235. X2D1PosItem posItem = new X2D1PosItem(dtoitem, dt);
  236. list.Add(posItem);
  237. }
  238. bool ret = posItems.TryAdd(list);
  239. if (!ret)
  240. {
  241. LogHelper.Warning($"【任务{dtos.First().TaskID}】添加取参考Dto").GetAwaiter();
  242. }
  243. }
  244. public void Stop()
  245. {
  246. //当前任务停止处理
  247. isRuning = false;
  248. }
  249. }
  250. }