可自由擴(kuò)展的促銷(xiāo)活動(dòng)架構(gòu)設(shè)計(jì)

需求和定義

??設(shè)計(jì)一個(gè)靈活的促銷(xiāo)架構(gòu),可以容納當(dāng)前可預(yù)見(jiàn)到的所有促銷(xiāo)活動(dòng)類(lèi)型?;顒?dòng)的配置方式要足夠自由,允許運(yùn)營(yíng)管理員自由配置活動(dòng)的參與人群、活動(dòng)包含的商品范圍、特別是不同活動(dòng)的疊加關(guān)系。
??配置時(shí),一個(gè)商品可以同時(shí)在同一時(shí)間參加多個(gè)活動(dòng)。而在結(jié)算時(shí)互斥的多個(gè)活動(dòng)中只能選擇其中一個(gè)參加,這個(gè)選擇可以是系統(tǒng)自動(dòng)的,也可以是用戶(hù)自己選擇的。不互斥的活動(dòng)可以則同時(shí)參加。
??這里的促銷(xiāo)活動(dòng)是指用戶(hù)購(gòu)買(mǎi)商品時(shí)會(huì)改變訂單的實(shí)付價(jià)格或者訂單商品數(shù)量的促銷(xiāo)類(lèi)型,例如限時(shí)降價(jià)、滿(mǎn)100減10、買(mǎi)1贈(zèng)1、會(huì)員打折等。不在下單過(guò)程中起作用的活動(dòng)不包括在這個(gè)范圍里,例如新用戶(hù)注冊(cè)送券、下單后贈(zèng)券、下單后返現(xiàn)等。

邏輯架構(gòu)

??這個(gè)架構(gòu)設(shè)計(jì)最關(guān)鍵的問(wèn)題是要解決不同促銷(xiāo)活動(dòng)疊加使用的問(wèn)題,而且能否疊加是可以由運(yùn)營(yíng)在配置的時(shí)候來(lái)指定的,而不是在代碼里固定不變。例如運(yùn)營(yíng)設(shè)置了一個(gè)限時(shí)價(jià)活動(dòng)為原價(jià)的2折,已經(jīng)突破了成本價(jià),這時(shí)候運(yùn)營(yíng)可能不希望用戶(hù)再使用其它的促銷(xiāo)活動(dòng);而另一個(gè)限時(shí)價(jià)活動(dòng)只是原價(jià)的9折,這時(shí)候運(yùn)營(yíng)可能就允許用戶(hù)疊加使用其它活動(dòng)。
??活動(dòng)疊加存在先后關(guān)系,后面的促銷(xiāo)結(jié)果基于前面的促銷(xiāo)結(jié)果進(jìn)行計(jì)算。
??根據(jù)這個(gè)以上需求,設(shè)計(jì)一個(gè)分層的促銷(xiāo)活動(dòng)架構(gòu),處在同一層的促銷(xiāo)表示互斥的、不能同時(shí)參加的活動(dòng)類(lèi)型,不同一層的活動(dòng)則可以疊加使用。一個(gè)常見(jiàn)的分層方式是這樣的:

層級(jí) 促銷(xiāo)方式 舉例
1級(jí) 直接修改價(jià)格 直降價(jià)、秒殺、拼團(tuán)、預(yù)訂
2級(jí) 范圍促銷(xiāo) 指定商品買(mǎi)1送1;指定品牌買(mǎi)滿(mǎn)100減10;全場(chǎng)商品滿(mǎn)100減10;
3級(jí) 加價(jià)換購(gòu) 買(mǎi)滿(mǎn)100后加10元換購(gòu)xx;
4級(jí) 優(yōu)惠券 滿(mǎn)100減10券;滿(mǎn)3件8折券;
5級(jí) 會(huì)員折上折 在實(shí)付金額上直接打95折;
6級(jí) 包郵 單品包郵;滿(mǎn)99包郵;大促全場(chǎng)包郵;
7級(jí) 運(yùn)費(fèi)券
8級(jí) 積分抵扣 100積分抵1元

??分層的方式和層次之間的優(yōu)先級(jí)主要依據(jù)以下2點(diǎn):
??1.邏輯上是否允許一個(gè)商品能否同時(shí)參加兩個(gè)活動(dòng),例如用戶(hù)購(gòu)買(mǎi)一個(gè)商品時(shí),顯然不能同時(shí)參加秒殺活動(dòng)又同時(shí)參加拼團(tuán)活動(dòng)。
??2.從運(yùn)營(yíng)角度是否允許一個(gè)商品同時(shí)參加兩個(gè)活動(dòng),例如有些平臺(tái)會(huì)把范圍促銷(xiāo)分成類(lèi)目促銷(xiāo)和全場(chǎng)促銷(xiāo)兩種,并且允許用戶(hù)同時(shí)參加這兩種活動(dòng),這時(shí)候就要把范圍促銷(xiāo)拆分成兩層。
??層次之間能否疊加由前面的活動(dòng)來(lái)指定,后面的活動(dòng)不能指定能否疊加前面層級(jí)的促銷(xiāo),否則將需要不斷的逆向回滾。即,在配置1級(jí)活動(dòng)的時(shí)候可以指定能否疊加后面的2到8級(jí)的促銷(xiāo),而在配置7級(jí)活動(dòng)時(shí)只能指定能否疊加8級(jí)促銷(xiāo)。

