package com.gkhy.exam.system.utils; import cn.hutool.core.date.DateUtil; import com.gkhy.exam.common.enums.CodeTypeEnum; import com.gkhy.exam.common.exception.ApiException; import com.gkhy.exam.common.utils.RedisUtils; import com.gkhy.exam.common.utils.StringUtils; import com.gkhy.exam.system.mapper.ExExamPaperMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.concurrent.TimeUnit; /** *
* 编号生成工具来 *
* * @author kzy * @since 2024-06-06 13:53:17 */ @Component public class SequenceUtils { @Autowired private RedisUtils redisUtils; @Autowired private ExExamPaperMapper examPaperMapper; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final DateTimeFormatter DATE_FORMATTER2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public synchronized String getNextSequence(String prefixKey){ if(StringUtils.isBlank(prefixKey)){ throw new ApiException("编号前缀不能为空"); } Date currentDate=new Date(); String today= DateUtil.format(currentDate,DATE_FORMATTER); String key=prefixKey+today; long increment=redisUtils.incr(key,1); if(increment==1){ //查询数据库 long count=0; if(prefixKey.equals(CodeTypeEnum.EXAM_PAPER.getCode())){ count=examPaperMapper.selectCountBetweenDay(DateUtil.format(DateUtil.beginOfDay(currentDate),DATE_FORMATTER2),DateUtil.format(DateUtil.endOfDay(currentDate),DATE_FORMATTER2)); } if(count>0){ increment=count+1; redisUtils.set(key,increment); } redisUtils.expire(key,24, TimeUnit.HOURS); } if(increment>9999){ throw new ApiException("编号超过最大值"); } String code=String.format("%04d",increment); return today+code; } }