在开发中,咱们有很多时候需要自定义编码,而不是使用uuid
或者是自增ID
。
本章就介绍一个自定义业务编码的生成规则。
import lombok.AllArgsConstructor;
import lombok.Getter;/*** @author: mcs* @Date: 2022/11/27 10:00* @Description: 业务编码类型及其生成规则*/
@Getter
@AllArgsConstructor
public enum CodeTypeEnum {/***业务编码生成规则*/QX("QX", "QX%s%s", "yyyyMM", "000", "缺陷");/*** 业务编码*/private String type;/*** 业务编码格式*/private String text;/*** 时间样式*/private String dateFormat;/*** 字符*/private String serialFormat;/*** 信息*/private String remark;
}
@Component
@Slf4j
public class RandomGenerateUtil {@Resourceprivate RedisTemplate<String, Long> redisTemplate;/*** Redis key 编码前缀*/private final static String SERIAL_REDIS_KEY_PREFIX = "businessCode:";/*** 自动编码* 注意:使用该编码需要集成redis* @param codeTypeEnum* @return*/public String nextSerialNumber(CodeTypeEnum codeTypeEnum) {// 格式化日期LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern(codeTypeEnum.getDateFormat());String date = formatter.format(now);// 获取流水号final String type = codeTypeEnum.getType();String redisKey = SERIAL_REDIS_KEY_PREFIX + type + ":" + date;DecimalFormat dft = new DecimalFormat(codeTypeEnum.getSerialFormat());Long count = redisTemplate.opsForValue().increment(redisKey, 1);String code = dft.format(count);// 组装返回数据return String.format(codeTypeEnum.getText(), date, code);}
}
最后生成的业务编码如下:
QX202311008
QX202311005
QX202311006
QX202311004
QX202311007