无需通过redis,而是直接通过JAVA来生成订单号(日期+流水号), java按日期加流水号方式生成订单号

303 阅读1分钟

前阵子因为业务需要做了订单相关的内容,以工具类的形式记录一下: 直接上代码:

/**
 * 生成统一格式(例如XP2021040200001)订单号工具类
 * @Author cht
 * @Date 2021/4/2 11:09:38
 */

public class OrderNumGenerate {
    private static final String SERIAL_NUMBER = "XXXXXX"; // 流水号格式
    private static OrderNumGenerate orderNumGenerater = null;

    private OrderNumGenerate() {
    }
    /**
     * 取得PrimaryGenerate的单例实现
     * @return
     */
    public static OrderNumGenerate getInstance() {
        if (orderNumGenerater == null) {
            synchronized (OrderNumGenerate.class) {
                if (orderNumGenerater == null) {
                    orderNumGenerater = new OrderNumGenerate();
                }
            }
        }
        return orderNumGenerater;
    }
    /**
     * 生成下一个编号
     */
    public static synchronized String generateNextNumber(String num) {
        String id = null;
        String s = num.substring(0, 2); //截取订单号前缀
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        if (num == null) {
            id = s+formatter.format(date) + "000001";
        } else {
            int count = SERIAL_NUMBER.length();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < count; i++) {
                sb.append("0");
            }
            String dateString=num.substring(2, 10);
            if(formatter.format(date).compareTo(dateString)==0){
                DecimalFormat df = new DecimalFormat("000000");
                id =s+formatter.format(date)+ df.format(1 + Integer.parseInt(num.substring(10, 16)));
            }else{
                id = s+formatter.format(date) + "000001";
            }
        }
        return id;
    }
/*    public static void main(String[] args) {
        String no = "XP20210407000001";
        no = OrderNumGenerate.getInstance().generateNextNumber(no);
        System.out.println(no);
    }*/
}