From 3479ad5223c328be72a2b26ab66f9aeee64ec4b5 Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期二, 18 十一月 2025 17:40:30 +0800
Subject: [PATCH] 提交

---
 system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java |   42 ++++++++++++++++++++++++++++++------------
 1 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java b/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
index 7d57010..3020770 100644
--- a/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
+++ b/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.core.redis.RedisLock;
 import com.ruoyi.common.enums.SystemDataNoEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.SysSerialNumber;
@@ -15,7 +16,9 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 @Slf4j
@@ -28,12 +31,15 @@
     @Autowired
     private RedisCache redisCache;
 
-    /**娴佹按鍙峰惎鐢ㄧ紦瀛�*/
     @Value("${custom.serialNumber.cache.enabled:false}")
     private boolean serialNumberCache;
 
     @Autowired
     private ISysSerialNumberService serialNumberService;
+
+    private static final long LOCK_WAIT_TIME = 5; // 灏濊瘯鑾峰彇閿佹渶澶х瓑寰呮椂闂达紙绉掞級
+    private static final long LOCK_LEASE_TIME = 10; // 閿佺殑鑷姩閲婃斁鏃堕棿锛堢锛�
+
 
 
     @Override
@@ -43,27 +49,43 @@
             return "";
         }
 
-        String dayKey = DateUtils.dateYYMM();
+        String dayKey = DateUtils.dateTime();
         String fullKey = baseNo + dayKey;
-        RLock lock = redisLock.lock(Constants.SYS_DATASERIALNUMBER_KEYPREFIX + fullKey);
+        RLock lock = redisLock.getRLock(Constants.SYS_DATASERIALNUMBER_KEYPREFIX + fullKey);
 
+        boolean locked = false;
         try {
-            if (!lock.tryLock(60, TimeUnit.SECONDS)) {
-                throw new RuntimeException("鑾峰彇閿佸け璐�");
+            locked = lock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.SECONDS);
+            if (!locked) {
+                throw new RuntimeException("鑾峰彇閿佸け璐ワ紝璇风◢鍚庨噸璇�");
             }
 
             log.info("{}杩涘叆", Thread.currentThread().getName());
             Integer serial = getOrInitSerialNumber(fullKey, baseNo, dayKey);
-            redisCache.setCacheObject(fullKey, serial, 1000, TimeUnit.DAYS);
+            redisCache.setCacheObject(fullKey, serial, 1, TimeUnit.DAYS);
 
             return formatSerialNumber(fullKey, serial);
         } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
             throw new RuntimeException("鑾峰彇閿佸紓甯�", e);
         } finally {
-            unlockIfHeld(lock);
+            if (locked) {
+                unlockIfHeld(lock);
+            }
         }
     }
 
+    private void unlockIfHeld(RLock lock) {
+        try {
+            if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        } catch (Exception e) {
+            log.warn("閲婃斁閿佸紓甯�: {}", e.getMessage(), e);
+        }
+    }
+
+    // 浠ヤ笅鏂规硶淇濇寔鍘熸牱
     private Integer getOrInitSerialNumber(String fullKey, String baseNo, String dayKey) {
         Integer serial = serialNumberCache ? redisCache.getCacheObject(fullKey) : null;
 
@@ -93,9 +115,5 @@
         return prefix + String.format("%04d", serial);
     }
 
-    private void unlockIfHeld(RLock lock) {
-        if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
-            lock.unlock();
-        }
-    }
+
 }

--
Gitblit v1.8.0