java自动生成编号

在实际项目中,经常会遇到需要自动生成“CS001”或者根据每天日期生成的流水号这样的编号,以下是生成两种编号的工具类。

CS001格式:

这里采用根据主键id一致的方式生成,如主键id为1,生成的编号为0001

public class ProducerNumUtil {
    private static final Integer ONE = 1;
    private static final Integer TWO = 2;
    private static final Integer THREE = 3;

    // prefix为自定义前缀,想要几位数可以自行修改0的数量
    // id获取方式为从数据库表中查询现在最大id+1(SELECT id+1  from table  ORDER BY id DESC LIMIT 1)
    public static String getId(String prefix, Integer id){
        //判断位数
        String s = id + "";
        int count = s.length();
        String producerNum = prefix;
        if (ONE == count){
            producerNum += "000"+ String.valueOf(id);
        }else if (TWO == count){
            producerNum += "00"+ String.valueOf(id);
        }else if (THREE == count){
            producerNum += "0" + String.valueOf(id);
        }else {
            producerNum += String.valueOf(id);
        }
        return producerNum;
    }
}

十六位流水号

public class OrderNumberUtil {

    @Autowired
    RedisTemplate redisTemplate;
    
	// firstNum:开头数字,endNum:第四位数,numLength:日期后数字的长度
	// 如firstNum:1,endNum:2,numLength:4,今天日期:2020.02.23
	// 生成的第一个流水号为1002-20200223-0001
    public String getSerialBizId(int firstNum, int endNum, int numLength) {
        String prefixBizCode="order_num";
        String serialNumLength="";
        for(int i=0; i<numLength; i++){
            serialNumLength+="0";
        }
        String timeFormatter="yyyyMMdd"; //yyyyMMdd
        //默认序列号位数
        if(ObjectUtils.isEmpty(serialNumLength)){//默认
            serialNumLength="00000";
        }

        SimpleDateFormat sdf=new SimpleDateFormat(timeFormatter);
        Date date=new Date();
        String formatDate=sdf.format(date);
        String key= prefixBizCode+formatDate;
        System.err.println(key);
        Long incr = getIncr(key, getCurrent2TodayEndMillisTime());
        System.err.println(incr);
        if(incr==0) {
            incr = getIncr(key, getCurrent2TodayEndMillisTime());//从000001开始
        }

        DecimalFormat df=new DecimalFormat(serialNumLength);//流水号位数

        String prefix = orderForm+new DecimalFormat("000").format(orderLevel);


        return prefix+"-"+formatDate+"-"+df.format(incr);
    }

    /**
     *  根据key获取redis值
     */
    public Long getIncr(String key, long liveTime) {

        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long increment = entityIdCounter.getAndIncrement();

        if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
            entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
        }
        return increment;
    }

    /**
     * 系统日期的毫秒数
     */
    public Long getCurrent2TodayEndMillisTime() {
        Calendar todayEnd = Calendar.getInstance();
        // Calendar.HOUR 12小时制
        // HOUR_OF_DAY 24小时制
        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        todayEnd.set(Calendar.MILLISECOND, 999);
        return todayEnd.getTimeInMillis()-System.currentTimeMillis();
    }
}
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值