谷粒商城订单
訂單
1、 訂單中心
電商系統(tǒng)涉及到 3 流, 分別時(shí)信息流, 資金流, 物流, 而訂單系統(tǒng)作為中樞將三者有機(jī)的集合起來(lái)。
訂單模塊是電商系統(tǒng)的樞紐, 在訂單這個(gè)環(huán)節(jié)上需求獲取多個(gè)模塊的數(shù)據(jù)和信息, 同時(shí)對(duì)這些信息進(jìn)行加工處理后流向下個(gè)環(huán)節(jié), 這一系列就構(gòu)成了訂單的信息流通。
1、 訂單構(gòu)成
1、用戶(hù)信息
用戶(hù)信息包括用戶(hù)賬號(hào)、用戶(hù)等級(jí)、用戶(hù)的收貨地址、收貨人、收貨人電話(huà)等組成,用戶(hù)賬 戶(hù)需要綁定手機(jī)號(hào)碼,但是用戶(hù)綁定的手機(jī)號(hào)碼不一定是收貨信息上的電話(huà)。用戶(hù)可以添加 多個(gè)收貨信息,用戶(hù)等級(jí)信息可以用來(lái)和促銷(xiāo)系統(tǒng)進(jìn)行匹配,獲取商品折扣,同時(shí)用戶(hù)等級(jí) 還可以獲取積分的獎(jiǎng)勵(lì)等
2、訂單基礎(chǔ)信息
訂單基礎(chǔ)信息是訂單流轉(zhuǎn)的核心,其包括訂單類(lèi)型、父/子訂單、訂單編號(hào)、訂單狀態(tài)、訂 單流轉(zhuǎn)的時(shí)間等。
- 訂單類(lèi)型包括實(shí)體商品訂單和虛擬訂單商品等,這個(gè)根據(jù)商城商品和服務(wù)類(lèi)型進(jìn)行區(qū)分。
- 同時(shí)訂單都需要做父子訂單處理,之前在初創(chuàng)公司一直只有一個(gè)訂單,沒(méi)有做父子訂 單處理后期需要進(jìn)行拆單的時(shí)候就比較麻煩,尤其是多商戶(hù)商場(chǎng),和不同倉(cāng)庫(kù)商品的時(shí)候, 父子訂單就是為后期做拆單準(zhǔn)備的。
- 訂單編號(hào)不多說(shuō)了,需要強(qiáng)調(diào)的一點(diǎn)是父子訂單都需要有訂單編號(hào),需要完善的時(shí)候 可以對(duì)訂單編號(hào)的每個(gè)字段進(jìn)行統(tǒng)一定義和詮釋。
- 訂單狀態(tài)記錄訂單每次流轉(zhuǎn)過(guò)程,后面會(huì)對(duì)訂單狀態(tài)進(jìn)行單獨(dú)的說(shuō)明。
- 訂單流轉(zhuǎn)時(shí)間需要記錄下單時(shí)間,支付時(shí)間,發(fā)貨時(shí)間,結(jié)束時(shí)間/關(guān)閉時(shí)間等等
3、商品信息
商品信息從商品庫(kù)中獲取商品的 SKU 信息、圖片、名稱(chēng)、屬性規(guī)格、商品單價(jià)、商戶(hù)信息 等,從用戶(hù)下單行為記錄的用戶(hù)下單數(shù)量,商品合計(jì)價(jià)格等。
4、優(yōu)惠信息
優(yōu)惠信息記錄用戶(hù)參與的優(yōu)惠活動(dòng),包括優(yōu)惠促銷(xiāo)活動(dòng),比如滿(mǎn)減、滿(mǎn)贈(zèng)、秒殺等,用戶(hù)使 用的優(yōu)惠券信息,優(yōu)惠券滿(mǎn)足條件的優(yōu)惠券需要默認(rèn)展示出來(lái),具體方式已在之前的優(yōu)惠券 篇章做過(guò)詳細(xì)介紹,另外還虛擬幣抵扣信息等進(jìn)行記錄。
為什么把優(yōu)惠信息單獨(dú)拿出來(lái)而不放在支付信息里面呢?
因?yàn)閮?yōu)惠信息只是記錄用戶(hù)使用的條目,而支付信息需要加入數(shù)據(jù)進(jìn)行計(jì)算,所以做為區(qū)分。
5、支付信息
-
1支付流水單號(hào),這個(gè)流水單號(hào)是在喚起網(wǎng)關(guān)支付后支付通道返回給電商業(yè)務(wù)平臺(tái)的支 付流水號(hào),財(cái)務(wù)通過(guò)訂單號(hào)和流水單號(hào)與支付通道進(jìn)行對(duì)賬使用。
-
2支付方式用戶(hù)使用的支付方式,比如微信支付、支付寶支付、錢(qián)包支付、快捷支付等 。支付方式有時(shí)候可能有兩個(gè)——余額支付+第三方支付。
-
3商品總金額,每個(gè)商品加總后的金額;運(yùn)費(fèi),物流產(chǎn)生的費(fèi)用;優(yōu)惠總金額,包括促 銷(xiāo)活動(dòng)的優(yōu)惠金額,優(yōu)惠券優(yōu)惠金額,虛擬積分或者虛擬幣抵扣的金額,會(huì)員折扣的金額等 之和;實(shí)付金額,用戶(hù)實(shí)際需要付款的金額。
? 用戶(hù)實(shí)付金額=商品總金額+運(yùn)費(fèi)-優(yōu)惠總金額
6、物流信息
物流信息包括配送方式,物流公司,物流單號(hào),物流狀態(tài),物流狀態(tài)可以通過(guò)第三方接口來(lái) 獲取和向用戶(hù)展示物流每個(gè)狀態(tài)節(jié)點(diǎn)。
2、訂單狀態(tài)
1.待付款
用戶(hù)提交訂單后,訂單進(jìn)行預(yù)下單,目前主流電商網(wǎng)站都會(huì)喚起支付,便于用戶(hù)快速完成支 付,需要注意的是待付款狀態(tài)下可以對(duì)庫(kù)存進(jìn)行鎖定,鎖定庫(kù)存需要配置支付超時(shí)時(shí)間,超 時(shí)后將自動(dòng)取消訂單,訂單變更關(guān)閉狀態(tài)。
2.已付款/待發(fā)貨
用戶(hù)完成訂單支付,訂單系統(tǒng)需要記錄支付時(shí)間,支付流水單號(hào)便于對(duì)賬,訂單下放到 WMS系統(tǒng),倉(cāng)庫(kù)進(jìn)行調(diào)撥,配貨,分揀,出庫(kù)等操作。
3.待收貨/已發(fā)貨
倉(cāng)儲(chǔ)將商品出庫(kù)后,訂單進(jìn)入物流環(huán)節(jié),訂單系統(tǒng)需要同步物流信息,便于用戶(hù)實(shí)時(shí)知悉物 品物流狀態(tài)
4.已完成
用戶(hù)確認(rèn)收貨后,訂單交易完成。后續(xù)支付側(cè)進(jìn)行結(jié)算,如果訂單存在問(wèn)題進(jìn)入售后狀態(tài)
5.已取消
付款之前取消訂單。包括超時(shí)未付款或用戶(hù)商戶(hù)取消訂單都會(huì)產(chǎn)生這種訂單狀態(tài)。
6.售后中
用戶(hù)在付款后申請(qǐng)退款,或商家發(fā)貨后用戶(hù)申請(qǐng)退換貨。
售后也同樣存在各種狀態(tài),當(dāng)發(fā)起售后申請(qǐng)后生成售后訂單,售后訂單狀態(tài)為待審核,等待 商家審核,商家審核通過(guò)后訂單狀態(tài)變更為待退貨,等待用戶(hù)將商品寄回,商家收貨后訂單 狀態(tài)更新為待退款狀態(tài),退款到用戶(hù)原賬戶(hù)后訂單狀態(tài)更新為售后成功。
2、訂單流程
訂單流程是指從訂單產(chǎn)生到完成整個(gè)流轉(zhuǎn)的過(guò)程,從而行程了一套標(biāo)準(zhǔn)流程規(guī)則。而不同的 產(chǎn)品類(lèi)型或業(yè)務(wù)類(lèi)型在系統(tǒng)中的流程會(huì)千差萬(wàn)別,比如上面提到的線(xiàn)上實(shí)物訂單和虛擬訂單 的流程,線(xiàn)上實(shí)物訂單與 O2O 訂單等,所以需要根據(jù)不同的類(lèi)型進(jìn)行構(gòu)建訂單流程。
不管類(lèi)型如何訂單都包括正向流程和逆向流程,對(duì)應(yīng)的場(chǎng)景就是購(gòu)買(mǎi)商品和退換貨流程,正向流程就是一個(gè)正常的網(wǎng)購(gòu)步驟:訂單生成–>支付訂單–>賣(mài)家發(fā)貨–>確認(rèn)收貨–>交易成功。 而每個(gè)步驟的背后,訂單是如何在多系統(tǒng)之間交互流轉(zhuǎn)的,可概括如下圖
1、訂單創(chuàng)建與支付
-
(1)、訂單創(chuàng)建前需要預(yù)覽訂單,選擇收貨信息等
-
(2)、訂單創(chuàng)建需要鎖定庫(kù)存,庫(kù)存有才可創(chuàng)建,否則不能創(chuàng)建
-
(3)、訂單創(chuàng)建后超時(shí)未支付需要解鎖庫(kù)存
-
(4)、支付成功后,需要進(jìn)行拆單,根據(jù)商品打包方式,所在倉(cāng)庫(kù),物流等進(jìn)行拆單
-
(5)、支付的每筆流水都需要記錄,以待查賬
-
(6)、訂單創(chuàng)建,支付成功等狀態(tài)都需要給 MQ 發(fā)送消息,方便其他系統(tǒng)感知訂閱
2、逆向流程
-
(1)、修改訂單,用戶(hù)沒(méi)有提交訂單,可以對(duì)訂單一些信息進(jìn)行修改,比如配送信息, 優(yōu)惠信息,及其他一些訂單可修改范圍的內(nèi)容,此時(shí)只需對(duì)數(shù)據(jù)進(jìn)行變更即可。
-
(2)、訂單取消,用戶(hù)主動(dòng)取消訂單和用戶(hù)超時(shí)未支付,兩種情況下訂單都會(huì)取消訂 單,而超時(shí)情況是系統(tǒng)自動(dòng)關(guān)閉訂單,所以在訂單支付的響應(yīng)機(jī)制上面要做支付的限時(shí)處理,尤其是在前面說(shuō)的下單減庫(kù)存的情形下面,可以保證快速的釋放庫(kù)存。 另外需要需要處理的是促銷(xiāo)優(yōu)惠中使用的優(yōu)惠券,權(quán)益等視平臺(tái)規(guī)則,進(jìn)行相應(yīng)補(bǔ) 回給用戶(hù)。
-
(3)、退款,在待發(fā)貨訂單狀態(tài)下取消訂單時(shí),分為缺貨退款和用戶(hù)申請(qǐng)退款。如果是 全部退款則訂單更新為關(guān)閉狀態(tài),若只是做部分退款則訂單仍需進(jìn)行進(jìn)行,同時(shí)生 成一條退款的售后訂單,走退款流程。退款金額需原路返回用戶(hù)的賬戶(hù)。
-
(4)、發(fā)貨后的退款,發(fā)生在倉(cāng)儲(chǔ)貨物配送,在配送過(guò)程中商品遺失,用戶(hù)拒收,用戶(hù) 收貨后對(duì)商品不滿(mǎn)意,這樣情況下用戶(hù)發(fā)起退款的售后訴求后,需要商戶(hù)進(jìn)行退款 的審核,雙方達(dá)成一致后,系統(tǒng)更新退款狀態(tài),對(duì)訂單進(jìn)行退款操作,金額原路返 回用戶(hù)的賬戶(hù),同時(shí)關(guān)閉原訂單數(shù)據(jù)。僅退款情況下暫不考慮倉(cāng)庫(kù)系統(tǒng)變化。如果 發(fā)生雙方協(xié)調(diào)不一致情況下,可以申請(qǐng)平臺(tái)客服介入。在退款訂單商戶(hù)不處理的情 況下,系統(tǒng)需要做限期判斷,比如 5 天商戶(hù)不處理,退款單自動(dòng)變更同意退款。
3、冪等性處理
參照接口冪等性文檔
4、訂單業(yè)務(wù)
1、搭建環(huán)境
訂單服務(wù)引入頁(yè)面,nginx 配置動(dòng)靜分離,上傳靜態(tài)資源到 nginx。編寫(xiě) controller 跳轉(zhuǎn)邏輯
2、訂單確認(rèn)頁(yè)
可以發(fā)現(xiàn)訂單結(jié)算頁(yè),包含以下信息:
-
1.收貨人信息:有更多地址,即有多個(gè)收貨地址,其中有一個(gè)默認(rèn)收貨地址
-
2.支付方式:貨到付款、在線(xiàn)支付,不需要后臺(tái)提供
-
3.送貨清單:配送方式(不做)及商品列表(根據(jù)購(gòu)物車(chē)選中的 skuId 到數(shù)據(jù)庫(kù)中查詢(xún))
-
4.發(fā)票:不做
-
5.優(yōu)惠:查詢(xún)用戶(hù)領(lǐng)取的優(yōu)惠券(不做)及可用積分(京豆)
OrderConfirmVo
@Data public class OrderConfirmVO { // 收貨地址, ums_member_receive_address 表 private List<MemberReceiveAddressEntity> addresses; // 購(gòu)物清單, 根據(jù)購(gòu)物車(chē)頁(yè)面?zhèn)鬟f過(guò)來(lái)的 skuIds 查詢(xún) private List<OrderItemVO> orderItems; // 可用積分, ums_member 表中的 integration 字段 private Integer bounds; // 訂單令牌, 防止重復(fù)提交 private String orderToken; }OrderItemVO(參照 Cart 對(duì)象)
public class OrderItemVo {private Long skuId;private Boolean check = true;private String title;private String image;private List<String> skuAttr;private BigDecimal price;private Integer count;private BigDecimal totalPrice; }3、創(chuàng)建訂單
當(dāng)用戶(hù)點(diǎn)擊提交訂單按鈕,應(yīng)該收集頁(yè)面數(shù)據(jù)提交到后臺(tái)并生成訂單數(shù)據(jù)。
1、數(shù)據(jù)模型
訂單確認(rèn)頁(yè),需要提交的數(shù)據(jù):
@Data public class OrderSubmitVO { //提交上次訂單確認(rèn)頁(yè)給你的令牌; private String orderToken; private BigDecimal apyPrice; // 校驗(yàn)總價(jià)格時(shí), 拿計(jì)算價(jià)格和這個(gè)價(jià)格比較 private Integer payType;//0-在線(xiàn)支付 1-貨到付款 private String delivery_company; // 配送方式 // 訂單清單可以不用提交, 繼續(xù)從購(gòu)物車(chē)中獲取 // 地址信息, 提交地址 id, 會(huì)員 id 不需要提交 Private Long addrId; // TODO: 發(fā)票相關(guān)信息略 // TODO: 營(yíng)銷(xiāo)信息等 }提交以后, 需要響應(yīng)的數(shù)據(jù):
@Data public class OrderSubmitResponseVO {private OrderEntity orderEntity;private Integer code; // 1-不可重復(fù)提交或頁(yè)面已過(guò)期 2-庫(kù)存不足 3-價(jià)格校驗(yàn)不合法 等 }2、防止超賣(mài)
數(shù)據(jù)庫(kù) unsigned int 做最后的保證。
4、 自動(dòng)關(guān)單
訂單超時(shí)未支付, 需要取消訂單
5、 解鎖庫(kù)存
訂單關(guān)閉, 需要解鎖已經(jīng)占用的庫(kù)存
庫(kù)存鎖定成功, 訂單回滾, 保證最終一致性, 也需要庫(kù)存自動(dòng)解鎖
4、5 功能參照消息隊(duì)列流程完成
總結(jié)
- 上一篇: 云桌面和计算机,云桌面和电脑在使用上的差
- 下一篇: 币圈“重启”?大佬回归,矿机脱销,资金盘