关于计数以及Index返回订单号升级版002(控制字符长度,控制年月标记,拾取未使用编号)--使用两个表来满足操作

1实现步骤以及说明

1.根据参数获取当前setNoIndex表里现在的No的index值,如果包含关键字当前对应数据,则现在SetIndexNoLeft 表中找到有无未使用并未占用的那条数据(被占用的数据IsTaken=1,生成后使用当前时间与updated时间进行比对,然后时间超过30分钟后会把状态变更为 IsTaken =0 ),如果有就返回,如果没有就创建一条新的SetIndexNoLeft记录并返回。
2.如果当前SetNoIndex下面没有数据,则新建一条数据,并且在SetIndexNoLeft 创建一条新数据创建时 IsTaken就是1,被占用。
3.在主要对象需要插入时,插入成功后数据进行删除当前 这一条Id的SetIndexNoLeft数据。

2数据库表:

表1:年月日数据生成Index数据表

USE [YingyuYubingBaogao2023]
GO/****** Object:  Table [dbo].[SetNoIndex]    Script Date: 2023/8/17 17:54:05 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE TABLE [dbo].[SetNoIndex]([Id] [int] IDENTITY(1,1) NOT NULL,[NoType] [int] NULL,[ThisIndex] [int] NULL,[ThisSigle] [nvarchar](30) NULL,[KeyWord] [nvarchar](30) NULL,[CreateDate] [datetime] NULL,[Updated] [datetime] NULL
) ON [PRIMARY]GOALTER TABLE [dbo].[SetNoIndex] ADD  CONSTRAINT [DF_SetNoIndex_CreateDate]  DEFAULT (getdate()) FOR [CreateDate]
GOALTER TABLE [dbo].[SetNoIndex] ADD  CONSTRAINT [DF_SetNoIndex_Updated]  DEFAULT (getdate()) FOR [Updated]
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0月累计,1日累计,2年累计,3,总共累计' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'NoType'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'当前排序' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'ThisIndex'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'当前标记(如果是日累计就是20230802,如果是月累计就是 202308 ,如果是年累计就是 2023,如果是 所有累计就是0)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'ThisSigle'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'关键字' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'KeyWord'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'CreateDate'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'更新时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex', @level2type=N'COLUMN',@level2name=N'Updated'
GOEXEC sys.sp_addextendedproperty @name=N'Name', @value=N'编号自动生成器' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetNoIndex'
GO

表2: 生成的临时编号表

USE [YingyuYubingBaogao2023]
GO/****** Object:  Table [dbo].[SetIndexNoLeft]    Script Date: 2023/8/17 17:55:46 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE TABLE [dbo].[SetIndexNoLeft]([Id] [int] IDENTITY(1,1) NOT NULL,[NoIndexId] [int] NULL,[NoLeft] [nvarchar](40) NULL,[IsTaken] [bit] NULL,[Updated] [datetime] NULL
) ON [PRIMARY]GOALTER TABLE [dbo].[SetIndexNoLeft] ADD  CONSTRAINT [DF_SetIndexNoLeft_Updated]  DEFAULT (getdate()) FOR [Updated]
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'编号IndexId' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetIndexNoLeft', @level2type=N'COLUMN',@level2name=N'NoIndexId'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'剩下的编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetIndexNoLeft', @level2type=N'COLUMN',@level2name=N'NoLeft'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否被占用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetIndexNoLeft', @level2type=N'COLUMN',@level2name=N'IsTaken'
GOEXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'处理时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetIndexNoLeft', @level2type=N'COLUMN',@level2name=N'Updated'
GOEXEC sys.sp_addextendedproperty @name=N'Name', @value=N'编号拾取的明细端' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SetIndexNoLeft'
GO

3.需要的Model对象创建

 public class SetIndexNoLeft{/// <summary>/// /// </summary>[Description("")]public int Id { get; set; }/// <summary>/// 编号IndexId/// </summary>[Description("编号IndexId")]public int NoIndexId { get; set; }/// <summary>/// 剩下的编号/// </summary>[Description("剩下的编号")]public string NoLeft { get; set; }/// <summary>/// 是否被占用/// </summary>[Description("是否被占用")]public bool IsTaken { get; set; }/// <summary>/// 处理时间/// </summary>[Description("处理时间")]public DateTime Updated { get; set; }/// <summary>/// 设置好的No全部/// </summary>public string NoOut { get; set; }}

参考的枚举实例(你可能用不到):

    /// <summary>/// 编号类型/// </summary>public enum ENoTypes{报告编号,客户编号,用户编号,样本编号,店铺编号,样本类型编号,项目编号}

4 DAL数据库操作类。

namespace DAL
{/// <summary>/// 编号自动生成器操作类/// </summary>public class DALSetNoIndex{ /// <summary>///获取当前 0月累计,1日累计,2年累计,3,总共累计/// </summary>/// <param name="SetNoType"> 0月累计,1日累计,2年累计,3,总共累计</param>/// <param name="SetKeyword">当前关键字(需要的表单名子)</param>/// <param name="OutIndexLength">index编号长度 0001 就是4 </param>/// <returns></returns>public SetIndexNoLeft GetIndexNo(string SetKeyword, int SetNoType = 0, int OutIndexLength = 5){string sql = $@"declare  @SetNoType int ,@SetThisSigle nvarchar(10), @SetKeyword nvarchar(10),@ThisDate nvarchar(20),@OutStr nvarchar(20),@OutStrLength int;
set @ThisDate =CONVERT(nvarchar, getdate(), 112);---当前日期全部数据(20230108)
set @SetNoType = {SetNoType};--设定类型
set @OutStrLength ={OutIndexLength};--序号保留多少位
set @SetKeyword = '{SetKeyword}';---当前关键字
Update SetIndexNoLeft set IsTaken = 0 where  datediff( minute , Updated , getdate() )>60 and IsTaken =1 ;---先更新本表中所有已过期的数据 30分钟期限
if (@SetNoType = 0)--0月累计
beginset @SetThisSigle = SUBSTRING(@ThisDate,1,6); 
end
else if(@SetNoType =1 )--1日累计
beginset @SetThisSigle = @ThisDate; 
end
else if(@SetNoType =2)--2年累计
begin set @SetThisSigle = SUBSTRING(@ThisDate,1,4); 
end 
else --3总共累计
beginset @SetThisSigle='';
end declare @SetIndex int ,@OPIndexId int,@OPIndexNoLeftId int,@HebingOutNo nvarchar(20) ;  ----@OPIndexId 为获取到当前Id ,@OPIndexNoLeftId  是获取当前数据条,@HebingOutNo 是当前要导出的数据set @OPIndexNoLeftId  = 0;---初始化输出表Idif  exists(select * from  SetNoIndex where KeyWord = @SetKeyword  and  ThisSigle = @SetThisSigle )begin -- 如果存在就更新 select @OPIndexId  = Id  from  SetNoIndex where KeyWord = @SetKeyword  and  ThisSigle = @SetThisSigle --获取对应Id--select @OPIndexId as OPIndexId ;if  exists(select * from  SetIndexNoLeft  where [NoIndexId] = @OPIndexId   and  IsTaken =0)begin----select 'aaaaaa'; select top 1  @OPIndexNoLeftId = Id from  SetIndexNoLeft   where  [NoIndexId] = @OPIndexId   and  IsTaken = 0 order by NoLeft; ----返回当前剩下那条数据的Idupdate SetIndexNoLeft set IsTaken = 1 ,Updated = getdate() where Id =  @OPIndexNoLeftId;  --修改当前状态end else begin update SetNoIndex set ThisIndex = ThisIndex+1 ,Updated =getdate() where KeyWord = @SetKeyword  and  ThisSigle = @SetThisSigle;--先更新select  @SetIndex= ThisIndex from  SetNoIndex where Id =@OPIndexId ;  -- KeyWord = @SetKeyword  and  ThisSigle = @SetThisSigle ;--在提取结果end  end elsebeginset  @SetIndex = 1;insert  into SetNoIndex ([NoType],[ThisIndex],[ThisSigle],[KeyWord])  values (@SetNoType,@SetIndex,@SetThisSigle,@SetKeyword);-- 插入数据set @OPIndexId = @@IDENTITY;--- 获取当前Idend --select DATALENGTH( @ThisDate);--select  @ThisDate;--select @SetThisSigle;---select @OPIndexNoLeftId ;select  @HebingOutNo =  @SetThisSigle + right('00000000000'+convert(varchar, @SetIndex),@OutStrLength) from SetNoIndex where Id = @OPIndexId ; if( @OPIndexNoLeftId = 0 )--表内无数据begin insert into SetIndexNoLeft ([NoIndexId] ,[NoLeft],[IsTaken],Updated ) values (@OPIndexId,@HebingOutNo,'true',getdate());set @OPIndexNoLeftId= @@IDENTITY;--- 获取当前Id end  select top 1  * from  SetIndexNoLeft where Id = @OPIndexNoLeftId; -----返回当前数据";return  DBUtility.DapperDbHelper.Query<SetIndexNoLeft>(sql).FirstOrDefault(); }/// <summary>/// 删除占用/// </summary>/// <param name="ID">ID</param>/// <returns></returns>public ResultMsg Delete(int ID){ResultMsg msg = new ResultMsg();try{string sql = "DELETE [SetIndexNoLeft] WHERE[ID] = @ID";msg.ReturnInt = DapperDbHelper.Execute(sql, new { ID = ID });msg.Success = true;return msg;}catch (Exception ex){msg.Success = false;msg.ErrMsg = ex.Message;}return msg;}/// <summary>/// 释放占用/// </summary>/// <param name="ID">ID</param>/// <returns></returns>public ResultMsg CleanTaken(int ID){ResultMsg msg = new ResultMsg();try{string sql = "Update  [SetIndexNoLeft] set IsTaken =0   WHERE[ID] = @ID";msg.ReturnInt = DapperDbHelper.Execute(sql, new { ID = ID });msg.Success = true;return msg;}catch (Exception ex){msg.Success = false;msg.ErrMsg = ex.Message;}return msg;}

4 引用方式:
其中你需要的那个数据就是 返回对象 SetIndexNoLeft 属性的 NoOut

    /// <summary>/// 获取当前编号/// </summary>/// <param name="ThisType">当前类型</param>/// <param name="DPNO">店铺No</param>/// <param name="PhoneNo">电话号码后四位</param>/// <returns></returns>public SetIndexNoLeft GetNoByType(ENoTypes ThisType, string DPNO = "",string PhoneNo="0000"){SetIndexNoLeft GetFromDB = null;//数据库获取的数据 switch (ThisType){case ENoTypes.客户编号:GetFromDB = GetIndexNo($"客户编号{DPNO}", 2, 3);GetFromDB.NoOut = $"YYU{DPNO}KH{GetFromDB.NoLeft}{PhoneNo}"; //YYU+001(店铺编号)+KH+2023(年)+999(流水号)+0000(电话号码后4位)break;case ENoTypes.店铺编号:GetFromDB = GetIndexNo("店铺编号", 3, 3);GetFromDB.NoOut = GetFromDB.NoLeft; //001(店铺编号)break;case ENoTypes.报告编号:GetFromDB = GetIndexNo($"报告编号{DPNO}", 1, 2);GetFromDB.NoOut = $"YYU{DPNO}{GetFromDB.NoLeft}"; //YYU+001(店铺编号)+2023(年)+08(月)+02(日)+99(流水号)break;case ENoTypes.样本编号:GetFromDB = GetIndexNo($"样本编号{DPNO}", 1, 2);GetFromDB.NoOut = $"YYU{DPNO}YB{GetFromDB.NoLeft}"; //YYU+001(店铺编号)+YB+2023(年)+08(月)+02(日)+99(2位流水号)break;case ENoTypes.样本类型编号:GetFromDB = GetIndexNo("样本类型编号", 2, 3);GetFromDB.NoOut = $"YYUYBLX{GetFromDB.NoLeft}"; //YYU+001(店铺编号)+YB+2023(年)+08(月)+02(日)+99(2位流水号)break;case ENoTypes.项目编号:GetFromDB = GetIndexNo("项目编号", 3, 3);GetFromDB.NoOut = $"YYUXM{GetFromDB.NoLeft}"; // break;default://用户编号GetFromDB = GetIndexNo("用户编号", 3, 5);GetFromDB.NoOut = $"YYU{GetFromDB.NoLeft}"; //YYU+99999(流水号)break;}return GetFromDB; } 
}

在程序里的应用:

 SetIndexNoLeft ThisNoLeft = null;//设置全局ThisNoLeft = new DALSetNoIndex().GetNoByType(ENoTypes.客户编号,thisMendian.No, PhoneNo);//设定指定的编号No.Text = ThisNoLeft.NoOut;if (ThisNoLeft!=null )//插入数据完成后进行数据删除{new DAL.DALSetNoIndex().Delete(ThisNoLeft.Id);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django图书商城系统实战开发-实现订单管理

Django图书商城系统实战开发-实现订单管理 简介 在本教程中&#xff0c;我们将继续基于Django框架开发图书商城系统&#xff0c;这次的重点是实现订单管理功能。订单管理是一个电子商务系统中非常重要的部分&#xff0c;它涉及到用户下单、支付、发货以及订单状态的管理等方面…

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍&#xff1a;使用方法&#xff1a;限制&#xff1a; 3. Bucket Map Join介绍&#xff1a;好处&#xff1a;使用条件&#xff1a;使用方法&#xff1a; 4. Sort Merge Bucket Map Join介绍&#xff1a;如何使用&#xff1a; 5. Skew …

如何在控制台查看excel内容

背景 最近发现打开电脑的excel很慢&#xff0c;而且使用到的场景很少&#xff0c;也因为mac自带了预览的功能。但是shigen就是闲不住&#xff0c;想自己搞一个excel预览软件&#xff0c;于是在一番技术选型之后&#xff0c;我决定使用python在控制台显示excel的内容。 具体的需…

Redis与MySQL的比较:什么情况下使用Redis更合适?什么情况下使用MySQL更合适?

Redis和MySQL是两种不同类型的数据库&#xff0c;各有自己的特点和适用场景。下面是Redis和MySQL的比较以及它们适合使用的情况&#xff1a; Redis适合的场景&#xff1a; 高性能读写&#xff1a;Redis是基于内存的快速Key-Value存储&#xff0c;读写性能非常高。它适用于需要…

NodeJs导出PDF

&#xff08;优于别人&#xff0c;并不高贵&#xff0c;真正的高贵应该是优于过去的自己。——海明威&#xff09; 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…

【jquery实现动态给表格添加删除行,合并指定单元格】

jquery实现动态给表格添加删除行&#xff0c;合并指定单元格 前端技术 jspjquery 动态添加行 //新增行 $("#addRowBtn").click(function(){var rowEl$("<tr><td><input typecheckbox classcheckItem/></td><td><input nam…

NPOI 读取和写入Excel

在C#中使用NPOI库读取和写入Excel文件&#xff0c;你需要先下载并安装NPOI库。你可以在NuGet管理器中搜索NPOI并进行安装。 以下是一个使用NPOI库进行Excel文件读取和写入的示例&#xff1a; 读取Excel文件&#xff1a; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel…

【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类

tomcat仿写 项目结构扫描文件servlet注解map容器servlet工具类启动类调用 项目结构 扫描文件之前当然要确定一下项目结构了&#xff0c;我这里的方案是tomcat和项目同级 项目的话就仿照我们平时使用的结构就好了&#xff0c;我们规定所有的静态资源文件都在webApp目录下存放…

【数据库】P1 数据库基本常识

数据库基本常识 数据库 ≠ 数据库管理系统表&#xff08;Table&#xff09;SQL是什么 数据库 ≠ 数据库管理系统 数据库是保存有组织的数据的容器&#xff0c;数据库称为 DB&#xff08;DataBase&#xff09;&#xff1b;数据库管理系统是创建和操纵数据库的软件&#xff0c;数…

充气泵方案设计——便携无线充气泵方案

充气泵方案的进化史是人类历史上电子技术发展史中的一环。电子技术&#xff0c;特别是微电子技术是 20 世纪发展最为迅速、影响最为广泛的技术成就。电子技术的核心是电子器件,电子器件的进步和换代&#xff0c;引起了电子电路极大的变化&#xff0c;出现了很多新的电路和应用。…

java解决mysql大数据联查问题

java解决mysql大数据联查问题 近期有一个需求是联查两张表比对三个字段 一般用mysql就可以解决 SELECT* FROMtb_a aLEFT JOIN b ON a.test b.testAND a.NAME b.NAME AND a.type b.type但是表a和表b的数据量都很不小&#xff0c;大概在10w左右&#xff0c;由于并不是以固定…

Webpact学习笔记记录

Webpact学习笔记记录 一.初始化项目1.生成package.json2.安装webpack3.执行webpack体验 二、webpack的配置文件三、less-loader解析less1.安装loader2.配置 四、eslint-loader语法检查1.安装loader2.配置loader3.在package.json中加入 五、js语法转换1.安装loader2.配置loader …

前端能正常跑起来但是控制台报错数据undefined之onMounted最好不要用异步写法

记录问题 在做项目的时候&#xff0c;项目可以正常运行&#xff0c;但是控制台总是报错&#xff0c;有一个数据是undefined。 分析问题 一般遇到这种情况&#xff0c;就是vue找不到这个数据。但是为什么能正常运行&#xff1f;说明是开始加载的时候找不到数据&#xff0c;但…

Java进阶篇--数据结构

目录 一.数组&#xff08;Array&#xff09;&#xff1a; 1.1 特点&#xff1a; 1.2 基本操作&#xff1a; 1.3 使用数组的好处包括&#xff1a; 1.4 数组也有一些限制&#xff1a; 二.集合框架&#xff08;Collections Framework&#xff09;&#xff1a; 2.1 列表…

当你出差在外时,怎样轻松访问远程访问企业局域网象过河ERP系统?

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…

miniconda克隆arcpy

arcpy环境克隆 前言尝试思考到此结束 前言 最近遇到了一些问题&#xff0c;需要用到arcpy来处理一些东西&#xff0c;但众所周知&#xff0c;arcgis的arcpy是python 2.0的&#xff0c;我不是很喜欢&#xff1b;所以我安装了arcgis pro 2.8&#xff0c;我发现这也是个坑&#x…

Git分布式版本控制系统

目录 2、安装git 2.1 初始环境 2.2 Yum安装Git 2.3 编译安装 2.4 初次运行 Git 前的配置 2.5 初始化及获取 Git 仓库 2.6 Git命令常规操作 2.6.2 添加新文件 2.6.3 删除git内的文件 2.6.4 重命名暂存区数据 2.6.5 查看历史记录 2.6.6 还原历史数据 2.6.7 还原未来…

react使用antd的table组件,实现点击弹窗显示对应列的内容

特别提醒&#xff1a;不能在table的columns的render里面设置弹窗组件渲染&#xff0c;因为这会导致弹窗显示的始终是最后一行的内容&#xff0c;因为这样渲染的结果是每一行都会重新渲染一遍这个弹窗并且会给传递一个content的值&#xff0c;渲染到最后一行的时候&#xff0c;就…

Unity的TimeScale的影响范围分析

大家好&#xff0c;我是阿赵。 这期来说一下Unity的TimeScale。 一、前言 Unity提供了Time这个类&#xff0c;来控制时间。其实我自己倒是很少使用这个Time&#xff0c;因为做网络同步的游戏&#xff0c;一般是需要同步服务器时间&#xff0c;所以我比较多是在使用System.Date…