在实际项目中,经常会遇到需要自动生成“CS001”或者根据每天日期生成的流水号这样的编号,以下是生成两种编号的工具类。
CS001格式:
这里采用根据主键id一致的方式生成,如主键id为1,生成的编号为0001
public class ProducerNumUtil {
private static final Integer ONE = 1;
private static final Integer TWO = 2;
private static final Integer THREE = 3;
// prefix为自定义前缀,想要几位数可以自行修改0的数量
// id获取方式为从数据库表中查询现在最大id+1(SELECT id+1 from table ORDER BY id DESC LIMIT 1)
public static String getId(String prefix, Integer id){
//判断位数
String s = id + "";
int count = s.length();
String producerNum = prefix;
if (ONE == count){
producerNum += "000"+ String.valueOf(id);
}else if (TWO == count){
producerNum += "00"+ String.valueOf(id);
}else if (THREE == count){
producerNum += "0" + String.valueOf(id);
}else {
producerNum += String.valueOf(id);
}
return producerNum;
}
}
十六位流水号
public class OrderNumberUtil {
@Autowired
RedisTemplate redisTemplate;
// firstNum:开头数字,endNum:第四位数,numLength:日期后数字的长度
// 如firstNum:1,endNum:2,numLength:4,今天日期:2020.02.23
// 生成的第一个流水号为1002-20200223-0001
public String getSerialBizId(int firstNum, int endNum, int numLength) {
String prefixBizCode="order_num";
String serialNumLength="";
for(int i=0; i<numLength; i++){
serialNumLength+="0";
}
String timeFormatter="yyyyMMdd"; //yyyyMMdd
//默认序列号位数
if(ObjectUtils.isEmpty(serialNumLength)){//默认
serialNumLength="00000";
}
SimpleDateFormat sdf=new SimpleDateFormat(timeFormatter);
Date date=new Date();
String formatDate=sdf.format(date);
String key= prefixBizCode+formatDate;
System.err.println(key);
Long incr = getIncr(key, getCurrent2TodayEndMillisTime());
System.err.println(incr);
if(incr==0) {
incr = getIncr(key, getCurrent2TodayEndMillisTime());//从000001开始
}
DecimalFormat df=new DecimalFormat(serialNumLength);//流水号位数
String prefix = orderForm+new DecimalFormat("000").format(orderLevel);
return prefix+"-"+formatDate+"-"+df.format(incr);
}
/**
* 根据key获取redis值
*/
public Long getIncr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
}
return increment;
}
/**
* 系统日期的毫秒数
*/
public Long getCurrent2TodayEndMillisTime() {
Calendar todayEnd = Calendar.getInstance();
// Calendar.HOUR 12小时制
// HOUR_OF_DAY 24小时制
todayEnd.set(Calendar.HOUR_OF_DAY, 23);
todayEnd.set(Calendar.MINUTE, 59);
todayEnd.set(Calendar.SECOND, 59);
todayEnd.set(Calendar.MILLISECOND, 999);
return todayEnd.getTimeInMillis()-System.currentTimeMillis();
}
}