// 更新警员位置 // 返回警员位置变化状态,并同时返回警员位置变化异常状态结果 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); }
// 矩形选择 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); }