LocSigGroupWorker.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using DevExpress.Utils.Extensions;
  2. using DevExpress.Xpo;
  3. using Ips.Library.Basic;
  4. using Ips.Library.Entity;
  5. using Ips.LocAlgorithm;
  6. using Ips.Sps.Refs;
  7. using Ips.Sps.Scheduling.Entities;
  8. using Ips.Sps.Scheduling.SigProces;
  9. using Ips.Sps.TskResults.Peses;
  10. using Ips.Sps.TskResults.Poses;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.DirectoryServices.ActiveDirectory;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. namespace Ips.Sps.Scheduling.SigLocs
  18. {
  19. public class LocSigGroupWorker : LocWorkerBase
  20. {
  21. public LocSigGroupWorker(RunTsk context) : base(context)
  22. {
  23. }
  24. public override void Execute(ProcSigGroup procSigGroup, CancellationToken token = default)
  25. {
  26. var tarSigList = procSigGroup.ProcSigList.Where(m => m.Sig.SigCategory != SignalCategory.RefSig && m.PesCorList.Any()).ToList();
  27. var refSigList = procSigGroup.ProcSigList.Where(m => m.Sig.SigCategory == SignalCategory.RefSig && m.PesCorList.Any()).ToList();
  28. var refPesList = refSigList.SelectMany(m => m.PesCorList).SelectMany(m => m.PesList).Where(m => m.IsValid).OrderBy(m => m.SigTime).ToList();
  29. foreach (var tarSigProcResult in tarSigList)
  30. {
  31. var sig = tarSigProcResult.Sig;
  32. if (sig == null) continue;
  33. IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}开始定位,信号时间:{procSigGroup.GroupTime:yyyy-MM-dd HH:mm:ss},任务:【{CurrentTsk.TskName}】");
  34. var mainSatId = sig.MainSatId;
  35. List<Pos> posList = new List<Pos>();
  36. try
  37. {
  38. #region 三星定位
  39. if (sig.AdjaSatIds.Count >= 2)
  40. {
  41. for (int i = 0; i < sig.AdjaSatIds.Count - 1; i++)
  42. {
  43. var adja1SatId = sig.AdjaSatIds[i];
  44. var corItem1 = tarSigProcResult.PesCorList.Find(m => m.MainSatId == mainSatId && m.AdjaSatId == adja1SatId);
  45. if (corItem1 == null) continue;
  46. for (int j = i + 1; j < sig.AdjaSatIds.Count; j++)
  47. {
  48. var adja2SatId = sig.AdjaSatIds[j];
  49. var corItem2 = tarSigProcResult.PesCorList.Find(m => m.MainSatId == mainSatId && m.AdjaSatId == adja2SatId);
  50. if (corItem2 == null) continue;
  51. var sigPosList = LocDt2(sig, corItem1, corItem2, refPesList, token);
  52. if (sigPosList.IsNotNullOrEmpty())
  53. {
  54. posList.AddRange(sigPosList);
  55. }
  56. }
  57. }
  58. }
  59. #endregion
  60. #region 双星定位
  61. if (CurrentTsk.DfLoc && sig.AdjaSatIds.Count >= 1)
  62. {
  63. for (int i = 0; i < sig.AdjaSatIds.Count; i++)
  64. {
  65. var adjaSatId = sig.AdjaSatIds[i];
  66. var corItem = tarSigProcResult.PesCorList.Find(m => m.MainSatId == mainSatId && m.AdjaSatId == adjaSatId);
  67. if (corItem == null) continue;
  68. var sigPosList = LocDtf(sig, corItem, refPesList, token);
  69. if (sigPosList.IsNotNullOrEmpty())
  70. {
  71. posList.AddRange(sigPosList);
  72. }
  73. }
  74. }
  75. #endregion
  76. PosManager.Default.SendPosListChangedMessage(CurrentTsk.TskId, tarSigProcResult.Sig.SigId, posList, DataChangeType.Insert);
  77. IpsLogger.Info($"信号频点:{sig.SigFreq.E6m()}定位完成,信号时间:{procSigGroup.GroupTime:yyyy-MM-dd HH:mm:ss},任务:【{CurrentTsk.TskName}】");
  78. }
  79. catch (Exception ex)
  80. {
  81. IpsLogger.Error($"任务:【{CurrentTsk.TskName}】信号频点:{sig.SigFreq.E6m()}定位异常",ex);
  82. }
  83. }
  84. }
  85. protected virtual List<Pos> LocDt2(RunSig sig, ProcSigCorItem cor1, ProcSigCorItem cor2, List<Pes> refPesList, CancellationToken token)
  86. {
  87. List<Pos> posList = new List<Pos>();
  88. Session session = new Session();
  89. foreach (var pes1 in cor1.PesList)
  90. {
  91. token.ThrowIfCancellationRequested();
  92. var startPos = pes1.StartPos;
  93. var pes2 = cor2.PesList.Find(m => m.StartPos == startPos);
  94. if (pes2 == null) continue;
  95. List<Pes> usePesList = new List<Pes>();
  96. usePesList.AddRange(new[] { pes1, pes2 });
  97. ExeResult<PosResult> posResult = null;
  98. Pes refPes1 = null, refPes2 = null;
  99. List<Pes> refPesList1 = new List<Pes>(), refPesList2 = new List<Pes>();
  100. if (pes1.IsValid && pes2.IsValid)
  101. {
  102. bool findDbRef = true;// CurrentTsk.SigType != SignalType.NORMAL && !CurrentTsk.IsHistory;
  103. //三星单参定位
  104. refPes1 = RefManager.Default.GetRefPes(pes1, refPesList, out refPesList1, findDbRef);
  105. if (refPes1 != null)
  106. refPes2 = RefManager.Default.GetRefPes(pes2, refPesList, out refPesList2, findDbRef);
  107. bool hasRef = refPes1 != null && refPes2 != null;
  108. if (hasRef)
  109. {
  110. usePesList.AddRange(refPesList1);
  111. usePesList.AddRange(refPesList2);
  112. posResult = LocUtil.X3Ref(pes1.Dt, pes2.Dt, refPes1.Dt, refPes2.Dt,
  113. refPes1.GetSigLLA(), refPes2.GetSigLLA(),
  114. pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(),
  115. pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(),
  116. pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(),
  117. pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ(),
  118. token: token).Result;
  119. }
  120. else
  121. {
  122. //三星无参定位
  123. posResult = LocUtil.X3(pes1.Dt, pes2.Dt,
  124. pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(),
  125. pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(),
  126. pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(),
  127. pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ(),
  128. token: token
  129. ).Result;
  130. }
  131. }
  132. if (posResult != null && posResult.ExitCode > 0)
  133. {
  134. IpsLogger.Error($"定位异常,错误消息:{posResult.ExitMsg},定位参数:{posResult.Arguments}");
  135. }
  136. var pos = LocSigUtil.CreatePos(posResult?.Result, CurrentTsk.TskId, sig, pes1.SigTime, session);
  137. var refSigLla = pos.HasRef ? refPes1.GetSigLLA() : null;
  138. if (SpsConst.EnableLocGdopErr)
  139. pos.GdopErr = LocSigUtil.GetGdopErr(pos, pes1, pes2, refSigLla);
  140. pos.Save();
  141. LocSigUtil.SavePosRel(pos, pes1, refPes1, refPesList1, session);
  142. LocSigUtil.SavePosRel(pos, pes2, refPes2, refPesList2, session);
  143. posList.Add(pos);
  144. }
  145. return posList;
  146. }
  147. protected virtual List<Pos> LocDtf(RunSig sig, ProcSigCorItem cor, List<Pes> refPesList, CancellationToken token)
  148. {
  149. List<Pos> posList = new List<Pos>();
  150. Session session = new Session();
  151. foreach (var pes in cor.PesList)
  152. {
  153. token.ThrowIfCancellationRequested();
  154. List<Pes> usePesList = new List<Pes>();
  155. usePesList.AddRange(new[] { pes });
  156. ExeResult<PosResult> posResult = null;
  157. Pes refPes = null;
  158. List<Pes> refPesList1 = new List<Pes>();
  159. if (pes.IsValid)
  160. {
  161. bool findDbRef = true;
  162. refPes = RefManager.Default.GetRefPes(pes, refPesList, out refPesList1, findDbRef);
  163. bool hasRef = refPes != null;
  164. if (hasRef)
  165. {
  166. usePesList.AddRange(refPesList1);
  167. if (SpsConst.EnableDtfLoc32)
  168. {
  169. posResult = Loc32Util.X2Ref(
  170. pes.GetMainAntLLA(),
  171. pes.GetAdjaAntLLA(),
  172. refPes.GetSigLLA(),
  173. pes.SigFreq + SpsConst.DfoLocTurn,
  174. refPes.SigFreq + SpsConst.DfoLocTurn,
  175. SpsConst.DfoLocTurn,
  176. SpsConst.DfoLocTurn,
  177. pes.Dt,
  178. refPes.Dt,
  179. pes.Df,
  180. refPes.Df,
  181. pes.GetMainEphXYZ(),
  182. pes.GetAdjaEphXYZ(),
  183. token: token).Result;
  184. }
  185. else
  186. {
  187. posResult = LocUtil.X2Ref(
  188. pes.GetMainAntLLA(),
  189. pes.GetAdjaAntLLA(),
  190. refPes.GetSigLLA(),
  191. pes.SigFreq + SpsConst.DfoLocTurn,
  192. refPes.SigFreq + SpsConst.DfoLocTurn,
  193. SpsConst.DfoLocTurn,
  194. SpsConst.DfoLocTurn,
  195. pes.Dt,
  196. refPes.Dt,
  197. pes.Df,
  198. refPes.Df,
  199. pes.GetMainEphXYZ(),
  200. pes.GetAdjaEphXYZ(),
  201. token: token).Result;
  202. }
  203. }
  204. else
  205. {
  206. //posResult = LocUtil.X3(pes.Dt, pes2.Dt,
  207. // pes.GetMainAntLLA(), pes.GetAdjaAntLLA(),
  208. // pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(),
  209. // pes.GetMainEphXYZ(), pes.GetAdjaEphXYZ(),
  210. // pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ(),
  211. // token: token
  212. // ).Result;
  213. }
  214. }
  215. if (posResult != null && posResult.ExitCode > 0)
  216. {
  217. IpsLogger.Error($"定位异常,错误消息:{posResult.ExitMsg},定位参数:{posResult.Arguments}");
  218. }
  219. var pos = LocSigUtil.CreatePos(posResult?.Result, CurrentTsk.TskId, sig, pes.SigTime, session);
  220. var refSigLla = pos.HasRef ? refPes.GetSigLLA() : null;
  221. pos.Save();
  222. LocSigUtil.SavePosRel(pos, pes, refPes, refPesList1, session);
  223. posList.Add(pos);
  224. }
  225. return posList;
  226. }
  227. }
  228. }