自动生成编号
逻辑类
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.LinkedList;
import java.util.List;
@Component
public class NumberGenerateService {
private final RedisUtil redisUtil;
private final List<NumberPrefixExtractor<?>> numberPrefixExtractors = new LinkedList<>();
public NumberGenerateService(RedisUtil redisUtil){
this.redisUtil = redisUtil;
}
public void addNumberPrefixExtractor(NumberPrefixExtractor<?> numberPrefixExtractor){
this.numberPrefixExtractors.add(numberPrefixExtractor);
}
public String generateNumber(String keyPrefix,String numberPrefix){
String date = NumberConstant.dateTimeFormatter.format(LocalDate.now());
String numberKey = String.format("%s_%s_%s",keyPrefix,numberPrefix,date);
long no = redisUtil.incr(numberKey, 1);
if(no == 1L){
redisUtil.expire(numberKey, Duration.between(LocalDateTime.now(), LocalDateTime.of(LocalDate.now(), LocalTime.MAX)).plus(10L, ChronoUnit.MINUTES).getSeconds());
}
return String.format("%s-%s-%s", numberPrefix, date,no);
}
public <T> String generateNumber(Class<?> clazz,String keyPrefix,T t){
for (NumberPrefixExtractor<?> extractor : numberPrefixExtractors) {
if(extractor.getClass().equals(clazz)){
String numberPrefix = ((NumberPrefixExtractor<T>)extractor).extract(t);
return this.generateNumber(keyPrefix,numberPrefix);
}
}
return null;
}
}
注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NumberInsert {
/**
* 注入域的名称
*/
String fieldName() default "number";
/**
* 编号key前缀
*/
String keyPrefix();
/**
* 编号前缀
*/
String numberPrefix() default "";
/**
* 编号提取取
*/
Class<?> extractor() default void.class;
}
接口
public interface NumberPrefixExtractor<T> {
String extract(T t);
}