From 246c72b8e1cba97de66efd8112ed166210ebc686 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 17 四月 2026 12:02:38 +0800
Subject: [PATCH] fix:围栏点位重名校验、围栏禁行区禁用

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java |   31 +++++++++++++++++++++++++++++--
 1 files changed, 29 insertions(+), 2 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 a54e6b9..dcf87ac 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
@@ -211,6 +211,7 @@
     @Transactional
     @ShardingSphereTransactionType(TransactionType.BASE)
     public R addElectronic(ElectronicFenceAddDto dto) {
+        validateElectronicNameUnique(dto.getElectronicName(), null);
         // 获取现有的运营区域(areaType=1)
         LambdaQueryWrapper<XpElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>();
         xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaType, 1);
@@ -343,6 +344,7 @@
     @Transactional
     @ShardingSphereTransactionType(TransactionType.BASE)
     public R editElectronic(ElectronicFenceUpdateDto dto) {
+        validateElectronicNameUnique(dto.getElectronicName(), dto.getId());
         // 获取现有的运营区域(areaType=1),排除当前正在编辑的电子围栏
         LambdaQueryWrapper<XpElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>();
         xpElectronicFenceAreaLambdaQueryWrapper.eq(XpElectronicFenceArea::getAreaType, 1);
@@ -448,7 +450,9 @@
             // 设置电子围栏ID并保存区域数据
             for (XpElectronicFenceArea area : updatedElectronicFenceAreas) {
                 area.setElectronicId(xpElectronicFence.getId());
-                area.setAreaStatus(1);
+                if (area.getAreaType() == null || area.getAreaType() == 1) {
+                    area.setAreaStatus(1);
+                }
                 area.setArea(area.getArea());
                 area.setCityCode(dto.getCityCode());
                 if (null != area.getId()) {
@@ -461,7 +465,9 @@
             // 设置电子围栏ID并保存区域数据
             for (XpElectronicFenceArea area : updatedElectronicFenceAreas) {
                 area.setElectronicId(xpElectronicFence.getId());
-                area.setAreaStatus(2);
+                if (area.getAreaType() == null || area.getAreaType() == 1) {
+                    area.setAreaStatus(2);
+                }
                 area.setArea(area.getArea());
                 area.setCityCode(dto.getCityCode());
                 if (null != area.getId()) {
@@ -531,6 +537,12 @@
                         old.setPoints(geoJsonPolygon);
                         mongoTemplate.save(old);
                     }
+                } else if (newElectronicFenceArea.getAreaType() == 2
+                        && newElectronicFenceArea.getId() != null) {
+                    Query query = new Query();
+                    query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId())));
+                    query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId())));
+                    mongoTemplate.remove(query, XpGeoFencingProhibitedPolygon.class);
                 }
             }
         }
@@ -749,6 +761,21 @@
         return R.ok();
 
     }
+
+    @Override
+    public void validateElectronicNameUnique(String electronicName, Long excludeId) {
+        if (!StringUtils.hasText(electronicName)) {
+            return;
+        }
+        long count = this.lambdaQuery()
+                .eq(XpElectronicFence::getElectronicName, electronicName)
+                .ne(excludeId != null, XpElectronicFence::getId, excludeId)
+                .count();
+        if (count > 0) {
+            throw new ServiceException("围栏名称已存在", I18nKeyConstant.FENCE_NAME_EXISTS);
+        }
+    }
+
     private static List<Long> normalizePointIds(List<Long> ids) {
         if (CollUtil.isEmpty(ids)) {
             return Collections.emptyList();

--
Gitblit v1.7.1