文档章节

通用可配置业务流水号生成设计

泥水佬
 泥水佬
发布于 2016/03/10 15:36
字数 565
阅读 290
收藏 7

        有一段时间没有思考代码相关的工作了,最近项目经常碰到不同业务流水号的生成,下面的技术人员每次都针对流水号生成写一些复杂的代码;为了解放以后这方面的工作于是动了一下脑子想一个动态可配置的流水号生产组件,虽然没写代码一段时间但脑子在这方面还是挺灵活,大概想了一下基本就构建出一个通用业务流水号配置功能,以下分享一下这个设计。

流水号拆分

其实业务流水号都是由不同总分组成,每部分都表达不同的含意。所以在设计上需要对流水号进行分解。以"GZ201602020001RJ"的主要组成部分:{GZ}{20160202}{0001}{RJ}

  • {GZ}
    这个规则主要是描述所在城市地区
  • {20160202}
    当前业务所在的年月日
  • {0001}
    当天递增量
  • {RJ}
    固定业务类型

       总的来说,业务流水号都是由不同参数所组成。

设计

在设计上必须由一个基础的设计模型来支持不同参数的来源和扩展,可能定义一个基础的结构{Type:Parameter}。那流水号的组成规则是{Type1:Parameter}{Type2:Parameter}{Type2:Parameter},通过不同的规则拼装而成;在技术可以定义一个接口来定义一个参数的定义。

public interface IParameterHandler
{
    void Execute(StringBuilder sb, string value);
}

针对以上规则定义一个简单针对中文获取首拼音的规则:{CN:广州},针对这情况可以实现如下:

/// <summary>
    /// {CN:广州}
    /// </summary>
    [ParameterType("CN")]
 public class ChineseSpellCodeParameter : IParameterHandler
 {
        public void Execute(StringBuilder sb, string value)
        {

            foreach (char item in value)
            {
                sb.Append(Hz2Py.Convert(item.ToString()).Substring(0, 1));
            }

        }
}

        经过参数模块解释{CN:广州}=GZ

        通过这种方式可以扩展出很多很多不同的可配置的参数规则来满足应用的需要。

整体使用效果

针对最开始的那个业务号详细定义规则如下:{CN:广州}{D:yyyyMMdd}{N:{D:yyyyMMdd}/0000}{S:RJ}

string[] rule = new string[]{ 
                "{CN:广州}{D:yyyyMMdd}{N:{D:yyyyMMdd}/0000}{S:RJ}"
            };
            foreach (string item in rule)
            {
                string value = BNRFactory.Default.Create(item);
                Console.WriteLine(item);
                Console.WriteLine(value);
            }

© 著作权归作者所有

共有 人打赏支持
泥水佬

泥水佬

粉丝 72
博文 87
码字总数 57518
作品 7
广州
架构师
私信 提问
加载中

评论(2)

_凤求凰_
_凤求凰_

引用来自“对岸”的评论

流水号泄露当天交易量不好吧~

哈哈。我也想说这个来着
对岸
对岸
流水号泄露当天交易量不好吧~
Spring Boot 工程集成全局唯一ID生成器 Vesta

本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! --- 概 述 在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中给大家推荐了一款由百度开发的基于 Snowflake算...

CodeSheep
2018/11/22
0
0
个人对架构设计理解

今天的文章不涉及到代码方面的东西,只是说说思想方面的东西,当然,我说的这些其实很简单,毕竟我也只是做了2年的程序而已,但未必每个团队都是这么做的。 首先就是如何分层,分几层。很多情...

zting科技
2017/01/12
0
0
PHP生成订单号算法

首先,订单号不适合用自增字段,因为会暴露一个网站的业务量(参见“德国坦克问题” http://en.wikipedia.org/wiki/Germantank_problem)。另外,通常在订单在写入数据库之前,业务就需要用到...

jims
2016/08/28
0
0
OpenJweb快速开发平台字段默认值生成器

OpenJweb快速开发平台中可设置任意字段的默认值规则,同时也可以在规定的默认值生成器类中增加新的字段默认值生成规则,这样为任意表字段设置默认值就大大减少了开发工作量,目前字段默认值生成...

迷途d书童
2012/03/09
41
0
mysql并发插入重复数据问题的解决思路

一、问题描述 涉及到的功能是一个表单页面添加数据,后端接口的功能就是往数据库中写入表单的数据,系统属于后台系统,但因为跟钱有关,添加的数据要保证同一次填写的数据只能入一次库。 测试...

八月下沙
2016/12/21
206
0

没有更多内容

加载失败,请刷新页面

加载更多

redis&memcached&SQL&NoSQL

Why 一个应用肯定有两部分逻辑:数据逻辑和业务逻辑。 数据逻辑包括各种I/O,和内部的数据的处理,也就是在内部如何组织数据结构,变量也属于这一部分。 当一个应用变成一个进程,它负责数据逻...

backbye
今天
2
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部