通用的業務編號規則設計實現(附原始碼)

2022-01-16 12:11:24 字數 2796 閱讀 5317

一、說明

本篇部落格參考  但源部落格貼出了部分**,對部分**沒有過多的解釋。本篇針對想參考現成的完整**的人。

二、背景

1、概要

每乙個企業應用中不可避免的都會涉及到業務編碼規則的問題,比如訂單管理系統中的訂單編號,比如商品管理系統中的商品編碼,比如專案管理系統中的專案編碼等等,這一系列的編碼都需要管理起來,那麼它們的應該如何編碼的,具體的編碼規則我們很多時候都是直接寫在程式當中

2、分析

常用的的編碼有: 

1、資料庫自增長id或最大值加1 

2、guid 

3、時間戳 

4、常量+自增長 

5、常量+時間戳+自增長 

6、根據單據屬性編碼 比如商品編碼:第x是**商品顏色,第y位是**商品產地 

7、自定義函式處理返回 

8、其它

3、思考

第乙個問題就是單據編碼的時間順序:

1、新增前先預取得新單據編碼

優點是儲存處理很簡單,而且儲存後不需要再重新整理ui,缺點就是如果放棄表單那麼編碼計數已經跳號,做不到連續的單據號,而且沒法實現上面編碼的第6種情況。

2、儲存時才生成單據編碼

缺點是儲存比較麻煩點,而且儲存後需要再重新整理ui中的單據編碼字段,但是如果是需要根據單據屬性編碼,那就必做得使用這種方式了,而且能做到單據連續。

第二個問題是這個編碼該怎麼去取,怎麼保證唯一性 。

這裡要看是使用哪種編碼方式,比如 max + 1 這種方式 就直接檢索資料庫 select max(id) + 1 from table 取得編碼,如果是guid則比較方便,但是guid看著實在是有點噁心,使用時間戳的話如果精確到秒的話是沒辦法保證唯一性的,即使精確到毫秒理論上也是不行的。其它複雜的編碼獲取就更麻煩點了。總之不是很方便就能取得。

第三個問題如果這個編碼規則需要更換怎麼辦

這個如果沒有特別設計編碼規則一般都要修改程式,沒辦法說不動程式直接修改配置就能實現

三、目的及設計

1、設計

鑑於以上幾個問題,我們想設計乙個比較通用的業務編碼規則模組,以後的專案也可復用,它應該要實現以下功能及特點:

1、滿足各種編碼規則的需求

a.背景中提到的那7種都要實現,還要求各種規則可以自由組合

b.依賴重置,比如日期變化時序號自動重置為1

2、拓展性強,可新增自定義規則

3、通過配置檔案或資料進行配置,修改業務編碼規則只需要修改配置檔案或資料

4、使用簡單

2、資料庫設定

我們先從配置來設計,我們把規則配置放在資料庫中,可以考慮以後再做個介面來管理這些配置。設計2張表來儲存這些規則

1、單據編碼  

2、單據編碼規則 用來儲存基礎規則組合,一種單據編碼對應多種規則

3、呼叫

public class purchasingapicontroller : apicontroller

//取得主表的billno

public string getnextbillno()

//用billno過濾取得從表中的rowid

public string getnextrowid(string key)

}

sequence物件中主要就是乙個next()的實現

4、**結構

稍微解釋說明下:

1、defaultsequencefacotry 繼承自介面isequencefactory負責構建squence

2、sequence 繼承自iseqence是採番的主要處理類,此類裡可以設定上下文資料

3、sequencecontext sequence上下文物件,保留著資料庫的直接資訊或者從資料庫取出通過工廠模式建立的資訊

4、resets資料夾中類 繼承自isequencereset,由sequenceresetfactory構建,處理重置的物件,比如今天的編號a20160130-001到a20160130-010,那麼當明天到了編號需要重置成a20160131-001

5、rules資料夾中類 繼承自抽象類sequencerulebase,由sequencerulefactory構建,就是一系列規則資訊

6、iclasssequencehandler 自定義類規則介面,實現這個添口可新增自定義規則,sequencehandler中是兩個自定義類規則的實現 。(例如:商品編號需要受到商品顏色和其他屬性影響的條件下) 

5、例項

乙個簡單的例子:一般的編號形式是wt20160131001 其中包括3個規則,它在資料庫的儲存為:

a:主表t_sequence儲存重置資訊及其他

程式根據表中sequencereset反射調取相應的重置實現,根據currentcode判斷什麼時候去重置。

b:t_sequencesetting表儲存規則

程式根據rulename去反射呼叫相應的規則類。

四、原始碼

針對源部落格沒有給出sequence的完整**。在理解作者的思想下已經補充完整:

通用單向鍊錶的實現(附使用例子)

當我開啟csdn,發現我有第乙個粉絲了,激動得差點大喊 hello world 整晚都很開心,哈哈,為了保住我唯一的粉絲,我決定,以後勤快一點。今天就先出一篇通用鍊錶實現的部落格,只包含了乙個標頭檔案 h 和乙個原始檔 c 可以很方便地新增到你們的專案中。list.h ifndef list h d...

通用棧的設計和實現 C實現

棧的定義 cpp stack t 在此設計的通用棧將會達到以下兩點要求 可以處理任意的資料型別的資料 請注意棧中base和top的資料型別,其為void 因此其可以處理各種資料型別 高效的資料操作和訪問 void 其為雙指標,意味入棧和出棧的將只是對應資料的位址,而不需要對資料本身進行拷貝,因此也達...

基於Drools決策表的通用規則集設計

jie 2017 12 05 ruleset required 規則包自定義名稱 import option 匯入規則庫的類和靜態函式 function 列表 sequential option 是否按從上到下的順序執行規則 ruletable required 定義規則表,後緊接自定義規則字首名稱...