lengfaqiang 2 лет назад
Родитель
Сommit
cfe5a77d3e

+ 61 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/OrderRuleEnum.java

@@ -0,0 +1,61 @@
+package com.sckw.core.model.enums;
+
+/**
+ * @author lfdc
+ * @description redis生成编号 key枚举定义
+ * @date 2023-08-25 15:07:23
+ */
+public enum OrderRuleEnum {
+
+    /**
+     * 物流订单
+     */
+    LOGISTICS_ORDER("logisticsOrder", "T", "物流订单业务类别"),
+
+    /**
+     * 贸易订单
+     */
+    TRADE_ORDER("waybillOrder", "B", "贸易订单业务类别"),
+
+    /**
+     * 运单
+     */
+    WAYBILL_ORDER("waybillOrder", "T", "运单业务类别"),
+
+    /**
+     * 对账
+     */
+    LEDGER_ORDER("ledgerOrder", "BR", "对账业务类别"),
+
+    /**
+     * 结算
+     */
+    SETTLEMENT_ORDER("settlementOrder", "BP", "结算业务类别"),
+    ;
+
+
+    private final String value;
+    private final String code;
+    private final String destination;
+
+
+    OrderRuleEnum(String value, String code, String destination) {
+        this.value = value;
+        this.code = code;
+        this.destination = destination;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDestination() {
+        return destination;
+    }
+
+
+}

+ 51 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/RedisOrderGenerateEnum.java

@@ -0,0 +1,51 @@
+package com.sckw.core.model.enums;
+
+import lombok.Getter;
+
+/**
+ * @author lfdc
+ * @description redis生成编号 key枚举定义
+ * @date 2023-08-25 15:07:23
+ */
+@Getter
+public enum RedisOrderGenerateEnum {
+    /**
+     * 物流订单key
+     */
+    LOGISTICS_ORDER("logisticsOrder","logistics_order_no_generator:","物流订单key"),
+
+    /**
+     * 车辆运单key
+     */
+    WAYBILL_ORDER("waybillOrder","waybill_order_no_generator:","车辆运单key"),
+
+    /**
+     * 对账key
+     */
+    ACCOUNT_CHECKING("accountChecking","logistics_order_no_generator:","对账key"),
+    ;
+
+
+    private final String value;
+    private final String key;
+    private final String name;
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    RedisOrderGenerateEnum(String value, String key, String name) {
+        this.value = value;
+        this.key = key;
+        this.name = name;
+    }
+
+}

+ 15 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -118,6 +118,21 @@ public class DateUtils extends DateUtil {
         return null;
     }
 
+
+    /**
+     * 日期格式化 日期格式为:yyyy-MM-dd
+     *
+     * @param expireDate    日期
+     * @return 返回yyMMdd格式日期
+     */
+    public static String formatDateToYYMMDD(Date expireDate) {
+        if (expireDate != null) {
+            String str = new SimpleDateFormat("yyMMdd").format(expireDate);
+            return str;
+        }
+        return null;
+    }
+
     /**
      * @param date
      * @return String    返回类型

+ 129 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OrderGenerateSeqNoUtils.java

@@ -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;
+    }
+}

+ 0 - 25
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OrderGenerateUtils.java

@@ -54,29 +54,4 @@ public class OrderGenerateUtils {
         return SDF.format(new Date());
     }
 
-    /**
-     * 字符串格式化长度不足补0
-     */
-    public static String addZeroForNum(String str, int strLength) {
-        int strLen = str.length();
-        if (strLen < strLength) {
-            StringBuffer sb = new StringBuffer(str);
-            while (strLen < strLength) {
-                // 左补0
-                sb.insert(0, "0");
-                strLen = sb.length();
-            }
-            str = sb.toString();
-        }
-        return str;
-    }
-
-    public static void main(String[] args) {
-        getLogisticsLOrderNo("T","1","1","1");
-    }
-    public static void getLogisticsLOrderNo(String t, String number, String number1, String number2) {
-        StringBuilder str=new StringBuilder();
-        String date = DateUtils.formatDate(new Date());
-        str.append(t).append(date).append(number).append(number1).append(number2);
-    }
 }

+ 18 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/StringUtils.java

@@ -711,6 +711,24 @@ public class StringUtils {
         return new String(newCodePoints, 0, outOffset);
     }
 
+
+    /**
+     * 字符串格式化长度不足补0
+     */
+    public static String addZeroForNum(String str, int strLength) {
+        int strLen = str.length();
+        if (strLen < strLength) {
+            StringBuffer sb = new StringBuffer(str);
+            while (strLen < strLength) {
+                // 左补0
+                sb.insert(0, "0");
+                strLen = sb.length();
+            }
+            str = sb.toString();
+        }
+        return str;
+    }
+
     /**
      * 值替换
      *

+ 20 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/LogisticsConsignmentController.java

@@ -327,4 +327,24 @@ public class LogisticsConsignmentController {
         }
         ExcelUtil.downData(response, SellLogisticOrderExcelVo.class, list);
     }
+
+
+    /**
+     * 生成物流订单编号demo
+     * @return
+     */
+    @RequestMapping(value = "/addLogisticsNumberDemo", method = RequestMethod.GET)
+    public HttpResult addLogisticsNumberDemo() {
+        return logisticsConsignmentService.addLogisticsNumberDemo();
+    }
+
+
+    /**
+     * 生成车辆订单编号demo
+     * @return
+     */
+    @RequestMapping(value = "/addWaybillNumberDemo", method = RequestMethod.GET)
+    public HttpResult addWaybillNumberDemo() {
+        return logisticsConsignmentService.addWaybillNumberDemo();
+    }
 }

+ 23 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java

@@ -12,10 +12,10 @@ import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.enums.CarWaybillEnum;
 import com.sckw.core.model.enums.LogisticsOrderEnum;
+import com.sckw.core.model.enums.OrderRuleEnum;
+import com.sckw.core.model.enums.RedisOrderGenerateEnum;
 import com.sckw.core.model.page.PageResult;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.IdWorker;
-import com.sckw.core.utils.StringUtils;
+import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
@@ -1860,4 +1860,24 @@ public class LogisticsConsignmentService {
         });
         return logisticOrderExcelVos;
     }
+
+    public HttpResult addLogisticsNumberDemo() {
+        String seqNo = OrderGenerateSeqNoUtils.getSeqNo(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER, "0", "1", "3");
+        String seqNo1 = OrderGenerateSeqNoUtils.getOtherSeqNo(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER);
+        System.out.println(seqNo);
+        System.out.println(seqNo1);
+        return HttpResult.ok(seqNo+":"+seqNo1);
+    }
+
+    public static void getLogisticsLOrderNo(String t, String number, String number1, String number2) {
+        StringBuilder str = new StringBuilder();
+        String date = DateUtils.formatDate(new Date());
+        str.append(t).append(date).append(number).append(number1).append(number2);
+    }
+
+    public HttpResult addWaybillNumberDemo() {
+        return HttpResult.ok();
+    }
+
+
 }