From 736c4d730af55904edab3e194fcffd7134eb3f94 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 24 四月 2026 20:21:07 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/constant/I18nKeyConstant.java               |    2 ++
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java |   32 ++++++++++++++++++++++++++++++++
 xp-robotaxi-map-boot/src/main/resources/i18n/messages.properties                                |    1 +
 xp-robotaxi-map-boot/src/main/resources/i18n/messages_zh_CN.properties                          |    1 +
 xp-robotaxi-map-boot/src/main/resources/i18n/messages_en_US.properties                          |    1 +
 5 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/constant/I18nKeyConstant.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/constant/I18nKeyConstant.java
index 5927541..bc446b2 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/constant/I18nKeyConstant.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/constant/I18nKeyConstant.java
@@ -101,6 +101,8 @@
     String POINT_NUMBER_PARSE_FAIL = "point.number.parse.fail";
     // 点位-名称已存在
     String POINT_NAME_EXISTS = "point.name.exists";
+    // 点位-围栏下点位数量超限
+    String POINT_FENCE_POINT_LIMIT_EXCEEDED = "point.fence.point.limit.exceeded";
 
     // 点位删除-存在关联巡游点位
     String POINT_DELETE_HAS_CRUISE_PLAN_POINT = "point.delete.has.cruise.plan.point";
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
index e013adf..a5aa323 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
@@ -72,6 +72,7 @@
 public class XpPointServiceImpl extends ServiceImpl<XpPointMapper, XpPoint> implements XpPointService {
 
     private static final String POINT_BIZ_TYPE = "PUD";
+    private static final int MAX_POINTS_PER_FENCE = 15;
     private static final int SERIAL_WIDTH = 6;
     private static final int LOCK_WAIT_SECONDS = 5;
     private static final int LOCK_LEASE_SECONDS = 30;
@@ -120,6 +121,7 @@
             if (!locked) {
                 throw new ServiceException("点位编号生成繁忙,请稍后重试", I18nKeyConstant.POINT_NUMBER_LOCK_FAIL);
             }
+            validateFencePointCountLimit(pointAddDto.getElectronicAreaId());
             String maxPointNumber = this.baseMapper.selectMaxPointNumber(cityPrefix, POINT_BIZ_TYPE);
             int nextSerial = 1;
             if (StringUtils.hasText(maxPointNumber)) {
@@ -238,6 +240,36 @@
         return getPinyinInitials(prefix).toUpperCase();
     }
 
+    private void validateFencePointCountLimit(Long electronicAreaId) {
+        if (electronicAreaId == null || electronicAreaId == 0L) {
+            return;
+        }
+        XpElectronicFenceArea currentArea = xpElectronicFenceAreaService.getById(electronicAreaId);
+        if (currentArea == null) {
+            throw new ServiceException("运营区域不存在", I18nKeyConstant.POINT_ELECTRONIC_AREA_NOT_EXIST);
+        }
+        Long fenceId = currentArea.getElectronicId();
+        if (fenceId == null) {
+            throw new ServiceException("运营区域不存在", I18nKeyConstant.POINT_ELECTRONIC_AREA_NOT_EXIST);
+        }
+        List<Long> areaIds = xpElectronicFenceAreaService.lambdaQuery()
+                .eq(XpElectronicFenceArea::getElectronicId, fenceId)
+                .list()
+                .stream()
+                .map(XpElectronicFenceArea::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (areaIds.isEmpty()) {
+            return;
+        }
+        long pointCount = this.lambdaQuery()
+                .in(XpPoint::getElectronicAreaId, areaIds)
+                .count();
+        if (pointCount >= MAX_POINTS_PER_FENCE) {
+            throw new ServiceException("当前围栏最多只能添加15个点位", I18nKeyConstant.POINT_FENCE_POINT_LIMIT_EXCEEDED);
+        }
+    }
+
     private static String buildPointNumberLockKey(String cityPrefix, String bizType) {
         return "xp:point:number:" + cityPrefix + ":" + bizType;
     }
diff --git a/xp-robotaxi-map-boot/src/main/resources/i18n/messages.properties b/xp-robotaxi-map-boot/src/main/resources/i18n/messages.properties
index 51c612e..1b99416 100644
--- a/xp-robotaxi-map-boot/src/main/resources/i18n/messages.properties
+++ b/xp-robotaxi-map-boot/src/main/resources/i18n/messages.properties
@@ -41,6 +41,7 @@
 point.number.lock.fail=点位编号生成繁忙,请稍后重试
 point.number.parse.fail=点位编号生成失败(历史编号格式异常)
 point.name.exists=点位名称已存在
+point.fence.point.limit.exceeded=当前围栏最多只能添加15个点位
 point.delete.has.cruise.plan.point=操作失败,该点位有关联的巡游计划点位
 point.enable.not.in.operating.area=当前点位不在围栏运营区域内,不能启用。
 point.enable.in.prohibited.area=当前点位在禁行区内,不能启用。
diff --git a/xp-robotaxi-map-boot/src/main/resources/i18n/messages_en_US.properties b/xp-robotaxi-map-boot/src/main/resources/i18n/messages_en_US.properties
index c288015..ee83069 100644
--- a/xp-robotaxi-map-boot/src/main/resources/i18n/messages_en_US.properties
+++ b/xp-robotaxi-map-boot/src/main/resources/i18n/messages_en_US.properties
@@ -34,6 +34,7 @@
 point.number.lock.fail=Point number generation is busy, please try again later
 point.number.parse.fail=Point number generation failed (invalid historical number format)
 point.name.exists=Point name already exists
+point.fence.point.limit.exceeded=A maximum of 15 points can be added to a single fence
 point.delete.has.cruise.plan.point=Operation failed. This point is associated with cruise plan points.
 point.enable.not.in.operating.area=This point is not within the fence operating area and cannot be enabled.
 point.enable.in.prohibited.area=This point is in a prohibited area and cannot be enabled.
diff --git a/xp-robotaxi-map-boot/src/main/resources/i18n/messages_zh_CN.properties b/xp-robotaxi-map-boot/src/main/resources/i18n/messages_zh_CN.properties
index 724440c..edfc39b 100644
--- a/xp-robotaxi-map-boot/src/main/resources/i18n/messages_zh_CN.properties
+++ b/xp-robotaxi-map-boot/src/main/resources/i18n/messages_zh_CN.properties
@@ -34,6 +34,7 @@
 point.number.lock.fail=点位编号生成繁忙,请稍后重试
 point.number.parse.fail=点位编号生成失败(历史编号格式异常)
 point.name.exists=点位名称已存在
+point.fence.point.limit.exceeded=当前围栏最多只能添加15个点位
 point.delete.has.cruise.plan.point=操作失败,该点位有关联的巡游计划点位
 point.enable.not.in.operating.area=当前点位不在围栏运营区域内,不能启用。
 point.enable.in.prohibited.area=当前点位在禁行区内,不能启用。

--
Gitblit v1.7.1