天天看點

Java自動生成訂單序列号

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**

 * 産生流水号工具類

 * @version V1.0

 * @date: 2013-11-16 下午5:21:37

 */

public class SerialNum {

 private static String count = "000";

 private static String dateValue = "20131115";

 /**

  * 産生流水号

  */

 public synchronized static String getMoveOrderNo() {

  long No = 0;

  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

  String nowdate = sdf.format(new Date());

  No = Long.parseLong(nowdate);

  if (!(String.valueOf(No)).equals(dateValue)) {

   count = "000";

   dateValue = String.valueOf(No);

  }

  String num = String.valueOf(No);

  num += getNo(count);

  num = "CB" + num;

  return num;

 }

  * 擷取撤展單序列号

 public synchronized static String getMoveOrderNo(String serialNum) {

  String nyr = StringUtils.substring(serialNum, 2, 10); // 擷取年月日字元串

  String countV = StringUtils.substring(serialNum, 10); // 擷取流水号

  if (Integer.valueOf(countV) > Integer.valueOf(count)) {

   dateValue = nyr;

   count = String.valueOf(countV);

  return getMoveOrderNo();

  * 傳回當天的訂單數+1

 public static String getNo(String s) {

  String rs = s;

  int i = Integer.parseInt(rs);

  i += 1;

  rs = "" + i;

  for (int j = rs.length(); j < 3; j++) {

   rs = "0" + rs;

  count = rs;

  return rs;

 public static void main(String[] args) {

  for (int i = 0; i < 10; i++) {

   System.out.println(getMoveOrderNo());

}

注意:上面的程式如果伺服器一直能夠正常運作就不會出什麼問題,

要是重新開機伺服器或者中間出現什麼故障需要重新開機服務都可能造成重複序列号的産生,

為了能夠保證唯一,我們需要配合上資料庫的查詢,查詢最後一條記錄,

然後拿出序列号在調用getMoveOrderNo(String serialNum)這個方法,

就能夠保證什麼情況下生成的序列号都是正确唯一的。