1,常見的促銷模型
促銷管理系統在很多地方都有使用,大家去超市就經常體現到,感受到,不少中小型單位都其促銷活動,要搞促銷活動最好是有應用軟件支持,這樣就比較靈活管理也方便。而依靠手工處理的話效率會比較低下的。常見的促銷活動,其分類及舉例如下:
模型分類 | 序號 | 例子 |
捆綁促銷 | 1 | 購買TK001+TK002各1件,優惠10元。(TK001,TK002為產品編碼,不同的單位有不同的定義,下同。) |
2 | 購買TK001+TK002各1件,贈送商品TK003一件。 | |
3 | 購買TK001商品2件,TK002商品1件,贈送TK002商品2件。 | |
4 | 購買TK001+TK002各一件,享受8折。 | |
5 | 購買TK001+TK002數量各一件,享受優惠價10元。 | |
單品促銷 | 1 | 購買TK001商品,促銷價10元。 |
2 | 購買TK001享受8折。 | |
3 | 購買TK001,優惠5元。 | |
4 | 購買TK001商品2個,贈送TK003商品1個。 | |
組合促銷 | 1 | 購買TK001,TK002,TK003,TK004任一件95折,任兩件89折。 |
2 | 購買PK01牌商品任意一件95折,兩件92折。 | |
3 | 購買PK01,PC02,PA03牌商品滿足3件,每件促銷價20元。 | |
4 | 購買PK01,PC02,PA03牌商品任意1件,可10元購買TK014商品。 | |
5 | 購買PK01,PC02,PA03牌商品任意1件,贈送TK004,TK005,TK006商品中任意一件。 | |
6 | 購買PK01,PC02牌商品任意1件,可特價2元購買TK006,TK007中任意商品一件。 | |
客單價促銷 | 1 | 購買TK001滿200元,贈送TK006一件,滿300元,贈送商品TK007,TK008,TK009各一件。 |
2 | 全場購物滿50元,可特價2元購買TK011。 | |
3 | 購買TK001滿200元,優惠30元,滿400元優惠60元,滿600元優惠90元。 | |
客單量促銷 | 1 | 購買PA01牌商品,除商品TK017外,任意2件贈送TK003一件。 |
2 | 購買PA01牌商品,除商品TK017外,可特價1元購買商品TK003。 |
2,軟件模型抽象
根據上面的業務模型,可以抽象出品牌,商品名稱,商品編號,購買件數,實際單價,原單價,單項金額,優惠類型,折扣,備注。其中優惠類型可分為無、折扣、特價、促銷、優惠、贈送,這幾個類型的特點如下:
名稱 | 說明 |
無 | 無任何優惠。 |
折扣 | 使用打折來做優惠。 |
特價 | 固定一個很低的價格。 |
促銷 | 與特價類似,但價格不一定低,只是比原價略有減少。 |
優惠 | 直接在原價格上面減去一定的金額。 |
贈送 | 客戶不用錢。 |
由于有贈送或直接降低價格的活動,所以固定幾個特殊的商品很重要。
序號 | 商品編號 | 含義 |
1 | L00001 | 0.01元 |
2 | L00010 | 0.1元 |
3 | L00100 | 1元 |
4 | L01000 | 10元 |
3,CKRule上面建模
對象的定義相對簡單,是直接參考上面的定義的
自定義類就是銷售記錄信息,包含單價,數據,打折等內容。這些內容可以根據終端客戶的需要增加,如商品條形碼等信息。

而主表記錄就是客戶的基本信息。

要實現上面提到有多樣化規則,一般都需要客戶自己來設置,不要由軟件開發商來設置,否則會忙壞軟件開發者,而得不到一點收益。要讓客戶的計算機管理員可以設置,那設置的辦法就要相對簡單易懂。在邏輯比較界面中有購物車的商品判斷,如含品牌,含商品,含商品件數等等。對商品的操作都是使用商品編號的,這樣會比較方便電腦識別。

而結論&操作部分就精彩了,如優惠,打折,促銷,特價等操作都會出現。

這些邏輯判斷和操作都是前臺用戶設置時所必備的內容。
4,促銷系統實現方式
看了促銷系統的需求,從業務上覺得很正常,是很多商場,商家常常做的活動,也不太復雜。但僅僅從技術實現來看,那就直接覺得太恐怖了,不好處理,有些東西好像僅僅是自然語言來表達,在程序上不好跟進。
好像每一個促銷都要寫一個類來控制,這樣就會出現非常多的類才能搞定問題,如果某天客戶想增加一些新的規則,那原來的類就要修改或變化。從簡單的角度來看,的確要這樣做的,也可以使用一些更加復雜的設計模式來處理問題。
從更標準的角度來看的話,應該做更多業務抽象,架構抽象,對象抽象的工作,但如果開發者剛剛接解這個行業或公司資源不足,難以做更深入的抽象和分析呢?那這個促銷的項目基本上沒得做了,匆匆上馬的話,后面修改的工作量會非常大,最后工作越做越多,但是始終做不到收益。
CKRule從業務規則管理的角度來解決促銷問題,把經常變化的規則封裝入規則管理系統中,規則的變化不影響主程序代碼,技術人員和業務專家都可以按自身的需求不斷修改規則,并且都可以在程序運行時修改和部署規則。這大大方便了促銷系統的開發。
5,軟件實現
銷售訂單的定義包含銷售主體和明細的商品信息,而商品信息要使用促銷規則再進行計算一次,從而判斷那些商品可以打折或有什么優惠,如果可以優惠的商品就進行優惠。在實現的計算中,可以會遇到沖突的問題,即符合多個優惠條件的情況,當前軟件沒有判斷沖突,都會生效,實際的計算可能會選其中一兩條優惠。

促銷管理的業務規則可以在程序運行時配置,不影響其他代碼的編寫,而配置界面就是調用CKRule上面的配置內容。
初始化規則界面
_curPackage = new RuleFacade().GetPkgInst(RuleInstName); foreach (var item in _curPackage.RuleLib.PoolRules.KeyWords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item; //_lvi.ImageKey = "Pic _lvi.Group = lvTips.Groups[0]; lvTips.Items.Add(_lvi); } foreach (var item in _curPackage.RuleLib.PoolRules.LgcOperaWords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item; //_lvi.ImageKey = "PicMethod"; _lvi.Group = lvTips.Groups[1]; lvTips.Items.Add(_lvi); } foreach (var item in _curPackage.RuleLib.PoolRules.ConclusionWords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item;// new List<CallDef>() { item }; //_lvi.ImageKey = "PicMethod"; _lvi.Group = lvTips.Groups[2]; lvTips.Items.Add(_lvi); } |

保存規則之后,需要刷新規則引擎,使用如下方法進行刷新。
new RuleFacade().Refresh(RuleInstName); |
在計算界面就使用如下命名進行規則計算