@author lyn
/
@Component
public class SerialNoUtils {
/*
public static final String ORDER_CODE = "DD-";
/**
public static final String RETURN_ORDER = "THD-";
/**
public static final String REFUND_ORDER = "TKD-";
/**
- 序号长度
*/
public static final int SORT_LENGTH = 6;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private RedissonClient redissonClient;
/**
- 生成17位唯一流水号,"LSH"+yyyyMMdd+6位数字
- 6位数字,如:000001
- @param bizCode 业务码
- @return
*/
public String generateSerialNo(String bizCode) {
//定义需要返回的流水号
String serialNo = null;
//先查询到今天的日期,格式:"yyyyMMdd"
String todayDate = new SimpleDateFormat("yyyyMMdd")
.format(new Date());
//固定字母前缀 拼接 今天日期,组成新的完整的前缀,也就是缓存的key
String cacheKey = bizCode + todayDate;
RLock lock = redissonClient.getLock("SerialNoLock" + cacheKey);
//通过key查询缓存有没有num数据,没有赋初始值并设置过期时间
try {
lock.lock();
if (Boolean.FALSE.equals(redisTemplate.hasKey(cacheKey))) {
redisTemplate.opsForValue().set(cacheKey, "0", getSeconds(), TimeUnit.SECONDS);
}
//再通过key查询缓存有没有num数据,缓存操作根据自身项目封装工具类
String value = redisTemplate.opsForValue().get(cacheKey);
Long codeNum = null;
//如果缓存查询有值,数值+1,再赋值给下一个流水号
if (null != value) {
codeNum = Long.parseLong(value) + 1L;
} else {
//如果缓存查询没值,直接赋值为1
codeNum = 1L;
}
//流水号 = 缓存key + 拼接的数值 = 前缀 + 日期 + 拼接的数值
serialNo = getCodeOfSix(cacheKey, codeNum.intValue());
//设置缓存,调用此方法,会自动将key所对应的value+1,保存时长:今天剩余的时间
redisTemplate.opsForValue().increment(cacheKey, 1);
} finally {
lock.unlock();
}
return serialNo;
}
/**