一、使用场景

我们经常需要使用递增的序列号,例如合同的编号,公文的编号等。
这些编号需要根据复杂的业务规则递增,并且保证不重。

  • 例1 合同的类型包括销售,采购,人事, 那么自动生成的合同编号是 SL,SU,HR,每个分类每年从1开始递增,跨年后重新开始

2017年的第一个销售合同是 SL2017-1,第二个是SL2017-2。接下来有个采购合同,SU2017-1。 到了2018年,销售合同又变成SL2018-1…

  • 例2 中间需要看到序列号,但可能没有最终生成,所以先不让序列号增长,而最终步骤执行的时候,再确定并增长序列号。
  • 例3 由于有些合同的特殊,需要预留序列号,其他的合同先继续,之后某个特殊合同再占用这个特殊的预留序列号。

下面我们先从最简单的序号讲起。

Sequence.uuid() 生成数字随机数
Sequence.increment() 获取下个序列号,并且增长序列号
Sequence.get() 获取下个序列号,不增长序列号
Sequence.clear() 清空序列号
Sequence.initValue() 获取下个序列号,展示的时候不增长,保存的时候增长

二、如何使用

例如合同编号从1开始递增。

序列号递增:
Sequence.increment(“合同编号”),去获取当前的合同编号序列号,并且让这个序列号加1,

序列号获取:
Sequence.get(“合同编号”),去获取当前的合同编号序列号,序列号不变。

示例:

  • Sequence.increment(“合同编号”)
    返回:1
  • Sequence.increment(“合同编号”)
    返回:2
  • Sequence.increment(“劳动协议编号”)
    返回: 1
  • Sequence.increment(“合同编号)
    返回: 3

序列都有名字,不同名字的序列号的值会独立增长。

  • Sequence.get(“合同编号)
    返回: 4 因为上一步是3,并且递增了。
  • Sequence.get(“合同编号)
    返回: 4 因为上一步是get
  • Sequence.get(“合同编号)
    返回: 4 因为上一步是get
  • Sequence.increment(“合同编号)
    返回: 4 因为上一步是get,但获得之后,递增了,下次获得就是5了。
  • Sequence.get(“合同编号)
    返回: 5

get和increment都会拿序列的下一个值,但是increment拿完后会给值增加。

三、随年份、部门变化的序列号

例如合同编号每年会自动重新开始。合同编号规则是:HT , 年份,序列号。

合同编号格子填入表达式: "ht"+Date.today().year+"-"+Sequence.increment("合同编号"+Date.today().year)

  • 2007年的时候第一份合同
    返回字符串 ht2007-1

"合同编号"+Date.today().year 计算结果是字符串 合同编号2017合同编号2017 对应的序列号不存在,所以返回1. "ht"+Date.today().year+"-" ,计算结果是字符串 ht2017- 加起来就得到最终结果 ht2007-1

  • 2007年的时候第二份合同
    返回字符串 ht2007-2
  • 2007年的时候第三份合同
    返回字符串 ht2007-3
  • 2008年的时候第一份合同
    返回字符串 ht2008-1

因为Sequence.increment 的名称参数,在2008年的时候,计算结果是 合同编号2008 ,不存在这个序列( 存在 合同编号2007 的序列),所以返回的序列值是1。


因为序列完全按照名字来划分,如上一讲通过让序列名随着年份变化,我们可以让各年的序列号独立增长。现在我们需要各种独立增长的序列号,也只需要让序列名的变化和业务保持一致就行。

  • 随月份变化的序列值
    只需要在序列名字中传入月份就可以了。
    例如 Sequence.increment(“合同月编号”+Date.today.month).
  • 不同合同类型的编号独立递增
    只需要在序列名字中传入合同类型就可以了。
    例如 Sequence.increment(“合同类型编号”+it.合同类型).
  • 不同合同类型的编号,每年独立递增
    只需要在序列名字中传入合同类型和年份就可以了。
    例如 Sequence.increment(“合同年类型编号”+it.合同类型+”-“+Date.today.year).

    四、序列号管理

系统管理 > 高级管理> 序列号管理。
5.7 序列号 - 图1

这里我们可以看到所有的序列号。

  • 名称: 序列号的名称,
  • 值: 序列号的下一个值,//调用Sequence.increment(序列名)后,刷新可以看到值增加了。
  • 空缺: 给特殊场合预留的序列号值。
  • 是否补缺: false :获得序列号的时候获得值,true, 从空缺中获得。

可以点击跳过,跳过一个。跳过的将会成为空缺的列表中的一个。如果设置为补缺状态,那么下一个获取的序列号会是空缺列表的第一个。
也可以直接点击编辑,修改序列号的所有内容(慎用)

五、练习

对于序列号的生成及保存,建立一个有关手机序列号的一个页面
每条新纪录生成,并序列号不重复