All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dxy.library.util.common.OrderNoUtils Maven / Gradle / Ivy

package com.dxy.library.util.common;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 订单号工具类
 * 订单生成规则:
 * 正常情况下:年(2位)+月(2位)+日(2位)+秒(5位)+循环自增值(3位)+随机码(2位)共16位
 * 非正常情况下:年(2位)+月(2位)+日(2位)+秒(5位)+随机码(5位)共16位
 * 注:非正常情况在同时开启1W个线程的情况下并未发生
 * 业务编码(1位):自营、通用件、全车件待定
* @author duanxinyuan
 * 2017/5/14 19:39
 */
public class OrderNoUtils {
    //循环自增上限,超出则从初始值开始
    private static int maxLoop = 999;
    private static int initNum = 100;
    private volatile static AtomicInteger atomicInteger;

    public static int matchRating = 1;

    /**
     * DCL获取单例atomicInteger
     */
    private static AtomicInteger getAtomicInteger() {
        if (atomicInteger == null) {
            synchronized (OrderNoUtils.class) {
                if (atomicInteger == null) {
                    atomicInteger = new AtomicInteger(initNum);//初始值为100
                }
            }
        }
        return atomicInteger;
    }

    /**
     * 订单号生成
     */
    public static Long next() {
        //获取单例
        AtomicInteger atomicInteger = getAtomicInteger();
        //原子性自增并返回自增前的值
        int nextValue = atomicInteger.getAndIncrement();
        //若循环次数已超过上限
        if (nextValue > maxLoop) {
            //CAS更新值成功
            if (atomicInteger.compareAndSet(nextValue + 1, initNum)) {
                atomicInteger.getAndIncrement();
                return getNextNormally(initNum);
            } else {//CAS更新值失败
                //重新获取
                nextValue = atomicInteger.getAndIncrement();
                if (nextValue <= maxLoop) {
                    return getNextNormally(nextValue);
                } else {//非正常情况下
                    return getNextUnNormally();
                }
            }
        }
        return getNextNormally(nextValue);
    }

    private static Long getNextNormally(int nextValue) {
        int randomNum = (int) (Math.random() * 90) + 10;//2位随机码
        return Long.valueOf(getDateNum() + nextValue + randomNum);
    }

    private static Long getNextUnNormally() {
        int randomNum = (int) (Math.random() * 90000) + 10000;//5位随机码
        return Long.valueOf(getDateNum() + randomNum);
    }

    /**
     * 获取订单号中的时间部分
     */
    private static String getDateNum() {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMddHHmmss");
        String sTime = simpleDateFormat.format(date);
        Integer nSecond = Integer.valueOf(sTime.substring(6, 8)) * 60 * 60 + Integer.valueOf(sTime.substring(8, 10)) * 60
                + Integer.valueOf(sTime.substring(10, 12));
        StringBuilder sSecond = new StringBuilder(String.valueOf(nSecond));
        if (sSecond.length() < 5) {
            for (int i = 5, j = sSecond.length(); i > j; i--) {
                sSecond.insert(0, "0");
            }
        }
        return sTime.substring(0, 6) + sSecond;
    }

    public static String next(Integer type) {
        String result = "";
        if (type == matchRating) {
            result = "m" + next();
        }
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy