瀏覽代碼

优化订单号以及核销码生成方式

liude 6 月之前
父節點
當前提交
e3667b7e3f

+ 47 - 17
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java

@@ -22,6 +22,7 @@ import com.chelvc.framework.common.util.AssertUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.StringUtils;
 import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.chelvc.framework.redis.context.RedisContextHolder;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timeout;
 import io.netty.util.Timer;
@@ -35,6 +36,7 @@ import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.security.SecureRandom;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -71,6 +73,13 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
 
     private final ReservationService reservationService;
 
+
+    // 定义字符池
+    private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
+    private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    private static final String DIGITS = "0123456789";
+    private static final String ALL_CHARACTERS = LOWER_CASE + UPPER_CASE + DIGITS;
+
     @Override
     public ConfirmOrderResultDTO generateConfirmOrder(OmsOrderModifyParam orderParam) {
         ConfirmOrderResultDTO result = new ConfirmOrderResultDTO();
@@ -245,8 +254,9 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         //计算赠送成长值
         order.setGrowth(0);
         //生成订单号
-        order.setOrderSn(generateOrderSn(order));
+        order.setOrderSn(generateOrderSn(6));
         order.setMerchantId(orderParam.getMerchantId());
+        order.setId(RedisContextHolder.sequence());
         //设置自动收货天数
         List<OmsOrderSetting> orderSettings = orderSettingService.listOrderSetting();
         if (!CollectionUtils.isEmpty(orderSettings)) {
@@ -511,23 +521,43 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
     }
 
     /**
-     * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id
+     *
      */
-    private String generateOrderSn(OmsOrder order) {
-        StringBuilder sb = new StringBuilder();
-//        String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
-//        String key = REDIS_DATABASE+":"+ REDIS_KEY_ORDER_ID + date;
-//        Long increment = redisService.incr(key, 1);
-//        sb.append(date);
-//        sb.append(String.format("%02d", order.getSourceType()));
-        sb.append(String.format("%02d", new Random().nextInt(900000) + 100000));
-//        String incrementStr = increment.toString();
-//        if (incrementStr.length() <= 6) {
-//            sb.append(String.format("%06d", increment));
-//        } else {
-//            sb.append(incrementStr);
-//        }
-        return sb.toString();
+    public static String generateOrderSn(int length) {
+        if (length < 6) {
+            throw new IllegalArgumentException("Password length must be at least 6 characters.");
+        }
+
+        SecureRandom random = new SecureRandom();
+        StringBuilder password = new StringBuilder(length);
+
+        // 确保每种类型至少有一个字符
+        password.append(LOWER_CASE.charAt(random.nextInt(LOWER_CASE.length())));
+        password.append(UPPER_CASE.charAt(random.nextInt(UPPER_CASE.length())));
+        password.append(DIGITS.charAt(random.nextInt(DIGITS.length())));
+
+        // 填充剩余的字符
+        for (int i = 3; i < length; i++) {
+            password.append(ALL_CHARACTERS.charAt(random.nextInt(ALL_CHARACTERS.length())));
+        }
+
+        // 将密码打乱顺序
+        return shuffleString(password.toString());
+    }
+
+
+    // 打乱字符串顺序
+    private static String shuffleString(String input) {
+        List<Character> characters = new ArrayList<>();
+        for (char c : input.toCharArray()) {
+            characters.add(c);
+        }
+        Collections.shuffle(characters);
+        StringBuilder output = new StringBuilder(characters.size());
+        for (char c : characters) {
+            output.append(c);
+        }
+        return output.toString();
     }
 
     /**