生成自增的编号:
/** * 生成工单编码 * * @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
时间: 2024-10-07 07:00:44