From 37b33d638ca9448e3330269c861bc02b16ca976d Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期三, 01 四月 2026 17:36:14 +0800
Subject: [PATCH] fix(management):围栏复制名称处理

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java |   19 ++++++++++++++++++-
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java      |    6 ++++--
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpOpenCityService.java            |    3 +--
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOpenCityServiceImpl.java   |   29 +++++++++++++++++++++++++----
 4 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
index efdfddc..c439b96 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -39,8 +39,10 @@
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import static com.xiaopeng.map.service.serviceimpl.XpElectronicFenceServiceImpl.getPinyinInitials;
@@ -239,7 +241,7 @@
                     I18nKeyConstant.FENCE_STATUS_CANNOT_COPIED
             );
         }
-        electronicFence.setElectronicName("副本_"+electronicFence.getElectronicName());
+        electronicFence.setElectronicName(buildCopyFenceName(electronicFence.getElectronicName()));
         electronicFence.setId(null);
         electronicFence.setStatus(0);
         List<XpElectronicFenceArea> electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id)
@@ -267,6 +269,21 @@
         return R.ok(electronicFence.getId());
     }
 
+    private String buildCopyFenceName(String sourceName) {
+        Set<String> existingNames = new HashSet<>(xpElectronicFenceService.lambdaQuery()
+                .likeRight(XpElectronicFence::getElectronicName, sourceName)
+                .list()
+                .stream()
+                .map(XpElectronicFence::getElectronicName)
+                .collect(Collectors.toSet()));
+
+        String candidateName = sourceName + "_副本";
+        while (existingNames.contains(candidateName)) {
+            candidateName = candidateName + "_副本";
+        }
+        return candidateName;
+    }
+
     /**
      * 根据ID列表批量查询电子围栏
      *
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java
index 5a8b21c..d28345d 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java
@@ -11,6 +11,7 @@
 import com.xiaopeng.operation.vo.OpenCityListVO;
 import com.xiaopeng.operation.vo.XpOpenCityVo;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
@@ -51,8 +52,9 @@
      */
     @ApiOperation(value = "获取开通城市列表(管理后台)", tags = {"管理后台-交易管理"}, response = OpenCityListVO.class)
     @GetMapping("/api/v1/openCity/list")
-    public R<List<OpenCityListVO>> getOpenCityList() {
-        List<OpenCityListVO> list = xpOpenCityService.getOpenCityListForAdmin();
+    @ApiImplicitParam(name = "type", value = "类型:1-路线规划配置使用 2-定价管理配置使用", required = true, dataTypeClass = Integer.class)
+    public R<List<OpenCityListVO>> getOpenCityList(@RequestParam("type") Integer type) {
+        List<OpenCityListVO> list = xpOpenCityService.getOpenCityListForAdmin(type);
         return R.ok(list);
     }
 
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpOpenCityService.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpOpenCityService.java
index b4f8995..0d87627 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpOpenCityService.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpOpenCityService.java
@@ -9,7 +9,6 @@
 import com.xiaopeng.operation.query.OpenCityPageQuery;
 import com.xiaopeng.operation.vo.OpenCityListVO;
 import com.xiaopeng.operation.vo.XpOpenCityVo;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -32,7 +31,7 @@
      *
      * @return 开通城市列表
      */
-    List<OpenCityListVO> getOpenCityListForAdmin();
+    List<OpenCityListVO> getOpenCityListForAdmin(Integer type);
 
     /**
      * 开通城市分页列表
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOpenCityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOpenCityServiceImpl.java
index 07a4bd8..337c053 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOpenCityServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpOpenCityServiceImpl.java
@@ -2,23 +2,28 @@
 
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xiaopeng.api.model.operation.XpOpenCity;
+import com.xiaopeng.api.model.operation.XpPricing;
+import com.xiaopeng.api.model.operation.XpRoutePlan;
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.web.page.PageInfo;
-import com.xiaopeng.common.security.utils.SecurityUtils;
 import com.xiaopeng.operation.constant.I18nKeyConstant;
 import com.xiaopeng.operation.dto.OpenCityAddDTO;
 import com.xiaopeng.operation.dto.OpenCityEditDTO;
 import com.xiaopeng.operation.mapper.XpOpenCityMapper;
 import com.xiaopeng.operation.query.OpenCityPageQuery;
+import com.xiaopeng.operation.service.IXpPricingItemService;
+import com.xiaopeng.operation.service.IXpRoutePlanService;
 import com.xiaopeng.operation.service.XpOpenCityService;
+import com.xiaopeng.operation.service.XpPricingService;
 import com.xiaopeng.operation.vo.OpenCityListVO;
 import com.xiaopeng.operation.vo.XpOpenCityNextVo;
 import com.xiaopeng.operation.vo.XpOpenCityVo;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -36,7 +41,11 @@
  */
 @Service
 public class XpOpenCityServiceImpl extends ServiceImpl<XpOpenCityMapper, XpOpenCity> implements XpOpenCityService {
+    @Autowired
+    private IXpRoutePlanService xpRoutePlanService;
 
+    @Autowired
+    private XpPricingService xpPricingService;
 
 
     @Override
@@ -59,14 +68,26 @@
     }
 
     @Override
-    public List<OpenCityListVO> getOpenCityListForAdmin() {
+    public List<OpenCityListVO> getOpenCityListForAdmin(Integer type) {
         // 1. 查询所有启用状态的开通城市
         List<XpOpenCity> xpOpenCities = this.baseMapper.selectList(
                 new LambdaQueryWrapper<XpOpenCity>()
                         .eq(XpOpenCity::getStatus, 1)
                         .orderByAsc(XpOpenCity::getId)
         );
-
+        List<Long> existsOpenCityIds = new ArrayList<>();
+        //2.根据type过滤已配置的开通城市
+        if (Integer.valueOf(1).equals(type)) {
+            //路径规划
+            existsOpenCityIds = xpRoutePlanService.list().stream().map(XpRoutePlan::getOpenCityId).collect(Collectors.toList());
+        } else {
+            //定价管理
+            existsOpenCityIds = xpPricingService.list().stream().map(XpPricing::getCityId).collect(Collectors.toList());
+        }
+        if (CollUtil.isNotEmpty(existsOpenCityIds)) {
+            List<Long> finalExistsOpenCityIds = existsOpenCityIds;
+            xpOpenCities = xpOpenCities.stream().filter(item -> !finalExistsOpenCityIds.contains(item.getId())).collect(Collectors.toList());
+        }
         // 2. 转换为VO,处理区/县级拼接逻辑
         return xpOpenCities.stream()
                 .map(city -> {

--
Gitblit v1.7.1