訂單系統(tǒng):從0到1設(shè)計思路
注意:文末有最新Java實戰(zhàn)項目和面試題
概述
本文主要講述了在傳統(tǒng)電商企業(yè)中,訂單系統(tǒng)應(yīng)承載的角色,就訂單系統(tǒng)所包含的主要功能模塊梳理了設(shè)計思路,并對訂單系統(tǒng)未來的發(fā)展做了一些思考。
1、訂單系統(tǒng)在企業(yè)中的角色
在搭建企業(yè)訂單系統(tǒng)之前,需要先梳理企業(yè)整體業(yè)務(wù)系統(tǒng)之間的關(guān)系和訂單系統(tǒng)上下游關(guān)系,只有劃分清業(yè)務(wù)系統(tǒng)邊界,才能確定訂單系統(tǒng)的職責(zé)與功能,進(jìn)而保證各系統(tǒng)之間高效簡潔的工作。
2、訂單系統(tǒng)與各業(yè)務(wù)系統(tǒng)的關(guān)系
(1)對外系統(tǒng):
(2)管理中后臺:
每個C端的業(yè)務(wù)形態(tài)都會有一個對應(yīng)的系統(tǒng)模塊,如負(fù)責(zé)管理平臺交易的訂單系統(tǒng),管理優(yōu)惠信息的促銷系統(tǒng),管理平臺所有產(chǎn)品的產(chǎn)品系統(tǒng),以及管理所有對外系統(tǒng)顯示內(nèi)容的內(nèi)容系統(tǒng)等。
(3)公共服務(wù)系統(tǒng):
3、訂單系統(tǒng)上下游關(guān)系
4、訂單系統(tǒng)的業(yè)務(wù)架構(gòu)
(1)訂單服務(wù)
該模塊的主要功能是用戶日常使用的服務(wù)和頁面,主要有訂單列表、訂單詳情、在線下單等,還包括為公共業(yè)務(wù)模塊提供的多維度訂單數(shù)據(jù)服務(wù)。
(2)訂單邏輯
訂單系統(tǒng)的核心,起著至關(guān)重要的作用,在訂單系統(tǒng)負(fù)責(zé)管理訂單創(chuàng)建、訂單支付、訂單生產(chǎn)、訂單確認(rèn)、訂單完成、取消訂單等訂單流程。還涉及到復(fù)雜的訂單狀態(tài)規(guī)則、訂單金額計算規(guī)則以及增減庫存規(guī)則等。在4節(jié)核心功能設(shè)計中會重點(diǎn)來說。
(3)底層服務(wù)
訂單系統(tǒng)核心功能
1、訂單中所包含的內(nèi)容信息
為了使訂單系統(tǒng)能夠?qū)τ唵芜M(jìn)行高效、精準(zhǔn)的管理和跟蹤,訂單會儲存關(guān)于產(chǎn)品、優(yōu)惠、用戶、支付信息等一系列的訂單實時數(shù)據(jù),來和下游系統(tǒng),如:促銷、倉儲、物流進(jìn)行交互。
以一個通用B2C商城的訂單為例,梳理其包含的信息如下:
2、流程引擎
流程是指從平臺角度出發(fā),將訂單從創(chuàng)建到完成的整個流轉(zhuǎn)過程進(jìn)行抽象,從而形成了一套標(biāo)準(zhǔn)流程規(guī)則。而不同的產(chǎn)品類型或交易類型在系統(tǒng)中的流程會千差萬別,因此為了方便對訂單流程進(jìn)行管理,會組建流程引擎模塊。
(1)正向流程
以一個通用B2C商城的訂單系統(tǒng)為例,根據(jù)其實際業(yè)務(wù)場景,其訂單流程可抽象為5大步驟:訂單創(chuàng)建>訂單支付>訂單生產(chǎn)>訂單確認(rèn)>訂單完成。
而每個步驟的背后,訂單是如何在多系統(tǒng)之間交互流轉(zhuǎn)的,可概括如下圖:
訂單創(chuàng)建:
用戶下單后,系統(tǒng)需要生成訂單,此時需要先獲取下單中涉及的商品信息,然后獲取該商品所涉及到的優(yōu)惠信息,如果商品不參與優(yōu)惠信息,則無此環(huán)節(jié)。
增減庫存規(guī)則是指訂單中的商品,何時從倉儲系統(tǒng)中對相應(yīng)商品庫存進(jìn)行扣除,目前主流有兩種方式:
下單減庫存——即用戶下單成功時減少庫存數(shù)量
優(yōu)勢:用戶體驗友好,系統(tǒng)邏輯簡潔;
缺點(diǎn):會導(dǎo)致惡意下單或下單后卻不買,使得真正有需求的用戶無法購買,影響真實銷量;
解決辦法:
設(shè)置訂單有效時間,若訂單創(chuàng)建成功N分鐘不付款,則訂單取消,庫存回滾;
限購,用各種條件來限制買家的購買件數(shù),比如一個賬號、一個ip,只能買一件;
風(fēng)控,從技術(shù)角度進(jìn)行判斷,屏蔽惡意賬號,禁止惡意賬號購買。
付款減庫存——即用戶支付完成并反饋給平臺后再減少庫存數(shù)量
優(yōu)勢:減少無效訂單帶來的資源損耗;
缺點(diǎn):因第三方支付返回結(jié)果存在時差,同一時間多個用戶同時付款成功,會導(dǎo)致下單數(shù)目超過庫存,商家?guī)齑娌蛔闳菀滓l(fā)斷貨和投訴,成本增加。
解決辦法:
付款前再次校驗庫存,如確認(rèn)訂單要付款時再驗證一次,并友好提示用戶庫存不足;
增加提示信息:在商品詳情頁,訂單步驟頁面提示不及時付款,不能保證有庫存等。
綜上所述,兩種方式各有優(yōu)缺點(diǎn),因此,需結(jié)合實際場景進(jìn)行考慮,如:秒殺、搶購、促銷活動等,可使用下單減庫存的方式。而對于產(chǎn)品庫存量大,并發(fā)流量沒有那么強(qiáng)的產(chǎn)品使用付款減庫存的方式。
將兩種方式帶入到銷售場景中,關(guān)聯(lián)商品類型、促銷類型、供需關(guān)系等,靈活使用,以充分發(fā)揮計算機(jī)系統(tǒng)的優(yōu)勢。
訂單支付:
訂單拆分一般分兩種:
一種是用戶挑選的商品來自于不同渠道(自營與商家,商家與商家);
另一種是在SKU層面上拆分訂單:不同倉庫,不同運(yùn)輸要求的SKU,包裹重量體積限制等因素需要將訂單拆分。
訂單拆分也是一個相對獨(dú)立的模塊,這里就不詳細(xì)描述了。
**訂單生產(chǎn):**訂單生產(chǎn),是指產(chǎn)品從企業(yè)到用戶這一流程的概述。如電商平臺中,商家發(fā)貨過程已有一個標(biāo)準(zhǔn)化的流程,訂單內(nèi)容會發(fā)送到倉庫,倉庫對商品進(jìn)行打單、揀貨、包裝、交接快遞進(jìn)行配送。
**訂單確認(rèn):**收到貨后,訂單系統(tǒng)需要在快遞被簽收后提醒用戶對商品做評價。這里要注意,確認(rèn)收到貨不代表交易成功,相反是售后服務(wù)的開始。
**訂單完成:**訂單完成是指在收到貨X天的狀態(tài),此時訂單不在售后的支持時間范圍內(nèi)。到此,一個訂單的正向流程就算走完了。
(2)逆向流程
上面說到逆向流程是各種修改訂單、取消訂單、退款、退貨等操作,需要梳理清楚這些流程與正向流程的關(guān)系,才能理清訂單系統(tǒng)完整的訂單流程。
**訂單修改:**可梳理訂單內(nèi)信息,根據(jù)信息關(guān)聯(lián)程度及業(yè)務(wù)訴求,設(shè)定訂單的可修改范圍是什么,比如:客戶下單后,想修改收貨人地址及電話。此時只需對相應(yīng)數(shù)據(jù)進(jìn)行更新即可。
**訂單取消:**用戶提交訂單后沒有進(jìn)行支付操作,此時用戶原則上屬于取消訂單,因為還未付款,則比較簡單,只需要將原本提交訂單時扣減的庫存補(bǔ)回,促銷優(yōu)惠中使用的優(yōu)惠券,權(quán)益等視平臺規(guī)則,進(jìn)行相應(yīng)補(bǔ)回。
**退款:**用戶支付成功后,客戶發(fā)出退款的訴求后,需商戶進(jìn)行退款審核,雙方達(dá)成一致后,系統(tǒng)應(yīng)以退款單的形式完成退款,關(guān)聯(lián)原訂單數(shù)據(jù)。因商品無變化,所以不需考慮與庫存系統(tǒng)的交互,僅需考慮促銷系統(tǒng)及支付系統(tǒng)交互即可。
**退貨:**用戶支付成功后,客戶發(fā)出退貨的訴求后,需商戶進(jìn)行退款審核,雙方達(dá)成一致后,需對庫存系統(tǒng)進(jìn)行補(bǔ)回,支付系統(tǒng)、促銷系統(tǒng)以退款單形式完成退款。最后,在退款/退貨流程中,需結(jié)合平臺業(yè)務(wù)場景,考慮優(yōu)惠分?jǐn)偟倪壿?,在發(fā)生退款/退貨時,優(yōu)惠該如何退回的處理規(guī)則和流程。
(3)狀態(tài)機(jī)
狀態(tài)機(jī)是管理訂單狀態(tài)邏輯的工具。狀態(tài)機(jī)可歸納為3個要素,即現(xiàn)態(tài)、動作、次態(tài)。
現(xiàn)態(tài):是指當(dāng)前所處的狀態(tài)。
動作:動作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。
次態(tài):動作滿足后要遷往的新狀態(tài),“次態(tài)”是相對于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。
狀態(tài)機(jī)的設(shè)計需要結(jié)合平臺實際業(yè)務(wù)場景,將狀態(tài)間的切換細(xì)化成了執(zhí)行了某個動作。
以一個B2C商城的訂單系統(tǒng)舉例如下:
訂單系統(tǒng)為了高效的對訂單進(jìn)行跟蹤和管理,會對訂單流程當(dāng)中的關(guān)鍵節(jié)點(diǎn),抽象出訂單狀態(tài)。而訂單狀態(tài)從不同用戶的角度可分為,系統(tǒng)訂單狀態(tài)、商家訂單狀態(tài)、買家訂單狀態(tài)等。
對于訂單系統(tǒng)來說,訂單狀態(tài)細(xì)分的顆粒度越細(xì)、越明確,訂單系統(tǒng)管理的精度和可靠性就越高,比如:在待付款和待發(fā)貨兩個狀態(tài)中,訂單系統(tǒng)后臺會細(xì)分為訂單超時取消、訂單支付失敗、訂單付款完成等。
因此,訂單狀態(tài)模塊中,通常會維護(hù)狀態(tài)映射表,以不同的用戶角色對系統(tǒng)訂單狀態(tài)進(jìn)行重新劃分,以滿足不同用戶的需求。
除此以外,隨著電商平臺的不斷發(fā)展,不同的業(yè)務(wù)類型,所對應(yīng)的訂單狀態(tài)都會有所區(qū)別。所以,訂單系統(tǒng)中一般會儲存多套狀態(tài)機(jī),以滿足不同的訂單類型來使用。
訂單系統(tǒng)的發(fā)展
訂單系統(tǒng)的主體框架,和主要業(yè)務(wù)模塊已基本講完,那么隨著企業(yè)的發(fā)展,業(yè)務(wù)量和業(yè)務(wù)形式不斷變化,企業(yè)有可能形成多個訂單系統(tǒng)并存以滿足不同的業(yè)務(wù)需要的情況。
業(yè)務(wù)系統(tǒng)架構(gòu)如下:
這種狀況的出現(xiàn),將會給平臺帶來非常大的發(fā)展瓶頸,如:
三個訂單系統(tǒng),每個訂單系統(tǒng)處理不同類型的訂單,沒有統(tǒng)一的訂單銷量、訂單狀態(tài)信息,網(wǎng)站前臺對訂單的狀態(tài)展示與控制不統(tǒng)一,只能是在網(wǎng)站前臺會員中心硬代碼維護(hù)一套面向會員的統(tǒng)一訂單明細(xì)與狀態(tài)數(shù)據(jù)。而無線側(cè)上線后,由于不了解前臺網(wǎng)站會員中心的訂單狀態(tài)管理邏輯,所以需要把前臺網(wǎng)站的訂單明細(xì)及狀態(tài)管理再在無線應(yīng)用側(cè)再實現(xiàn)一遍。
三套后臺訂單系統(tǒng)與公共業(yè)務(wù)系統(tǒng)如會員中心、支付與財務(wù)、促銷工具、客戶分單等系統(tǒng)都需要對接一遍,公共業(yè)務(wù)處理邏輯不統(tǒng)一,一旦邏輯變更多個系統(tǒng)統(tǒng)一個接口都要修改一遍,接口的重復(fù)維護(hù)開發(fā)工作量大。
訂單開發(fā)目前分到事業(yè)部,各個事業(yè)部只會考慮自己的邏輯,不會考慮公共架構(gòu),只會越走越遠(yuǎn)。碰到像無線這樣的項目,需要對接各個事業(yè)部,無線側(cè)應(yīng)用上線進(jìn)展慢。
因此未來的訂單系統(tǒng)可拆分為訂單中心與業(yè)務(wù)訂單系統(tǒng)兩個模塊,以管理公司所有訂單數(shù)據(jù),并為各個模塊提供統(tǒng)一服務(wù)。
業(yè)務(wù)系統(tǒng)架構(gòu)如下:
最后
對于企業(yè)訂單系統(tǒng)的搭建,并不是要做的大而全、也不是要小而精。而需要結(jié)合市場、公司、業(yè)務(wù)的實際情況來最終制定系統(tǒng)設(shè)計方案和產(chǎn)品迭代計劃。
最終,和公司整體發(fā)展相互協(xié)調(diào),相輔相成。
作者:夜空_2cd3 鏈接:https://www.jianshu.com/p/2ee9085c74bb











