在Winform应用中增加通用的业务编码规则生成

这篇具有很好参考价值的文章主要介绍了在Winform应用中增加通用的业务编码规则生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们很多应用系统中,往往都需要根据实际情况生成一些编码规则,如订单号、入库单号、出库单号、退货单号等等,我们有时候根据规则自行增加一个函数来生成处理,不过我们仔细观察后,发现它们的编码规则有很大的共通性,因此可以考虑使用一些通用的业务编码规则生成,从而在系统中统一维护即可,本篇随笔介绍如何在WInform界面中实现通用的业务编码规则生成。

1、常见单号的业务编码规则

刚才我们提到一些编码规则,如订单号、入库单号、出库单号、退货单号等等,它们都是有大同小异的规则,有前缀、有日期的编码、有一些流水号,还有一些特殊的规则处理,往往就是这些,需要协调好流水号的增加处理即可。

例如,原来在我的CRM业务模块中,增加了一个函数,用来生成订单号的,如下所示。

        /// <summary>
        /// 生成单据号码,编码为XS-{userId}-{yyyyMMdd}-流水号
        /// </summary>
        /// <returns></returns>
        public async Task<string> GetOrderNo()
        {
            string prefix = string.Format("XS-{0}-{1}", CurrentApiUser.Id, DateTime.Now.ToString("yyyyMMdd"));

            //获取当天的记录数量+1
            DateTime currentDate = DateTime.Now.ToString("yyyy-MM-dd").ToDateTime(); //当前日期
            //计算条件数量+1
            int count = this.EntityDb.Count(s => s.OrderDate >= currentDate && s.OrderDate <= currentDate.AddDays(1)) + 1;

            //循环检索,直到不重复的编号
            string number = string.Format("{0}-{1}", prefix, count);
            while (true)
            {
                var result = await CheckNumberExist(number);
                if (result)
                {
                    //存在增加1再判断
                    number = string.Format("{0}-{1}", prefix, count++);
                }
                else
                {
                    break;
                }
            }

            return number;
        }

这里为了增加对流水号的循环判断,直到没有重复的即可输出来作为订单号。

大多数的编码规则大同小异,因此我们可以考虑使用共同的规则进行处理,类似我们通用字典的模块处理。订单编码,可以在新建订单的时候生成,也可以提供用户手动生成【生成编号】的操作,如下界面所示。

在Winform应用中增加通用的业务编码规则生成

 文章来源地址https://www.toymoban.com/news/detail-748139.html

2、设计通用的业务编码规则

我们归纳了一些编码规则,基本上也就是前缀,日期分隔,分隔符,后缀,流水号这些元素的组合,如果需要更加复杂的也可以自行调整接口,我们这里设计一个通用的编码规则,对这些元素进行组合配置,数据库设计如下所示。

在Winform应用中增加通用的业务编码规则生成

根据这些内容,我们使用手工编码或者代码生成工具生成相关的基础代码 (可以基于EnterpriseLibrary的框架代码或者基于SqlSugar开发框架的代码),最终我们都用于WInform的界面调用。

这里以我们基于SqlSugar开发框架的代码生成为例。

在Winform应用中增加通用的业务编码规则生成

生成后,会生成一个相关的业务类,实现相关的CRUD接口,如下代码定义所示,如果你有自己的基础框架实现,那么也可以忽略具体的代码生成,关注业务编码的生成的的规则即可。

   /// <summary>
   /// 业务表编码规则 应用层服务接口实现
   /// </summary>
   public class TableNumberService : MyCrudService<TableNumberInfo, string, TableNumberPagedDto>, ITableNumberService

为了控制编码的规则生成,我们增加一个同步锁来实现冲突处理。

        /// <summary>
        /// 同步锁
        /// </summary>
        private static SemaphoreSlim syncRoot = new SemaphoreSlim(1);

