Просмотр исходного кода

贸易订单号生成规则逻辑优化

yzc 2 лет назад
Родитель
Сommit
f74770d4be

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

@@ -367,6 +367,20 @@ public class StringUtils {
         return false;
     }
 
+    /**
+     * 截取字符串从index到最后
+     *
+     * @param str
+     * @param index
+     * @return
+     */
+    public static String subStrFromIndexToEnd(String str, Integer index) {
+        if (StringUtils.isBlank(str) || str.length() <= index) {
+            return str;
+        }
+        return str.substring(str.length() - index);
+    }
+
     /**
      * 字符串转数组
      *

+ 4 - 0
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -51,6 +51,10 @@ public class RedisConstant {
      * 合同签约完成更新物流订单状态锁key
      */
     public static final String LOGISTICS_ORDER_CONTRACT_UPDATE_KEY = "order:trade:logistics:update:%s";
+    /**
+     * 生成贸易订单号锁key
+     */
+    public static final String TORDER_NO_GENERATE_KEY = "order:trade:no:generate:%s";
 
     /**
      * 消费请求有效时间(秒)

+ 26 - 1
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/utils/RedissonUtils.java

@@ -283,6 +283,13 @@ public class RedissonUtils {
         }
     }
 
+    /**
+     * 原子增加
+     *
+     * @param name
+     * @param expired
+     * @return
+     */
     public static Long getAtomicLong(String name, Long expired) {
         RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
         long number = atomicLong.incrementAndGet();
@@ -290,6 +297,13 @@ public class RedissonUtils {
         return number;
     }
 
+    /**
+     * 原子减少
+     *
+     * @param name
+     * @param expired
+     * @return
+     */
     public static Long decrementAndGet(String name, Long expired) {
         RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
         long number = atomicLong.decrementAndGet();
@@ -297,7 +311,18 @@ public class RedissonUtils {
         return number;
     }
 
-
+    /**
+     * 原子set
+     *
+     * @param name
+     * @param value
+     * @param expired
+     */
+    public static void setAtomicLong(String name, Long value, Long expired) {
+        RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
+        atomicLong.set(value);
+        atomicLong.expire(expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));
+    }
 
 
     public static void main(String[] args) {

+ 4 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java

@@ -3,6 +3,9 @@ package com.sckw.order.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.order.model.KwoTradeOrder;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
 
 /**
  * @desc: 交易订单(采购订单/销售订单)mapper
@@ -12,4 +15,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {
 
+    String getMaxOrderNoByDate(@Param("date") Date date);
 }

+ 37 - 13
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -1,5 +1,6 @@
 package com.sckw.order.serivce;
 
+import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -11,10 +12,9 @@ import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.CustomPromptException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.CooperateTypeEnum;
-import com.sckw.core.utils.BeanUtils;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.OrderGenerateUtils;
-import com.sckw.core.utils.StringUtils;
+import com.sckw.core.model.enums.OrderRuleEnum;
+import com.sckw.core.model.enums.RedisOrderGenerateEnum;
+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;
@@ -47,7 +47,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -89,8 +88,6 @@ public class KwoTradeOrderService {
     private final KwoTradeOrderContractService kwoTradeOrderContractService;
     private final KwoTradeOrderTrackService kwoTradeOrderTrackService;
 
-    private static final String ORDER_NO_PREFIX = "B";
-
     /**
      * @desc: 采购下单草稿
      * @author: yzc
@@ -100,7 +97,7 @@ public class KwoTradeOrderService {
      */
     public void addPurchaseOrderDraft(PurchaseOrderDraftParam param) {
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
-        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
+        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(getOrderNo())
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(DictEnum.TORDER_SOURCE_1.getValue()).setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_0.getValue()));
         kwoTradeOrderMapper.insert(order);
@@ -140,7 +137,7 @@ public class KwoTradeOrderService {
                     .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
                     .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec()).setGoodsThumb(goodsDetail.getThumb());
         }
-        if (Objects.isNull(order.getUnitPrice())){
+        if (Objects.isNull(order.getUnitPrice())) {
             order.setUnitPrice(new BigDecimal("0.00"));
         }
         //单位信息
@@ -235,7 +232,7 @@ public class KwoTradeOrderService {
      */
     public void addValetOrderDraft(ValetOrderDraftParam param) {
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
-        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
+        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(getOrderNo())
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(DictEnum.TORDER_SOURCE_2.getValue()).setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_0.getValue()));
         kwoTradeOrderMapper.insert(order);
@@ -260,7 +257,7 @@ public class KwoTradeOrderService {
                 .setOrderSource(DictEnum.TORDER_SOURCE_1.getValue());
         orderCheck(orderCheckDTO, false);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
-        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
+        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(getOrderNo())
                 .setUnit(param.getGoodsInfo().getUnit()).setSource(DictEnum.TORDER_SOURCE_1.getValue())
                 .setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_1.getValue()));
         kwoTradeOrderMapper.insert(order);
@@ -364,7 +361,6 @@ public class KwoTradeOrderService {
      * @Param param:
      * @return: void
      */
-    @Transactional(rollbackFor = Exception.class)
     public void addValetOrderSubmit(ValetOrderParam param) {
         OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
@@ -375,7 +371,7 @@ public class KwoTradeOrderService {
         contractCheck(contract);
         param.setContractInfo(contract);
         KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
-        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(OrderGenerateUtils.generateOrderNo(ORDER_NO_PREFIX))
+        order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(getOrderNo())
                 .setUnit(param.getGoodsInfo().getUnit()).setSource(DictEnum.TORDER_SOURCE_2.getValue());
         String contractStatus = contract.getContractStatus();
         if (Objects.equals(contractStatus, DictEnum.CONTRACT_STATUS_0.getValue())) {
@@ -394,6 +390,34 @@ public class KwoTradeOrderService {
         addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
     }
 
+
+    /**
+     * 生成贸易订单号
+     *
+     * @return
+     */
+    private String getOrderNo() {
+        Date date = new Date();
+        String key = OrderGenerateSeqNoUtils.getKey(RedisOrderGenerateEnum.TRADE_ORDER, OrderRuleEnum.TRADE_ORDER, date);
+        String lockKey = String.format(RedisConstant.TORDER_NO_GENERATE_KEY, DateUtils.formatDateToYYMMDD(date));
+        try {
+            if (Boolean.FALSE.equals(RedissonUtils.exists(key))) {
+                if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
+                    throw new BusinessException("业务繁忙,请稍后再试!");
+                }
+                DateTime dateTime = DateUtils.beginOfDay(date);
+                String maxOrderNo = kwoTradeOrderMapper.getMaxOrderNoByDate(dateTime);
+                if (StringUtils.isNotBlank(maxOrderNo)) {
+                    Long maxNum = Long.valueOf(StringUtils.subStrFromIndexToEnd(maxOrderNo, 4));
+                    RedissonUtils.setAtomicLong(key, maxNum, DateUtils.getSecondsDay());
+                }
+            }
+            return OrderGenerateSeqNoUtils.getOtherSeqNo(RedisOrderGenerateEnum.TRADE_ORDER, OrderRuleEnum.TRADE_ORDER);
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+    }
+
     /**
      * @desc: 合同校验
      * @author: yzc

+ 9 - 0
sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.order.dao.KwoTradeOrderMapper">
+
+
+    <select id="getMaxOrderNoByDate" resultType="java.lang.String">
+        SELECT MAX(t_order_no) FROM kwo_trade_order WHERE create_time &gt;= #{date};
+    </select>
+</mapper>