Bläddra i källkod

Merge branch 'master' of http://8.138.18.76:3000/qmrb/parking-server

guoshuai 1 vecka sedan
förälder
incheckning
36323940d4

+ 7 - 3
src/main/java/com/qmrb/system/controller/OrderController.java

@@ -2,7 +2,6 @@ package com.qmrb.system.controller;
 
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -23,6 +22,7 @@ import com.qmrb.system.pojo.form.PayOrderForm;
 import com.qmrb.system.pojo.query.PayOrderQuery;
 import com.qmrb.system.pojo.vo.*;
 import com.qmrb.system.service.*;
+import com.qmrb.system.utils.JSSafeSnowflake;
 import com.qmrb.system.utils.WxPayUtil;
 import com.qmrb.system.wxpayback.api.CommonController;
 import com.qmrb.system.wxpayback.api.CommonResult;
@@ -240,7 +240,9 @@ public class OrderController extends CommonController {
 
     @PostMapping("/createOrder")
     public CommonResult<ReCreateOrderVO> createOrder(@RequestBody ToCreateOrderVO toCreatOrderVO) {
-        Long id = IdUtil.getSnowflake().nextId();
+//        Long id = IdUtil.getSnowflake().nextId();
+        JSSafeSnowflake idGenerator = new JSSafeSnowflake(2);
+        Long id = idGenerator.nextId();
         toCreatOrderVO.setOutTradeNo(id.toString());
         // 根据停车记录id获取车牌号
         List<BarnRecord> barnRecordList = barnRecordService.list(new LambdaQueryWrapper<BarnRecord>().eq(BarnRecord::getId, toCreatOrderVO.getGoodId())
@@ -343,7 +345,9 @@ public class OrderController extends CommonController {
             toCreateOrderVO.setTotal(pendingAmount.multiply(new BigDecimal(100)).intValue());
             toCreateOrderVO.setDescription("停车缴费");
             toCreateOrderVO.setOpenId(openId);
-            Long orderId = IdUtil.getSnowflake().nextId();
+//            Long orderId = IdUtil.getSnowflake().nextId();
+            JSSafeSnowflake idGenerator = new JSSafeSnowflake(2);
+            Long orderId = idGenerator.nextId();
             toCreateOrderVO.setOutTradeNo(orderId.toString());
             // 订单入库
             orderService.save(new Order().setAmountsPayable(toCreateOrderVO.getTotal())

+ 8 - 3
src/main/java/com/qmrb/system/service/impl/OrderServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.text.StrFormatter;
-import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
@@ -22,7 +21,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.qmrb.system.converter.PayOrderConverter;
 import com.qmrb.system.mapper.CouponMapper;
 import com.qmrb.system.mapper.OrderMapper;
-import com.qmrb.system.pojo.entity.*;
+import com.qmrb.system.pojo.entity.CarPark;
+import com.qmrb.system.pojo.entity.Coupon;
+import com.qmrb.system.pojo.entity.Order;
+import com.qmrb.system.pojo.entity.ToolWxConfig;
 import com.qmrb.system.pojo.form.BarnRecordForm;
 import com.qmrb.system.pojo.form.PayOrderForm;
 import com.qmrb.system.pojo.query.PayOrderQuery;
@@ -31,6 +33,7 @@ import com.qmrb.system.pojo.vo.ReCreateOrderVO;
 import com.qmrb.system.pojo.vo.ToCreateOrderVO;
 import com.qmrb.system.pojo.vo.WxLoginVO;
 import com.qmrb.system.service.*;
+import com.qmrb.system.utils.JSSafeSnowflake;
 import com.qmrb.system.utils.WxPayUtil;
 import com.qmrb.system.wxpayback.Enum.WxApiType;
 import com.qmrb.system.wxpayback.Enum.WxPayStatusEnum;
@@ -567,7 +570,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     @Override
     public void createOrderByRecord(ToCreateOrderVO toCreatOrderVO) {
-        Long id = IdUtil.getSnowflake().nextId();
+//        Long id = IdUtil.getSnowflake().nextId();
+        JSSafeSnowflake idGenerator = new JSSafeSnowflake(2);
+        Long id = idGenerator.nextId();
         toCreatOrderVO.setOutTradeNo(id.toString());
         //订单入库
         this.save(new Order().setAmountsPayable(toCreatOrderVO.getTotal())

+ 51 - 0
src/main/java/com/qmrb/system/utils/JSSafeSnowflake.java

@@ -0,0 +1,51 @@
+package com.qmrb.system.utils;
+
+public class JSSafeSnowflake {
+    private final long twepoch = 1625097600000L; // 起始时间戳(2021-06-30 00:00:00)
+    private final long workerIdBits = 5L;  // 机器ID占5位(支持32台机器)
+    private final long sequenceBits = 12L; // 序列号占12位(每毫秒4096个ID)
+    private final long maxWorkerId = ~(-1L << workerIdBits);
+    private long workerId;
+    private long sequence = 0L;
+    private long lastTimestamp = -1L;
+
+    public JSSafeSnowflake(long workerId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException("Worker ID超出范围");
+        }
+        this.workerId = workerId;
+    }
+
+    public synchronized long nextId() {
+        long timestamp = System.currentTimeMillis();
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException("时钟回拨异常");
+        }
+        if (timestamp == lastTimestamp) {
+            sequence = (sequence + 1) & ((1 << sequenceBits) - 1);
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+        lastTimestamp = timestamp;
+        // 时间戳部分仅保留30位(原41位压缩到30位)
+        long timestampShifted = ((timestamp - twepoch) & 0x3FFFFFFFL) << (workerIdBits + sequenceBits);
+        return timestampShifted | (workerId << sequenceBits) | sequence;
+    }
+
+    private long tilNextMillis(long lastTimestamp) {
+        long timestamp = System.currentTimeMillis();
+        while (timestamp <= lastTimestamp) {
+            timestamp = System.currentTimeMillis();
+        }
+        return timestamp;
+    }
+
+    public static void main(String[] args) {
+        JSSafeSnowflake idGenerator = new JSSafeSnowflake(2);
+        Long id = idGenerator.nextId();
+        System.out.println(id);
+    }
+}