最终我们的实现代码如下所示。

        /// <summary>
        /// 根据定义表名、单据头、分割符1、分割符2,生成业务编码。如果生成错误,返回空字符串
        /// </summary>
        /// <param name="tableNameOrCode">表名或代码</param>
        /// <returns></returns>
        public async Task<string> GenerateNumber(string tableNameOrCode)
        {
            string businessNumber = "";
            await syncRoot.WaitAsync(); //等待锁
            try
            {
                var info = await base.GetFirstAsync(s => s.TableName == tableNameOrCode || s.Code == tableNameOrCode);
                if (info != null)
                {
                    string currentDate = "";
                    string lastDate = "";
                    int currentNumber = 1; //流水号起始值
                    int serialLength = 3; //流水号长度

                    if(!info.LastGenerateTime.HasValue)
                    {
                        info.LastGenerateTime = DateTime.Now;
                    }

                    if (info.RuleFormat == "年月日")
                    {
                        currentDate = DateTime.Now.ToString("yyyyMMdd");
                        lastDate = info.LastGenerateTime.Value.ToString("yyyyMMdd");
                    }
                    else if (info.RuleFormat == "年月")
                    {
                        currentDate = DateTime.Now.ToString("yyyyMM");
                        lastDate = info.LastGenerateTime.Value.ToString("yyyyMM");
                    }

                    //如果当前日期和最后日期不一致,流水号重置为0
                    if(!currentDate.Equals(lastDate))
                    {
                        info.CurrentValue = 0;
                    }

                    //如果流水号非起始值,那么累计计算
                    if(info.CurrentValue.HasValue && info.CurrentValue >= 0)
                    {
                        currentNumber = (int)info.CurrentValue + 1;//流水号当前值
                    }

                    //流水号长度
                    if(info.ValueLength.HasValue && info.ValueLength > 3)
                    {
                        serialLength = (int)info.ValueLength;//流水号长度
                    }
                    var SplitString1 = string.IsNullOrEmpty(info.SplitString1) ? "-" : info.SplitString1;
                    var SplitString2 = string.IsNullOrEmpty(info.SplitString2) ? "-" : info.SplitString2;

                    //生成业务编码
                    businessNumber = $"{info.Prex}{SplitString1}{currentDate}{SplitString2}{currentNumber.ToString().PadLeft(serialLength, '0')}{info.Suffix}";

                    //更新记录
                    info.CurrentValue = currentNumber;
                    info.SplitString1 = SplitString1;
                    info.SplitString2 = SplitString2;
                    info.CurrentNumberString = businessNumber;
                    info.LastGenerateTime = DateTime.Now;//更新最后生成编码日期

                    await base.UpdateAsync(info);
                }
            }
            catch (Exception ex)
            {
                var errorText = $"生成单号时出现错误:{ex.Message}";
                LogTextHelper.Error(errorText, ex);
            }
            finally
            {
                syncRoot.Release();//释放锁
            }

            return businessNumber;
        }

上面主要注意的就是流水号的生成,这个稍微特殊处理一下,如果定义的规则是年月日,那么和最后的生成日期和当前日期不一致的话(转换为年月日对比),就认为流水号重新重置为1,否则是同一天的,流水号递增即可。如果是年月的,也是判断最后日期和当前日期的年月是否一致,不一致则重置为1,否则递增。注意流水号的编码长度,一般为4位,如果不满足的可以增加到6位等。

最终我们实际的业务编码的管理界面和查看的对应编码的界面如下所示,供参考设计界面处理。

在Winform应用中增加通用的业务编码规则生成

编辑单个业务编码规则的界面如下所示。

在Winform应用中增加通用的业务编码规则生成

 为了方便,我们这里提供一个【测试生成】的按钮,用于测试具体的编码生成,我们具体的业务调用,就是类似这个调用即可。

var handNo = await BLLFactory<ITableNumberService>.Instance.GenerateNumber(tableNameOrCode);

同样,我们也可以把这个界面搬到WPF框架界面上去,可以重用具体的业务编码规则处理,如上类似的界面处理。

在Winform应用中增加通用的业务编码规则生成

 单个通用的业务编码规则的编辑界面如下所示。

在Winform应用中增加通用的业务编码规则生成

 因此,不管对于Winform还是WPF的界面,他们的展示方式都是类似的,我们可以重用业务层对通用编码规则的定义。

 

