| | |
| | | if (xpElectronicFenceAreas != null) { |
| | | xpElectronicFence.setOperatingAreaCount(xpElectronicFenceAreas.stream().filter(xpElectronicFenceArea -> xpElectronicFenceArea.getAreaType() == 1).count()); |
| | | xpElectronicFence.setProhibitedAreaCount(xpElectronicFenceAreas.stream().filter(xpElectronicFenceArea -> xpElectronicFenceArea.getAreaType() == 2).count()); |
| | | }else{ |
| | | } else { |
| | | xpElectronicFence.setOperatingAreaCount(0L); |
| | | xpElectronicFence.setProhibitedAreaCount(0L); |
| | | } |
| | |
| | | query.setProhibitedAreaCountMin(null); |
| | | query.setProhibitedAreaCountMax(null); |
| | | } |
| | | |
| | | public static String getPinyinInitials(String chinese) { |
| | | StringBuilder pinyinInitials = new StringBuilder(); |
| | | for (char c : chinese.toCharArray()) { |
| | |
| | | } |
| | | return pinyinInitials.toString(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | @ShardingSphereTransactionType(TransactionType.BASE) |
| | |
| | | for (XpElectronicFenceArea newArea : newElectronicFenceAreas) { |
| | | //处理围栏闭合 |
| | | String[] split = newArea.getFencePoints().split(","); |
| | | if(!split[0].equals(split[split.length - 1])){ |
| | | if (!split[0].equals(split[split.length - 1])) { |
| | | newArea.setFencePoints(newArea.getFencePoints() + "," + split[0]); |
| | | } |
| | | if (newArea.getAreaType() == 1) { // 只检查运营区域 |
| | |
| | | } |
| | | org.locationtech.jts.geom.Point point = calculateCentroid(coordinates); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + ""); |
| | | if(null == geocode){ |
| | | if (null == geocode) { |
| | | return R.fail("经纬度转换城市code失败"); |
| | | } |
| | | String cityCode = geocode.get("cityCode"); |
| | |
| | | xpElectronicFenceAreaMapper.insert(area); |
| | | } |
| | | |
| | | }else{ |
| | | } else { |
| | | // 设置电子围栏ID并保存区域数据 |
| | | for (XpElectronicFenceArea area : newElectronicFenceAreas) { |
| | | area.setElectronicId(xpElectronicFence.getId()); |
| | |
| | | @Transactional |
| | | @ShardingSphereTransactionType(TransactionType.BASE) |
| | | public R editElectronic(ElectronicFenceUpdateDto dto) { |
| | | // 获取现有的运营区域(areaType=1),排除当前正在编辑的电子围栏 |
| | | LambdaQueryWrapper<XpElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaType, 1); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaStatus, 1); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.ne(XpElectronicFenceArea::getElectronicId, dto.getId()); |
| | | List<XpElectronicFenceArea> existingOperationAreas = xpElectronicFenceAreaMapper.selectList(xpElectronicFenceAreaLambdaQueryWrapper); |
| | | // 获取现有的运营区域(areaType=1),排除当前正在编辑的电子围栏 |
| | | LambdaQueryWrapper<XpElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaType, 1); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaStatus, 1); |
| | | xpElectronicFenceAreaLambdaQueryWrapper.ne(XpElectronicFenceArea::getElectronicId, dto.getId()); |
| | | List<XpElectronicFenceArea> existingOperationAreas = xpElectronicFenceAreaMapper.selectList(xpElectronicFenceAreaLambdaQueryWrapper); |
| | | |
| | | // 获取待更新的区域 |
| | | List<XpElectronicFenceArea> updatedElectronicFenceAreas = dto.getElectronicFenceAreas(); |
| | | // 获取待更新的区域 |
| | | List<XpElectronicFenceArea> updatedElectronicFenceAreas = dto.getElectronicFenceAreas(); |
| | | |
| | | // 检查更新后的区域与现有运营区域是否有重叠 |
| | | for (XpElectronicFenceArea updatedArea : updatedElectronicFenceAreas) { |
| | | //处理围栏闭合 |
| | | String[] split = updatedArea.getFencePoints().split(","); |
| | | if(!split[0].equals(split[split.length - 1])){ |
| | | updatedArea.setFencePoints(updatedArea.getFencePoints() + "," + split[0]); |
| | | } |
| | | if (updatedArea.getAreaType() == 1) { // 只检查运营区域 |
| | | for (XpElectronicFenceArea existingArea : existingOperationAreas) { |
| | | if (polygonOverlapService.checkPolygonOverlap( |
| | | updatedArea.getFencePoints(), |
| | | existingArea.getFencePoints())) { |
| | | List<String> res = new ArrayList<>(); |
| | | res.add(updatedArea.getAreaName()); |
| | | res.add(existingArea.getAreaName()); |
| | | throw new ServiceException( |
| | | "运营区域{}与现有运营区域{}发生重叠", |
| | | I18nKeyConstant.AREA_OVERLAP_ERROR, |
| | | res.toArray() |
| | | ); |
| | | } |
| | | // 检查更新后的区域与现有运营区域是否有重叠 |
| | | for (XpElectronicFenceArea updatedArea : updatedElectronicFenceAreas) { |
| | | //处理围栏闭合 |
| | | String[] split = updatedArea.getFencePoints().split(","); |
| | | if (!split[0].equals(split[split.length - 1])) { |
| | | updatedArea.setFencePoints(updatedArea.getFencePoints() + "," + split[0]); |
| | | } |
| | | if (updatedArea.getAreaType() == 1) { // 只检查运营区域 |
| | | for (XpElectronicFenceArea existingArea : existingOperationAreas) { |
| | | if (polygonOverlapService.checkPolygonOverlap( |
| | | updatedArea.getFencePoints(), |
| | | existingArea.getFencePoints())) { |
| | | List<String> res = new ArrayList<>(); |
| | | res.add(updatedArea.getAreaName()); |
| | | res.add(existingArea.getAreaName()); |
| | | throw new ServiceException( |
| | | "运营区域{}与现有运营区域{}发生重叠", |
| | | I18nKeyConstant.AREA_OVERLAP_ERROR, |
| | | res.toArray() |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | // 更新主表数据 |
| | | XpElectronicFence xpElectronicFence = new XpElectronicFence(); |
| | | BeanUtils.copyProperties(dto, xpElectronicFence); |
| | | if (dto.getStatus() == 0) { |
| | | xpElectronicFence.setStatus(0); |
| | | } else if (dto.getStatus() == 1) { |
| | | if (dto.getEffectType() == 1) { |
| | | } |
| | | |
| | | XpElectronicFence electronicFence = this.getById(dto.getId()); |
| | | Integer status = electronicFence.getStatus(); |
| | | |
| | | |
| | | // 更新主表数据 |
| | | XpElectronicFence xpElectronicFence = new XpElectronicFence(); |
| | | BeanUtils.copyProperties(dto, xpElectronicFence); |
| | | if (dto.getStatus() == 0) { |
| | | xpElectronicFence.setStatus(0); |
| | | } else if (dto.getStatus() == 1) { |
| | | if (dto.getEffectType() == 1) { |
| | | // 设置为启用中 |
| | | xpElectronicFence.setStatus(2); |
| | | xpElectronicFence.setEffectTime(LocalDateTime.now()); |
| | | } else { |
| | | if (dto.getEffectTime().isBefore(LocalDateTime.now())) { |
| | | // 设置为启用中 |
| | | xpElectronicFence.setStatus(2); |
| | | xpElectronicFence.setEffectTime(LocalDateTime.now()); |
| | | } else { |
| | | if (dto.getEffectTime().isBefore(LocalDateTime.now())) { |
| | | // 设置为启用中 |
| | | xpElectronicFence.setStatus(2); |
| | | // 先删除以前的定时任务 |
| | | QuartzManager.removeJob((ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_EFFECT); |
| | | |
| | | // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效 |
| | | Map<String, ? extends Object> maps = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("type", 1L) |
| | | .put("id", xpElectronicFence.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | ElectronicEffectJob.class, |
| | | (ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), |
| | | TimeJobType.ELECTRONIC_EFFECT, |
| | | DateUtils.localDateTimeToDate(dto.getEffectTime()), |
| | | maps |
| | | ); |
| | | xpElectronicFence.setStatus(1); |
| | | } |
| | | } |
| | | if (dto.getFailureType() != null && dto.getFailureType() == 2) { |
| | | |
| | | if (dto.getFailureTime().isBefore(LocalDateTime.now())) { |
| | | // 设置待启用 |
| | | xpElectronicFence.setStatus(1); |
| | | } else { |
| | | // 先删除以前的定时任务 |
| | | QuartzManager.removeJob((ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_FAILURE); |
| | | // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效 |
| | | Map<String, ? extends Object> maps = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("type", 2L) |
| | | .put("id", xpElectronicFence.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | ElectronicEffectJob.class, |
| | | (ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), |
| | | TimeJobType.ELECTRONIC_FAILURE, |
| | | DateUtils.localDateTimeToDate(dto.getEffectTime()), |
| | | maps |
| | | ); |
| | | xpElectronicFence.setStatus(1); |
| | | } |
| | | } |
| | | } |
| | | //根据经纬度获取当前城市code |
| | | XpElectronicFenceArea electronicFenceArea = dto.getElectronicFenceAreas().get(0); |
| | | String[] split = electronicFenceArea.getFencePoints().split(","); |
| | | Coordinate[] coordinates = new Coordinate[split.length]; |
| | | for (int i = 0; i < split.length; i++) { |
| | | String[] split1 = split[i].split("_"); |
| | | coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1])); |
| | | } |
| | | org.locationtech.jts.geom.Point point = calculateCentroid(coordinates); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + ""); |
| | | if (null == geocode) { |
| | | return R.fail("经纬度转换城市code失败"); |
| | | } |
| | | String cityCode = geocode.get("cityCode"); |
| | | dto.setCityCode(cityCode); |
| | | xpElectronicFence.setCityCode(dto.getCityCode()); |
| | | |
| | | this.updateById(xpElectronicFence); |
| | | |
| | | // 禁行区(areaType=2)差异删除:对比原有禁行区与本次编辑入参禁行区(按id) |
| | | List<XpElectronicFenceArea> existingProhibitedAreas = xpElectronicFenceAreaService.lambdaQuery() |
| | | .eq(XpElectronicFenceArea::getElectronicId, dto.getId()) |
| | | .eq(XpElectronicFenceArea::getAreaType, 2) |
| | | .list(); |
| | | Set<Long> incomingProhibitedIds = updatedElectronicFenceAreas.stream() |
| | | .filter(a -> a != null && a.getAreaType() != null && a.getAreaType() == 2 && a.getId() != null) |
| | | .map(XpElectronicFenceArea::getId) |
| | | .collect(Collectors.toSet()); |
| | | List<Long> toDeleteProhibitedIds = existingProhibitedAreas.stream() |
| | | .map(XpElectronicFenceArea::getId) |
| | | .filter(id -> id != null && !incomingProhibitedIds.contains(id)) |
| | | .collect(Collectors.toList()); |
| | | if (!toDeleteProhibitedIds.isEmpty()) { |
| | | // 逻辑删除MySQL禁行区 |
| | | xpElectronicFenceAreaService.removeByIds(toDeleteProhibitedIds); |
| | | // 同步删除Mongo禁行区多边形 |
| | | List<String> toDeleteAreaIdStrings = toDeleteProhibitedIds.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | Query delMongoQuery = new Query(); |
| | | delMongoQuery.addCriteria(Criteria.where("fenceId").is(String.valueOf(dto.getId()))); |
| | | delMongoQuery.addCriteria(Criteria.where("areaId").in(toDeleteAreaIdStrings)); |
| | | mongoTemplate.remove(delMongoQuery, XpGeoFencingProhibitedPolygon.class); |
| | | } |
| | | // 删除旧的区域数据,然后保存新的区域数据 |
| | | mongoTemplate.remove(new Query(Criteria.where("fenceId").is(String.valueOf(dto.getId()))), XpGeoFencingPolygon.class); |
| | | if (xpElectronicFence.getStatus() == 2) { |
| | | // 设置电子围栏ID并保存区域数据 |
| | | for (XpElectronicFenceArea area : updatedElectronicFenceAreas) { |
| | | area.setElectronicId(xpElectronicFence.getId()); |
| | | area.setAreaStatus(1); |
| | | area.setArea(area.getArea()); |
| | | area.setCityCode(dto.getCityCode()); |
| | | if (null != area.getId()) { |
| | | xpElectronicFenceAreaService.updateById(area); |
| | | } else { |
| | | xpElectronicFenceAreaService.save(area); |
| | | } |
| | | } |
| | | } else { |
| | | // 设置电子围栏ID并保存区域数据 |
| | | for (XpElectronicFenceArea area : updatedElectronicFenceAreas) { |
| | | area.setElectronicId(xpElectronicFence.getId()); |
| | | area.setAreaStatus(2); |
| | | area.setArea(area.getArea()); |
| | | area.setCityCode(dto.getCityCode()); |
| | | if (null != area.getId()) { |
| | | xpElectronicFenceAreaService.updateById(area); |
| | | } else { |
| | | xpElectronicFenceAreaService.save(area); |
| | | } |
| | | } |
| | | } |
| | | if (dto.getStatus() == 1 || dto.getStatus() == 2) { |
| | | for (XpElectronicFenceArea newElectronicFenceArea : updatedElectronicFenceAreas) { |
| | | if (newElectronicFenceArea.getAreaType() == 1 |
| | | && newElectronicFenceArea.getAreaStatus() == 1) { |
| | | // 先查询出mongo里围栏相同的数据 如果有 那么更新数据 |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId()))); |
| | | query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId()))); |
| | | XpGeoFencingPolygon old = mongoTemplate.findOne(query, XpGeoFencingPolygon.class); |
| | | if (old == null) { |
| | | XpGeoFencingPolygon xpGeoFencingPolygon = new XpGeoFencingPolygon(); |
| | | xpGeoFencingPolygon.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | xpGeoFencingPolygon.setName(xpElectronicFence.getElectronicName()); |
| | | xpGeoFencingPolygon.setCityCode(cityCode); |
| | | xpGeoFencingPolygon.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | xpGeoFencingPolygon.setOperationStrategy(xpElectronicFence.getOperationStrategy()); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | xpGeoFencingPolygon.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(xpGeoFencingPolygon); |
| | | } else { |
| | | // 先删除以前的定时任务 |
| | | QuartzManager.removeJob((ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_EFFECT); |
| | | |
| | | // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效 |
| | | Map<String, ? extends Object> maps = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("type", 1L) |
| | | .put("id", xpElectronicFence.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | ElectronicEffectJob.class, |
| | | (ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), |
| | | TimeJobType.ELECTRONIC_EFFECT, |
| | | DateUtils.localDateTimeToDate(dto.getEffectTime()), |
| | | maps |
| | | ); |
| | | xpElectronicFence.setStatus(1); |
| | | // 如果存在,则更新已有文档 |
| | | old.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | old.setName(xpElectronicFence.getElectronicName()); |
| | | old.setCityCode(cityCode); |
| | | old.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | old.setOperationStrategy(xpElectronicFence.getOperationStrategy()); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | old.setPoints(geoJsonPolygon); |
| | | // 执行更新操作 |
| | | mongoTemplate.save(old); // save() 会根据 _id 自动判断是插入还是更新 |
| | | } |
| | | } |
| | | if (dto.getFailureType() != null && dto.getFailureType() == 2) { |
| | | |
| | | if (dto.getFailureTime().isBefore(LocalDateTime.now())) { |
| | | // 设置待启用 |
| | | xpElectronicFence.setStatus(1); |
| | | } |
| | | if (newElectronicFenceArea.getAreaType() == 2 |
| | | && newElectronicFenceArea.getAreaStatus() == 1) { |
| | | // 先查询出mongo里围栏相同的数据 如果有 那么更新数据 |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId()))); |
| | | query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId()))); |
| | | XpGeoFencingProhibitedPolygon old = mongoTemplate.findOne(query, XpGeoFencingProhibitedPolygon.class); |
| | | if (old == null) { |
| | | XpGeoFencingProhibitedPolygon xpGeoFencingProhibitedPolygon = new XpGeoFencingProhibitedPolygon(); |
| | | xpGeoFencingProhibitedPolygon.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | xpGeoFencingProhibitedPolygon.setName(xpElectronicFence.getElectronicName()); |
| | | xpGeoFencingProhibitedPolygon.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | xpGeoFencingProhibitedPolygon.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(xpGeoFencingProhibitedPolygon); |
| | | } else { |
| | | // 先删除以前的定时任务 |
| | | QuartzManager.removeJob((ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_FAILURE); |
| | | // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效 |
| | | Map<String, ? extends Object> maps = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("type", 2L) |
| | | .put("id", xpElectronicFence.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | ElectronicEffectJob.class, |
| | | (ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), |
| | | TimeJobType.ELECTRONIC_FAILURE, |
| | | DateUtils.localDateTimeToDate(dto.getEffectTime()), |
| | | maps |
| | | ); |
| | | xpElectronicFence.setStatus(1); |
| | | old.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | old.setName(xpElectronicFence.getElectronicName()); |
| | | old.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | old.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(old); |
| | | } |
| | | } |
| | | } |
| | | //根据经纬度获取当前城市code |
| | | XpElectronicFenceArea electronicFenceArea = dto.getElectronicFenceAreas().get(0); |
| | | String[] split = electronicFenceArea.getFencePoints().split(","); |
| | | Coordinate[] coordinates = new Coordinate[split.length]; |
| | | for (int i = 0; i < split.length; i++) { |
| | | String[] split1 = split[i].split("_"); |
| | | coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1])); |
| | | } |
| | | org.locationtech.jts.geom.Point point = calculateCentroid(coordinates); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + ""); |
| | | if(null == geocode){ |
| | | return R.fail("经纬度转换城市code失败"); |
| | | } |
| | | String cityCode = geocode.get("cityCode"); |
| | | dto.setCityCode(cityCode); |
| | | xpElectronicFence.setCityCode(dto.getCityCode()); |
| | | } |
| | | // 判断区域下的所有运营点位是否处于运营区域内 如果不是则更新为测试点位 |
| | | List<Long> areaIds = updatedElectronicFenceAreas.stream().map(XpElectronicFenceArea::getId).collect(Collectors.toList()); |
| | | LambdaQueryWrapper<XpPoint> pointLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | pointLambdaQueryWrapper.in(XpPoint::getElectronicAreaId, areaIds).eq(XpPoint::getPointType, 1); |
| | | List<XpPoint> xpPoints = xpPointMapper.selectList(pointLambdaQueryWrapper); |
| | | if (!xpPoints.isEmpty()) { |
| | | List<Long> electronicAreaId = xpPoints.stream().map(XpPoint::getElectronicAreaId).distinct().collect(Collectors.toList()); |
| | | if (!electronicAreaId.isEmpty()) { |
| | | Map<Long, XpElectronicFenceArea> longXpElectronicFenceAreaMap = updatedElectronicFenceAreas |
| | | .stream().collect(Collectors.toMap(XpElectronicFenceArea::getId, e -> e)); |
| | | for (XpPoint xpPoint : xpPoints) { |
| | | XpElectronicFenceArea xpElectronicFenceArea = longXpElectronicFenceAreaMap.get(xpPoint.getElectronicAreaId()); |
| | | |
| | | this.updateById(xpElectronicFence); |
| | | |
| | | // 禁行区(areaType=2)差异删除:对比原有禁行区与本次编辑入参禁行区(按id) |
| | | List<XpElectronicFenceArea> existingProhibitedAreas = xpElectronicFenceAreaService.lambdaQuery() |
| | | .eq(XpElectronicFenceArea::getElectronicId, dto.getId()) |
| | | .eq(XpElectronicFenceArea::getAreaType, 2) |
| | | .list(); |
| | | Set<Long> incomingProhibitedIds = updatedElectronicFenceAreas.stream() |
| | | .filter(a -> a != null && a.getAreaType() != null && a.getAreaType() == 2 && a.getId() != null) |
| | | .map(XpElectronicFenceArea::getId) |
| | | .collect(Collectors.toSet()); |
| | | List<Long> toDeleteProhibitedIds = existingProhibitedAreas.stream() |
| | | .map(XpElectronicFenceArea::getId) |
| | | .filter(id -> id != null && !incomingProhibitedIds.contains(id)) |
| | | .collect(Collectors.toList()); |
| | | if (!toDeleteProhibitedIds.isEmpty()) { |
| | | // 逻辑删除MySQL禁行区 |
| | | xpElectronicFenceAreaService.removeByIds(toDeleteProhibitedIds); |
| | | // 同步删除Mongo禁行区多边形 |
| | | List<String> toDeleteAreaIdStrings = toDeleteProhibitedIds.stream().map(String::valueOf).collect(Collectors.toList()); |
| | | Query delMongoQuery = new Query(); |
| | | delMongoQuery.addCriteria(Criteria.where("fenceId").is(String.valueOf(dto.getId()))); |
| | | delMongoQuery.addCriteria(Criteria.where("areaId").in(toDeleteAreaIdStrings)); |
| | | mongoTemplate.remove(delMongoQuery, XpGeoFencingProhibitedPolygon.class); |
| | | } |
| | | // 删除旧的区域数据,然后保存新的区域数据 |
| | | mongoTemplate.remove(new Query(Criteria.where("fenceId").is(String.valueOf(dto.getId()))), XpGeoFencingPolygon.class); |
| | | if (xpElectronicFence.getStatus() == 2) { |
| | | // 设置电子围栏ID并保存区域数据 |
| | | for (XpElectronicFenceArea area : updatedElectronicFenceAreas) { |
| | | area.setElectronicId(xpElectronicFence.getId()); |
| | | area.setAreaStatus(1); |
| | | area.setArea(area.getArea()); |
| | | area.setCityCode(dto.getCityCode()); |
| | | if(null != area.getId()){ |
| | | xpElectronicFenceAreaService.updateById(area); |
| | | }else{ |
| | | xpElectronicFenceAreaService.save(area); |
| | | } |
| | | } |
| | | }else{ |
| | | // 设置电子围栏ID并保存区域数据 |
| | | for (XpElectronicFenceArea area : updatedElectronicFenceAreas) { |
| | | area.setElectronicId(xpElectronicFence.getId()); |
| | | area.setAreaStatus(2); |
| | | area.setArea(area.getArea()); |
| | | area.setCityCode(dto.getCityCode()); |
| | | if(null != area.getId()){ |
| | | xpElectronicFenceAreaService.updateById(area); |
| | | }else{ |
| | | xpElectronicFenceAreaService.save(area); |
| | | } |
| | | } |
| | | } |
| | | if (dto.getStatus() == 1 || dto.getStatus() == 2) { |
| | | for (XpElectronicFenceArea newElectronicFenceArea : updatedElectronicFenceAreas) { |
| | | if (newElectronicFenceArea.getAreaType() == 1 |
| | | && newElectronicFenceArea.getAreaStatus() == 1) { |
| | | // 先查询出mongo里围栏相同的数据 如果有 那么更新数据 |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId()))); |
| | | query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId()))); |
| | | XpGeoFencingPolygon old = mongoTemplate.findOne(query, XpGeoFencingPolygon.class); |
| | | if (old == null) { |
| | | XpGeoFencingPolygon xpGeoFencingPolygon = new XpGeoFencingPolygon(); |
| | | xpGeoFencingPolygon.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | xpGeoFencingPolygon.setName(xpElectronicFence.getElectronicName()); |
| | | xpGeoFencingPolygon.setCityCode(cityCode); |
| | | xpGeoFencingPolygon.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | xpGeoFencingPolygon.setOperationStrategy(xpElectronicFence.getOperationStrategy()); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | xpGeoFencingPolygon.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(xpGeoFencingPolygon); |
| | | } else { |
| | | // 如果存在,则更新已有文档 |
| | | old.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | old.setName(xpElectronicFence.getElectronicName()); |
| | | old.setCityCode(cityCode); |
| | | old.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | old.setOperationStrategy(xpElectronicFence.getOperationStrategy()); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | old.setPoints(geoJsonPolygon); |
| | | // 执行更新操作 |
| | | mongoTemplate.save(old); // save() 会根据 _id 自动判断是插入还是更新 |
| | | } |
| | | |
| | | } |
| | | if (newElectronicFenceArea.getAreaType() == 2 |
| | | && newElectronicFenceArea.getAreaStatus() == 1) { |
| | | // 先查询出mongo里围栏相同的数据 如果有 那么更新数据 |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId()))); |
| | | query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId()))); |
| | | XpGeoFencingProhibitedPolygon old = mongoTemplate.findOne(query, XpGeoFencingProhibitedPolygon.class); |
| | | if (old == null) { |
| | | XpGeoFencingProhibitedPolygon xpGeoFencingProhibitedPolygon = new XpGeoFencingProhibitedPolygon(); |
| | | xpGeoFencingProhibitedPolygon.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | xpGeoFencingProhibitedPolygon.setName(xpElectronicFence.getElectronicName()); |
| | | xpGeoFencingProhibitedPolygon.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | xpGeoFencingProhibitedPolygon.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(xpGeoFencingProhibitedPolygon); |
| | | } else { |
| | | old.setFenceId(String.valueOf(xpElectronicFence.getId())); |
| | | old.setName(xpElectronicFence.getElectronicName()); |
| | | old.setAreaId(String.valueOf(newElectronicFenceArea.getId())); |
| | | // 将围栏点转换为GeoJSON多边形 |
| | | GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints()); |
| | | old.setPoints(geoJsonPolygon); |
| | | mongoTemplate.save(old); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // 判断区域下的所有运营点位是否处于运营区域内 如果不是则更新为测试点位 |
| | | List<Long> areaIds = updatedElectronicFenceAreas.stream().map(XpElectronicFenceArea::getId).collect(Collectors.toList()); |
| | | LambdaQueryWrapper<XpPoint> pointLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | pointLambdaQueryWrapper.in(XpPoint::getElectronicAreaId, areaIds).eq(XpPoint::getPointType, 1); |
| | | List<XpPoint> xpPoints = xpPointMapper.selectList(pointLambdaQueryWrapper); |
| | | List<XpPoint> updatePoints = new ArrayList<>(); |
| | | if (!xpPoints.isEmpty()) { |
| | | List<Long> electronicAreaId = xpPoints.stream().map(XpPoint::getElectronicAreaId).distinct().collect(Collectors.toList()); |
| | | if (!electronicAreaId.isEmpty()) { |
| | | Map<Long, XpElectronicFenceArea> longXpElectronicFenceAreaMap = updatedElectronicFenceAreas |
| | | .stream().collect(Collectors.toMap(XpElectronicFenceArea::getId, e -> e)); |
| | | for (XpPoint xpPoint : xpPoints) { |
| | | XpElectronicFenceArea xpElectronicFenceArea = longXpElectronicFenceAreaMap.get(xpPoint.getElectronicAreaId()); |
| | | |
| | | if (xpElectronicFenceArea != null) { |
| | | String fencePoints = xpElectronicFenceArea.getFencePoints(); |
| | | Double pointLat = xpPoint.getPointLat(); |
| | | Double pointLon = xpPoint.getPointLon(); |
| | | // 判断这个点位有没有处于当前区域 由多个经纬度点构成的面里 |
| | | if (fencePoints != null && !fencePoints.trim().isEmpty() && |
| | | pointLat != null && pointLon != null) { |
| | | boolean isInside = isPointInPolygon(fencePoints, pointLon, pointLat); |
| | | // 如果点不在区域内,更新为测试点位 |
| | | if (!isInside) { |
| | | xpPoint.setPointType(2); // |
| | | log.info("点位ID: {} 经纬度: ({}, {}) 不在电子围栏区域内,已更新为测试点位", |
| | | xpPoint.getId(), pointLon, pointLat); |
| | | UpdateWrapper<XpPoint> xpPointUpdateWrapper = new UpdateWrapper<>(); |
| | | xpPointUpdateWrapper.eq("id", xpPoint.getId()); |
| | | xpPointUpdateWrapper.set("point_type", 2); |
| | | xpPointUpdateWrapper.set("electronic_areaId", null); |
| | | xpPointMapper.update(xpPoint, xpPointUpdateWrapper); |
| | | } |
| | | if (xpElectronicFenceArea != null) { |
| | | String fencePoints = xpElectronicFenceArea.getFencePoints(); |
| | | Double pointLat = xpPoint.getPointLat(); |
| | | Double pointLon = xpPoint.getPointLon(); |
| | | // 判断这个点位有没有处于当前区域 由多个经纬度点构成的面里 |
| | | if (fencePoints != null && !fencePoints.trim().isEmpty() && |
| | | pointLat != null && pointLon != null) { |
| | | boolean isInside = isPointInPolygon(fencePoints, pointLon, pointLat); |
| | | // 如果点不在区域内,更新为测试点位 |
| | | if (!isInside) { |
| | | xpPoint.setPointType(2); // |
| | | log.info("点位ID: {} 经纬度: ({}, {}) 不在电子围栏区域内,已更新为测试点位", |
| | | xpPoint.getId(), pointLon, pointLat); |
| | | UpdateWrapper<XpPoint> xpPointUpdateWrapper = new UpdateWrapper<>(); |
| | | xpPointUpdateWrapper.eq("id", xpPoint.getId()); |
| | | xpPointUpdateWrapper.set("point_type", 2); |
| | | xpPointUpdateWrapper.set("electronic_areaId", null); |
| | | xpPointMapper.update(xpPoint, xpPointUpdateWrapper); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return R.ok(); |
| | | } |
| | | //如果区域状态从停用改为启用,需将区域内的点位全部启用 |
| | | if (status ==3 && dto.getStatus() == 2 && !xpPoints.isEmpty()){ |
| | | for (XpPoint xpPoint : xpPoints) { |
| | | xpPoint.setOperationStatus(2); |
| | | xpPointMapper.updateById(xpPoint); |
| | | } |
| | | } |
| | | return R.ok(); |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | /** |
| | | * 计算围栏中心点 |
| | | * |
| | | * @param coordinates |
| | | * @return |
| | | */ |