该程序订单号有业务类型(飞机票业务是1或者火车票业务是2依次类推)+日期(四位数)+默认数字( 100)+六位随机数总共14位的订单号
首先每天第一次都会生成key,并保存订单号,第二次获取订单号,会根据第一次生成的key获取订单号,并且加1,成为第二个订单号并保存,有序性。
@Override
public Long createSerialNumber(String biz,String type) {
try {
if (StringUtils.isBlank (biz))
return null ;
return kvClient .lockForProcess2(
biz, System.currentTimeMillis () + "" ,
PayDistributeLockPrefix.LOCK_ORDER_TIME ,
new DistributeLockProcessor<Long>() {
@Override
public Long process() {
String date = DateUtils.DateToString (null ,
DateStyle.MMDD );
String key = type + biz
+ date;// key
String start = biz + date;
String v = kvClient .read(key, String.class );
String s = null ;// value
if (null == v) {// 每天第一次生成
s = start + "100" + RandomStringUtils.random (6 , false , true );
kvClient .save(key, s, Integer.MAX_VALUE );
return Long.valueOf (s);
} else {
v = v.substring(
v.length() - 7 ,
v.length());
Integer returnInt = Integer.valueOf (v);
returnInt++;
v = start + returnInt;
kvClient .save(key, v, Integer.MAX_VALUE );
return Long.valueOf (v);
}
}
});
} catch (Exception e) {
LOGGER .info("获取订单编号失败" , e);
Ensure.that (e).isNotNull("09000001" );
}
return null ;
}