1.背景

在企业应用中单据编号的自定义是一个很常见的需求,如工号、业务单据编码等,能不能抽象一个通用的框架呢?

2.思路

这里的难点在于实现"解释器",比如将"前缀"是日期、年月、固定字符、部门代码等。而且“解释器”的“规则”允许动态增加。实施人员和用户可以自由改变单号的生成规则。

还要考虑并发问题,如一个单据同时多人访问编码是否唯一,如果不唯一那就有问题了。

3.具体实现类图

4.界面使用效果

这个编码规则的维护页面可是耗费了我不少的精力,除了编码规则的技术实现还要考虑这样一个技术难题,就是表格级联,是什么意思呢就是当一个编码生成规则有很多段的时候,不同的段的信息是不一样的,如果一个段是日期,那么编码段值就是年月日或者只有年月等可以选择,而如果编码段是自定义那就是那么就是固定字符需要用户手动输入,而且是必须项,还有很多种,很种段类开对应的段值都是不一样的,所以需要动态改变同列不同行采用的是不同控件处理。

首先要先维护编码规则信息,之后是程序调用生成编码。编码生成已经集成到最新的代码生成器中。可以完美的结合快速代码生成器进行使用。那么我们就一起来体验一下吧。

1.打开编码规则程序:

2.新增,编码规则:

3.输入编码规则编码和选择模块,再增加编码规则段。规则编码段有自定义、日期、流水号、部门、公司、用户编码等。

规则讲解:

  1. 编码段,可以是用户自定义、日期、流水码、公司等等。
  2. 编码段值,与编码段是一对,在编码段不同时意义不同。
  3. 流水号可以不是最后一个编码段,可以是中间的段。但一个业务单据的编码规则只能有一个流水码段。
  4. 长度、补位,只有流水码需要补位其它都是定长。流水号不够长度时是否补位,如果补位补位的字符是什么。
  5. 初始值,流水码从哪个值做为第一个编码出现。
  6. 步长,当获取最大编码时流水码下一个编码是什么这也是关键值,默认步长是1。
  7. 流水依据段,是查当前最大编码是否依据这个编码段。这也是这个编码生成的一个特点,也是为什么流水码可以不是最后一个的关键。

4.维护完成后 生效保存。

5.保存成功后,调用时可以按编码规则的编码或者模块编码获取最大编号。

6.下面是SNF.CodeGenerator-代码生成器生成的多表页面,运行效果如下:

5.高并发测试结果

同时起了100个线程,和每个线程获取单据号100次。最终测试结果是可以保证唯一性的,如下:

6.优点

  1. 编码规则用户可以进行维护,方便快捷,简单方便,组合性强。

  2. 可以用于业务单据的单号也可以单独调用使用。灵活。

  3. 同时在调用时也可以选择获取的最大编号是否立即生效。

  4. 还解决了easyui的技术问题:动态改变同列不同行采用的是不同控件处理。

  5. 处理了并发问题,有效防止出现重复编码。

  6. 代码生成器中增加了 “业务单号”,完全与单表和多表生成代码进行整合。

  

作者: 王春天 2015-11-23
作者Blog:http://www.cnblogs.com/spring_wang
出处: http://www.cnblogs.com/spring_wang/p/4988837.html

如果觉得还不错,欢迎转载。

本系列文章列表如下:

基于SNF-快速开发平台框架的系列文章:

SNF快速开发平台3.2之--.Net可扩展的单据编号生成器-SNF.CodeRule

SNF快速开发平台3.1之--审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow

SNF快速开发平台3.1之--审核流(2)流程设计-SNF.WorkFlow功能使用说明

SNF快速开发平台3.1之--审核流(1)SNF.WorkFlow审核流简介

SNF快速开发平台3.0之--完美的代码生成器SNF.CodeGenerator-快速开发者的利器

基于MVC4+EasyUI的Web开发框架--Spring.Net.FrameworkV3.0总体介绍

SNF快速开发平台3.0之--MVC 打印解决方案

SNF快速开发平台3.0之--文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)

SNF快速开发平台3.0之--asp.net mvc4 强大的导出和不需要上传文件的批量导入EXCEL

SNF快速开发平台3.0之MVC通用控件库展示-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI +Knockout

SNF快速开发平台3.0之-界面个性化配置+10种皮肤+7种菜单-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

SNF快速开发平台3.0之-CS页面-Asp.net+Spring.Net.Framework

SNF快速开发平台3.0之--系统里广播的作用--迅速及时、简明扼要的把信息发送给接收者

