.NET ORM框架HiSql实战-第三章-使用自定义编号生成【申请编号】
一、引言
上一篇.NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查) 中菜单编号采用的是雪花ID,生成的编号无法自定义。比如本系统的一个申请业务,需要按前缀+日期+流水号的规则生成【申请编号】,这样就可以用到hisql的自定义编号。
hisql自定义编号不但可以生成雪花ID,很重要的是支持类似以下规则的编号:
规则1:20220001、202200001....到202299999 或到 2022ZZZZZ。
规则2:BH20220708000001、BH20220708000001....到BH20220708999999 或到 BH20220708zZZZZZ。
规则...
您也可以通过查看 Hisql流水编号 的各个参数的说明,解锁更多的编号规则,实现您想要的编号。
先看结果图:
二、使用步骤
1、 在文件第一章中的文件: HiSqlSetupExtension 加入编号对象的注入,这里必须是采用单例模式注入
using HiSql;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace H.CRM.Action.API.Helper
{
public static class HiSqlSetupExtension
{
public static IServiceCollection AddHiSqlSetup(this IServiceCollection services)
{
//注入HiSqlConfig
services.AddTransient<HiSqlConfig>();
//注入HiSqlClient
services.AddTransient<HiSqlClient>((d) =>
{
var config = d.GetService<HiSqlConfig>();
var hisql = new HiSqlClient(config);
return hisql;
});
services.AddSingleton((d) =>
{
#region 集群模式部署需要开启Redis
HiSql.Global.RedisOn = true;//开启redis缓存
HiSql.Global.RedisOptions = new RedisOptions { Host = "127.0.0.1", PassWord = "", Port = 6379, CacheRegion = "HISQL" };
HiSql.Global.NumberOptions.MultiMode = true;
#endregion
HiSql.Global.SnroOn = true;
var config = d.GetService<HiSqlConfig>();
HiSqlClient sqlClient = new HiSqlClient(config);
sqlClient.CodeFirst.InstallHisql();
var number = new SeriNumber(sqlClient);
return number;
});
return services;
}
}
class HiSqlConfig : ConnectionConfig
{
static readonly NLog.Logger logger = NLog.LogManager.GetLogger("HiSqlSetup");
public HiSqlConfig(IConfiguration configuration)
{
DbType = DBType.SqlServer;
DbServer = "HISQL";
ConnectionString = configuration.GetSection("ConnectionStrings:Admin").Value;
Schema = "dbo";
SqlExecTimeOut = 1000 * 5;
AppEvents = new AopEvent()
{
OnDbDecryptEvent = (connstr) =>
{
//解密连接字段
return connstr;
},
OnLogSqlExecuting = (sql, param) =>
{
//sql执行前 日志记录 (异步)
#if DEBUG
logger.Trace($"执行前sql:{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
#endif
},
OnLogSqlExecuted = (sql, param) =>
{
#if DEBUG
//sql执行后 日志记录 (异步)
logger.Trace($"执行后sql:{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
#endif
},
OnSqlError = (sqlEx) =>
{
//sql执行错误后 日志记录 (异步)
logger.Error($"执行错误:{sqlEx.Message} sql:{sqlEx.Sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
},
OnTimeOut = (int timer) =>
{
//logger.Trace($"执行超时:{timer} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
}
};
}
}
}
2、 配置编号服务。
在 HiSqlController 文件添加Action ConfigSNRO(), 然后在访问改地址,就完成编号的初始化。这个配置只有修改编号规则的时候初始化一次,也可以采用其他方式初始化。
using Microsoft.AspNetCore.Mvc;
using HiSql;
using System.Linq;
using System.Collections.Generic;
using HSMB.Model.Dto;
namespace HSMB.Admin.WebApi.Controllers
{
[Verify]
[Route("api/[controller]/[action]")]
[ApiController]
public class HiSqlController : ControllerBase
{
private readonly HiSqlClient sqlClient;
private readonly SeriNumber seriNumber;
public HiSqlController(
HiSqlClient hiSqlClient
, SeriNumber seriNumber
)
{
this.sqlClient = hiSqlClient;
this.seriNumber = seriNumber;
}
[HttpGet, HttpPost]
public IActionResult Install()
{
HiSql.Global.SnroOn = true; //启用编号。
sqlClient.CodeFirst.InstallHisql();
var tables = sqlClient.DbFirst.GetTables().ToList().Where(t => t.TabName.StartsWith("H"));
return new JsonResult(tables);
}
[HttpGet, HttpPost]
public IActionResult ConfigSNRO()
{
//配置表 "bus_request_person" 字段 "reqID" 使用 自定义编号,名称:request_person:
ConfigSnroInit(new Hi_Snro()
{
SNRO = BillNumberType.request_person, // public const string request_person = "request_person";
SNUM = 1,
IsSnow = false,
SnowTick = 0,
StartNum = "0000",
EndNum = "9999",
Length = 4,
CurrNum = "0000",
CurrAllNum = "",
PreChar = "",
IsNumber = true,
PreType = PreType.YM,
FixPreChar = "P",
IsHasPre = true,
CacheSpace = 10,
Descript = "申请单号"
}, "bus_request_person", "reqID");
return new JsonResult(true);
}
private void ConfigSnroInit(Hi_Snro snro, string tableName, string fieldName)
{
///配置加入到编号表
var cnt = sqlClient.Modi("Hi_Snro", snro).ExecCommand();
//
var json = sqlClient.Context.DMInitalize.GetTabStruct(tableName); //获取一下表表机构,系统自动将表结构信息插入到 Hi_FieldModel 中
// 修改 Hi_FieldModel 中配置,
sqlClient.Update(typeof(Hi_FieldModel).Name, new { TabName = tableName, FieldName = fieldName, SNO = snro.SNRO, SNO_NUM = snro.SNUM }).Only("SNO", "SNO_NUM").ExecCommand();
}
[HttpGet, HttpPost]
public IActionResult TestSNRO(string SNRO = BillNumberType.request_person, int SNO_NUM = 1)
{
var num = seriNumber.NewNumber(SNRO, SNO_NUM);
return new JsonResult(num);
}
}
}
启动项目通过测试代码可以看到编号没问题;
3、修改 BusrequestpersonController 代码,将生成【申请编号】的地方采用 SeriNumber对象生成。
注入对象:
采用 SeriNumber对象生成编号:
完成后,启用项目填写业务申请,可以看到生成的编号如开头的截图一样,是按照我们想要的规则生成编号的。
.NET ORM框架HiSql实战-第三章-使用自定义编号生成【申请编号】的更多相关文章
- .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)
一.引言 上一篇.NET ORM框架HiSql实战-第一章-集成HiSql 已经完成了Hisql的引入,本节就把 项目中的菜单管理改成hisql的方式实现. 菜单管理界面如图: 二.修改增删改查相关代 ...
- .NET ORM框架HiSql实战-第一章-集成HiSql
一.引言 做.Net这么多年,出现了很多很多ORM框架,比如Dapper,Sqlsugar,Freesql等等.在之前的项目中,用到的ORM框架也大多数是这几个老牌的框架. 不过最近园子关于.NET ...
- Rxjava2实战--第三章 创建操作符
Rxjava2实战--第三章 创建操作符 Rxjava的创建操作符 操作符 用途 just() 将一个或多个对象转换成发射这个或者这些对象的一个Observable from() 将一个Iterabl ...
- c# 轻量级 ORM 框架 之 DBHelper 实现 (三)
周末了比较清闲,把自己的orm框架整理了下,开源了. 已经做出来的东西通常感觉有些简单,一些新手或许听到"框架"一类的词觉得有些"高深",简单来说orm就是把a ...
- .NET Core3.1 Dotnetty实战第三章
一.概要 本章主要内容就是讲解如何在dotnetty的框架中进行网络通讯以及编解码对象.数据包分包拆包的相关知识点. 后续会专门开一篇避坑的文章,主要会描述在使用dotnetty的框架时会遇到的哪些问 ...
- 学习笔记-[Maven实战]-第三章:Maven使用入门(1)
说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...
- .NET Core IdentityServer4实战 第三章-使用EntityFramework Core进行持久化配置
内容:本文带大家使用IdentityServer4进行使用使用EntityFramework Core进行配置和操作数据 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 前两章内容 ...
- ORM框架(ITDOS实战源码)
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁. 如以下示例: public int GetSystem ...
- DirectX12 3D 游戏开发与实战第三章内容
变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...
随机推荐
- XCTF练习题---CRYPTO---Railfence解析
XCTF练习题---CRYPTO---Morse解析 flag:cyberpeace{railfence_cipher_gogogo} 解题步骤: 1.观察题目,下载附件进行查看 2.根据题目提示,发 ...
- ucore lab4 内核线程管理 学习笔记
越学越简单,真是越学越简单啊 看视频的时候着实被那复杂的函数调用图吓到了.看代码的时候发现条理还是很清晰的,远没有没想象的那么复杂. 这节创建了俩内核线程,然后运行第一个线程,再由第一个切换到第二个. ...
- 通过代码解释什么是API,什么是SDK?
这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个. 当时我没能说清楚,回去之后就上百度查.结果查了很久还是看不懂,然后就把这个问题搁置了. 谁知道毕业正式工作后,又再一次地面对了这 ...
- .net 关于Task.Run 和 Async await的执行顺序
一直捋不清楚用Task.Run异步的执行关系,网上找的些说明写得也有点复杂,所以自己做实验测一下. 直接上代码 这个是加await private static void TestFun() { Co ...
- 一次 HTTP 请求就需要一次 TCP 连接吗?
一次 HTTP 请求就需要一次 TCP 连接吗? 本文写于 2021 年 2 月 9 日 太长不看版本:短连接需要,长连接不需要. 一次 HTTP 请求就需要一次 TCP 连接吗? TCP 的连接与断 ...
- 华为OPS,自定义命令,动态执行命令
OPS 开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...
- 常见的邮箱服务器(SMTP,POP3)地址,端口
163.com: POP3服务器地址:pop.163.com(端口:110) SMTP服务器地址:smtp.163.com(端口:25) sina.com: POP3服务器地址:pop3.sina.c ...
- 配置中心Nacos(服务发现)
服务演变之路 单体应用架构 在刚开始的时候,企业的用户量.数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码.编译.打包并且部署在⼀个Tomcat容器中的架构模式就是单体应用架构,这样的架构既 ...
- 详解SQL操作的窗口函数
摘要:窗口函数是聚集函数的延伸,是更高级的SQL语言操作,主要用于AP场景下对数据进行一些分析.汇总.排序的功能. 本文分享自华为云社区<GaussDB(DWS) SQL进阶之SQL操作之窗口函 ...
- 面试官:Dubbo怎么实现服务降级,他有什么好处?
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,今天周一了,招聘软件 ...