using DevExpress.Data.Filtering; using DevExpress.Mvvm; using DevExpress.Xpo; using Ips.Library.Basic; using Ips.Library.Entity; using Ips.LocAlgorithm; using Ips.Sps.Refs; using Ips.Sps.TskResults.Peses; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Sps.TskResults.Poses { public sealed class PosManager { public static readonly PosManager Default = new PosManager(); private PosManager() { } Session session = new Session(); public Session GetSession() { return session; } public bool GetIsValidByRange(Pos pos, bool autoSwap = true) { bool posIsValid = GeoUtil.IsValidPoint(pos.PosLon, pos.PosLat); if (posIsValid) return true; bool mirrIsValid = GeoUtil.IsValidPoint(pos.MirrLon, pos.MirrLat); if (mirrIsValid) { if (autoSwap) { double lon = pos.PosLon; double lat = pos.PosLat; pos.PosLon = pos.MirrLon; pos.PosLat = pos.MirrLat; pos.MirrLon = lon; pos.MirrLat = lat; return true; } } return false; } public CriteriaOperator CreateListFixCriteria(PosQueryModel queryModel, bool isMap = false) { CriteriaOperator result = null; List queryList = new List(); if (queryModel.TskId > 0) { queryList.Add(CriteriaOperator.FromLambda(m => m.TskId == queryModel.TskId)); } //if (queryModel.StartTime.HasValue) //{ // queryList.Add(CriteriaOperator.FromLambda(m => m.SigTime >= queryModel.StartTime)); //} //if (queryModel.EndTime.HasValue) //{ // queryList.Add(CriteriaOperator.FromLambda(m => m.SigTime <= queryModel.EndTime)); //} if (queryModel.PosTypes.IsNotNullOrEmpty()) { queryList.Add(CriteriaOperator.FromLambda(m => queryModel.PosTypes.Contains(m.PosType))); } if (queryModel.EmtIds.IsNotNullOrEmpty()) { queryList.Add(CriteriaOperator.FromLambda(m => queryModel.EmtIds.Contains(m.EmtId))); } if (!queryModel.ShowNotValidPoint) { queryList.Add(CriteriaOperator.FromLambda(m => m.IsValid)); } else { if (isMap) { queryList.Add(CriteriaOperator.FromLambda(m => m.PosLon > -180 && m.PosLon < 180)); } } if (queryList.Count > 0) { result = CriteriaOperator.And(queryList); } return result; } public List GetAll(PosQueryModel queryModel) { //var session = new Session(); var posQuery = session.Query(); var query = CreateFilter(posQuery, queryModel); DateTime startTime, endTime; if (queryModel.LastHours == 0) { startTime = queryModel.StartTime; endTime = queryModel.EndTime; } else { var maxTime = query.OrderByDescending(m => m.SigTime).Select(m => m.SigTime).FirstOrDefault(); if (maxTime == default) { return new List(); } else { startTime = maxTime.AddHours(-queryModel.LastHours); endTime = maxTime; } } query = query.Where(m => m.SigTime >= startTime && m.SigTime <= endTime) .OrderByDescending(m => m.SigTime); return query.ToList(); } public IQueryable CreateFilter(IQueryable query, PosQueryModel queryModel) { return query.WhereIf(queryModel.TskId > 0, m => m.TskId == queryModel.TskId) .WhereIf(queryModel.SigId > 0, m => m.SigId == queryModel.SigId) .WhereIf(queryModel.PosTypes.IsNotNullOrEmpty(), m => queryModel.PosTypes.Contains(m.PosType)) .WhereIf(queryModel.EmtIds.IsNotNullOrEmpty(), m => queryModel.EmtIds.Contains(m.EmtId)) .WhereIf(!queryModel.ShowNotValidPoint, m => m.IsValid); } public void SendPosListChangedMessage(int tskId, int sigId, List posList, DataChangeType changeType, Type targetType = null) { if (posList.IsNullOrEmpty()) return; var msg = new PosListChangedMessage() { TskId = tskId, SigId = sigId, PosList = posList, ChangeType = changeType }; bool isSend = false; if (sigId > 0) { Messenger.Default.Send(msg, targetType, $"{tskId}_{sigId}"); isSend = true; } if (tskId > 0) { Messenger.Default.Send(msg, targetType, tskId.ToString()); isSend = true; } if (!isSend) { Messenger.Default.Send(msg); } } public ExeResult ExecLoc3x(Pes pes1, Pes pes2, List refPesList) { ExeResult posResult = null; Pes refPes1 = null, refPes2 = null; List refPesList1 = new List(), refPesList2 = new List(); //if (pes1.IsValid && pes2.IsValid) //{ //三星单参定位 refPes1 = RefManager.Default.GetRefPes(pes1, refPesList, out refPesList1); if (refPes1 != null) refPes2 = RefManager.Default.GetRefPes(pes2, refPesList, out refPesList2); bool hasRef = refPes1 != null && refPes2 != null; if (hasRef) { posResult = LocUtil.X3Ref(pes1.Dt, pes2.Dt, refPes1.Dt, refPes2.Dt, refPes1.GetSigLLA(), refPes2.GetSigLLA(), pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(), pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(), pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(), pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ()).Result; } else { //三星无参定位 posResult = LocUtil.X3(pes1.Dt, pes2.Dt, pes1.GetMainAntLLA(), pes1.GetAdjaAntLLA(), pes2.GetMainAntLLA(), pes2.GetAdjaAntLLA(), pes1.GetMainEphXYZ(), pes1.GetAdjaEphXYZ(), pes2.GetMainEphXYZ(), pes2.GetAdjaEphXYZ()).Result; } //} if (posResult != null && posResult.ExitCode > 0) { IpsLogger.Error($"定位异常,{posResult.ExitMsg},定位参数:{posResult.Arguments}"); } //var pos = LocSigUtil.CreatePos(posResult?.Result, CurrentTsk.TskId, sig, pes1.SigTime); //var refSigLla = pos.HasRef ? refPes1.GetSigLLA() : null; //pos.GdopErr = LocSigUtil.GetGdopErr(pos, pes1, pes2, refSigLla); return posResult; } public void DeleteByIds(long[] ids) { session.ExecuteNonQuery($"delete from pos where id in ({string.Join(',', ids)})"); } public void UseMirr(long[] ids) { session.ExecuteNonQuery($"update pos set poslon=mirrlon,poslat=mirrlat,mirrlon=poslon,mirrlat=poslat where id in ({string.Join(',', ids)})"); } } }