|
|
@@ -0,0 +1,129 @@
|
|
|
+package com.sckw.core.utils;
|
|
|
+
|
|
|
+import com.sckw.core.model.enums.OrderRuleEnum;
|
|
|
+import com.sckw.core.model.enums.RedisOrderGenerateEnum;
|
|
|
+import com.sckw.redis.utils.RedissonUtils;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.data.redis.support.atomic.RedisAtomicLong;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author lfdc
|
|
|
+ * @description 物流订单编号生成工具类
|
|
|
+ * @date 2023-08-25 16:08:41
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class OrderGenerateSeqNoUtils {
|
|
|
+
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param redisOrderGenerateEnum 传入指定枚举的key
|
|
|
+ * @param prefix 业务类别
|
|
|
+ * @param orderType 单据创建类型
|
|
|
+ * @param level 所属几级分包
|
|
|
+ * @param number 同级分包次数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getSeqNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix, String orderType, String level, String number) {
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
+ calendar.set(Calendar.MINUTE, 59);
|
|
|
+ calendar.set(Calendar.SECOND, 59);
|
|
|
+ calendar.set(Calendar.MILLISECOND, 999);
|
|
|
+ /**拼接redis key 公共key+[业务标识]+日期 */
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
+ StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(new Date()));
|
|
|
+ //设置过期时间,这里设置为当天的23:59:59
|
|
|
+ Date expireDate = calendar.getTime();
|
|
|
+ Long seq = generate(appendKey.toString(), expireDate);
|
|
|
+ String date = DateUtils.formatDateToYYMMDD(expireDate);
|
|
|
+ String sequence = StringUtils.addZeroForNum(seq.toString(), 4);
|
|
|
+ if (prefix == null) {
|
|
|
+ throw new RuntimeException("Order Generate SeqNo Error");
|
|
|
+ }
|
|
|
+ /**拼接业务编号*/
|
|
|
+ String seqNo = prefix.getCode() + date + sequence;
|
|
|
+ /**extendBusiness 根据实际业务是否需要 */
|
|
|
+ String seqNoEnd = extendBusiness(seqNo, orderType, level, number);
|
|
|
+ log.info("KEY:{}, 序列号生成:{}, 过期时间:{}", appendKey, seqNo, String.format("%tF %tT ", expireDate, expireDate));
|
|
|
+ return seqNoEnd;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String extendBusiness(String seqNo, String orderType, String level, String number) {
|
|
|
+ return seqNo + orderType + level + number;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * //返回当前redis中的key的最大值
|
|
|
+ *
|
|
|
+ * @param redisTemplate
|
|
|
+ * @param key redisKey
|
|
|
+ * @param expireTime 过期时间
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public long generate(RedisTemplate<?, ?> redisTemplate, String key, Date expireTime) {
|
|
|
+ //RedisAtomicLong为原子类,根据传入的key和redis链接工厂创建原子类
|
|
|
+ RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
|
|
|
+ //设置过期时间
|
|
|
+ counter.expireAt(expireTime);
|
|
|
+ //返回redis中key的值,内部实现下面详细说明
|
|
|
+ return counter.incrementAndGet();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回当前redis中的key的最大值
|
|
|
+ *
|
|
|
+ * @param key redisKey
|
|
|
+ * @param expireTime 过期时间
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static long generate(String key, Date expireTime) {
|
|
|
+ long seq = RedissonUtils.getAtomicLong(key, expireTime.getTime());
|
|
|
+// RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
|
|
|
+// //设置过期时间
|
|
|
+// counter.expireAt(expireTime);
|
|
|
+// //返回redis中key的值,内部实现下面详细说明
|
|
|
+// return counter.incrementAndGet();
|
|
|
+ return seq;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param redisOrderGenerateEnum 传入枚举指定的key
|
|
|
+ * @param prefix 业务类别
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getOtherSeqNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix) {
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
+ calendar.set(Calendar.MINUTE, 59);
|
|
|
+ calendar.set(Calendar.SECOND, 59);
|
|
|
+ calendar.set(Calendar.MILLISECOND, 999);
|
|
|
+ /**拼接redis key 公共key+[业务标识]+日期 */
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
+ StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(new Date()));
|
|
|
+ //设置过期时间,这里设置为当天的23:59:59
|
|
|
+ Date expireDate = calendar.getTime();
|
|
|
+ Long seq = generate(appendKey.toString(), expireDate);
|
|
|
+ String date = DateUtils.formatDateToYYMMDD(expireDate);
|
|
|
+ String sequence = StringUtils.addZeroForNum(seq.toString(), 4);
|
|
|
+ if (prefix == null) {
|
|
|
+ throw new RuntimeException("Order Generate SeqNo Error");
|
|
|
+ }
|
|
|
+ /**拼接业务编号*/
|
|
|
+ String seqNo = prefix.getCode() + date + sequence;
|
|
|
+ log.info("KEY:{}, 序列号生成:{}, 过期时间:{}", appendKey, seqNo, String.format("%tF %tT ", expireDate, expireDate));
|
|
|
+ return seqNo;
|
|
|
+ }
|
|
|
+}
|