旗开得胜
This commit is contained in:
@ -0,0 +1,82 @@
|
||||
package com.greenorange.promotion.utils;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
public class OrderNumberUtils {
|
||||
|
||||
|
||||
// 定义日期格式化器,精确到秒
|
||||
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
|
||||
// 定义序列号最大值
|
||||
private static final int MAX_SEQUENCE = 999999;
|
||||
|
||||
// 当前日期,初始化为当天
|
||||
private static String currentDate = getCurrentDate();
|
||||
|
||||
// 自增序列号,线程安全
|
||||
private static final AtomicInteger sequence = new AtomicInteger(0);
|
||||
|
||||
// 锁对象,用于保护自增序列号的生成
|
||||
private static final Lock lock = new ReentrantLock();
|
||||
|
||||
|
||||
public static String generateOrderId() {
|
||||
// 获取当前日期
|
||||
String today = getCurrentDate();
|
||||
|
||||
// 如果日期发生变化,重置序列号
|
||||
if (!today.equals(currentDate)) {
|
||||
currentDate = today;
|
||||
sequence.set(0); // 重置序列号
|
||||
}
|
||||
|
||||
// 获取时间戳(精确到秒)
|
||||
String timestamp = DATE_FORMAT.format(new Date());
|
||||
|
||||
// 获取4位随机数
|
||||
String randomNumber = generateRandomNumber();
|
||||
|
||||
// 获取6位自增序列号,并确保不超过最大值
|
||||
int seq = getNextSequence();
|
||||
|
||||
// 格式化序列号为6位
|
||||
String formattedSequence = String.format("%06d", seq);
|
||||
|
||||
// 拼接生成订单号
|
||||
return timestamp + randomNumber + formattedSequence;
|
||||
}
|
||||
|
||||
// 获取当前日期(格式:yyyyMMdd)
|
||||
private static String getCurrentDate() {
|
||||
return new SimpleDateFormat("yyyyMMdd").format(new Date());
|
||||
}
|
||||
|
||||
// 生成4位随机数(范围:0000到9999)
|
||||
private static String generateRandomNumber() {
|
||||
int random = (int) (Math.random() * 10000); // 生成0到9999之间的随机数
|
||||
return String.format("%04d", random); // 格式化为4位
|
||||
}
|
||||
|
||||
// 获取下一个自增序列号,使用ReentrantLock来确保线程安全
|
||||
private static int getNextSequence() {
|
||||
lock.lock(); // 获取锁
|
||||
try {
|
||||
int seq = sequence.incrementAndGet();
|
||||
if (seq > MAX_SEQUENCE) {
|
||||
sequence.set(0); // 达到最大值后重置
|
||||
seq = sequence.incrementAndGet();
|
||||
}
|
||||
return seq;
|
||||
} finally {
|
||||
lock.unlock(); // 确保在最终释放锁
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user