訂單


訂單

1、 訂單中心

電商系統涉及到 3 流, 分別時信息流, 資金流, 物流, 而訂單系統作為中樞將三者有機的集合起來。

訂單模塊是電商系統的樞紐, 在訂單這個環節上需求獲取多個模塊的數據和信息, 同時對這些信息進行加工處理后流向下個環節, 這一系列就構成了訂單的信息流通。

1、 訂單構成

在這里插入圖片描述

1、用戶信息

用戶信息包括用戶賬號、用戶等級、用戶的收貨地址、收貨人、收貨人電話等組成,用戶賬 戶需要綁定手機號碼,但是用戶綁定的手機號碼不一定是收貨信息上的電話。用戶可以添加 多個收貨信息,用戶等級信息可以用來和促銷系統進行匹配,獲取商品折扣,同時用戶等級 還可以獲取積分的獎勵等

2、訂單基礎信息

訂單基礎信息是訂單流轉的核心,其包括訂單類型、父/子訂單、訂單編號、訂單狀態、訂 單流轉的時間等。

  • 訂單類型包括實體商品訂單和虛擬訂單商品等,這個根據商城商品和服務類型進行區分。
  • 同時訂單都需要做父子訂單處理,之前在初創公司一直只有一個訂單,沒有做父子訂 單處理后期需要進行拆單的時候就比較麻煩,尤其是多商戶商場,和不同倉庫商品的時候, 父子訂單就是為后期做拆單准備的。
  • 訂單編號不多說了,需要強調的一點是父子訂單都需要有訂單編號,需要完善的時候 可以對訂單編號的每個字段進行統一定義和詮釋。
  • 訂單狀態記錄訂單每次流轉過程,后面會對訂單狀態進行單獨的說明。
  • 訂單流轉時間需要記錄下單時間,支付時間,發貨時間,結束時間/關閉時間等等

3、商品信息

商品信息從商品庫中獲取商品的 SKU 信息、圖片、名稱、屬性規格、商品單價、商戶信息 等,從用戶下單行為記錄的用戶下單數量,商品合計價格等。

4、優惠信息

優惠信息記錄用戶參與的優惠活動,包括優惠促銷活動,比如滿減、滿贈、秒殺等,用戶使 用的優惠券信息,優惠券滿足條件的優惠券需要默認展示出來,具體方式已在之前的優惠券 篇章做過詳細介紹,另外還虛擬幣抵扣信息等進行記錄。

為什么把優惠信息單獨拿出來而不放在支付信息里面呢?

因為優惠信息只是記錄用戶使用的條目,而支付信息需要加入數據進行計算,所以做為區分。

5、支付信息

  • 1支付流水單號,這個流水單號是在喚起網關支付后支付通道返回給電商業務平台的支 付流水號,財務通過訂單號和流水單號與支付通道進行對賬使用。

  • 2支付方式用戶使用的支付方式,比如微信支付、支付寶支付、錢包支付、快捷支付等 。支付方式有時候可能有兩個——余額支付+第三方支付。

  • 3商品總金額,每個商品加總后的金額;運費,物流產生的費用;優惠總金額,包括促 銷活動的優惠金額,優惠券優惠金額,虛擬積分或者虛擬幣抵扣的金額,會員折扣的金額等 之和;實付金額,用戶實際需要付款的金額。

    ​ 用戶實付金額=商品總金額+運費-優惠總金額

    6、物流信息

物流信息包括配送方式,物流公司,物流單號,物流狀態,物流狀態可以通過第三方接口來 獲取和向用戶展示物流每個狀態節點。

2、訂單狀態

1.待付款

用戶提交訂單后,訂單進行預下單,目前主流電商網站都會喚起支付,便於用戶快速完成支 付,需要注意的是待付款狀態下可以對庫存進行鎖定,鎖定庫存需要配置支付超時時間,超 時后將自動取消訂單,訂單變更關閉狀態。

2.已付款/待發貨

用戶完成訂單支付,訂單系統需要記錄支付時間,支付流水單號便於對賬,訂單下放到 WMS系統,倉庫進行調撥,配貨,分揀,出庫等操作。

3.待收貨/已發貨

倉儲將商品出庫后,訂單進入物流環節,訂單系統需要同步物流信息,便於用戶實時知悉物 品物流狀態

4.已完成

用戶確認收貨后,訂單交易完成。后續支付側進行結算,如果訂單存在問題進入售后狀態

5.已取消

付款之前取消訂單。包括超時未付款或用戶商戶取消訂單都會產生這種訂單狀態。

6.售后中

用戶在付款后申請退款,或商家發貨后用戶申請退換貨。

售后也同樣存在各種狀態,當發起售后申請后生成售后訂單,售后訂單狀態為待審核,等待 商家審核,商家審核通過后訂單狀態變更為待退貨,等待用戶將商品寄回,商家收貨后訂單 狀態更新為待退款狀態,退款到用戶原賬戶后訂單狀態更新為售后成功。

2、訂單流程

訂單流程是指從訂單產生到完成整個流轉的過程,從而行程了一套標准流程規則。而不同的 產品類型或業務類型在系統中的流程會千差萬別,比如上面提到的線上實物訂單和虛擬訂單 的流程,線上實物訂單與 O2O 訂單等,所以需要根據不同的類型進行構建訂單流程。

