PosManager.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using DevExpress.Data.Filtering;
  2. using DevExpress.Mvvm;
  3. using DevExpress.Xpo;
  4. using Ips.Library.Basic;
  5. using Ips.Library.Entity;
  6. using Ips.LocAlgorithm;
  7. using Ips.Sps.Refs;
  8. using Ips.Sps.TskResults.Peses;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. namespace Ips.Sps.TskResults.Poses
  15. {
  16. public sealed class PosManager
  17. {
  18. public static readonly PosManager Default = new PosManager();
  19. private PosManager() { }
  20. Session session = new Session();
  21. public Session GetSession()
  22. {
  23. return session;
  24. }
  25. public bool GetIsValidByRange(Pos pos, bool autoSwap = true)
  26. {
  27. bool posIsValid = GeoUtil.IsValidPoint(pos.PosLon, pos.PosLat);
  28. if (posIsValid) return true;
  29. bool mirrIsValid = GeoUtil.IsValidPoint(pos.MirrLon, pos.MirrLat);
  30. if (mirrIsValid)
  31. {
  32. if (autoSwap)
  33. {
  34. double lon = pos.PosLon;
  35. double lat = pos.PosLat;
  36. pos.PosLon = pos.MirrLon;
  37. pos.PosLat = pos.MirrLat;
  38. pos.MirrLon = lon;
  39. pos.MirrLat = lat;
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. public CriteriaOperator CreateListFixCriteria(PosQueryModel queryModel, bool isMap = false)
  46. {
  47. CriteriaOperator result = null;
  48. List<CriteriaOperator> queryList = new List<CriteriaOperator>();
  49. if (queryModel.TskId > 0)
  50. {
  51. queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.TskId == queryModel.TskId));
  52. }
  53. //if (queryModel.StartTime.HasValue)
  54. //{
  55. // queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.SigTime >= queryModel.StartTime));
  56. //}
  57. //if (queryModel.EndTime.HasValue)
  58. //{
  59. // queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.SigTime <= queryModel.EndTime));
  60. //}
  61. if (queryModel.PosTypes.IsNotNullOrEmpty())
  62. {
  63. queryList.Add(CriteriaOperator.FromLambda<Pos>(m => queryModel.PosTypes.Contains(m.PosType)));
  64. }
  65. if (queryModel.EmtIds.IsNotNullOrEmpty())
  66. {
  67. queryList.Add(CriteriaOperator.FromLambda<Pos>(m => queryModel.EmtIds.Contains(m.EmtId)));
  68. }
  69. if (!queryModel.ShowNotValidPoint)
  70. {
  71. queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.IsValid));
  72. }
  73. else
  74. {
  75. if (isMap)
  76. {
  77. queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.PosLon > -180 && m.PosLon < 180));
  78. }
  79. }
  80. if (queryList.Count > 0)
  81. {
  82. result = CriteriaOperator.And(queryList);
  83. }
  84. return result;
  85. }
  86. public List<Pos> GetAll(PosQueryModel queryModel)
  87. {
  88. //var session = new Session();
  89. var posQuery = session.Query<Pos>();
  90. var query = CreateFilter(posQuery, queryModel);
  91. DateTime startTime, endTime;
  92. if (queryModel.LastHours == 0)
  93. {
  94. startTime = queryModel.StartTime;
  95. endTime = queryModel.EndTime;
  96. }
  97. else
  98. {
  99. var maxTime = query.OrderByDescending(m => m.SigTime).Select(m => m.SigTime).FirstOrDefault();
  100. if (maxTime == default)
  101. {
  102. return new List<Pos>();
  103. }
  104. else
  105. {
  106. startTime = maxTime.AddHours(-queryModel.LastHours);
  107. endTime = maxTime;
  108. }
  109. }
  110. query = query.Where(m => m.SigTime >= startTime && m.SigTime <= endTime)
  111. .OrderByDescending(m => m.SigTime);
  112. return query.ToList();
  113. }
  114. public IQueryable<Pos> CreateFilter(IQueryable<Pos> query, PosQueryModel queryModel)
  115. {
  116. return query.WhereIf(queryModel.TskId > 0, m => m.TskId == queryModel.TskId)
  117. .WhereIf(queryModel.SigId > 0, m => m.SigId == queryModel.SigId)
  118. .WhereIf(queryModel.PosTypes.IsNotNullOrEmpty(), m => queryModel.PosTypes.Contains(m.PosType))
  119. .WhereIf(queryModel.EmtIds.IsNotNullOrEmpty(), m => queryModel.EmtIds.Contains(m.EmtId))
  120. .WhereIf(!queryModel.ShowNotValidPoint, m => m.IsValid);
  121. }
  122. public void SendPosListChangedMessage(int tskId, int sigId, List<Pos> posList, DataChangeType changeType, Type targetType = null)
  123. {
  124. if (posList.IsNullOrEmpty()) return;
  125. var msg = new PosListChangedMessage()
  126. {
  127. TskId = tskId,
  128. SigId = sigId,
  129. PosList = posList,
  130. ChangeType = changeType
  131. };
  132. bool isSend = false;
  133. if (sigId > 0)
  134. {
  135. Messenger.Default.Send(msg, targetType, $"{tskId}_{sigId}");
  136. isSend = true;
  137. }
  138. if (tskId > 0)
  139. {
  140. Messenger.Default.Send(msg, targetType, tskId.ToString());
  141. isSend = true;
  142. }
  143. if (!isSend)
  144. {
  145. Messenger.Default.Send(msg);
  146. }
  147. }
  148. public ExeResult<PosResult> ExecLoc3x(Pes pes1, Pes pes2, List<Pes> refPesList)
  149. {
  150. ExeResult<PosResult> posResult = null;
  151. Pes refPes1 = null, refPes2 = null;
  152. List<Pes> refPesList1 = new List<Pes>(), refPesList2 = new List<Pes>();
  153. //if (pes1.IsValid && pes2.IsValid)
  154. //{
  155. //三星单参定位
  156. refPes1 = RefManager.Default.GetRefPes(pes1, refPesList, out refPesList1);
  157. if (refPes1 != null)
  158. refPes2 = RefManager.Default.GetRefPes(pes2, refPesList, out refPesList2);
  159. bool hasRef = refPes1 != null && refPes2 != null;
  160. if (hasRef)
  161. {
  162. posResult = LocUtil.X3Ref(pes1.Dt, pes2.Dt, refPes1.Dt, refPes2.Dt,
  163. refPes1.GetSigLLA(), refPes2.GetSigLLA(),
  164. pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(),
  165. pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(),
  166. pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(),
  167. pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ()).Result;
  168. }
  169. else
  170. {
  171. //三星无参定位
  172. posResult = LocUtil.X3(pes1.Dt, pes2.Dt,
  173. pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(),
  174. pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(),
  175. pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(),
  176. pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ()).Result;
  177. }
  178. //}
  179. if (posResult != null && posResult.ExitCode > 0)
  180. {
  181. IpsLogger.Error($"定位异常,{posResult.ExitMsg},定位参数:{posResult.Arguments}");
  182. }
  183. //var pos = LocSigUtil.CreatePos(posResult?.Result, CurrentTsk.TskId, sig, pes1.SigTime);
  184. //var refSigLla = pos.HasRef ? refPes1.GetSigLLA() : null;
  185. //pos.GdopErr = LocSigUtil.GetGdopErr(pos, pes1, pes2, refSigLla);
  186. return posResult;
  187. }
  188. public void DeleteByIds(long[] ids)
  189. {
  190. session.ExecuteNonQuery($"delete from pos where id in ({string.Join(',', ids)})");
  191. }
  192. public void UseMirr(long[] ids)
  193. {
  194. session.ExecuteNonQuery($"update pos set poslon=mirrlon,poslat=mirrlat,mirrlon=poslon,mirrlat=poslat where id in ({string.Join(',', ids)})");
  195. }
  196. }
  197. }