|
@@ -0,0 +1,97 @@
|
|
|
|
+package com.szwl.util;
|
|
|
|
+
|
|
|
|
+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 --> 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);
|
|
|
|
+ }
|
|
|
|
+}
|