生成序列号、流水号

        使用数据库和Redis,生成序列号或流水号。当Redis中没值,加载数据库中的最大值,存入Redis中。

一、配置Spring Boot的Redis,使Spring Context的有RedisConnectionFactory
二、创建Redistemplate:

@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Long> redisTemplateSerial(RedisConnectionFactory factory) {
        RedisTemplate<String, Long> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        template.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));
        return template;
    }
}

三、生成序列号、流水号的代码:

public class SerialGenerate<T extends SerialNo> {
    @Resource
    private T tMapper;
    @Resource(name = "redisTemplateSerial")
    private RedisTemplate<String, Long> redisTemplateSerial;

    public String gen() {
        // 生成编码
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Long redisSerial =  redisTemplateSerial.opsForValue().increment(RedisConstant.serial);
        String yyyyMMdd = null;
        // 今天年月日
        String yyyyMMddCurrent = format.format(new Date());
        // 流水号
        String serial = "00001";
        if(redisSerial == null || redisSerial.toString().length() < 13) {
            // 如果redis中为空,则从数据库中加载今天最大值,并增加1.
            List<Entity> entity = tMapper.queryMax(yyyyMMddCurrent);
            if(ObjectUtil.isNotEmpty(entity)) {
                 serial = String.valueOf(Long.parseLong(entity.get(0).getNo().substring(8, 13)) + 1);
                // 如果数据溢出
                BusinessException.isTrue(Long.parseLong(serial) <= 99999L, ExceptionEnum.ExceptionMAX);
            }
            redisSerial = Long.valueOf(yyyyMMddCurrent + serial);
            redisTemplateSerial.opsForValue().set(RedisConstant.serial, redisSerial);
        } else {
            // 如果redis中的值已存在,需要判断是否当天的流水,不是的话,需要重置日期和流水。
            yyyyMMdd = redisSerial.toString().substring(0, 8);
            if(ObjectUtil.notEqual(yyyyMMdd, yyyyMMddCurrent)) {
                // 如果不是今天.
                redisSerial = Long.valueOf(yyyyMMddCurrent + serial);
                redisTemplateSerial.opsForValue().set(RedisConstant.serial, redisSerial);
            }
        }
        return redisSerial.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值