所谓系统编码规则就是类似电商订单号等生成规则,通常是流水号,比如我们常见的餐饮消费、超市购物POS机打印的小票号都是年月日+pos机号+序号。企业信息系统建设中也会涉及很多单据号,比如:销售订单号、采购单号、领料单号、入库单号、出库单号、调拨单号等,一般是前缀(表示单据类型)+年月日+序号,如:销售单号为SO201902200001。那么企业信息系统该如何设计系统编码呢?
1、数据表设计
1)系统编码主表
CREATE TABLE `sys_code_config` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT,
`code_group` varchar(30) NOT NULL,
`code_label` varchar(100) NOT NULL COMMENT '说明',
`code_type` varchar(32) NOT NULL COMMENT 'goods|employee等',
`code_type_text` varchar(32) DEFAULT NULL,
`code_prefix` varchar(10) DEFAULT NULL COMMENT '编码前缀',
`code_ym` varchar(255) DEFAULT NULL COMMENT '编码中间日期格式',
`code_len` int(11) DEFAULT NULL COMMENT '编码长度',
`code_initval` int(11) DEFAULT '0' COMMENT '初始计数器',
`write_uid` bigint(20) DEFAULT NULL,
`write_time` datetime DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
说明:
- code_group:编码组,比如员工工号(emp_no)
- code_label:编码组说明,比如emp_no对应的就是“员工工号”
- code_type:编码具体类型,比如:10
- code_type_text:编码具体类型对应的文字描述:比如10–正编人员
- code_prefix:编码前缀,如正编人员1开头,非正编2开头
- code_ym:年月日格式化串,员工工号不需要,因此对应空字符串‘’
- code_len:编码长度,不包括编码前缀长度,若长度4则,正编人员工号10001开始
- code_initval:编码初始计数器,假设为10,则正编人员工号10011开始
2)系统编码细表(无需维护,系统自动填充值)
CREATE TABLE `sys_code_value` (
`sid` bigint(20) NOT NULL AUTO_INCREMENT,
`code_group` varchar(32) NOT NULL,
`code_type` varchar(32) NOT NULL COMMENT 'goods|employee等',
`code_ym` varchar(8) NOT NULL,
`code_val` int(11) NOT NULL DEFAULT '0' COMMENT '初始计数器',
`write_uid` varchar(32) DEFAULT NULL,
`write_time` datetime DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、编号生成规则
取正编人员的工号,参数:code_group = ‘emp_no’, code_type = ‘10’, code_ym = ‘’,伪代码如下:
set config = 取表sys_code_config数据(code_group = 'emp_no', code_type = '10');
if config 不存在 then 抛错退出程序
set initVO = 取表sys_code_value数据(code_group = 'emp_no', code_type = '10', code_ym = '');
set prefix = config.code_prefix; // 1
set code_ym = config.code_ym; // ''
set initVal = config.code_val || 0; //配置表没维护默认0
if initVO !=null && initVO.code_val > initVal then //已经有编码值,判断编码值是否大于初始值
initVal = initVO.code_val;
end if
initVal++; //编码递增
initVal = 格式化('0000', initVal); // initVal = 1, 格式化成0001
return prefix + code_ym + initVal // 10001
如果往数据库存入本次取的编码,以便下次取用,则还需返写编码,伪码如下:
写入数据表sys_code_value(code_group = 'emp_no', code_type = '10', code_ym = '', code_val=1)
3、程序调用
可以把编码获取封装成一个通用方法,如下:
- getDefSysCode(code_group, code_type), 同getDefSysCode(code, code_type, false)
- getDefSysCode(code_group, code_type, updateFlag)
getDefSysCode函数说明:
- code_group:如上文的emp_no
- code_type:如上文的10(正编人员工号)
- updateFlag:是否更新sys_code_value表
则获取正编人员工号调用如下:
- 单纯获取工号,供前台页面显示新增员工默认工号多少?则调用getDefSysCode(‘emp_no’,10)
- 获取工号,同时更新sys_code_value则,调用getDefSysCode(‘emp_no’,10,true)