谈谈企业信息系统建设中系统编码设计

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/chuangxin/article/details/87929374

所谓系统编码规则就是类似电商订单号等生成规则,通常是流水号,比如我们常见的餐饮消费、超市购物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)

猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/87929374