生成流水号工具类

package com.lansi.lojoy.lojoymanage.util;

import com.lansi.lojoy.lojoymanage.common.constants.SerialNumberConstants;
import com.lansi.lojoy.lojoymanage.common.enums.SerialNumberTypeEnum;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 流水号生成工具类
 * @author Sean
 * @createDate 2021-01-06
 */
public class SerialNumberUtil {
    /**
     * 生成流水号前缀
     * @param serialNumberTypeEnum 流水号类型
     * @return
     */
    public static String getSerialNumberPrefix(SerialNumberTypeEnum serialNumberTypeEnum) {
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern(serialNumberTypeEnum.getDatePattern());
        return serialNumberTypeEnum.getPrefix() + LocalDate.now().format(pattern);
    }

    /**
     * 获取流水号缓存Key
     * @param serialPrefix 流水号前缀
     * @return
     */
    public static String getCacheKey(String serialPrefix) {
        return SerialNumberConstants.SERIAL_CACHE_PREFIX.concat(serialPrefix);
    }

    /**
     * 补全流水号
     * @param serialPrefix 流水号前缀
     * @param incrementalSerial 当天自增流水号
     * @param serialNumberTypeEnum 流水号类型
     * @return
     */
    public static String completionSerialNumber(String serialPrefix,Long incrementalSerial,SerialNumberTypeEnum serialNumberTypeEnum) {
        StringBuilder result = new StringBuilder(serialPrefix);
        //需要补0的长度=流水号长度-当日自增计数长度
        Integer length = serialNumberTypeEnum.getSerialLength() - String.valueOf(incrementalSerial).length();
        for (int i = 0; i < length; i++) {
            result.append("0");
        }
        result.append(incrementalSerial);
        return result.toString();
    }
}
package com.lansi.lojoy.lojoymanage.service.impl;

import com.lansi.lojoy.lojoymanage.common.constants.SerialNumberConstants;
import com.lansi.lojoy.lojoymanage.common.enums.SerialNumberTypeEnum;
import com.lansi.lojoy.lojoymanage.entity.PictureLibraryIdentify;
import com.lansi.lojoy.lojoymanage.service.SerialNumberService;
import com.lansi.lojoy.lojoymanage.util.SerialNumberUtil;
import com.lansi.lojoy.lojoymanage.util.basicexpansion.StringUtils;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * 流水号模块
 * @author Sean
 * @createDate 2021-01-06
 */
@Service
@RequiredArgsConstructor
public class SerialNumberServiceImpl implements SerialNumberService {

    private final StringRedisTemplate stringRedisTemplate;

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 生成流水号
     *
     * @param serialNumberTypeEnum 流水号类型
     * @return
     */
    @Override
    public String generateSerialNumber(SerialNumberTypeEnum serialNumberTypeEnum) {
        //获取流水号前缀
        String serialNumberPrefix = SerialNumberUtil.getSerialNumberPrefix(serialNumberTypeEnum);
        //获取流水号缓存Key
        String cacheKey = SerialNumberUtil.getCacheKey(serialNumberPrefix);
        //获取当日自增数
        Long increment = stringRedisTemplate.opsForValue().increment(cacheKey);
        if (serialNumberTypeEnum.getIsExpire()) {
            //设置缓存失效时间
            Long expire = stringRedisTemplate.getExpire(cacheKey);
            if (expire < 0) {
                logger.info("expire>>>{}", expire);
                stringRedisTemplate.expire(cacheKey, SerialNumberConstants.DEFAULT_CACHE_DAYS, TimeUnit.DAYS);
            }
        }
        //组合流水号并补全流水号
        return SerialNumberUtil.completionSerialNumber(serialNumberPrefix, increment, serialNumberTypeEnum);
    }

    /**
     * 获取图片标识
     *
     * @param serialNumberTypeEnum 流水号类型
     * @return
     */
    @Override
    public PictureLibraryIdentify getPictureLibraryIdentify(SerialNumberTypeEnum serialNumberTypeEnum) {
        String serialNumber = generateSerialNumber(serialNumberTypeEnum);
        PictureLibraryIdentify identify = new PictureLibraryIdentify();
        identify.setPictureIdentify(serialNumber);
        switch (serialNumberTypeEnum) {
            case TK_SERIAL_NUMBER:
                identify.setPictureFileKey(StringUtils.format("PictureLibrary/Collection/Picture/{0}", serialNumber));
                break;
            case AL_SERIAL_NUMBER:
                identify.setPictureFileKey(StringUtils.format("PictureLibrary/DesignerCase/Picture/{0}", serialNumber));
                break;
        }
        return identify;
    }
}
package com.lansi.lojoy.lojoymanage.common.enums;

import com.lansi.lojoy.lojoymanage.common.constants.SerialNumberConstants;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 流水号类型枚举
 * @author Sean
 * @createDate 2021-01-06
 */
@Getter
@AllArgsConstructor
public enum SerialNumberTypeEnum {
    /**
     * 图库图片流水号
     */
    TK_SERIAL_NUMBER("TK", SerialNumberConstants.SERIAL_YY_MM_DD_PREFIX, 5, 13,true),

    /**
     * 案例图片流水号
     */
    AL_SERIAL_NUMBER("AL", SerialNumberConstants.SERIAL_YY_MM_DD_PREFIX, 5, 13,true),

    /**
     * 团购活动流水号
     */
    TG_SERIAL_NUMBER("TG", SerialNumberConstants.SERIAL_YY_MM_DD_PREFIX, 5, 13,true),

    /**
     * 公共号文章前缀
     */
    GZH_SERIAL_NUMBER("GZH",SerialNumberConstants.NULL , 5, 8,false),

    /**
     * 问答前缀
     */
    QA_SERIAL_NUMBER("QA",SerialNumberConstants.NULL , 5, 7,false),

    /**
     *  推荐位前缀
     */
    TJW_SERIAL_NUMBER("TJW",SerialNumberConstants.NULL , 5, 7,false),

    /**
     * 视频前缀
     */
    SP_SERIAL_NUMBER("SP",SerialNumberConstants.NULL , 5, 7,false);

    /**
     * 流水号前缀
     * 为空时填写""
     */
    private String prefix;

    /**
     * 时间格式表达式
     */
    private String datePattern;

    /**
     * 流水号长度
     */
    private Integer serialLength;

    /**
     * 总长度
     */
    private Integer totalLength;

    /**
     * 是否过期
     */
    private Boolean isExpire;
}
package com.lansi.lojoy.lojoymanage.common.constants;

/**
 * 流水号生成常量
 * @author Sean
 * @createDate 2021-01-06
 */
public class SerialNumberConstants {
    /**
     * 流水号缓存key前缀
     */
    public static final String SERIAL_CACHE_PREFIX = "Serial_Number_Cache_";

    /**
     * 流水号yyMMdd前缀
     */
    public static final String SERIAL_YY_MM_DD_PREFIX = "yyMMdd";

    /**
     * 流水号yyyyMMdd前缀
     */
    public static final String SERIAL_YYYY_MM_DD_PREFIX = "yyyyMMdd";

    /**
     * 默认缓存天数
     */
    public static final Integer DEFAULT_CACHE_DAYS = 7;

    /**
     * 空的内容
     */
    public static final String NULL = "";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值