/** 高低位算法*/
private class HiloOptimizer {
private String prefix; //前缀
private int maxLo;
private int lo;
private long hi;
private long lastValue;
public HiloOptimizer(String prefix, int maxLo) {
this.prefix = prefix != null ? prefix.replace("{", "${") : "";
this.maxLo = maxLo; //最大低位
this.lo = maxLo + 1; //最低初始位
}
public synchronized String generate() {
if (lo > maxLo) { //当低位超过最大高位
lastValue = getLastValue(); //表示hi位的进位次数,从数据库id管理表获取
lo = lastValue == 0 ? 1 : 0; //低位归0
hi = lastValue * (maxLo + 1); //高位进位
}
return String.valueOf(hi + lo++); //低位最后自增lo++
}
}
@Transactional
private long getLastValue(Type type) {
String jpql = "select sn from Sn sn where sn.type = :type";
Sn sn = entityManager.createQuery(jpql, Sn.class)//
.setParameter("type", type)//
.setFlushMode(FlushModeType.COMMIT)//
.setLockMode(LockModeType.PESSIMISTIC_WRITE)//
.getSingleResult();//
long lastValue = sn.getLastValue();
sn.setLastValue(lastValue + 1);
entityManager.merge(sn);
return lastValue;
}
public String generate(Type type) {
Assert.notNull(type);
String sn = null;
switch (type) {
case product:
sn = productHiloOptimizer.generate();
break;
case order:
sn = orderHiloOptimizer.generate();
break;
case payment:
sn = paymentHiloOptimizer.generate();
break;
case slip:
sn = slipHiloOptimizer.generate();
break;
case refunds:
sn = refundsHiloOptimizer.generate();
break;
case shipping:
sn = shippingHiloOptimizer.generate();
break;
case returns:
sn = returnsHiloOptimizer.generate();
break;
case merchant:
sn = merchantHiloOptimizer.generate();
break;
case merchantStore:
sn = merchantStoreHiloOptimizer.generate();
break;
case accountDetail:
sn = accountDetailHiloOptimizer.generate();
break;
case cashOrder:
sn = cashorderHiloOptimizer.generate();
break;
case refundOrder:
sn = refundorderHiloOptimizer.generate();
break;
}
return sn;
}