对于很多业务系统都需要生成业务流水号,如果订单号、购采单号等等;而这些业务流水号并不是简单的一个增长数值,它们很多时候都有一些不同的规则来定义,如不同类型的字母或地区拼音简写等。为了更灵活生成这些有规则的业务流水号BeetleX提供对应的组件,接下来简单介绍一下组件的使用。

首先需要通过Nuget引用BeetleX.BNR组件,然后通过以下方法即可以生业务流水号

for (int i = 0; i < 10; i++)
{var number = await BNRFactory.Default.Create("[CN:广州][D:yyyyMMdd][N:[D:yyyyMMdd]/000000]");Console.WriteLine(number);
}

那个规则看上去好像很复杂,不过先看一下结果输出是怎样的

GZ20220520000008
GZ20220520000009
GZ20220520000010
GZ20220520000011
GZ20220520000012
GZ20220520000013
GZ20220520000014
GZ20220520000015
GZ20220520000016
GZ20220520000017

以上流水号规则是[广州拼间首字母]+[年月日]+[基于年月日为标识的6位自增量]。

组件提供的规则是由表达式组成,规则可以根据需求定义多个表达式;表达式的编写方式是[表达式函数:参数]。接下来介绍一下组件提供的基础表达式

[CN:中文]

返回对应中文信息拼间首字线大写

[N:标识/填充格式]

根据标识来生成对应自增量的数字

[D:日期格式]

根据日期输出当前日期

[S:字符]

输出一个指定的字符

有了上面的描述,接下来定义一个简单的规则

[CN:广州][D:yyyyMMdd]

相信对应回上面的表达式应该能知道结果了。

 自定义表达式

组件默认提供的表达式有限,但可以根据实际需求来制定一个表达式,可以通过查看一个默认的表达式相信更容易理解

/// <summary>/// {D:yyyyMMdd}/// </summary>[ParameterType("D")]public class DateParameterHandler : IParameterHandler{public Task Execute(StringBuilder sb, string value){sb.Append(DateTime.Now.ToString(value));return Task.CompletedTask;}public BNRFactory Factory{get;set;}}

以上是日期输出的表达式。

使用Redis自增

组件虽然提供了一个自增量的表达式,但存在一个问题就是不同服务之间是无法同步的;通过借助于Reids的自增函数就能实现不同服务中生成唯一的自增数。虽然这个表达式组件集成了,但并没有直接引入到默认表达式模块中,需要使用者单独引入

DefaultRedis.Instance.Host.AddWriteHost("localhost");
BNRFactory.Default.Register("redis", new RedisSequenceParameter(DefaultRedis.Instance));
var number = await BNRFactory.Default.Create("[CN:广州][redis:[D:yyyy]/000000]");

根据需要注册一个表达式名称即可使用。这个Redis的自增表达式实现也非常简单

public class RedisSequenceParameter : IParameterHandler{public RedisSequenceParameter(Redis.RedisDB db){mRedisDB = db;}private Redis.RedisDB mRedisDB;public BNRFactory Factory { get; set; }public async Task Execute(StringBuilder sb, string value){string[] properties = value.Split('/');StringBuilder key = new StringBuilder();string[] items = RuleAnalysis.Execute(properties[0]);foreach (string p in items){string[] sps = RuleAnalysis.GetProperties(p);IParameterHandler handler = null;if (Factory.Handlers.TryGetValue(sps[0], out handler)){await handler.Execute(key, sps[1]);}}var redisKey = key.ToString();var number = await mRedisDB.Incr(redisKey);sb.Append(number.ToString(properties[1]));}}

示例代码:

https://github.com/beetlex-io/BeetleX-Samples/tree/master/BeetleX.BNR.App

BeetleX

开源跨平台通讯框架(支持TLS)

提供HTTP,Websocket,Redis,RPC和服务网关开源组件

https://beetlex-io.com

