一、使用背景
在日常开发过程中,尤其订单和支付过程中,难免用到订单流水号,为类节省开发,在这里和大家分享工具类,希望给大家带来帮助。
二、直接上代码
package com.train.common.utils;
import cn.hutool.core.date.DatePattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* </p>
* 流水号生成工具类
* </p>
*
*/
public class SerialUtil {
private static final Logger logger = LoggerFactory.getLogger(SerialUtil.class);
// 使用单例模式,不允许直接创建实例
private SerialUtil() {
}
// 全局自增数
private static int count = 0;
// 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值)
private static final int total = 9999;
// 格式化的时间字符串
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatePattern.PURE_DATETIME_MS_PATTERN);
// 获取当前时间年月日时分秒毫秒字符串
private static String getNowDateStr() {
return simpleDateFormat.format(new Date());
}
// 记录上一次的时间,用来判断是否需要递增全局数
private static String now = null;
/*
* 生成一个订单号 - 支付平台使用
*/
public static synchronized String generateOrder() {
String datasets = getNowDateStr();
if (datasets.equals(now)) {
count++;// 自增
} else {
count = 1;
now = datasets;
}
int countInteger = String.valueOf(total).length() - String.valueOf(count).length();
// 算补位
StringBuilder bu = new StringBuilder();
// 补字符串
for (int i = 0; i < countInteger; i++) {
bu.append("0");
}
bu.append(count);
if (count >= total) {
count = 0;
}
return datasets + bu;
}
public static void main(String[] args) {
String serialNumber = generateOrder();
logger.info("生成的订单号为:{}", serialNumber);
}
}