.Net可扩展的单据编号生成器-SNF.CodeRule--SNF快速开发平台3.2的更多相关文章

  1. SNF开发平台WinForm之七-单据打印和使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    8.1运行效果: 8.2开发实现: 1.  先要创建.grf报表模版,指定数据列.存储位置:Reports\Template文件夹下 2.  之后在程序当中查出数据,之后把数据和打印模版 传入方法进行 ...

  2. 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

    下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...

  3. 审核流(2)流程设计-SNF.WorkFlow功能使用说明--SNF快速开发平台3.1

    流程设计 图形化的流程设计,更方便.直观 1.打开“流程设计“程序,如上.点击”新建“如下: 2.红色部分为必填项,审批对象是选择要审批的程序菜单,单据名称是在审核流流转时用于提示的单据名称,还要选择 ...

  4. SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: .组装站内信息发送实体对象. SNFService SNFService = new SNFService(); if (this.ucUser.SelectedIds ! ...

  5. SNF开发平台WinForm之十三-单独从服务器上获取PDF文件进行显示-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: 如果需要单独显示PDF文件时用下面代码去实现,指定url地址. 地址: . 获取附件管理的实体对象: List<KeyValuePair<string, obj ...

  6. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework

    1.调用前组装参数 2.调用发送信息服务脚本   .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...

  7. SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework

    原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...

  8. SNF开发平台WinForm之十-Excel导入-SNF快速开发平台3.3-Spring.Net.Framework

    7.1运行效果: 2.Excel导入开发实现 2.1. 创建窗体,修改命名空间 新增的窗体命名“FrmImport表名”,这个导入窗口比较其它窗口会特殊一些,需要继承BaseFormImport父级窗 ...

  9. SNF开发平台WinForm之九-代码生成器使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    下面就具体的使用说明: 1.获取代码生成器的授权码(根据本机)-----还原数据库-------改config-----代码生成器 改代码生成器Config 2.登录代码生成器 3.查看是否连接成功 ...

随机推荐

  1. java:冒泡排序、选择排序、插入排序实现

    整数排序 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 样例 样例 1: 输入: [3, 2, 1, 4, 5] 输出: [1, 2, 3, 4, 5] ...

  2. Topic路由模式

    原本理解的不够彻底,程序总是不太对.所以查询了资料,关于这种模式的意思做了仔细的解读,复制的文字. 一:介绍 1.模式 2.知识点 其中,#可以匹配一个或者多个字符 其中,*可以匹配一个字符 3.仔细 ...

  3. 000 Python的运行

    1.在命令行中运行 2.使用shell(IDLE) 3.新建.py脚本 只要是编辑器都可以 4.然后脚本在IDLE中运行 首先,需要先打开IDLE,然后使用File下面的open打开所需要的py文件, ...

  4. 素数筛选-hdu2710

    题目描述: 题目大意:找出具有最大素数因子的整数.如果有不止一个,则输出在输入文件中出现最早的一个. 解题思路:刚开始时,p数组中的元素全为0,刚开始对于素数 i,p[i]=0,用一个for循环,将是 ...

  5. HDU 1495 非常可乐【BFS】

    题目链接:https://vjudge.net/problem/HDU-1495 转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/6750320.ht ...

  6. Burp Suite之爬网模块(二)

    Spider功能 Burp Spider爬网介绍 Burp Spider 是一个映射 web 应用程序的工具.它使用多种智能技术对一个应用程序的内容和功能进行全面的清查. 通过跟踪 HTML 和 Ja ...

  7. css文字效果(文字剪贴蒙版,text-shodow的应用,文字排版等…)

    .katex { display: inline-block; text-align: initial; } .katex { font-family: Consolas, Inconsolata, ...

  8. 不一样的go语言-一样的语法

    前言   上一篇入门篇算是初识庐山真面目,我们知道了一个go程序的构成,在这里总结一下. //包名 package //导入包 import "fmt" //main方法,程序入口 ...

  9. iOS 技术篇:从使用到了解block底层原理 (一)

    1.概述 block : Object - C对于闭包的实现 . 闭包 = 一个函数(或是指向函数的指针) +该函数执行的外部的上下文变量(自由变量) 2.对block的理解 可以嵌套定义,定义 bl ...

  10. Javascript实现对象的继承

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼.压个啥样,就得是个啥样,不能随便动,动一动就坏了.而在Javascript中,没有模子,月饼被换成了面 ...