到了这里,关于在Winform应用中增加通用的业务编码规则生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 生成式AI对业务流程有哪些影响?企业如何应用生成式AI?一文看懂

    集成与融合类ChatGPT工具与技术,以生成式AI变革业务流程 ChatGPT背后的生成式AI,聊聊生成式AI如何改变业务流程 ChatGPT月活用户过亿,生成式AI对组织的业务流程有哪些影响? 生成式AI对业务流程有哪些影响?企业如何应用生成式AI?一文看懂 业务流程将因生成式AI变革,ChatGPT引领

    2024年02月09日
    浏览(38)
  • MySQL用的在溜,不知道业务如何设计也白搭!!!

    作者: 博学谷狂野架构师 GitHub: GitHub地址 (有我精心准备的130本电子书PDF) 只分享干货、不吹水,让我们一起加油!😄 范式设计 范式概述 第一范式: 当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式

    2023年04月27日
    浏览(44)
  • 第52天:WEB攻防-通用漏洞&弱口令安全&社工字典生成&服务协议&Web应用

    思维导图 前置知识 案例一:Zblog-密文 MD5 传输加密猜解 案例二:服务类-SSHRDP 远程终端猜解 案例三:应用类-ZIPWord 文件压缩包猜解 案例四:github上收集的常见服务器设备,协议,以及常见平台默认密码 产生原因: 安全意识:自己设置的xiaojie123弱密码 初始化:初始密码为

    2024年04月14日
    浏览(34)
  • GIT版本号命名通用规则,开源项目版本号通用规则

    该规则对版本的迭代顺序命名做了很好的规范,其版本号的格式为 X.Y.Z(又称为Major.Minor.Patch) ,递增的规则为: 序号 格式要求 说明 X 非负整数 表示主版本号(Major),当API的兼容性变化时,X需递增。 Y 非负整数 表示次版本号(Minor),当增加功能时(不影响API)的兼容性

    2024年02月07日
    浏览(27)
  • HummerRisk V0.9.0:增加RBAC 拓扑图,云检测、漏洞、主机等模块增加规则

    HummerRisk V0.9.0发布:增加RBAC 资源拓扑图,首页新增检查的统计数据,云检测、漏洞、主机等模块增加规则,对象存储增加京东云,操作审计增加金山云,镜像仓库新增设置别名。 感谢社区中小伙伴们的反馈,你们的认可是我们前进的动力。 HummerRisk 保持高速的迭代,期待您

    2023年04月08日
    浏览(25)
  • GoRules:Go的业务规则引擎

    ZEN Engine 是一个跨平台、开源业务 规则 引擎 (BRE)。它是用 Rust 编写的,并提供NodeJS、 Python 和Go的本机绑定。 ZEN Engine 允许从 JSON 文件加载和执行 JSON 决策模型 (JDM)。 我们的JDM Editor存储库上提供了开源 React 编辑器。 安装 go get github.com/gorules/zen-go 用法 ZEN Engine 构建为可嵌入的

    2024年02月19日
    浏览(18)
  • 安全策略与业务需求不匹配:安全规则与业务流程的优先级不一致

    随着网络攻击手段层出不穷、黑客技术的日益升级和网络安全法规的日益严格化,企业在保障信息安全的同时也面临着越来越大的压力和挑战。其中一个突出的问题是**安全策略与业务需求的不匹配问题**。这主要表现为安全规则的制定与企业日常的业务流程存在很大的差异和

    2024年01月21日
    浏览(35)
  • Protobuf编码规则

    该表显示了在  .proto  文件中指定的类型,以及自动生成的类中的相应类型: .proto Type Notes C++ Type Java/Kotlin Type[1] Java/Kotlin 类型 [1] Python Type[3] Go Type Ruby Type C# Type PHP Type Dart Type double double double float float64 Float double float double float float float float float32 Float float float double int32 var

    2024年02月02日
    浏览(19)
  • 复杂业务系统的通用架构设计法则

    我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两点: 由点组成 点之间有各种关联 两点的规模和复杂性直接决定了系统的复杂程度。比如

    2024年02月08日
    浏览(41)
  • Matlab在编码中增加CRC和交织功能

    我们在MATLAB中定义一个类(class),包含了CRC生成函数和检验函数(囊括了常用的CRC多项式)

    2024年02月10日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包