业务流水号规则生成组件相关推荐

  1. ORM映射框架总结--SQL 语句生成组件

    1.       SQL 语句生成组建 之前说过ORM框架中有一个非常重要的组件,那就是SQL语句生成组件.SQL语句生成组件,顾名思义就是用于生成sql语句的一个组件.之前的Attribute 是用 ...

  2. Angular-cli生成组件修改css成less或sass

    使用cli命令生成组件: ng generate component 组件名 生成出来的组件文件有:html / ts / css / spec.ts 问题我是一个less重度患者怎么可能再去写css ...

  3. 【Groovy】集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )

    文章目录 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 二.代码示例 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 调用集合的 collect ...

  4. 文档生成组件工作估算

    笔者最近做一个系统的工作量预估,其中包含一个通用组件,文档生成组件的工作量预估,在此分享下. 功能要求:通过定制文档模板,依据设置的文档数据,抽取数据或图表,生成文档,记录所有生成文档,实现文档查询. ...

  5. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    原文:.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用 在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了 ...

  6. registerModule: 动态注册vuex模块,对于自定义生成组件很有用

    registerModule: 动态注册vuex模块 <div class="reference">在 store 创建之后,你可以使用 store.registerM ...

  7. 决策树算法原理以及决策树规则生成方法

    决策树算法原理以及决策树规则生成方法 决策树是一种可解释性较强的策略分析工具.creditmodel提供了分类回归树和条件推断树两种决策树生成和提取规则的方法. 每一个风险管理人员都应该掌握使用决策树 ...

  8. 根据编号规则生成规则编号

    /*** 根据编号规则生成规则编号* @param rule 前缀* @param num 数字位数* @param orderField 排序字段* @param table 表名* @param ...

  9. java 按规则生成编码_填值规则(编码生成)

    > 自动生成规则编码,比如: 订单号的生成,前缀+年月日时分秒 时间戳 如果创建一个规则实现? * 第一步:实现接口 IFillRuleHandler 参考实例: ``` /** * 填值规则D ...

最新文章

  1. 人工智能改变生活的10种方式
  2. Spark 1.6发布:引入Dataset接口
  3. 用Chrome开发者工具调试一切
  4. shell在二级python_在Shell脚本中检查Python版本的方法
  5. 邯郸学院计算机专业是本科还是专科,邯郸学院是大学吗 是本科还是专科
  6. python格式化转换_(转)python 格式化输出及%用法
  7. 使用Spring Boot来加速Java web项目的开发
  8. Easytrader踩坑之旅(一)
  9. 使用fat jar和proguard对包含第三方依赖包的java代码进行打包混淆
  10. memset初始化值的效率秒杀for循环
  11. 清华数据结构c语言版严蔚敏pdf,清华数据结构习题集答案(C语言版严蔚敏).pdf
  12. qcc512x_qcc302x开发调试笔记
  13. 新西兰计算机科学硕士哪所大学最好,2020年新西兰哪些大学计算机科学专业比较好及其优势介绍...
  14. 特征选择与特征权重计算的区别
  15. Mac 配置 Terminal 代理
  16. SNKr:创造新的潮圈文化 将区块链与时尚潮流结合
  17. YOLOv3 物体识别显示中文标签
  18. 笔记:《深入浅出统计学》第八、九章:概率密度、正态分布(高斯分布)
  19. 跨境12V汽车一键启动PKE无钥匙进入遥控远程启动系统改装
  20. 不思议迷宫:逆向后的放置play

热门文章

  1. 开源囧事4:你们这些卖代码的能不能留自己的QQ号?留我QQ号干嘛?
  2. 爬取百度图片(正则表达式)
  3. 计算机专业开题报告指导老师意见评语,开题报告指导教师评语内容及精选范文...
  4. 超巧妙的设置密码的方法
  5. 2014年华为上机题目
  6. 搜狗输入法中文状态下,打出来还是英文
  7. Win7系统访问局域网-取消需要密码的方法
  8. java软件开发案例整合_30个java练手实战项目,让理论与实践相结合,献给嗜学如命的奋斗人...
  9. 档案管理系统软件测试用例,在线考试系统软件测试用例报告
  10. intellij idea 项目目录类文件有对号和数字