该方法生成的长序号一共有两种-根据需要选择
第一种:开头不含四位随机码的(有限的唯一序号),每天最多生成25974条唯一长序号,当天如果超了就会出现重复,示例如下
# 不带随机码生成的示例
LOGA20240223001
第二种:开头含四位随机码的(无限的唯一序号),每天生成的编码超过25974条唯一长序号时会把开头的四位随机码进行更换,示例如下
# 带随机码生成的示例
0168LOGA20240223001
生成原理就是-标识符+字母+序号
# LOG为标识
LOGA20240223001
# A为字母,最后3位要超过999时,A就会变成B,以此类推
LOGA20240223999 -----> LOGB20240223001
# 中间的是当天日期-当到了明天字母和序号都会变回第一
LOGB20240223168 -----> LOGA20240224001
# 最后3位就是序号0-999,当超过999时变为001
LOGA20240223999 -----> LOGB20240223001
完整代码如下
/**
* 生成编码
*
* @param sign 自定义标识 (可以为空)
* @param lastNumber 上一个编码 (没有则生成新的)
* @param isRandom 是否在开头添加随机数
* @return 生成的编码
*/
public static String generateNumber(String sign, String lastNumber, boolean isRandom) {
sign = StringUtils.hasLength(sign) ? sign : "";
StringBuilder sb = new StringBuilder();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date nowDate = new Date();
try {
if (StringUtils.hasLength(lastNumber)) {
String random = isRandom ? lastNumber.substring(0, 4) : "";
lastNumber = isRandom ? lastNumber.substring(4) : lastNumber;
int signLength = sign.length();
int num = Integer.parseInt(lastNumber.substring(signLength + 9));
String frequency = lastNumber.substring(signLength, signLength + 1);
Date oldDate = dateFormat.parse(lastNumber.substring(signLength + 1, signLength + 9));
if (dateFormat.parse(dateFormat.format(nowDate)).equals(oldDate)) {
if (num == 999) {
num = 1;
if ("Z".equals(frequency)) {
frequency = "A";
random = isRandom ? String.format("%04d", new Random().nextInt(9999)) : "";
} else {
frequency = String.valueOf(++frequency.toCharArray()[0]);
}
} else {
++num;
}
} else {
num = 1;
frequency = "A";
}
sb.append(random).append(sign).append(frequency).append(dateFormat.format(nowDate)).append(String.format("%03d", num));
} else {
sb.append(isRandom ? String.format("%04d", new Random().nextInt(9999)) : "").append(sign).append("A").append(dateFormat.format(nowDate)).append("001");
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("--------生成编号失败--------");
}
return sb.toString();
}