.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 游戏开发与实战第三章内容
变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...
随机推荐
- Redis 内存满了怎么办?这样设置才正确!
上回在<Redis 数据过期了会被立马删除么?>说到如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 再也不会被客户端请求,就无法走 ...
- matplotlib画图工具/绘制散点图
绘制散点图 import matplotlib.pyplot as plt fig=plt.figure() ax = fig.add_subplot(111) ax.scatter(x,y, s,c ...
- [操作系统]LINUX进程状态说明
R(task_running) : 可执行状态 只有在该状态的进程才可能在CPU上运行.而同一时刻可能有多个进程 处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的 ...
- Git 使用心得 & 常见问题整理
开源Linux 回复"读书",挑选书籍资料~ Git 流程图 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remot ...
- 是时候使用 YAML 来做配置或数据文件了
概述 我们做程序,经常需要用到配置信息,回顾一下这么多年的搬砖生涯,我记得用过多种格式的文件来定义配置信息,例如 ini文件,xml文件,或者现在比较流行的 json 文件. 这些年虽然云计算和云原生 ...
- Proxmox 7.2 部署 DoraCloud桌面云,支持vGPU
介绍 本文介绍了使用Proxmox + DoraCloud,将一台图形工作站(配置有Tesla P4显卡)改造成一台桌面云主机.可以满足多个桌面用户同时使用3D应用的需求. 该方案适合于小型工作室.电 ...
- Node.js的多版本管理工具 gnvm(win环境)的详细安装教程(图解步骤、通俗易懂、亲测有效)
前言 本篇随笔主要写了如何安装并使用node多版本管理工具gnvm(windowns环境下) 作为自己对多版本工具gnvm知识的总结与笔记. 百度云盘gnvm应用程序包 获取链接(个人应用地址如下): ...
- 牛客多校赛2K Keyboard Free
Description 给定 \(3\) 个同心圆,半径分别为 \(r1,r2,r3\) ,三个点分别随机分布在三个圆上,求这个三角形期望下的面积. Solution 首先可以固定 \(A\) 点,枚 ...
- 【可视化分析案例】用python分析B站Top100排行榜数据
一.数据源 之前,我分享过一期爬虫,用python爬取Top100排行榜: 最终数据结果,是这样的: 在此数据基础上,做python可视化分析. 二.数据读取 首先,读取数据源: # 读取csv数据 ...
- Cabloy-CMS中区块的开发与效果
关于区块 Cabloy-CMS引入了区块的概念,通过区块可以快速向文章添加各种类型的内容,比如:插入一个地图子页面.插入一首音乐,等等 Cabloy-CMS中的区块可以类比于Wordpress古腾堡编 ...