| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | 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<CriteriaOperator> queryList = new List<CriteriaOperator>();            if (queryModel.TskId > 0)            {                queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.TskId == queryModel.TskId));            }            //if (queryModel.StartTime.HasValue)            //{            //    queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.SigTime >= queryModel.StartTime));            //}            //if (queryModel.EndTime.HasValue)            //{            //    queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.SigTime <= queryModel.EndTime));            //}            if (queryModel.PosTypes.IsNotNullOrEmpty())            {                queryList.Add(CriteriaOperator.FromLambda<Pos>(m => queryModel.PosTypes.Contains(m.PosType)));            }            if (queryModel.EmtIds.IsNotNullOrEmpty())            {                queryList.Add(CriteriaOperator.FromLambda<Pos>(m => queryModel.EmtIds.Contains(m.EmtId)));            }            if (!queryModel.ShowNotValidPoint)            {                queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.IsValid));            }            else            {                if (isMap)                {                    queryList.Add(CriteriaOperator.FromLambda<Pos>(m => m.PosLon > -180 && m.PosLon < 180));                }            }            if (queryList.Count > 0)            {                result = CriteriaOperator.And(queryList);            }            return result;        }        public List<Pos> GetAll(PosQueryModel queryModel)        {            //var session = new Session();            var posQuery = session.Query<Pos>();            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<Pos>();                }                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<Pos> CreateFilter(IQueryable<Pos> 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<Pos> 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<PosResult> ExecLoc3x(Pes pes1, Pes pes2, List<Pes> refPesList)        {            ExeResult<PosResult> posResult = null;            Pes refPes1 = null, refPes2 = null;            List<Pes> refPesList1 = new List<Pes>(), refPesList2 = new List<Pes>();            //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)})");        }    }}
 |