生成自增的编号:


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