因为业务小所以没有使用缓存,业务多正规的话可以将本月编码放在redis,每一次都对比缓存中的编码,如果是本月的就可以加1,然后更新缓存,如果没有不是本月就直接更新redis,最后向数据库中插入数据
yml
LeaveCodeTop: PD
代码
完整代码在介绍分布式锁的时候写了连接(在这只写了编码部分):https://blog.csdn.net/weixin_43861630/article/details/108974581
public static String LEAVE_CODE_TOP = "";
@Value("${LeaveCodeTop}")
private void setLeaveCodeTop(String LeaveCodeTop) {
PlaLeaveApplyServiceImpl.LEAVE_CODE_TOP = LeaveCodeTop;
}
//编码实现部分,整体方法省略
QueryWrapper<PlaLeaveApply> queryWrapper = new QueryWrapper<>();
Calendar cal = Calendar.getInstance();
//获取当前年
int years = cal.get(Calendar.YEAR);
//获取当前月
int month = cal.get(Calendar.MONTH) + 1;
String codeStr;
//判断月份是否需要拼接0
if (month < 10) {
//拼接编码能确定的前一部分
codeStr = LEAVE_CODE_TOP + years + "0" + month;
} else {
//拼接编码能确定的前一部分
codeStr = LEAVE_CODE_TOP + years + month;
}
//模糊查询
queryWrapper.like("apply_no", codeStr);
//根据自增的id排序,不能使用创建时间降序排列,因为如果同时生成很多条数据,创建时间有可能会出现
//相同时间,这样排序的话每次可能都会不同,生成的编码可能会出现重复
queryWrapper.orderByDesc("id");
//根据排列后的数据取第一条数据
queryWrapper.last("LIMIT 1");
System.err.println("查询");
PlaLeaveApply plaLeaveApplypr = plaLeaveApplyMapper.selectOne(queryWrapper);
String applyNo;
//判断是否获取到收据
if (StringUtils.isNotNull(plaLeaveApplypr)) {
//获取数据的编码
String code = plaLeaveApplypr.getApplyNo();
System.err.println("code:" + code);
//分割获取数字,将string型转换成 BigInteger 注意:不能转int或者Integer,因为数过于大,会报错
BigInteger codeInteger = new BigInteger(code.split(LEAVE_CODE_TOP)[1]);
//将编码加1后转拼接前缀,生成string型编码
applyNo = LEAVE_CODE_TOP + codeInteger.add(new BigInteger("1"));
} else {
//如果没数据说名当前是第一条编码,所以拼接00001即可
applyNo = codeStr + "00001";
}