促銷(xiāo)計(jì)算過(guò)程

??計(jì)算過(guò)程參考管道設(shè)計(jì)模式(pipeline),把每一個(gè)促銷(xiāo)層級(jí)定義為一個(gè)主策略。同一層內(nèi)有多種促銷(xiāo)活動(dòng)的,把每一種活動(dòng)定義為一個(gè)子策略,在主策略里主要實(shí)現(xiàn)如果選擇子策略的邏輯。
??另外,不同位置和不同渠道可以使用的促銷(xiāo)類(lèi)型可能會(huì)有所不同,例如購(gòu)物車(chē)一般不需要計(jì)算運(yùn)費(fèi)這一級(jí)以后促銷(xiāo)、微信渠道不能使用會(huì)員折上折等。這種情況只要把主策略組合成不同的組合,計(jì)算時(shí)按需求指定要使用的策略組合就可以了。
??也就是說(shuō),從上到下依次有三個(gè)層次的策略:策略組合、主策略、子策略。這三種策略的輸入?yún)?shù)和輸出結(jié)果完全一樣。因此定義一個(gè)促銷(xiāo)計(jì)算結(jié)果對(duì)象,作為所有策略的輸入?yún)?shù)和輸出結(jié)果。


促銷(xiāo)活動(dòng)-數(shù)據(jù)流圖

?? 計(jì)算時(shí),把用戶(hù)購(gòu)物車(chē)?yán)锏纳唐方M裝成促銷(xiāo)計(jì)算結(jié)果結(jié)構(gòu),依次通過(guò)全部策略,每個(gè)策略都會(huì)修改促銷(xiāo)計(jì)算結(jié)果里的價(jià)格,以及在商品信息上附加一個(gè)促銷(xiāo)計(jì)算結(jié)果。下面這個(gè)例子,用戶(hù)購(gòu)買(mǎi)了goodsId=1的商品2件,商品原價(jià)是10元,這時(shí)候還沒(méi)有經(jīng)過(guò)促銷(xiāo)計(jì)算,實(shí)付價(jià)等于原價(jià)。注意promotion的isUserSelect字段,表示用戶(hù)指定要參加id=10的這個(gè)秒殺活動(dòng)。

{
  "goods":[{
    "goodsId":1,
    "buyCount":2,
    "originalPrice":10,
    "payPrice":10,
    "promotions":[{
      "type":"flashSale",
      "id":10,
      "isUserSelect":true
    }]
  }],
  "originalPrice":20,
  "payPrice":20,
  "promotions":[]
}

??經(jīng)過(guò)全部促銷(xiāo)策略計(jì)算之后得到類(lèi)似這樣的一個(gè)結(jié)構(gòu)。這個(gè)商品一共應(yīng)用了兩個(gè)促銷(xiāo)活動(dòng),實(shí)付價(jià)變成5元,其中參加秒殺活動(dòng)減了4元,優(yōu)惠券減了1元。
?? levelStacking字段表示這個(gè)促銷(xiāo)可以跟哪些層級(jí)的促銷(xiāo)疊加下,例如新客秒殺這個(gè)活動(dòng)的levelStacking=[4,5],表示這個(gè)活動(dòng)可以疊加4級(jí)和5級(jí)促銷(xiāo),但是不能同時(shí)參加其它層級(jí)的活動(dòng)。
?? priceAdjustment字段表示這個(gè)商品在這個(gè)促銷(xiāo)活動(dòng)上減了多少錢(qián)。

