业务流水号规则生成组件

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了业务流水号规则生成组件相关的知识,希望对你有一定的参考价值。

        对于很多业务系统都需要生成业务流水号,如果订单号、购采单号等等;而这些业务流水号并不是简单的一个增长数值,它们很多时候都有一些不同的规则来定义,如不同类型的字母或地区拼音简写等。为了更灵活生成这些有规则的业务流水号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

以上是关于业务流水号规则生成组件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 存储过程生成流水号

生成规则怎么写

基于Oracle Sequence的流水号生成规则

js生成流水号自增

怎么生成流水号

mysql 生成流水号 存储过程 订单编号