编号规则模块功能详细设计版本记录日期描述作者svn版本2014/1/22初稿潘微微版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-03221模块说明1.1模块作用编号规则属于工具模块,在系统的很多业务模块中都存在编号来标识数据,就需要有一个模块能尽量适用各种存在规律的编号的生成,编号规则负责该部分的工作,所以该模块属于工具模块,被各个地方所引用。1.2名词解释编号:用于标识一个业务实例、数据条目的有一定业务规则的字串,业务称谓上通常由前缀、主号码、后缀等组成。整个编号字串从技术称谓上可以分为的一个或多个部份,这些部份叫“编号片段”,每个“编号片段”由一个原子级的编号规则构成。编号规则:本设计框架支持一套可扩展的编号规则库。目前本设计预制了以下几种规则:固定字串、自增(减)序号、枚举形序号库、年月日时分秒格式数字、当前账户组织单元属性、当前账户部门属性、当前账户人员属性、自定义参数注入。本系统将按这些规则实现不同的“规则提供器”。序号实例:对于自增(减)序号、枚举形序号规则系统建立序号实例库;这两种规则,需要根据不同的参数形成不同的序号实例。每个序号实例条目记录了:实例区分组合字串、当前序号最大(小)值等。版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-03231.3原理与算法1.3.1编号引擎1.3.2规则定义说明规则定义分为:规则和规则明细定义。规则定义用于定义一个规则类型,用于识别不同的业务类型调用不同的编号规则。外部业务通过“单据类型编号”(TypeId)调用不同的编号规则。规则明细定义了编号片断的组成规则和需要配置的项目。规则明细以规则定义为表头。按排列顺序形成编号的组成规则。固定字段规则生成器:配置一个固定字串自增(减)序号:是按数字递增(简)规则产生编号片断的。可以配置数字格式如:“#####”(缺位需用0补齐)或“##,###”(戴格式的数字)可以配置数字起步值、最大值、步长(负步长表示递减)。序号实例区分参数:支持的参数包括全部(除当前明细)的规则明细,这些明细可以按顺序配制成一个字串组合。当运行时,系统按当前请求根据这些参数组成一个字串,然后到“序号实例”库表里查找,如果没有找到,则创建数据条目并从本规则明细的数字起步值开始记录当前序号。如果找到,则从此条目当前序号加步长记录当前序号。此规则还可以通过“序号实例”界面查看当前所有序号实例条目数据,并支持单独维护(实例区分组合字串、当前参数值下的序号的实际值)。还可以配置是否强制连续序号:如果需要强制连续序号,则系统不再自主递增(减)序号,需要外部API来提交递增(减)序号。且如果跳号,则会抛错(具体算法见后面说明)。版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-0324枚举形序号库:是按预定义好的序号库来输出编号片断的,比如:“A,B,C….”的字母顺序,当前如果是B了,则下次调用则产生C字母。序号库配置定义在规则明细上,采用“,”区分枚举项。还可以配置正序、倒序。仍可以配置“序号实例区分参数”和“配置是否强制连续序号”。(具体实现方案可以参照自增(减)序号规则提供器)年月日时分秒格式数字:从当前服务器时钟里获得编号片断的规则提供器。可以配置年月日时分秒的格式输出形式。当前账户组织单元属性、当前账户部门属性、当前账户人员属性:将从当前账户登录系统后形成的session里提取这些信息。系统支持“classname.propertyname”形式配置提取信息。自定义参数注入:根据系统调用API的定义,支持从调用直接带入参数用于编号片断。系统支持前台ajaxAPI调用参数,基于json串识别参数名,参数值。后台map识别参数名,参数值。本规则可以配置一个参数名。还可以配置直接从:session、request、里提取参数。1.3.3配置是否强制连续序号算法实现说明配置是否强制连续序号用于实现采用“由于自增(减)序号、枚举形序号库”的规则生成器。下面用是强制、否强制来简化称谓。否强制:系统将在调用编号请求API时就对序号进行自增(减)并持久化到序号实例库内。好处是使用简单,基本不用考虑序号重复问题。接近于随机数发生器。缺点是序号不连续(当产生时不提交业务或提交失败)。是强制:系统不会在调用编号请求API时就对序号进行自增(减),而是需要通过与业务提交同事务内的更新API来驱动对序号进行自增(减)并持久化到序号实例库内。举例某纯Integer数字递增序号提供器具体算法如下:版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-0325调用时API分为初始化session缓存和获得编号两个API;假定获得编号时有两个session都要请求序号,而当前序号为4;则两个session内通过初始化API(用“实例区分组合字串”作为属性key)放入4(假定“实例区分组合字串”相同)。调用API时(此API从session里创建新序号)各装入(session1:567;session2:56789)则当前:session1最大序号值为7;session2为9。(如果界面都没有提交,则下次界面打开时需再次调用初始化API恢复真实序号最大值4)。如果提交业务,则需要调用更新写入序号API(提交编号API只能是后台API),对于session1,如上图:如果满足要持久化更新的编号个数与最大号是连续的,则进行持久化,按最大编号值更新序号实例库相应条目。对于session2假定8的序号由于业务没有使用,则需要更新5679,会因最大号与编号个数不一致抛出异常。由于与业务提交处于相同事务,则保证序号连续的一致性。如果session1和session2都正常提交了,提交API需要先从数据库内读取当前真实序号情况,然后识别当前提交是否是在当前序号基础上连续递增(减)的,如果不是则此事务也抛出异常。注意,初始化、获得、提交更新API都是以typeid为参数的,所以:session里应以typeid为key构建一个Map,再以编号明细的key为内部MAP构建值对象;对于序号类的规则,内部MAP的值为当前序号值。这套session内的数据结构用于维护一个事务中连续创建编号的情况(强制要求联号配置下)。版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-03261.4参考文档1.5模块注册表:模块名称模块ID上级模块说明编号规则(2014版)49970ad981c611e39ef4cddb3cb243e2systemManage版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-03272相关页面界面说明2.1编号规则入口页面2.1.1/jsp/systemsettings/numBill/numBill/NumBillList.jsp列表结构:双表结构,主表为编号类别,子表为编号规则1)编号类别的列表页面的数据来源于Num_NumBill表2)编号规则的列表页面的数据来源于Num_NumRuler表3)下面为页面格式查询条件:1)主查询:类别编号2)高级查询:类别编号、类别名称新建:通过“新建”可以创建编号类别,填写基本信息。调用页面/jsp/systemsettings/numBill/numBill/NumBillEdit.jsp进行编号类别的编辑工作。修改:通过修改可以维护基本信息。选择一条记录调用getObj方法获得记录,展示到编辑界面。调用numBillManagerAction.getObj方法删除:通过删除按钮能够删除编号类别调用numBillManagerAction.delete新建规则明细:只通过该按钮可以创建子表数据(编号规则),点击该按钮会弹出下拉框选择创建版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-0328的规则,创建不同的规则进入不同的的编辑页面。调用:/numRulerManagerAction.do?method=getObj方法,需要传入编号类别主键以及规则类别子表‘修改’:通过该按钮可以修改创建的规则。调用/numRulerManagerAction.do?method=getObj子表‘删除’:调用该方法,可以删除规则调用删除方法:/numRulerManagerAction.do?method=delete查看规则实例:只有自增减型字串、枚举型字串两种会存在规则实例,当业务调用编号规则主键时,会保存或者更新当前的编号实例库,记录当前使用的规则实例。通过“查看规则实例”按钮就能查看到生成的编号实例列表。调用/jsp/systemsettings/numBill/numRulerSub/NumRulerSubList.jsp?numRulerId=,传入规则类别的主键引用:/jsp/systemsettings/numBill/numBill/NumBillList.jsp资源注册及权限表:资源名称资源ID所属模块说明编号规则Num_NumBill49970ad981c611e39ef4cddb3cb243e2所属“编号规则(2014版)”操作点名称操作点ID数据过滤器说明版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-0329维护9133900e81c611e39ef4cddb3cb243e22.1.2/jsp/systemsettings/numBill/numBill/NumBillEdit.jsp保存:点击“保存”调用js中ajax方法,将数据更新或者保存到后台,保存成功后返回列表页面,调用NumBillEdit.js文件中的保存方法。规则类别编号:记录所属业务,用英文编制。编号类别名称:所属业务的描述。创建人:默认当前人,从sessionScope中获取。创建时间:默认系统当前时间。状态类com.targ.systemsettings.numBill.numBill.uti.NumBillState.java草稿:0生效:1调用/numBillManagerAction.save(保存)/numBillManagerAction.update(更新)取消:取消返回编号规则的列表页面引用js:/jsp/systemsettings/numBill/numBill/NumBillEdit.js版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-032102.1.3/jsp/systemsettings/numBill/numRuler/NumRulerEdit.jsp使用该页面文件的规则类别是:固定字串、时间字串、当前用户字串,其中的区分不大版本:1.0BeijingTargsoftCo.,LtdTG-R-MB-XM-03211保存:点击“保存”调用js中ajax方法,将数据更新或者保存到后台,保存成功后返回列表页面,调用NumRulerEdit.js文件中的保存方法。规则类别编号:记录所属业务,从主表规则类别中代入展示。编号类别名称:所属业务的描述,从主表规则类别中代入展示。规则类别:记录所属的规则类别的描述。固定字串:记录类别为“固定字串”规则中的描述,直接写字串即可。日期:可以选择日期,主要应用于记录规则复位的时间。日期格式:可以选择时间字串的日期格式,如果存在该格式会以选择的格式,进行格式化生成编号。当前用户信息:主要是从sesion中获取当前的用户的信息。是否输出:是否输出代表在生成编号的时候是否将生成的编号片段按顺序拼接到编号上。针对自增减字串、枚举型字串规则类别中的复合字串的拼接中不存在该区分。对应类:com.targ.systemsettings.numBill.numRuler.util.NumRulerEnum.java输出:true(拼接)不输出:false(不拼接)排序:排序是数字,按照编号规则的排序序号正序排序生成编号。创建人:默认当前人,从sessionSco