Java生鮮電商平台-訂單配送模塊的架構與設計
生鮮電商系統最終的目的還是用戶下單支付購買,
所以訂單管理系統是電商系統中最為復雜的系統,其作為中樞決定着整個商城的運轉,
本文將對於生鮮類電商平台的訂單設計做一個完整的分析,也對前階段工作做一個復盤總結

訂單系統設計的好壞,決定了平台的可用性、后期的功能拓展和商城價值;訂單系統貫穿於整個商城系統,其他各個系統的設計也是為訂單系統提供數據支撐。從用戶提交訂單的那一刻到訂單完成,到售后,都需要訂單管理系統來管理。
訂單管理系統從流程生成過程,大致分為三部分:
1.階段一、訂單生成過程:用戶通過平台選擇商品,選擇添加至購物車(某些平台下單過程無加入購物車流程),生成訂單價格,提交訂單,后台根據優惠信息、活動信息、會員價等生成訂單金額,一般具體到每個商品訂單實付金額。
2.階段二、訂單配送過程:用戶支付完成,從倉儲發貨、配送、用戶收貨后訂單完成,如無提起售后流程,一般訂單到此就算完成,正常的訂單到階段二流程即結束了。
3.階段三、訂單異常、售后流程:用戶在前兩個階段過程中發起支付取消、提起商品售后流程,一般在訂單商品配送過程中是不允許用戶發起退款,等用戶收到貨物后才可發起售后,對於生鮮類平台,可能不會做退貨的功能。
一、訂單生成過程
首先,是用戶在商城內選購商品,這個階段可以叫做用戶購物行為。
然后,是系統調取各個系統的數據,計算訂單的最終價格,這個階段可以叫做數據處理過程。
最后,是將訂單價格在用戶端顯示,這個階段叫做表現層顯示。

1、訂單提交生成過程
用戶下單后系統需要生成訂單,生成訂單過程需獲取商品信息,商品是否涉及相關優惠活動;獲取用戶會員信息(由於小程序做了付費會員,付費會員與普通會員購物部分商品有不同優惠力度和商品價格差異)。
用戶提交商品訂單時需要考慮商品庫存問題:1.用戶提交訂單時鎖定商品庫存,即下單減庫存。2.用戶付款后鎖定商品庫存。何時鎖定商品庫存得看具體情況,個人感覺下單鎖庫存在商品庫存不多,商品暢銷情況下用戶體驗更好,避免在用戶支付完成后商家無庫存發貨。由於社區生鮮類商品,貨損較嚴重,所以設計為用戶付款后鎖定庫存。
2、支付訂單后是否需要拆單/合單
訂單拆單:客戶同時在多家店鋪下單,不同的店鋪的商品在正常情況下是要拆開的;自營平台商品的訂單是否需要拆單根據發貨倉是否相同,發貨倉不同,也是需要根據商品發貨單進行拆單。總之同一個訂單,會有多個包裹多個運單發貨,就需要將訂單查看。
訂單合單:同一個用戶不同訂單需要考慮是否合單發貨,需根據實際情況而定,訂單合單后,多個訂單生成一個發貨單發貨。
3、訂單商品優惠分攤
1. 為什么要對訂單金額進行分攤?
首要因素是退款,在訂單付款成功之后,如果不針對單個商品進行金額分攤,那么如果用戶需要退訂單中的部分商品,沒法計算需要退的金額。同樣如果只是單一商品品類券,則根據符合優惠券使用條件的商品進行分攤,其他商品按照商品售賣價格。
財務對賬:將優惠金額分攤到每個商品上,能核算統一訂單下的每個商品分別分攤的優惠金額,比如:平台券,一個使用平台券的訂單最終需要計算每個商品分攤的優惠金額,以確定每個商品的實際付款金額和享受平台優惠的金額。
核算成本:通過把優惠金額分攤到每個商品上去,運營,財務或采購人員可以評估營銷活動的成本。
2. 優惠金額分攤邏輯
按照最小維度進行分攤:即優惠金額需要分攤到每個商品,且同一個商品采購數量大於1時,該商品最終只能有一個分攤后的價格
優惠分攤比例:按照商品金額分攤對應比例的優惠,保證不同商品享受優惠的公平性,否則會出現商品應分攤的優惠大於商品的銷售價或影響用戶體驗。
誤差處理:減小誤差主要途徑是在算法層面上進行優化,同時也無法避免誤差,多余的誤差需要按照不同的優惠活動分別存儲起來,在財務對賬和退款的時候需要用到。
這里必須提一下,這里訂單商品優惠分攤的前提是訂單中商品符合優惠條件,訂單中不符合優惠條件的商品不參與優惠分攤。
二、訂單配送過程
用戶在下單完成后,限制了用戶退款訂單狀態,只允許用戶在訂單狀態為:待發貨和配送完成狀態下才可以申請退款。支付完成后訂單發貨狀態共分為:待發貨、分揀中、配送中、商品到達代收點、配送完成、用戶已取貨這幾個狀態。

1、針對有缺貨/無貨情況
避免生鮮水果類商品的貨損過大問題,倉儲一般備貨較少,有時需及時從生產商拿貨,就可能會出現商品不足、無貨的情況,如發生缺貨、無貨的情況,是否補單發貨,還是直接退款給用戶
生成補貨單發貨或者退款:在倉儲發貨分揀發現缺貨、無貨情況時可發起異常配送流程,針對缺貨、無貨的商品按照訂單生成時間判斷影響了具體哪些用戶訂單,在缺貨、無貨商品訂單中操作想應的補貨或者退款操作
這里需要說明一點,我們強調的是客服主動跟受影響的用戶進行溝通,而非系統自動發起補貨或退款。
2、用戶同一天下單多次的訂單是否需要合單發貨
針對同一用戶同一天內的訂單是否需要合成一個發貨單發貨,需要根據具體場景具體考慮,如果做了合成一個發貨單,幾單包裹在一起是否一個包裹能裝下,如果是需要兩三個包裹裝的話,只有一個發貨單如何處理,都是需要考慮解決方案。
三、訂單異常、售后流程
訂單售后一般包括未支付訂單取消、下單完成后未配送前發起退款申請,配送完成后的訂單申請售后過程,未支付訂單的取消和下單完成后未配送前發起的退款申請,系統在接收到退款申請時會自動給用戶訂單退款;配送完成后的訂單由於商品性質的原因,限定了不支持無理由退貨退款,並且沒有做退貨流程的處理,主要考慮到商品退回至倉庫已無價值。
訂單系統逆流程的分支很多,需要兼顧業務場景,一般在從0到1的過程中,售后流程會先通過線下的方式解決,以便能把資源集中在更核心的部分。