import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
//按日期生成流水号,每次重启后需要在config afterJFinalStart 启动之后调用id初始化代码
//1.如果数据有数据,取当日最大值加1 ,2。如果数据无数据,初始化为1
//调用:SerialUtil.newInstance("BDCID", new Date()).toString();
//BFCID 为调取那个表格的标识,代码区分标识调用
/*显示当前日期 20160101
long date = DateUtil.getYear() * 10000 + DateUtil.getMonth() * 100
+ DateUtil.getDay();
// 系统启动后获取数据库业务流水号
BigDecimal dBG = Db
.queryBigDecimal("SELECT MAX(bdid) FROM (SELECT MAX(BDID) as BDID FROM BUSI_DATA WHERE CONVERT(VARCHAR(10),BARCHTIME,23)= CONVERT(VARCHAR(10),GETDATE(),23) UNION ALL SELECT MAX(BDID) as BDID FROM busi_data_allot WHERE CONVERT(VARCHAR(10),BARCHTIME,23)= CONVERT(VARCHAR(10),GETDATE(),23)) as B");
if (dBG != null) {
long ret = dBG.longValue() - (date * 100000000);
SerialUtil.newInstance("BDID", new Date()).setNumber((int) ret);
}
*/
public class SerialUtil {
private static final int MAX_VALUE = 99999999;
private static final String FORMAT = "yyyyMMdd";
private static final Format DF = new SimpleDateFormat(FORMAT);
private static final byte[] lock = new byte[0];
private String prefix = null;
private Date date = null;
private int number = 1;
private static Map<String, SerialUtil> map = new HashMap<String, SerialUtil>();
public static void main(String [] args){
System.out.println(SerialUtil.newInstance("BDCID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDCID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDCID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDCID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDID", new Date()).toString());
System.out.println(SerialUtil.newInstance("BDID", new Date()).toString());
}
private SerialUtil(String prefix, Date date) {
this.prefix = prefix;
this.date = date;
}
public static SerialUtil newInstance(String prefix) {
Date date = new Date();
return newInstance(prefix, date);
}
public static SerialUtil newInstance(String prefix, Date date) {
SerialUtil o = null;
synchronized (lock) {
String key = getKey(prefix, date);
if (map.containsKey(key)) {
o = map.get(key);
int number = o.getNumber();
if (number < MAX_VALUE) {
o.setNumber(number + 1);
} else {
o.setNumber(1);
}
} else {
o = new SerialUtil(prefix, date);
map.put(key, o);
}
}
return o;
}
private static String getKey(String prefix, Date date) {
return prefix + format(date);
}
private static String format(Date date) {
return DF.format(date);
}
public String toString() {
prefix = "";
return prefix + format(date) + String.format("%08d", number);
}
public void setNumber(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}