商城计价中心 - 从容应对复杂场景价格计算
一、背景
隨著vivo商城的業(yè)務(wù)架構(gòu)不斷升級(jí),整個(gè)商城較為復(fù)雜多變的營(yíng)銷玩法被拆分到獨(dú)立的促銷系統(tǒng)中。
拆分后的促銷系統(tǒng)初期只是負(fù)責(zé)了營(yíng)銷活動(dòng)玩法的維護(hù),促銷中最為重要的計(jì)價(jià)業(yè)務(wù)仍然遺留在商城主站業(yè)務(wù)中,且由于歷史建設(shè)問(wèn)題,商城核心交易鏈路中商詳頁(yè)、購(gòu)物車、下單這三塊關(guān)于計(jì)價(jià)邏輯是分開獨(dú)立維護(hù)的,沒(méi)有統(tǒng)一,顯然隨著促銷優(yōu)惠的增加或者玩法的變動(dòng),商城側(cè)業(yè)務(wù)重復(fù)開發(fā)量會(huì)顯著加大。
促銷系統(tǒng)的獨(dú)立,計(jì)價(jià)相關(guān)業(yè)務(wù)能力從業(yè)務(wù)邊界上也應(yīng)由促銷系統(tǒng)提供,因此促銷側(cè)需要從頭開始設(shè)計(jì)促銷計(jì)價(jià)相關(guān)能力。
二、原有計(jì)價(jià)業(yè)務(wù)
2.1 計(jì)價(jià)業(yè)務(wù)場(chǎng)景
商城原有涉及到計(jì)價(jià)業(yè)務(wù)的主要是商詳頁(yè)、購(gòu)物車、確認(rèn)下單、提交訂單這幾個(gè)業(yè)務(wù)場(chǎng)景。
如果將每一個(gè)影響最終售賣價(jià)的優(yōu)惠叫做計(jì)價(jià)因子的話,那前述幾種場(chǎng)景下對(duì)于售賣價(jià)有影響的計(jì)價(jià)因子歸為三大類:
-
優(yōu)惠活動(dòng)(單品優(yōu)惠、訂單優(yōu)惠)
-
優(yōu)惠券(優(yōu)惠券、代金券)
-
虛擬抵扣(積分、換新鼓勵(lì)金)
對(duì)于每種計(jì)價(jià)場(chǎng)景與計(jì)價(jià)因子有如下關(guān)系:
2.2?原有計(jì)價(jià)模型
對(duì)于具體執(zhí)行的計(jì)價(jià)業(yè)務(wù)中各計(jì)價(jià)因子間是有一定的先后優(yōu)先級(jí)關(guān)系的,綜合如下圖所示,也在一定程度說(shuō)明了原有計(jì)價(jià)業(yè)務(wù)模型:
三、促銷計(jì)價(jià)模型
3.1 分層模型
促銷系統(tǒng)從零搭建基礎(chǔ)計(jì)價(jià)能力,對(duì)于系統(tǒng)的穩(wěn)定性及擴(kuò)展性必須有一定的保障,而這也就對(duì)于促銷系統(tǒng)的計(jì)價(jià)模型提出了一定的要求,通用的基礎(chǔ)計(jì)價(jià)模型最好是能有過(guò)一定的實(shí)踐經(jīng)歷驗(yàn)證過(guò)的,因此我們采用了傳統(tǒng)電商久經(jīng)考驗(yàn)的計(jì)價(jià)模型:分層計(jì)價(jià)。
所謂的分層計(jì)價(jià)即傳統(tǒng)電商中優(yōu)惠涉及的三個(gè)層面:商品級(jí)、店鋪級(jí)、平臺(tái)級(jí),正常情況下不同級(jí)別的優(yōu)惠默認(rèn)是可以疊加的,同一級(jí)別的優(yōu)惠默認(rèn)情況下是互斥的。
這里需要說(shuō)明的是,每一層級(jí)的優(yōu)惠計(jì)算的時(shí)候,對(duì)于有些優(yōu)惠的門檻條件是否滿足需要依賴原價(jià),默認(rèn)情況下依賴于上一個(gè)層級(jí)的優(yōu)惠計(jì)算后的價(jià)格,即商品級(jí)優(yōu)惠計(jì)算依賴商品原價(jià),店鋪級(jí)優(yōu)惠依賴于商品級(jí)優(yōu)惠計(jì)算后的價(jià)格,平臺(tái)級(jí)優(yōu)惠依賴于店鋪級(jí)優(yōu)惠計(jì)算后的價(jià)格。
疊加規(guī)則特別說(shuō)明:
正常優(yōu)惠疊加是指兩個(gè)優(yōu)惠可以同時(shí)享受,對(duì)于不同層級(jí)的優(yōu)惠默認(rèn)就是疊加的,對(duì)于同一層級(jí)的優(yōu)惠默認(rèn)是不疊加的,比如正常情況下,優(yōu)惠券下的各種類型券是只能用一張的。
但某些場(chǎng)景下,業(yè)務(wù)上會(huì)指定同一層級(jí)的優(yōu)惠可以疊加使用的,同時(shí)指定疊加使用的場(chǎng)景下還會(huì)分為普通疊加和并行疊加,舉個(gè)例子:訂單優(yōu)惠和優(yōu)惠券這兩個(gè)類型的疊加就屬于普通疊加(優(yōu)惠券門檻是否滿足的判斷取決于訂單優(yōu)惠后的價(jià)格),優(yōu)惠券和代金券的疊加屬于并行疊加(優(yōu)惠券和代金券的門檻是否滿足的判斷都取決于這兩者的前序優(yōu)惠后的價(jià)格)。
對(duì)于同一層級(jí)的優(yōu)惠按不同維度分為:必選/勾選、可疊加(并行疊加/普通疊加)/不可疊加 。
3.2 新的計(jì)價(jià)模型
3.3 核心計(jì)價(jià)流程
3.3.1 主流程
通過(guò)前述計(jì)價(jià)模型可以得知,在計(jì)算優(yōu)惠價(jià)時(shí)的先后順序是:商品級(jí)(CalcItem)、店鋪級(jí)(CalcShop)、平臺(tái)級(jí)(CalcGroup),另外根據(jù)一些特殊業(yè)務(wù)場(chǎng)景,增加了可能的中斷業(yè)務(wù)邏輯(CalcInterrupt),因此可得到下圖所示的最粗粒度的計(jì)價(jià)流程
那這三個(gè)級(jí)別的計(jì)算優(yōu)惠價(jià)內(nèi)部又是如何實(shí)現(xiàn)的呢?經(jīng)過(guò)業(yè)務(wù)抽象,這三個(gè)級(jí)別的計(jì)算可以變成一個(gè)通用的計(jì)算優(yōu)惠邏輯,僅有優(yōu)惠級(jí)別的區(qū)分。
3.3.2 通用流程
經(jīng)過(guò)業(yè)務(wù)抽象發(fā)現(xiàn)三個(gè)級(jí)別的優(yōu)惠計(jì)算的通用邏輯:
-
獲取當(dāng)前層級(jí)的優(yōu)惠查詢器
(Get Current Level PromotionGetter)
-
過(guò)濾優(yōu)惠查詢器
(Filter PromotionGetter)
-
查詢優(yōu)惠(Get Promotion)
-
過(guò)濾優(yōu)惠(Filter Promotion)
-
通過(guò)計(jì)價(jià)引擎計(jì)算優(yōu)惠(Calc Engine)
-
過(guò)濾計(jì)價(jià)結(jié)果(Filter CalcResult)
因此我們得出如下的通用的計(jì)價(jià)流程:
通用計(jì)價(jià)流程中的又有幾個(gè)相對(duì)靈活的與業(yè)務(wù)相關(guān)過(guò)濾邏輯,從后面的細(xì)節(jié)流程中可以了解更多的實(shí)現(xiàn)。
3.3.3?細(xì)節(jié)流程
之所以在通用計(jì)價(jià)流程中會(huì)有幾個(gè)過(guò)濾節(jié)點(diǎn),是因?yàn)樵跇I(yè)務(wù)上會(huì)有一些特殊的過(guò)濾邏輯,比如商詳頁(yè)來(lái)源的時(shí)候,只能使用商品級(jí)優(yōu)惠查詢器,某個(gè)優(yōu)惠只能特殊渠道去享受等等。
所以需要抽象出一個(gè)通用的可擴(kuò)展的過(guò)濾機(jī)制來(lái)實(shí)現(xiàn)業(yè)務(wù)需求,因此會(huì)按照不同維度去定制一些鏈?zhǔn)竭^(guò)濾器,執(zhí)行流程如下圖所示:
當(dāng)然圖中所示的不同維度額過(guò)濾器只是目前業(yè)務(wù)中的一部分,比如還有按照終端、付款方式、外部業(yè)務(wù)方等等,這些在具體實(shí)現(xiàn)的時(shí)候可以非常靈活的支持。
那上述過(guò)濾器是如何制定?以及與業(yè)務(wù)如何關(guān)聯(lián)的?
上圖中列出部分業(yè)務(wù)定制過(guò)濾序器,自定義過(guò)濾器后會(huì)自動(dòng)注冊(cè)到統(tǒng)一的優(yōu)惠業(yè)務(wù)過(guò)濾器工廠中,在前述的計(jì)價(jià)流程中,需要用到相關(guān)過(guò)濾器時(shí),只需帶上相關(guān)上下文參數(shù)可以自動(dòng)從過(guò)濾器工廠中獲取匹配的過(guò)濾器。
3.3.4 完整全流程
把前面這一系列流程中進(jìn)行一個(gè)組合拼裝,就可以得到計(jì)價(jià)的完整全流程圖,如下:
從這個(gè)完整流程圖中,可以看到一個(gè)通用穩(wěn)定的核心計(jì)價(jià)流程以及一個(gè)支持業(yè)務(wù)多變的定制過(guò)濾器,既保證了核心的穩(wěn)定,又保留靈活的擴(kuò)展。
四、系統(tǒng)核心設(shè)計(jì)
在通用的計(jì)價(jià)執(zhí)行流程中一個(gè)節(jié)點(diǎn)是「Calc Engine」,也就是計(jì)價(jià)引擎,這是整個(gè)計(jì)價(jià)邏輯中最核心底層的能力,由它來(lái)判定每個(gè)優(yōu)惠是否能被用戶享有。
4.1 統(tǒng)一優(yōu)惠模型
由于計(jì)價(jià)中心在建設(shè)的時(shí)候,已經(jīng)存在了促銷系統(tǒng)中的各個(gè)優(yōu)惠活動(dòng)、獨(dú)立的優(yōu)惠券及代金券、遺留在商城主站的未遷移的優(yōu)惠,因此想用兼容這么多的優(yōu)惠類型,必然需要建立一個(gè)統(tǒng)一的優(yōu)惠模型,而在建設(shè)過(guò)程中需將現(xiàn)有的優(yōu)惠模型進(jìn)行適配轉(zhuǎn)換至統(tǒng)一模型。
統(tǒng)一優(yōu)惠模型中的一些關(guān)鍵信息有:優(yōu)惠標(biāo)識(shí)、優(yōu)惠類型、優(yōu)惠模板id、開始結(jié)束時(shí)間、優(yōu)惠參數(shù)及一些擴(kuò)展參數(shù)等。
4.2 優(yōu)惠模板
1)在進(jìn)行促銷計(jì)價(jià)時(shí),每個(gè)具體的優(yōu)惠都會(huì)對(duì)應(yīng)一個(gè)唯一的優(yōu)惠模板,每個(gè)優(yōu)惠模板本質(zhì)上是一個(gè)JSON字符串,只是這些JSON字符串是由遵循了一定特殊邏輯規(guī)則的元信息數(shù)據(jù)轉(zhuǎn)化而成,而這些元信息在被計(jì)價(jià)引擎解釋執(zhí)行時(shí),都是返回布爾類型標(biāo)識(shí)是否通過(guò)。
2)基本的元信息數(shù)據(jù)有這幾種:
AndMeta(與)
對(duì)應(yīng)邏輯關(guān)系中的“與”關(guān)系,表示該類型的元信息所包含的子元信息解釋執(zhí)行都返回真才為真;
OrMeta(或)
對(duì)應(yīng)邏輯關(guān)系中的“或“關(guān)系,表示該類型的元信息所包含的子元信息任一解釋執(zhí)行返回真就為真;
NotMeta(非)
對(duì)應(yīng)邏輯關(guān)系中的“非”關(guān)系,表示該類型中元信息所包含的子元信息解釋為假當(dāng)前元信息為真;
ConditionalMeta(條件)
如果條件參數(shù)不存在或者從上下文獲取參數(shù)指定的布爾值不為true,則當(dāng)前元信息返回真,否則根據(jù)元信息中包含的子元信息解釋執(zhí)行的結(jié)果作為當(dāng)前元信息執(zhí)行結(jié)果;
ComplexMeta(組合元信息)
該元信息作為所有模板的通用載體,該元信息中包含兩個(gè)重要信息conditon、action,兩者的關(guān)系是只有condition條件都滿足后后,才會(huì)去執(zhí)行后續(xù)的action,而condition和action都可能為前述中的各種元信息的復(fù)雜組合。
3)模板元信息關(guān)系:
4)優(yōu)惠模板示例:
(滑動(dòng)查看)
4.3 計(jì)價(jià)引擎
計(jì)價(jià)引擎本質(zhì)上就是對(duì)應(yīng)優(yōu)惠模板的解釋執(zhí)行,并配合相關(guān)上下文,進(jìn)行優(yōu)惠計(jì)算,關(guān)鍵代碼如下:
(滑動(dòng)查看)
五、小結(jié)
通過(guò)前面幾章內(nèi)容的描述,我們基本把vivo商城促銷系統(tǒng)建設(shè)計(jì)價(jià)中心的關(guān)鍵思路闡述完了。建設(shè)完計(jì)價(jià)中心后,整個(gè)促銷系統(tǒng)的核心基礎(chǔ)才立住,但這也只是個(gè)開始,整個(gè)商城圍繞著促銷計(jì)價(jià)中心仍然還有其他待建設(shè)的內(nèi)容,比如整個(gè)商城的營(yíng)銷價(jià)格能力矩陣,價(jià)格監(jiān)控,商城時(shí)光機(jī)等等,而這些內(nèi)容我們后續(xù)有機(jī)會(huì)也會(huì)陸續(xù)輸出相關(guān)文章,與大家一起交流學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的商城计价中心 - 从容应对复杂场景价格计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Cloud原理详解
- 下一篇: 150面试题