/**
* redis 生成单号
* 前缀+自定义时间格式+流水号
*
* @param prefix 单号前缀
* @param dateFormat 单号中间自定义时间格式
* @param hashKey hashKey
* @param snLength 流水号长度
* @return 单号
*/
public String createOutboundOrderSn(String prefix, String dateFormat, String hashKey, int snLength) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
SimpleDateFormat keyDateFormat = new SimpleDateFormat(DatePattern.PURE_DATE_PATTERN);
String format = simpleDateFormat.format(new Date());
String keyFormat = keyDateFormat.format(new Date());
prefix += format;
String redisKey = RedisConstant.REDIS_GENERATE_OUTBOUND_KEY + keyFormat;
Long sn = redisTemplate.opsForHash().increment(redisKey, hashKey, 1);
// 设置过期时间为下一天的0时
LocalDate localDate = LocalDate.now().minusDays(-1);
Date timout = getDateBeginTime(localDate);
redisTemplate.expireAt(redisKey, timout);
StringBuilder fix = new StringBuilder();
for (int length = snLength; length > 0; length--) {
fix.append(0);
}
fix.append(sn);
return prefix + fix.substring(sn.toString().length(), fix.length());
}
/**
* 获取localDate日期的开始时间 {@link LocalTime}
* eg. 2018-06-11 13:31:31 return 2018-06-11 00:00:00
*
* @param localDate 当前日期
* @return 日期
*/
public static Date getDateBeginTime(LocalDate localDate) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}