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