通用的業務編碼規則設計實現(附源碼)
一、說明
本篇博客參考 http://www.cnblogs.com/xqin/p/3708367.html, 但源博客貼出了部分代碼,對部分代碼沒有過多的解釋。本篇針對想參考現成的完整代碼的人。
二、背景
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
{
private ISequenceFactory _sequenceFactory;
public PurchasingApiController(ISequenceFactory sequenceFactory)
{
_sequenceFactory = sequenceFactory;
}
//取得主表的BillNo
public string GetNextBillNo()
{
var sequence = _sequenceFactory.Create("sdx_purchasing");
return sequence.Next();
}
//用BillNo過濾取得從表中的RowId
public string GetNextRowId(string key)
{
var sequence = _sequenceFactory.Create("sdx_purchasingLine");
sequence.SetValue("BillNo", key)
return sequence.Next();
}
}
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的完整代碼。在理解作者的思想下已經補充完整:
源碼下載:百度網盤鏈接:http://pan.baidu.com/s/1hrk3N2s 密碼:man6
