From ddcce4e9bc4f1a71284008135f0065349c3b960a Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 06 三月 2026 21:11:06 +0800
Subject: [PATCH] bugfix

---
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java |   43 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
index fe17470..3180701 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
@@ -32,6 +32,10 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.security.KeyPair;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
@@ -44,6 +48,9 @@
  */
 @RestController
 public class SysUserController extends BaseController {
+    private static final DateTimeFormatter UNIQUE_NUMBER_DATE_FORMATTER = DateTimeFormatter.BASIC_ISO_DATE;
+    private static final String UNIQUE_NUMBER_REDIS_KEY_PREFIX = "sys:user:unique-number:";
+
     @Resource
     private ISysUserService userService;
 
@@ -99,11 +106,7 @@
         if (StringUtils.isNotEmpty(user.getUserAccount()) && !userService.checkUserNameUnique(user)) {
             throw new ServiceException("登录账号重复", I18nKeyConstant.ACCOUNT_DUPLICATE);
         }
-        //校验编号是否唯一
-        Long count = userService.lambdaQuery().eq(SysUser::getUniqueNumber, user.getUniqueNumber()).count();
-        if (count > 0) {
-            throw new ServiceException("用户编号已存在", I18nKeyConstant.ACCOUNT_UNIQUE_NUMBER_DUPLICATE);
-        }
+        user.setUniqueNumber(generateUniqueNumber());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         //TODO 手机号脱敏存储
         userService.insertUser(user);
@@ -113,6 +116,36 @@
         sysUserRoleService.insertSysUserRole(sysUserRole);
         return AjaxResult.success();
     }
+
+    private String generateUniqueNumber() {
+        LocalDate today = LocalDate.now();
+        String dateStr = UNIQUE_NUMBER_DATE_FORMATTER.format(today);
+        String redisKey = UNIQUE_NUMBER_REDIS_KEY_PREFIX + dateStr;
+
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime tomorrowStart = today.plusDays(1).atStartOfDay();
+        long expireSeconds = Duration.between(now, tomorrowStart).getSeconds() + 60;
+
+        for (int i = 0; i < 10; i++) {
+            Long seq = redisService.redisTemplate.opsForValue().increment(redisKey);
+            if (seq == null) {
+                throw new ServiceException("用户编号生成失败");
+            }
+            if (expireSeconds > 0) {
+                redisService.expire(redisKey, expireSeconds, TimeUnit.SECONDS);
+            }
+            if (seq > 999999L) {
+                throw new ServiceException("当天生成用户编号已达上限");
+            }
+            String uniqueNumber = dateStr + String.format("%06d", seq);
+
+            Long count = userService.lambdaQuery().eq(SysUser::getUniqueNumber, uniqueNumber).count();
+            if (count == null || count == 0L) {
+                return uniqueNumber;
+            }
+        }
+        throw new ServiceException("用户编号生成失败,请稍后重试");
+    }
     
     
     @GetMapping("/verifyUserNameRepeat/{username}")

--
Gitblit v1.7.1