From 06a8ab0ab2a0751ed172800296e020cb1a968325 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期四, 12 十二月 2024 22:28:25 +0800
Subject: [PATCH] !608 add 新增 基于Redisson的发号器工具 Merge pull request !608 from 秋辞未寒/dev

---
 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
new file mode 100644
index 0000000..3c2f703
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
@@ -0,0 +1,165 @@
+package org.dromara.common.redis.utils;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.redisson.api.RIdGenerator;
+import org.redisson.api.RedissonClient;
+
+import java.time.Duration;
+
+/**
+ * 鍙戝彿鍣ㄥ伐鍏风被
+ *
+ * @author 绉嬭緸鏈瘨
+ * @date 2024-12-10
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class SequenceUtils {
+
+    /**
+     * 榛樿鍒濆鍊�
+     */
+    public static final Long DEFAULT_INIT_VALUE = 1L;
+    /**
+     * 榛樿姝ラ暱
+     */
+    public static final Long DEFAULT_STEP_VALUE = 1L;
+    /**
+     * 榛樿杩囨湡鏃堕棿-澶�
+     */
+    public static final Duration DEFAULT_EXPIRE_TIME_DAY = Duration.ofDays(1);
+    /**
+     * 榛樿杩囨湡鏃堕棿-鍒嗛挓
+     */
+    public static final Duration DEFAULT_EXPIRE_TIME_MINUTE = Duration.ofMinutes(1);
+
+    /**
+     * 鑾峰彇Redisson瀹㈡埛绔疄渚�
+     */
+    private static final RedissonClient REDISSON_CLIENT = SpringUtils.getBean(RedissonClient.class);
+
+    /**
+     * 鑾峰彇ID鐢熸垚鍣�
+     *
+     * @param key        涓氬姟key
+     * @param expireTime 杩囨湡鏃堕棿
+     * @param initValue  ID鍒濆鍊�
+     * @param stepValue  ID姝ラ暱
+     * @return ID鐢熸垚鍣�
+     */
+    private static RIdGenerator getIdGenerator(String key, Duration expireTime, Long initValue, Long stepValue) {
+        if (initValue == null || initValue <= 0) {
+            initValue = DEFAULT_INIT_VALUE;
+        }
+        if (stepValue == null || stepValue <= 0) {
+            stepValue = DEFAULT_STEP_VALUE;
+        }
+        RIdGenerator idGenerator = REDISSON_CLIENT.getIdGenerator(key);
+        // 璁剧疆杩囨湡鏃堕棿
+        idGenerator.expire(expireTime);
+        // 璁剧疆鍒濆鍊煎拰姝ラ暱
+        idGenerator.tryInit(initValue, stepValue);
+        return idGenerator;
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾涓氬姟key鐨勫敮涓�id
+     *
+     * @param key        涓氬姟key
+     * @param expireTime 杩囨湡鏃堕棿
+     * @param initValue  ID鍒濆鍊�
+     * @param stepValue  ID姝ラ暱
+     * @return 鍞竴id
+     */
+    public static long nextId(String key, Duration expireTime, Long initValue, Long stepValue) {
+        return getIdGenerator(key, expireTime, initValue, stepValue).nextId();
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾涓氬姟key鐨勫敮涓�id瀛楃涓�
+     *
+     * @param key        涓氬姟key
+     * @param expireTime 杩囨湡鏃堕棿
+     * @param initValue  ID鍒濆鍊�
+     * @param stepValue  ID姝ラ暱
+     * @return 鍞竴id
+     */
+    public static String nextIdStr(String key, Duration expireTime, Long initValue, Long stepValue) {
+        return String.valueOf(nextId(key, expireTime, initValue, stepValue));
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾涓氬姟key鐨勫敮涓�id (ID鍒濆鍊�=1,ID姝ラ暱=1)
+     *
+     * @param key        涓氬姟key
+     * @param expireTime 杩囨湡鏃堕棿
+     * @return 鍞竴id
+     */
+    public static long nextId(String key, Duration expireTime) {
+        return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾涓氬姟key鐨勫敮涓�id瀛楃涓� (ID鍒濆鍊�=1,ID姝ラ暱=1)
+     *
+     * @param key        涓氬姟key
+     * @param expireTime 杩囨湡鏃堕棿
+     * @return 鍞竴id
+     */
+    public static String nextIdStr(String key, Duration expireTime) {
+        return String.valueOf(nextId(key, expireTime));
+    }
+
+    /**
+     * 鑾峰彇 yyyyMMdd 寮�澶寸殑鍞竴id
+     *
+     * @return 鍞竴id
+     */
+    public static String nextIdDate() {
+        return nextIdDate("");
+    }
+
+    /**
+     * 鑾峰彇 prefix + yyyyMMdd 寮�澶寸殑鍞竴id
+     *
+     * @param prefix 涓氬姟鍓嶇紑
+     * @return 鍞竴id
+     */
+    public static String nextIdDate(String prefix) {
+        // 鍓嶇紑+鏃ユ湡 鏋勫缓 prefixKey
+        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER));
+        // 鑾峰彇涓嬩竴涓猧d
+        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_DAY, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+        // 杩斿洖瀹屾暣id
+        return StringUtils.format("{}{}", prefixKey, nextId);
+    }
+
+    /**
+     * 鑾峰彇 yyyyMMddHHmmss 寮�澶寸殑鍞竴id
+     *
+     * @return 鍞竴id
+     */
+    public static String nextIdDateTime() {
+        return nextIdDateTime("");
+    }
+
+    /**
+     * 鑾峰彇 prefix + yyyyMMddHHmmss 寮�澶寸殑鍞竴id
+     *
+     * @param prefix 涓氬姟鍓嶇紑
+     * @return 鍞竴id
+     */
+    public static String nextIdDateTime(String prefix) {
+        // 鍓嶇紑+鏃ユ湡鏃堕棿 鏋勫缓 prefixKey
+        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER));
+        // 鑾峰彇涓嬩竴涓猧d
+        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_MINUTE, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
+        // 杩斿洖瀹屾暣id
+        return StringUtils.format("{}{}", prefixKey, nextId);
+    }
+
+}

--
Gitblit v1.9.3