日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

商城计价中心 - 从容应对复杂场景价格计算

發(fā)布時(shí)間:2024/1/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 商城计价中心 - 从容应对复杂场景价格计算 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景

隨著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)惠模板示例:

{ "type": "COMPLEX", "condition": { "type": "AND", "metas": [ { "type": "CONDITIONAL", "metas": [ { "type": "CONDITION", "metaCode": "terminalCheckCondition" } ], "param": "needTerminalCheck" }, { "type": "CONDITION", "metaCode": "amountOverCondition" } ] }, "action": { "type": "AND", "metas": [ { "type": "ACTION", "metaCode": "cutPriceAction" }, { "type": "ACTION", "metaCode": "freezeCouponAction" } ] }}

(滑動(dòng)查看)

4.3 計(jì)價(jià)引擎

計(jì)價(jià)引擎本質(zhì)上就是對(duì)應(yīng)優(yōu)惠模板的解釋執(zhí)行,并配合相關(guān)上下文,進(jìn)行優(yōu)惠計(jì)算,關(guān)鍵代碼如下:

private boolean executeMeta(Meta meta, EngineContext context) { if (meta instanceof AndMeta) { return executeAndMeta((AndMeta)meta, context); } else if (meta instanceof OrMeta) { return executeOrMeta((OrMeta) meta, context); } else if (meta instanceof NotMeta) { return executeNotMeta((NotMeta)meta, context); } else if (meta instanceof ComplexMeta) { return executeComplexMeta((ComplexMeta)meta, context); } else if (meta instanceof ConditionalMeta) { return executeConditionalMeta((ConditionalMeta)meta, context); } else { return executeIMeta(meta, context); }} ...... private boolean executeComplexMeta(ComplexMeta complexMeta, EngineContext context) { Meta condition = complexMeta.getCondition(); Meta action = complexMeta.getAction(); return executeMeta(condition, context) && executeMeta(action, context);} private boolean executeConditionalMeta(ConditionalMeta conditionalMeta, EngineContext context) { PromotionContext promotionContext = context.getPromotionContext(); if (promotionContext == null || promotionContext.getParameters() == null) { return true; } String conditionParam = conditionalMeta.getParameter(); String sNeedProcess = promotionContext.getParameters().get(conditionParam); if (sNeedProcess == null) { return true; } boolean needProcess = Boolean.parseBoolean(sNeedProcess); if (needProcess) { return executeMeta(conditionalMeta.getMetas().get(0), context); } else { return true; }} private boolean executeIMeta(Meta meta, EngineContext context) { IMeta iMeta = MetaFactory.get(meta.getMetaDef().getMetaCode()); if (iMeta == null) { throw new CalcException("meta not found, metaCode=" + meta.getMetaDef().getMetaCode()); } return iMeta.execute(context);}

(滑動(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。