From 96d054afcbbb3cc52f946bd3b37dd7c00dd9cb3e Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 13 三月 2026 17:15:50 +0800
Subject: [PATCH] 增加点位状态流转逻辑
---
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java | 513 +++++++++++++++++++++++++++++---------------------------
1 files changed, 263 insertions(+), 250 deletions(-)
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
index 77df7a9..e494533 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
@@ -99,7 +99,7 @@
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);
}
@@ -182,6 +182,7 @@
query.setProhibitedAreaCountMin(null);
query.setProhibitedAreaCountMax(null);
}
+
public static String getPinyinInitials(String chinese) {
StringBuilder pinyinInitials = new StringBuilder();
for (char c : chinese.toCharArray()) {
@@ -194,6 +195,7 @@
}
return pinyinInitials.toString();
}
+
@Override
@Transactional
@ShardingSphereTransactionType(TransactionType.BASE)
@@ -211,7 +213,7 @@
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) { // 只检查运营区域
@@ -261,7 +263,7 @@
}
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");
@@ -340,7 +342,7 @@
xpElectronicFenceAreaMapper.insert(area);
}
- }else{
+ } else {
// 设置电子围栏ID并保存区域数据
for (XpElectronicFenceArea area : newElectronicFenceAreas) {
area.setElectronicId(xpElectronicFence.getId());
@@ -388,273 +390,283 @@
@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();
}
@@ -805,6 +817,7 @@
/**
* 计算围栏中心点
+ *
* @param coordinates
* @return
*/
--
Gitblit v1.7.1