2013-06-26 66 views
0

我有一個包含客戶表的數據庫。這些客戶是企業,我試圖設計一種靈活可靠的方式,允許客戶設計自己的自定義發票號碼。用於複雜序列生成和存儲的模式

例如:

  • 客戶A發票序列:A-1306至1234年,在 'A-' 是靜態文本,1306 YYMM,而1234是重設每月
  • 客戶序列B發票序列:123456 - 這是一個永遠計數的序列
  • 客戶C發票序列:13-123456 - 此序列具有YY-,然後序列運行一年並重置。

我試圖決定最靈活的方式來允許有些隨意的序列成爲這個數字的一​​部分。我還需要以原子方式生成此數字,並根據各個元素所施加的固有規則處理序列的重置,例如序列中的MM推斷每個月的純增量重新啓動,其中MMDD推斷純增量元素每次重新啓動天。

自定義類型是否正確?一組getter和setter以及靜態和方法和驗證器?這種功能有沒有設計模式?

回答

1

我不得不解決類似你的情況爲客戶B. 我解決了一個問題:我創建了一個集合來存儲序列,並添加像這樣的文件:

{ 
"_id" : "PIN", 
"_class" : "com.alldata.genIII.bo.Sequence", 
"description" : "Sequence for PIN numbers. Used in all Account collections. ", 
"nextValue" : NumberLong(100001) 

} 

我使用_id指定將使用該序列的帳戶集合中的字段。我從100001開始爲用戶提供需求。

當創建帳戶時,我獲取序列的下一個值並將序列更新爲1. 此操作是原子的,因爲我使用findAndModify

這是我的代碼(Java)來獲取序列的下一個值:

public Long fetchNextValue(String sequenceId) { 
     Update update = new Update(); 
     update.inc("nextValue", 1); 
     Sequence seq = mongoTemplate.findAndModify(new Query(Criteria.where("code").is(sequenceId)), update, Sequence.class); 
     if (seq == null) 
      throw new NotFoundException("Sequence not found for sequenceId " + sequenceId); 
     return seq.getNextValue(); 
    } 

我有這樣的代碼運行在生產,到目前爲止,我還沒有遇到問題。但爲防萬一,我在帳戶集合的「pin」字段中添加了一個唯一的索引,所以如果有重複的情況,我會捕獲異常並重新嘗試幾次,並使用新的引腳。

有關如何做到這一點看看這article

您的其他案件的詳細信息,您可以使用存儲在MongoDB的一個JavaScript函數,該邏輯也適用於該序列。看看這個article,雖然現在有一條消息說他們不推薦它(這個消息是新的......),但它可以給你更多的想法。

希望這有助於

+0

感謝您的聯繫。由於輸入將是用戶輸入的,除非我對輸入做了一些嚴格的過濾,或者強制用戶給我們某種UI來構建格式srting,否則eval()將不會出現。 – regretoverflow

0

我已經完成了我的目標比我開始着手尋找一個更簡單的解決方案。在每個機構記錄中,我創建了一個名爲invoice_format的字符串字段。在此字段中,我存儲了一個格式字符串,我將其解析爲生成發票號碼。例如:

invoice_format: "A-{YY}{seq-04.d}" 

我解析這個和任何內部{}被認爲是一種格式化的規則,以及任何外界{}被認爲是文字文本。我有一個不那麼迷人的開關,它查找每個格式規則並根據規則返回一個值。我仍然有工作要做,但這構成了我的序列生成器的基礎。每個客戶的序列都保存在一個單獨的字段中,名爲invoice_sequence,當我在字段中遇到{seq}時,我會增加此字段並返回結果。