Exemplo n.º 1
0
        // 更新警员位置
        //  返回警员位置变化状态,并同时返回警员位置变化异常状态结果
        private bool UpgradeOfficerLocation(UpLoadDataPackage data, TagBindModel bdm, out UpgradeOfficerLocationResult result)
        {
            var handler = new OfficerLocationHandle(Repository);
            var lc      = handler.First(t => t.OfficerId == bdm.Officer.Id);

            result = new UpgradeOfficerLocationResult {
                PreLocation = lc, IsLocationException = false
            };

            var isEmpty = (null == lc);

            // 首次进入基站
            if (isEmpty && !data.IsOut)
            {
                lc = new OfficerLocation {
                    OfficerId = bdm.Officer.Id, EquipId = bdm.Equipment.Id, SiteId = data.SiteId, Status = (short)LocationStatus.In, UpTime = data.TTime
                };
                handler.Add(lc);
                return(true);
            }

            // 进入基站,并且位置发生变化
            if (!isEmpty && !data.IsOut && data.SiteId != lc.SiteId)
            {
                // 警员位置异常范围最小值
                var tmin = lc.UpTime - OfficerLocationExceptionTimeRange;
                // 警员位置异常范围最大 值
                var tmax = lc.UpTime + OfficerLocationExceptionTimeRange;
                // 进一步判断是否发生在异常时间内,并标识是否发生异常
                result.IsLocationException = (tmin <= data.TTime && tmax >= data.TTime);
                if (result.IsLocationException)
                {
                    // 位置异常,中断执行后续处理,并触发位置异常处理
                    return(false);
                }

                // 位置没有发生异常,继续执行后续处理
                lc.SiteId  = data.SiteId;
                lc.EquipId = bdm.Equipment.Id;
                lc.Status  = (short)LocationStatus.In;
                lc.UpTime  = data.TTime;
                handler.Modify(lc);
                return(true);
            }

            // 离开基站
            if (!isEmpty && data.IsOut && lc.SiteId == data.SiteId)
            {
                lc.EquipId = bdm.Equipment.Id;
                lc.Status  = (short)LocationStatus.Out;
                lc.UpTime  = data.TTime;
                handler.Modify(lc);
            }

            return(false);
        }
Exemplo n.º 2
0
        // 矩形选择
        public IEnumerable <OfficerDispatchQueryModel> RectangleSelect(double x1, double y1, double x2, double y2)
        {
            var lcHandler  = new OfficerLocationHandle(Repository);
            var ocHandler  = new OfficerHandle(Repository);
            var orgHandler = new OrganizationHandle(Repository);
            var ptHandler  = new PoliceTypeHandle(Repository);
            var stHandler  = new StationHandle(Repository);

            var noDel = (short)DeleteStatus.No;
            var query =
                from lc in lcHandler.All(null)
                join oc in ocHandler.All(t => t.IsDel == noDel) on lc.OfficerId equals oc.Id
                join org in orgHandler.All(t => t.IsDel == noDel) on oc.OrgId equals org.Id
                join ptp in ptHandler.All(t => t.IsDel == noDel) on oc.PtId equals ptp.Id
                join sts in stHandler.All(t => t.IsDel == noDel) on lc.SiteId equals sts.SiteId into stas
                from st in stas.DefaultIfEmpty(new Station {
            })
                select new { location = lc, officer = oc, org = org, ptp = ptp, station = st };

            // 此处进一步查询
            if (!User.IsSupperAdministrator)
            {
                var orgId = User.Organization.Id;
                query = query.Where(t => t.org.Id == orgId);
            }

            var xmin = x1;
            var xmax = x2;

            if (x1 > x2)
            {
                xmax = x1;
                xmin = x2;
            }

            var ymin = y1;
            var ymax = y2;

            if (y1 > y2)
            {
                ymin = y2;
                ymax = y1;
            }
            var items = query.OrderByDescending(t => t.location.UpTime).ToArray()
                        .Select(t => {
                OfficerDispatchQueryModel m = null;
                if (string.IsNullOrWhiteSpace(t.station.SiteId) ||
                    (t.station.Lon >= xmin && t.station.Lon <= xmax && t.station.Lat >= ymin && t.station.Lat <= ymax)
                    )
                {
                    m = new OfficerDispatchQueryModel
                    {
                        location = t.location,
                        officer  = t.officer,
                        org      = t.org,
                        ptp      = t.ptp,
                        station  = t.station
                    };
                }
                return(m);
            }).Where(t => t != null).ToArray();

            return(items);
        }