生成自增的编号:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
    /**
     * 生成工单编码
     
     * @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