From e4282457d992fd59acdaf0de9f150105a7015b9c Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 21 四月 2026 14:38:46 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java |   61 +++++++++++++++++++++++++++++-
 1 files changed, 59 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 000244d..84d6dd9 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
@@ -215,6 +215,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);
@@ -347,6 +348,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);
@@ -452,7 +454,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()) {
@@ -465,7 +469,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()) {
@@ -535,6 +541,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);
                 }
             }
         }
@@ -756,6 +768,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();
@@ -965,6 +992,36 @@
         return list();
     }
 
+    @Override
+    @Transactional
+    @ShardingSphereTransactionType(TransactionType.BASE)
+    public void expireFence(Long electronicId) {
+        if (electronicId == null) {
+            return;
+        }
+        XpElectronicFence electronicFence = this.getById(electronicId);
+        if (electronicFence == null || electronicFence.getStatus() == null) {
+            return;
+        }
+        Integer status = electronicFence.getStatus();
+        if (status != 1 && status != 2) {
+            return;
+        }
+        electronicFence.setStatus(3);
+        this.updateById(electronicFence);
+
+        List<XpElectronicFenceArea> electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery()
+                .eq(XpElectronicFenceArea::getElectronicId, electronicId)
+                .list();
+        if (CollUtil.isEmpty(electronicFenceAreaList)) {
+            return;
+        }
+        for (XpElectronicFenceArea electronicFenceArea : electronicFenceAreaList) {
+            electronicFenceArea.setAreaStatus(2);
+        }
+        xpElectronicFenceAreaService.updateBatchById(electronicFenceAreaList);
+    }
+
 
     /**
      * 计算围栏中心点

--
Gitblit v1.7.1