@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/generateRkNumber")
public R generateRkNumber() {
try{
String currentDate = SequenceUtil.getCurrentDate();
String key = SequenceUtil.REDIS_RUKU_PREFIX + currentDate;
long sequence = stringRedisTemplate.opsForValue().increment(key);
String seq = SequenceUtil.getSequence(sequence);
StringJoiner sj = new StringJoiner("");
sj.add(SequenceUtil.SEQ_RUKU_PREFIX).add(currentDate).add(seq);// 日期拼接序列号
return R.ok(sj.toString());
}catch (Exception e){
log.error("生成流水号异常:"+e.getMessage(),e);
return R.failed(e.getMessage());
}
}
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.StringJoiner;
/**
* 自增流水号: 前缀 + yyyyMMdd + 序列号
**/
public class SequenceUtil {
// 序列号的长度
static final int DEFAULT_LENGTH = 4;
// REDIS入库单号前缀
public static final String REDIS_RUKU_PREFIX = "serial.number:ruku:";
// 入库流水号前缀
public static final String SEQ_RUKU_PREFIX = "RK";
/**
* 格式化 key
* @param seq
* @return
*/
public static String getSequence(Long seq) {
String str = String.valueOf(seq);
int len = str.length();
// 取决于业务规模
if (len >= DEFAULT_LENGTH) {
return str;
}
int rest = DEFAULT_LENGTH - len;
StringJoiner stringJoiner = new StringJoiner("");
for (int i = 0; i < rest; i++) {
stringJoiner.add("0");
}
stringJoiner.add(str);
return stringJoiner.toString();
}
/**
* 获取当前年月日
* @return
*/
public static String getCurrentDate(){
LocalDate localDate = LocalDate.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
return df.format(localDate);
}
}