From 4ceb79afa35b2be369b8c84219524d687451974b Mon Sep 17 00:00:00 2001
From: MichelleChung <1242874891@qq.com>
Date: 星期五, 29 十二月 2023 11:39:15 +0800
Subject: [PATCH] !467 新增 ThreadLocalHolder 整合 SaHolder,ThreadLocal * fix 修复 issue#I8RWB5 字段缺少问题 ; * add 新增 ThreadLocalHolder 替换 SaHolder ;

---
 ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java |   55 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 26 insertions(+), 29 deletions(-)

diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java
index 77f2646..553d0db 100644
--- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java
+++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java
@@ -1,9 +1,11 @@
 package org.dromara.common.idempotent.aspectj;
 
 import cn.dev33.satoken.SaManager;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.SecureUtil;
 import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.context.ThreadLocalHolder;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MessageUtils;
@@ -25,6 +27,7 @@
 import java.time.Duration;
 import java.util.Collection;
 import java.util.Map;
+import java.util.StringJoiner;
 
 /**
  * 闃叉閲嶅鎻愪氦(鍙傝�冪編鍥TIS闃查噸绯荤粺)
@@ -34,15 +37,13 @@
 @Aspect
 public class RepeatSubmitAspect {
 
-    private static final ThreadLocal<String> KEY_CACHE = new ThreadLocal<>();
+    private static final String KEY_CACHE = "keyCache";
 
     @Before("@annotation(repeatSubmit)")
     public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
         // 濡傛灉娉ㄨВ涓嶄负0 鍒欎娇鐢ㄦ敞瑙f暟鍊�
-        long interval = 0;
-        if (repeatSubmit.interval() > 0) {
-            interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval());
-        }
+        long interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval());
+
         if (interval < 1000) {
             throw new ServiceException("閲嶅鎻愪氦闂撮殧鏃堕棿涓嶈兘灏忎簬'1'绉�");
         }
@@ -58,10 +59,8 @@
         submitKey = SecureUtil.md5(submitKey + ":" + nowParams);
         // 鍞竴鏍囪瘑锛堟寚瀹歬ey + url + 娑堟伅澶达級
         String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey;
-        String key = RedisUtils.getCacheObject(cacheRepeatKey);
-        if (key == null) {
-            RedisUtils.setCacheObject(cacheRepeatKey, "", Duration.ofMillis(interval));
-            KEY_CACHE.set(cacheRepeatKey);
+        if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) {
+            ThreadLocalHolder.set(KEY_CACHE, cacheRepeatKey);
         } else {
             String message = repeatSubmit.message();
             if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) {
@@ -78,15 +77,16 @@
      */
     @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult")
     public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) {
-        if (jsonResult instanceof R r) {
+        if (jsonResult instanceof R<?> r) {
             try {
                 // 鎴愬姛鍒欎笉鍒犻櫎redis鏁版嵁 淇濊瘉鍦ㄦ湁鏁堟椂闂村唴鏃犳硶閲嶅鎻愪氦
                 if (r.getCode() == R.SUCCESS) {
                     return;
                 }
-                RedisUtils.deleteObject(KEY_CACHE.get());
+                String cacheKey = ThreadLocalHolder.get(KEY_CACHE);
+                RedisUtils.deleteObject(cacheKey);
             } finally {
-                KEY_CACHE.remove();
+                ThreadLocalHolder.remove(KEY_CACHE);
             }
         }
     }
@@ -99,27 +99,25 @@
      */
     @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e")
     public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) {
-        RedisUtils.deleteObject(KEY_CACHE.get());
-        KEY_CACHE.remove();
+        String cacheKey = ThreadLocalHolder.get(KEY_CACHE);
+        RedisUtils.deleteObject(cacheKey);
+        ThreadLocalHolder.remove(KEY_CACHE);
     }
 
     /**
      * 鍙傛暟鎷艰
      */
     private String argsArrayToString(Object[] paramsArray) {
-        StringBuilder params = new StringBuilder();
-        if (paramsArray != null && paramsArray.length > 0) {
-            for (Object o : paramsArray) {
-                if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) {
-                    try {
-                        params.append(JsonUtils.toJsonString(o)).append(" ");
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
+        StringJoiner params = new StringJoiner(" ");
+        if (ArrayUtil.isEmpty(paramsArray)) {
+            return params.toString();
+        }
+        for (Object o : paramsArray) {
+            if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) {
+                params.add(JsonUtils.toJsonString(o));
             }
         }
-        return params.toString().trim();
+        return params.toString();
     }
 
     /**
@@ -140,13 +138,12 @@
             }
         } else if (Map.class.isAssignableFrom(clazz)) {
             Map map = (Map) o;
-            for (Object value : map.entrySet()) {
-                Map.Entry entry = (Map.Entry) value;
-                return entry.getValue() instanceof MultipartFile;
+            for (Object value : map.values()) {
+                return value instanceof MultipartFile;
             }
         }
         return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
-            || o instanceof BindingResult;
+               || o instanceof BindingResult;
     }
 
 }

--
Gitblit v1.9.3