{
  "goods":[{
    "goodsId":1,
    "goodsName":"示例商品",
    "buyCount":2,
    "originalPrice":10,
    "payPrice":5,
    "promotions":[{
      "type":"flashSale",
      "id":10,
      "name":"新客秒殺",
      "description":"僅限新客參加",
      "isUserSelect":true,
      "levelStacking":[4,5],
      "priceAdjustment":4,
      "extraInfo":[]
     },{
      "type":"discountCoupon",
      "id":11,
      "name":"新客無(wú)門(mén)檻減1券",
      "description":"僅限新客參加",
      "isUserSelect":false,
      "levelStacking":[5],
      "priceAdjustment":1,
      "extraInfo":[]
    }]
  ],
  "originalPrice":20,
  "payPrice":10,
  "promotions":[{
      "type":"flashSale",
      "id":10,
      "name":"新客秒殺",
      "priceAdjustment":8,
      "joinedGoodsId":[1],
      "extraInfo":[]
     },{
      "type":"discountCoupon",
      "id":11,
      "levelStacking":[5],
      "priceAdjustment":2,
      "joinedGoodsId":[1],
      "extraInfo":[]
    }]
}

??計(jì)算結(jié)果還要獲取到商品和活動(dòng)的其它詳情信息,把這個(gè)結(jié)果返回給購(gòu)物車(chē)和訂單后,由調(diào)用方根據(jù)各自的需求解釋成所需的結(jié)構(gòu)。
??由于策略的輸入輸出都是一樣的,所以理論上所有策略是可以任意組合的。也就是說(shuō)可以隨意往架構(gòu)里增加新的促銷(xiāo)方式或減少促銷(xiāo)方式。例如想是增加一個(gè)商品兌換券的促銷(xiāo)方式,只需要在3級(jí)和4級(jí)促銷(xiāo)之間增加一個(gè)主策略,再在這個(gè)主策略里增加兌換券的子策略就可以了。

數(shù)據(jù)庫(kù)設(shè)計(jì)

??首先把優(yōu)惠券跟其它活動(dòng)分開(kāi)來(lái),因?yàn)閮?yōu)惠券是屬于用戶(hù)資產(chǎn)類(lèi)型,用戶(hù)要先擁有了券才能參加活動(dòng)。然后會(huì)員折上折和會(huì)員積分是由用戶(hù)屬性決定的,不需要在促銷(xiāo)里另外保存。
??除此之外的其它促銷(xiāo)都滿(mǎn)足“在某個(gè)時(shí)間內(nèi)購(gòu)買(mǎi)了某個(gè)商品,就可以?xún)?yōu)惠多少元或者獲得贈(zèng)品”這樣一個(gè)結(jié)構(gòu),這些活動(dòng)都可以放到一個(gè)表里保存。


促銷(xiāo)活動(dòng)數(shù)據(jù)庫(kù)設(shè)計(jì)

??把促銷(xiāo)活動(dòng)的公有信息放到主表里,各種不同活動(dòng)的特有信息放到各自的主表里,子表的id就使用主表的id。如果使用Doctrine作為ORM可以很方便地實(shí)現(xiàn)這種架構(gòu)。
??優(yōu)惠券的數(shù)據(jù)表也使用相同的結(jié)構(gòu),在主表里保存券的通用配置,在子表里保存滿(mǎn)減券、滿(mǎn)折券、兌換券等不同券的信息。

其它問(wèn)題

??活動(dòng)的一般格式是買(mǎi)滿(mǎn)多少元/多少件,可以減少多少元/打多少折/獲得什么贈(zèng)品,可以把這些抽象成活動(dòng)條件和活動(dòng)結(jié)果兩類(lèi)策略,在各種不同的促銷(xiāo)里都可以調(diào)用。
??不同活動(dòng)疊加時(shí),后面的活動(dòng)可以按照原價(jià)來(lái)計(jì)算優(yōu)惠,也可以按照實(shí)付價(jià)來(lái)計(jì)算,也可以從某一層級(jí)開(kāi)始用實(shí)付價(jià)。
??活動(dòng)的可參與人群可以按用戶(hù)標(biāo)簽以及標(biāo)簽的交并補(bǔ)運(yùn)算進(jìn)行配置。參與活動(dòng)的商品范圍一般按品牌、品類(lèi)、商品id進(jìn)行配置,或者這些屬性的交并補(bǔ)運(yùn)算。這兩個(gè)配置的集合運(yùn)算的實(shí)現(xiàn)方式將在后面的文章詳細(xì)說(shuō)明。
??以上只是促銷(xiāo)活動(dòng)的大致架構(gòu),在實(shí)際開(kāi)發(fā)中由于各種促銷(xiāo)之間有很大的差異,這個(gè)架構(gòu)還要做很多兼容處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 每天進(jìn)步一點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)~~從開(kāi)始只能寫(xiě)幾句話(huà)、模仿別人的觀(guān)點(diǎn),到現(xiàn)...
    一個(gè)帥氣的名字呀閱讀 18,906評(píng)論 4 31
  • 京東618大促落下帷幕,伴隨著1199億元的銷(xiāo)售業(yè)績(jī)令人瞠目,如此龐大的促銷(xiāo)活動(dòng),是如何做到的?如果一個(gè)商品既參與...
    菜哥閱讀 8,058評(píng)論 6 65
  • 在電商和O2O領(lǐng)域,促銷(xiāo)是運(yùn)營(yíng)人員的一個(gè)主要的讓利行為,同時(shí)促銷(xiāo)活動(dòng)期間的購(gòu)買(mǎi)量也較之普通商品更高。所以促銷(xiāo)系統(tǒng)的...
    高暉_411e閱讀 2,067評(píng)論 0 13
  • 現(xiàn)在在去往另一個(gè)城市的火車(chē)上,家中突然有事,父母都不能相陪,這不是我第一次一個(gè)人去醫(yī)院,只是這次見(jiàn)我最重要的主治醫(yī)...
    佐伊littledewy閱讀 402評(píng)論 0 2
  • 人生之船,在欲望的大海上飄搖。 購(gòu)物成本上漲,子女教育增多,工作任務(wù)繁重。短暫的休閑和快樂(lè),敵不過(guò)小山一樣的壓力、...
    阿拉岡閱讀 370評(píng)論 0 0

友情鏈接更多精彩內(nèi)容