package com.nova.sankuai.domain.api.yinsheng;
|
|
import com.nova.sankuai.infra.config.ServerName;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.security.SecureRandom;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.Random;
|
|
/**
|
* 随机序列生成器
|
*/
|
@Component
|
public class SerialGenerator {
|
|
/**
|
* 以随机种子初始化random对象
|
*/
|
private static final Random RANDOM = new SecureRandom();
|
|
/**
|
* 内部交易码长度
|
*/
|
private static final int INTER_TRANS_ID_LENGTH = 32;
|
|
/**
|
* 日期格式化模板
|
*/
|
private static ThreadLocal<SimpleDateFormat> dateFormatFactory = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmssSSS"));
|
|
private static final String DEFAULT_TANSID_TYPE = "10";
|
|
private static final char[] mm = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
|
|
@Resource
|
ServerName serverName;
|
|
/**
|
* 生成规则 17位日期毫秒数 + 消息类型(10) + 随机数补齐32位
|
*/
|
public static String getOrder() {
|
StringBuilder sb = new StringBuilder();
|
sb.append(dateFormatFactory.get().format(new Date())).append(DEFAULT_TANSID_TYPE)
|
.append(generateRandomSerial(INTER_TRANS_ID_LENGTH - sb.length()));
|
return sb.toString();
|
}
|
|
/**
|
* 获取带有服务器名作为后缀的订单号
|
* @return 订单号
|
*/
|
public String getOrderWithServerName() {
|
StringBuilder sb = new StringBuilder();
|
sb.append(dateFormatFactory.get().format(new Date())).append(DEFAULT_TANSID_TYPE)
|
.append(generateRandomSerial(INTER_TRANS_ID_LENGTH - sb.length())).append(serverName.getServerName());
|
return sb.toString();
|
}
|
|
|
/**
|
* 生成len长度的随机数序列
|
*
|
* @return String randomString
|
*/
|
public static String generateRandomSerial(int len) {
|
StringBuilder sb = new StringBuilder();
|
for (int i = 0; i < len; i++) {
|
sb.append(mm[RANDOM.nextInt(mm.length)]);
|
}
|
return sb.toString();
|
}
|
|
}
|