所谓系统编码规则就是类似电商订单号等生成规则,通常是流水号,比如我们常见的餐饮消费、超市购物POS机打印的小票号都是年月日+pos机号+序号。企业信息系统建设中也会涉及很多单据号,比如:销售订单号、采购单号、领料单号、入库单号、出库单号、调拨单号等,一般是前缀(表示单据类型)+年月日+序号,如:销售单号为SO201902200001。那么企业信息系统该如何设计系统编码呢?
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
说明:
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
取正编人员的工号,参数: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)
可以把编码获取封装成一个通用方法,如下:
getDefSysCode函数说明:
则获取正编人员工号调用如下: