詳解:電商系統庫存邏輯的設計

本文主要對電商平臺的訂單系統相關庫存邏輯進行了詳細的闡述,一起來文中看看~

详解:电商系统库存逻辑的设计

一、庫存的概念

電商的業務場景中訂單的流程常常伴隨著庫存的變化;對於erp來說,庫存可能涉及入庫、出庫、分庫等操作,這裡暫且不討論erp中庫存的處理邏輯,主要就電商平臺的訂單系統相關庫存邏輯進行說明。

  1. 總庫存指:供應商倉庫該商品的實際庫存;
  2. 凍結庫存指:訂單臨時佔用的庫存,凍結庫存可以根據訂單取消或發貨等情況進行釋放;
  3. 可用庫存指:即總庫存-凍結庫存,一般指在前端顯示且用戶可下單的最大數量。

庫存的使用場景:

  1. 常規訂單流程:需要運用到總庫存,凍結庫存和可用庫存;
  2. 運營活動:特價商品活動需要佔用一定的庫存,以保證能有充足的庫存支撐活動的進行;
  3. 贈品庫存:如果把贈品當做一款SKU的情況下,即和正常下單路徑一樣,當把贈品單獨出來的情況下,需要設置贈品庫存(在我們的業務系統中,贈品由商家手動添加並設置庫存),同時需要建立一套單獨的庫存處理體系。

二、常規訂單流程中庫存的處理

總庫存的數量可以同步ERP或人工設置,人工設置的情況下,供應商點擊“確認發貨”後減少,退款時若訂單已發貨則供應商點擊“同意退款”/系統自動同意退款則增加,退貨時供應商點擊“確認收貨”/系統自動確認收貨則增加。

同步ERP數據的條件下,總庫存可以不受訂單狀態的影響(值得注意的是:如果在ERP系統中,確認發貨的節點和扣減總庫存的節點存在時間差的情況下,這個時間段,實際上會造成系統已扣減凍結庫存了,但是ERP總庫存不變,所以會造成可用庫存短時間偏大),也可以先扣減/增加總庫存,因為總庫同步肯定會覆蓋之前修改後的數量。

凍結庫存在用戶從app下單時增加,在供應商確認發貨/取消訂單時減少,“待發貨”的訂單申請退款成功則減少。

另外,取消退款和退款失敗的情況下,對庫存無影響。

結合訂單流程的中各個節點進一步說明:

用戶下單:下單時由於訂單生成之後需要預定一定的庫存,保證該訂單能發貨,所以需要增加對應商品的凍結庫存;這裡需要注意的是,不同的業務場景對於增加凍結庫存的節點定義不一樣。

一般來說在兩個節點考慮增加凍結庫存:一個是在生成訂單時,一個是在付款成功時。

對於庫存有限,時間緊迫的下單場景來說(比如:秒殺),在付款成功的時候增加凍結庫存會比較合理,因為未付款的訂單會影響到其他人購買這款商品。但對於常規場景來說,在生成訂單時佔用庫存會比較好,否則會影響用戶的下單體驗(但是一定要有系統自動取消訂單的功能以釋放凍結庫存)。

確認發貨:確認發貨的動作可以是ERP訂單出庫的時候自動確認發貨,也可以是手動確認發貨。無論哪種場景,只要觸發發貨動作的話,均需扣減總庫存,同時扣減凍結庫存。若ERP自動同步總庫存的情況下,則ERP中會扣減總庫存並自動同步至系統。

取消訂單:首頁,在我們系統中定義在付款成功之前可以取消訂單,取消訂單的時候需要扣減凍結庫存(即去除庫存的佔用)。

申請退款:若系統定義為商品付款後,發貨前可以申請退款的情況下,退款成功則需要扣減凍結庫存(商家操作“同意退款”或系統超時自動審核)。

申請退貨:若系統定義為商品發貨後,可以進行申請退貨的情況下,退款成功且供應商已收貨的情況下需要增加總庫存(商家操作“確認收貨”或系統自動確認收貨),若ERP自動同步庫存的情況下,則ERP中會增加總庫存並自動同步至系統。

附:下單流程圖

详解:电商系统库存逻辑的设计

三、活動庫存的處理

實際做法:由於在數據庫中沒有活動庫存這個字段,導致原公式:可用庫存=總庫存-凍結庫存,無法統一修改;在實際開發中凍結庫存=普通商品凍結庫存+活動庫存之和,另外活動庫存仍將保留在活動表中,活動表中包括字段活動庫存,活動已用庫存。

1. 活動庫存概念

特價商品在設置活動時,可設置活動庫存,目的為限制本商品以特價銷售的數量(設置的活動庫存不能大於總庫存),同時也保證參加活動的商品的數量,超出活動數量的商品(活動庫存用光的時候)將以原價購買。

2. 數據庫庫存相關字段

商品表相關字段:總庫存、凍結庫存;活動表相關字段:活動庫存、活動凍結庫存。

普通商品可用庫存=總庫存-凍結庫存-活動庫存之和

活動商品可用庫存=活動庫存-活動凍結庫存

(實際上在我們開發過程中,由於初期數據庫設計未能考慮到後面的拓展性,頁面取數據的時候,普通商品可用庫存=總庫存-凍結庫存,到後面增加促銷活動時,這個公式若需要變動則影響太大了。所以我們保持原來的公式不變,讓凍結庫存=普通商品凍結庫存+活動庫存之和,這個問題凸顯了技術架構的重要性。)

3. 下單過程中的庫存邏輯

活動創建成功,則對應的商品需將活動庫存A件從總庫存B件中間分出 ,此時普通商品可用庫存為(B-A)件,特價商品活動可用庫存為A件。

用戶下單時,以活動價購買商品C件,則普通商品可用庫存仍為(B-A)件,特價商品可用庫存為(A-C)件,活動凍凍結庫存為C件。

活動庫存不足/超出限購數量時,下單D件,其中以特價購買的為D1件,以普通價購買的商品為D2件。則普通商品可用庫存為(B-A-D2)件,普通商品凍結庫存D2件,特價商品活動可用庫存為(A-D1),活動凍結庫存為D1件。

當特價商品可用庫存不足時,特價商品售完,所有商品都以普通價購買。當活動期間若有訂單取消或退款、退貨,則活動庫存重新>0時,可繼續以剩餘的數量按特價購買商品。

4. 活動商品庫存扣減及回滾

活動商品售出之後,增加活動凍結庫存,活動有效期間取消訂單/退款成功則減少活動凍結庫存;普通商品的庫存不受影響,但是特價商品的可購數量需要增加/減少。

活動中若ERP由於發貨需要調整凍結庫存和總庫存,此時不管發貨的是不是特價商品,都是直接扣減凍結庫存和總庫存(因為ERP沒有分庫而且庫存自動同步的情況下,總庫存一定會減少,那邊此時也需要扣減凍結庫存保證普通商品的可購數量保持不變,而活動商品的庫存不需要處理)。

活動結束:如活動庫存100件,賣了20件,則將該商品的活動庫存清零,且活動凍結庫存的數量合併到凍結庫存後活動凍結庫存也清零。最終凍結庫存加20,此外由於活動庫存變小,普通商品可用庫存也變大(等於是把活動庫存沒用完的還回去)。

四、贈品庫存的處理

贈品庫存基於我當前的業務系統情況進行說明,我們目前的贈品總庫存及贈品活動庫存都是在後臺手動設置的,所以是一套單獨的邏輯。

贈品表相關字段:贈品總庫存,贈品活動庫存可用;活動表相關字段:贈品活動庫存,贈品可用庫存;

贈品總庫存可人工設置,每個使用贈品的活動都會設置對應的贈品活動庫存。贈品活動庫存可用=贈品總庫存-贈品活動庫存之和。(注意這個贈品可用庫存,是指在後臺添加贈品活動時可以設置的最大活動庫存數量)

購買商品時,所送的贈品不能大於贈品活動庫存;沒有贈品活動庫存不夠送的情況下,要友好提示客戶。當提交訂單後,若有送贈品,則自動扣減對應的贈品活動庫存和贈品總庫存。

活動有效期間,取消訂單/退貨,退款審核通過則自動增加贈品活動庫存和贈品總庫存;活動失效後,取消訂單/退貨,退款審核通過則自動增加贈品總庫存。活動失效時,對應的贈品活動庫存清零。

五、前端庫存展示

按正常邏輯:如果商品不存在特價/秒殺活動的情況下,直接以普通價購買,顯示普通商品可用庫存即可;如果商品存在秒殺/特價活動的情況下,應該要顯示活動商品的庫存。

但是存在一種情況就是購買的一批商品中部分商品需要按照活動價算,剩餘商品按照普通價算,那麼這時候取普通商品可用庫存/活動商品可用庫存都是不對的。

所以最終我們在權衡之下,還是用了普通商品可用庫存+活動商品可用庫存之和(即總庫存-凍結庫存-活動凍結庫存之和)。

題圖來自Unsplash,基於CC0協議


分享到:


相關文章: