Jelajahi Sumber

:space_invader:fix: 修复 IDGenerator 生成id的超18位的错误
:space_invader:feat: 取消 id 的自增,使用自定义id
:monocle_face:feat: 空中云汇订单信息传递至前端

Ritchie 1 tahun lalu
induk
melakukan
39bc9ef871

+ 2 - 0
README.md

@@ -28,6 +28,8 @@ ResponseCodesEnum 为错误码,其中 ALL_OK("00000","SUCCESS") 表示成功
 ## 使用 hutool 工具类
 参考文档 https://www.bookstack.cn/read/hutool/377f64112be7197a.md
 
+[新版本文档](https://www.bookstack.cn/read/hutool-5.6.0-zh/0ced75507d77392f.md)
+
 ## 配置文件参数使用
 推荐将配置文件的参数,放到数据库表 sys_properties 里面。
 参考 select * from sys_properties a where a.application ='szwl-server'

+ 1 - 1
src/main/java/com/szwl/constant/AirwallexConstant.java

@@ -18,7 +18,7 @@ public class AirwallexConstant {
 //    public final static String WEBHOOKS = "/webhook/paymentIntent";
 
     public final static String QR_URL = "http://localhost:8080/shenze/#/hpp";
-
+//    public final static String QR_URL = "http://szwltest.sunzee.com.cn/shenze/#/hpp";
 //    public final static String QR_URL = "http://szwlh.sunzee.com.cn/shenze/#/hpp";
 
 

+ 3 - 2
src/main/java/com/szwl/controller/AirwallexPayController.java

@@ -21,11 +21,11 @@ import com.szwl.model.dto.*;
 import com.szwl.model.entity.*;
 import com.szwl.model.utils.AccessTokenThreadUtil;
 import com.szwl.service.*;
+import com.szwl.utils.IDGenerator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 
@@ -192,6 +192,7 @@ public class AirwallexPayController {
 
         // 创建订单
         TCoinOrder tCoinOrder = new TCoinOrder();
+        tCoinOrder.setId(IDGenerator.coinOrderID());
         tCoinOrder.setAdminId(adminById.getId());
 
         if (StringUtils.isNotEmpty(createDate)) {
@@ -324,7 +325,7 @@ public class AirwallexPayController {
 //        String mode = AirwallexConstant.MODE;
 //        String locale = "it";
         String qrUrl = AirwallexConstant.QR_URL;
-        String QR = qrUrl + "?intent_id=" + paymentIntentId + "&client_secret=" + clientSecret + "&currency=" + currency;
+        String QR = qrUrl + "?intent_id=" + paymentIntentId + "&client_secret=" + clientSecret + "&currency=" + currency + "&productName=" + productName + "&productsNum=" + productNumber + "&totalPrice=" + amount;
 
         // 将订单存入数据库
         tCoinOrderService.save(tCoinOrder);

+ 9 - 0
src/main/java/com/szwl/controller/TOrderController.java

@@ -29,6 +29,7 @@ import com.szwl.model.utils.*;
 import com.szwl.service.*;
 import com.szwl.service.es.EsTOrderService;
 import com.szwl.utils.HuifuUtils;
+import com.szwl.utils.IDGenerator;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -260,6 +261,7 @@ public class TOrderController {
         }
         Integer productNumber = 1;
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());
@@ -526,6 +528,7 @@ public class TOrderController {
         BigDecimal marketingAmount = null;
 
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());
@@ -765,6 +768,7 @@ public class TOrderController {
         Integer productNumber = 1;
 
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());
@@ -808,6 +812,7 @@ public class TOrderController {
             order.setIsSettlement("0");
         }
         TOrder order2 = new TOrder();
+        order2.setId(IDGenerator.orderID());
         order2.setCreateDate(new Date());
         order2.setModifyDate(new Date());
         order2.setAdminId(admin.getId());
@@ -1182,6 +1187,7 @@ public class TOrderController {
         String frpCode2 = "ALIPAY_NATIVE";
 
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());
@@ -1231,6 +1237,7 @@ public class TOrderController {
         }
         order.setNote(note.toString());
         TOrder order2 = new TOrder();
+        order2.setId(IDGenerator.orderID());
         order2.setCreateDate(new Date());
         order2.setModifyDate(new Date());
         order2.setAdminId(admin.getId());
@@ -1689,6 +1696,7 @@ public class TOrderController {
         String frpCode1 = "WEIXIN_XCX";
         BigDecimal amount = price.setScale(2, RoundingMode.HALF_DOWN);
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());
@@ -3090,6 +3098,7 @@ public class TOrderController {
 
         TProduct product =  R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipmentId), productName));
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());

+ 2 - 0
src/main/java/com/szwl/controller/TWeixinPayController.java

@@ -17,6 +17,7 @@ import com.szwl.model.utils.PushUtils;
 import com.szwl.service.TEquipmentService;
 import com.szwl.service.TOrderService;
 import com.szwl.service.TWeixinPayConfigService;
+import com.szwl.utils.IDGenerator;
 import com.szwl.weixin.refund.model.CreateRequest;
 import com.szwl.weixin.util.HttpUtils;
 import com.wechat.pay.java.service.refund.model.AmountReq;
@@ -252,6 +253,7 @@ public class TWeixinPayController {
         String notifyUrl = JoinpayConstant.Notify_Url;
         String frpCode1 = "WEIXIN_NATIVE";
         TOrder order = new TOrder();
+        order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
         order.setModifyDate(new Date());
         order.setAdminId(admin.getId());

+ 2 - 1
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -27,7 +27,8 @@ public class TAdmin implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id", type = IdType.AUTO)
+//    @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     private Date createDate;

+ 2 - 1
src/main/java/com/szwl/model/entity/TCoinOrder.java

@@ -25,7 +25,8 @@ public class TCoinOrder implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id", type = IdType.AUTO)
+//    @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     @ApiModelProperty(value = "订单创建时间")

+ 2 - 1
src/main/java/com/szwl/model/entity/TEquipment.java

@@ -25,7 +25,8 @@ public class TEquipment implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id", type = IdType.AUTO)
+//    @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     private Date createDate;

+ 2 - 1
src/main/java/com/szwl/model/entity/TOrder.java

@@ -26,7 +26,8 @@ public class TOrder implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "订单唯一ID")
-    @TableId(value = "id", type = IdType.AUTO)
+//    @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     @ApiModelProperty(value = "创建时间")

+ 2 - 0
src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java

@@ -20,6 +20,7 @@ import com.szwl.service.THuifuTempOrderService;
 import com.szwl.service.TOrderDetailsService;
 import com.szwl.service.TOrderService;
 import com.szwl.utils.HuifuUtils;
+import com.szwl.utils.IDGenerator;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -204,6 +205,7 @@ public class THuifuMchServiceImpl extends ServiceImpl<THuifuMchMapper, THuifuMch
         TOrder tOrder = new TOrder();
         String[] ignoreProperties = {"id", "createDate","sn"};
         BeanUtil.copyProperties(huifuTempOrder, tOrder, ignoreProperties);
+        tOrder.setId(IDGenerator.orderID());
         tOrder.setSn(sn);
         tOrder.setCreateDate(new Date());
         tOrder.setModifyDate(new Date());

+ 97 - 0
src/main/java/com/szwl/utils/IDGenerator.java

@@ -0,0 +1,97 @@
+package com.szwl.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class IDGenerator {
+    private static final AtomicLong seq = new AtomicLong(0);
+    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+    private static final SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+
+
+    /**
+     * 生成唯一的16位长整型ID --> admin,equipment等常用表
+     *
+     * @return 订单ID
+     */
+    public static synchronized long commonID() {
+        String timestamp = dateFormat1.format(new Date()).substring(2);
+        long threadId = Thread.currentThread().getId();
+        String s1 = String.valueOf(threadId);
+        char c = s1.charAt(s1.length() - 1);
+        //huTool工具集的雪花算法 --> 生成19位id
+        //参数1为终端ID
+        //参数2为数据中心ID
+//        Snowflake snowflake = IdUtil.getSnowflake(1, 1);
+//        long id = snowflake.nextId();
+//        System.out.println("id***" + id);
+
+        return Long.parseLong(timestamp + c);
+    }
+
+    /**
+     * 生成唯一的18位长整型ID --> 用于国内订单
+     *
+     * @return 订单ID
+     */
+    public static synchronized long orderID() {
+        String timestamp = dateFormat.format(new Date()).substring(2);
+        long threadId = Thread.currentThread().getId();
+        String s1 = String.valueOf(threadId);
+        char c = s1.charAt(s1.length() - 1);
+        String randomNumber = generateRandomNumber();
+
+        // 乐观锁部分
+        long currentSeq;
+        long nextSeq;
+        do {
+            currentSeq = seq.get();
+            nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
+        } while (!seq.compareAndSet(currentSeq, nextSeq));
+        String s2 = String.valueOf(nextSeq);
+        char c1 = s2.charAt(s2.length() - 1);
+
+        String s = "5"; // 表示国内订单
+        return Long.parseLong(s + timestamp + c + randomNumber + c1);
+    }
+
+    /**
+     * 生成唯一的18位长整型ID --> 用于海外订单
+     *
+     * @return 订单ID
+     */
+    public static synchronized long coinOrderID() {
+        String timestamp = dateFormat.format(new Date()).substring(2);
+        long threadId = Thread.currentThread().getId();
+        String s1 = String.valueOf(threadId);
+        char c = s1.charAt(s1.length() - 1);
+        String randomNumber = generateRandomNumber();
+
+        // 乐观锁部分
+        long currentSeq;
+        long nextSeq;
+        do {
+            currentSeq = seq.get();
+            nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
+        } while (!seq.compareAndSet(currentSeq, nextSeq));
+        String s2 = String.valueOf(nextSeq);
+        char c1 = s2.charAt(s2.length() - 1);
+
+        String s = "1"; // 表示海外订单
+        return Long.parseLong(s + timestamp + c + randomNumber + c1);
+    }
+
+    /**
+     * 生成3位伪随机数
+     * 因为long类型范围是-9223372036854775808到9223372036854775807,无法容纳更大范围数字,可以将数据库字段类型改为无符号,或者使用varchar类型
+     * @return 随机数
+     */
+    private static String generateRandomNumber() {
+        Random random = new Random();
+        int nextInt = random.nextInt(1000);
+        // 格式化为3位数,并在不满三位的数字前面补零
+        return String.format("%03d", nextInt);
+    }
+}

+ 15 - 0
src/test/java/com/szwl/utils/IDGeneratorTest.java

@@ -0,0 +1,15 @@
+package com.szwl.utils;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class IDGeneratorTest {
+    public static void main(String[] args) {
+        long l = IDGenerator.orderID();
+        long l1 = IDGenerator.commonID();
+        long l2 = IDGenerator.coinOrderID();
+        System.out.println("orderId 国内订单表id >>> " + l);
+        System.out.println("coinOrderId 海外订单id >>> " + l2);
+        System.out.println("commonId 其他表id >>> " + l1);
+        System.out.println(String.format("%01d", 98));
+    }
+}