不管類型如何訂單都包括正向流程和逆向流程,對應的場景就是購買商品和退換貨流程,正向流程就是一個正常的網購步驟:訂單生成–>支付訂單–>賣家發貨–>確認收貨–>交易成功。 而每個步驟的背后,訂單是如何在多系統之間交互流轉的,可概括如下圖
在這里插入圖片描述

1、訂單創建與支付

  • (1)、訂單創建前需要預覽訂單,選擇收貨信息等

  • (2)、訂單創建需要鎖定庫存,庫存有才可創建,否則不能創建

  • (3)、訂單創建后超時未支付需要解鎖庫存

  • (4)、支付成功后,需要進行拆單,根據商品打包方式,所在倉庫,物流等進行拆單

  • (5)、支付的每筆流水都需要記錄,以待查賬

  • (6)、訂單創建,支付成功等狀態都需要給 MQ 發送消息,方便其他系統感知訂閱

2、逆向流程

  • (1)、修改訂單,用戶沒有提交訂單,可以對訂單一些信息進行修改,比如配送信息, 優惠信息,及其他一些訂單可修改范圍的內容,此時只需對數據進行變更即可。

  • (2)、訂單取消,用戶主動取消訂單和用戶超時未支付,兩種情況下訂單都會取消訂 單,而超時情況是系統自動關閉訂單,所以在訂單支付的響應機制上面要做支付的限時處理,尤其是在前面說的下單減庫存的情形下面,可以保證快速的釋放庫存。 另外需要需要處理的是促銷優惠中使用的優惠券,權益等視平台規則,進行相應補 回給用戶。

  • (3)、退款,在待發貨訂單狀態下取消訂單時,分為缺貨退款和用戶申請退款。如果是 全部退款則訂單更新為關閉狀態,若只是做部分退款則訂單仍需進行進行,同時生 成一條退款的售后訂單,走退款流程。退款金額需原路返回用戶的賬戶。

  • (4)、發貨后的退款,發生在倉儲貨物配送,在配送過程中商品遺失,用戶拒收,用戶 收貨后對商品不滿意,這樣情況下用戶發起退款的售后訴求后,需要商戶進行退款 的審核,雙方達成一致后,系統更新退款狀態,對訂單進行退款操作,金額原路返 回用戶的賬戶,同時關閉原訂單數據。僅退款情況下暫不考慮倉庫系統變化。如果 發生雙方協調不一致情況下,可以申請平台客服介入。在退款訂單商戶不處理的情 況下,系統需要做限期判斷,比如 5 天商戶不處理,退款單自動變更同意退款。

3、冪等性處理

參照接口冪等性文檔

4、訂單業務

1、搭建環境

訂單服務引入頁面,nginx 配置動靜分離,上傳靜態資源到 nginx。編寫 controller 跳轉邏輯

2、訂單確認頁

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

可以發現訂單結算頁,包含以下信息:

  • 1.收貨人信息:有更多地址,即有多個收貨地址,其中有一個默認收貨地址

  • 2.支付方式:貨到付款、在線支付,不需要后台提供

  • 3.送貨清單:配送方式(不做)及商品列表(根據購物車選中的 skuId 到數據庫中查詢)

  • 4.發票:不做

  • 5.優惠:查詢用戶領取的優惠券(不做)及可用積分(京豆)

OrderConfirmVo

@Data
public class OrderConfirmVO {
// 收貨地址, ums_member_receive_address 表
private List<MemberReceiveAddressEntity> addresses;
// 購物清單, 根據購物車頁面傳遞過來的 skuIds 查詢
private List<OrderItemVO> orderItems;
// 可用積分, ums_member 表中的 integration 字段
private Integer bounds;
// 訂單令牌, 防止重復提交
private String orderToken;
}

OrderItemVO(參照 Cart 對象)

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、創建訂單

當用戶點擊提交訂單按鈕,應該收集頁面數據提交到后台並生成訂單數據。

1、數據模型

訂單確認頁,需要提交的數據:

@Data
public class OrderSubmitVO {
//提交上次訂單確認頁給你的令牌;
private String orderToken;
private BigDecimal apyPrice; // 校驗總價格時, 拿計算價格和這個價格比較
private Integer payType;//0-在線支付 1-貨到付款
private String delivery_company; // 配送方式
// 訂單清單可以不用提交, 繼續從購物車中獲取
// 地址信息, 提交地址 id, 會員 id 不需要提交
Private Long addrId;
// TODO: 發票相關信息略
// TODO: 營銷信息等
}

提交以后, 需要響應的數據:

@Data
public class OrderSubmitResponseVO {
    private OrderEntity orderEntity;
    private Integer code;
// 1-不可重復提交或頁面已過期 2-庫存不足 3-價格校驗不合法 等
}

2、防止超賣

數據庫 unsigned int 做最后的保證。

4、 自動關單

訂單超時未支付, 需要取消訂單

5、 解鎖庫存

訂單關閉, 需要解鎖已經占用的庫存
庫存鎖定成功, 訂單回滾, 保證最終一致性, 也需要庫存自動解鎖

4、5 功能參照消息隊列流程完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM