生成自增的编号:
/**
* 生成工单编码
*
* @param workSheetType
* 工单类型
* @param systemName
* 系统名称
* @param cityCode
* 城市编码
* @return 形如AAA-BBB-CC-081127-0029
*/
public synchronized String nextWorkSheetNum(String workSheetType, String systemName, String cityCode)
{
String seqName = workSheetType + SEPARATOR + systemName + SEPARATOR + cityCode;
int nextSequnceValue = nextDailySequnceValue(seqName);
String result = seqName + SEPARATOR + todayStr() + SEPARATOR + leftPadWithZero(nextSequnceValue, PAD4);
return result;
}
//org.apache.commons.lang.StringUtils
//num为原数字,padwith为总共补齐的位数,0 为用什么补齐。 leftPad 是在左边用0补齐。
return StringUtils.leftPad(String.valueOf(num), padWith, '0');
//存储编号的类
public class IdSequnce {
private String name;
private int curVal;
private Date updatedAt;
....
}
/**
* 下一序列值,以天为周期
*
* @param name
* 序列名
* @return int数值>=1
*/
public int nextDailySequnceValue(String name)
{
IdSequnce seq = idSequnceDAO.getSequnceByName(name);
if (seq == null)
{
seq = new IdSequnce();
seq.setName(name);
seq.setCurVal(0);
seq.setUpdatedAt(new Date());
try
{
idSequnceDAO.insert(seq);
}
catch (Exception e)
{// 集群环境并发情况下,已被别应用服初始化该记录
seq = idSequnceDAO.getSequnceByName(name);
}
}
if (seq.getUpdatedAt() != null && DateUtil.isBeforeToday(seq.getUpdatedAt()))//(修改日期不为空,并且是今天之前修改的)所以,今天还没有编号
{
DevLog.debug("initial seq value");
seq.setCurVal(0);
}
seq.setUpdatedAt(new Date());
idSequnceDAO.increaseSequnce(seq);
return seq.getCurVal();
}
/**
* 今天之前的日期
*
* @return boolean
*/
public static boolean isBeforeToday(Date date) {
Date todayZero = getTodayZeroClock();
return isBefore(date, todayZero);
}
//编号加一
public void increaseSequnce(IdSequnce sequnce){
sequnce.setCurVal(sequnce.getCurVal()+1);
update(sequnce);
}
说明:IdSequnce 创建了一个表,一个类,用来存储当前的最大的编号。
结果为:形如AAA-BBB-CC-081127-0005
转载于:https://blog.51cto.com/jianboli/1895193