From 751d75b51a19c521364af730f5d6ea95fc25c871 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 11 三月 2026 18:04:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java |   37 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
index 0879dd1..d1492e6 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -6,6 +6,7 @@
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.PhoneUtil;
 import cn.hutool.core.io.resource.ClassPathResource;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -67,6 +68,7 @@
     private MessageSource messageSource;
 
     private static final Pattern CHINESE_PATTERN = Pattern.compile("\\p{IsHan}");
+    private static final long INVITATION_CODE_LIMIT = 500L;
 
     @ApiOperation(value = "邀请码管理分页列表",response = XpInvitationCode.class)
     @PostMapping("/api/v1/invitation/pageList")
@@ -82,6 +84,18 @@
     @ApiOperation(value = "生成邀请码")
     @Transactional
     public R add(@RequestBody InvitationAddDto dto){
+        long existing = xpInvitationCodeService.count();
+        long incoming = Arrays.stream(Optional.ofNullable(dto.getPhones()).orElse("").split(","))
+                .map(String::trim)
+                .filter(StringUtils::hasLength)
+                .count();
+        if (existing >= INVITATION_CODE_LIMIT || existing + incoming > INVITATION_CODE_LIMIT) {
+            String msg = messageSource.getMessage(I18nKeyConstant.INVITATION_LIMIT_EXCEEDED,
+                    new Object[]{INVITATION_CODE_LIMIT, existing, incoming},
+                    I18nKeyConstant.INVITATION_LIMIT_EXCEEDED,
+                    LocaleContextHolder.getLocale());
+            return R.fail(msg);
+        }
         return xpInvitationCodeService.add(dto.getPhones());
     }
     /**
@@ -158,6 +172,16 @@
         }
         if (CollectionUtils.isEmpty(invitationCodeImportExcels)) {
             return R.fail(messageSource.getMessage(I18nKeyConstant.INVITATION_IMPORT_DATA_EMPTY, null, I18nKeyConstant.INVITATION_IMPORT_DATA_EMPTY, LocaleContextHolder.getLocale()));
+        }
+
+        long existing = xpInvitationCodeService.count();
+        long incoming = invitationCodeImportExcels.size();
+        if (existing >= INVITATION_CODE_LIMIT || existing + incoming > INVITATION_CODE_LIMIT) {
+            String msg = messageSource.getMessage(I18nKeyConstant.INVITATION_LIMIT_EXCEEDED,
+                    new Object[]{INVITATION_CODE_LIMIT, existing, incoming},
+                    I18nKeyConstant.INVITATION_LIMIT_EXCEEDED,
+                    LocaleContextHolder.getLocale());
+            return R.fail(msg);
         }
 
         // 批量校验:账号必须为手机号;邀请码不能为空且不能包含中文;同时校验文件内重复/数据库已存在
@@ -320,5 +344,16 @@
         xpInvitationCodeService.removeBatchByIds(longs);
         return R.ok();
     }
-   
+
+    @ApiOperation(value = "校验生成邀请码的手机号是否合法")
+    @PostMapping("/api/v1/invitation/validateCode")
+    public R<Boolean> validateCode(@RequestParam String phone){
+        if (!PhoneUtil.isMobile(phone)){
+            return R.ok(false);
+        }
+        List<XpInvitationCode> existsList = xpInvitationCodeService.lambdaQuery()
+                .in(XpInvitationCode::getBindAccount, phone)
+                .list();
+        return R.ok(CollUtil.isEmpty(existsList));
+    }
 }

--
Gitblit v1.7.1