關于計數以及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.pswp.cn/news/41225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41225.shtml
英文地址,請注明出處:http://en.pswp.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…