主頁 > 後端開發 > 還不知道,如何設計訂單系統?來看這篇文章,很不錯!

還不知道,如何設計訂單系統?來看這篇文章,很不錯!

2020-12-04 06:50:10 後端開發

本文主要講述了在傳統電商企業中,訂單系統應承載的角色,就訂單系統所包含的主要功能模塊梳理了設計思路,并對訂單系統未來的發展做了一些思考,

1. 訂單系統在企業中的角色

在搭建企業訂單系統之前,需要先梳理企業整體業務系統之間的關系和訂單系統上下游關系,只有劃分清業務系統邊界,才能確定訂單系統的職責與功能,進而保證各系統之間高效簡潔的作業,

2. 訂單系統與各業務系統的關系

(1)對外系統:

所有給企業外部用戶使用的系統都在這一層,包括官網、普通用戶使用的C端,還包括給商戶使用的商家后臺和在各個銷售渠道進行分銷的系統,比如與銀行信用卡中心合作、微信合作在合作商的平臺露出本企業的產品,這類系統站在與客戶接觸的最前線,是公司實作商業模式的橋頭堡,

(2)管理中后臺:

每個C端的業務形態都會有一個對應的系統模塊,如負責管理平臺交易的訂單系統,管理優惠資訊的促銷系統,管理平臺所有產品的產品系統,以及管理所有對外系統顯示內容的內容系統等,

(3)公共服務系統:

隨著企業的發展,資訊化建設到達一定程度后,企業需要將通用功能服務化、平臺化,以保證應用架構的合理性,提升服務效率,這類系統主要給其他應用系統提供基礎服務能力支持,關注公眾號:程式員白楠楠, 領取2020最新Java面試題手冊(200多頁PDF檔案),

3. 訂單系統上下游關系

由此可見,訂單系統對上接收用戶資訊,將用戶資訊轉化為產品訂單,同時管理并跟蹤訂單資訊和資料,承載了公司整個交易線的重要對客環節,對下則銜接產品系統、促銷系統、倉儲系統、會員系統、支付系統等,對整個電商平臺起著承上啟下的作用,

4. 訂單系統的業務架構

(1)訂單服務

該模塊的主要功能是用戶日常使用的服務和頁面,主要有訂單串列、訂單詳情、在線下單等,還包括為公共業務模塊提供的多維度訂單資料服務,

(2)訂單邏輯

訂單系統的核心,起著至關重要的作用,在訂單系統負責管理訂單創建、訂單支付、訂單生產、訂單確認、訂單完成、取消訂單等訂單流程,還涉及到復雜的訂單狀態規則、訂單金額計算規則以及增減庫存規則等,在4節核心功能設計中會重點來說,

(3)底層服務

資訊化建設達到一定程度的企業,一般會將公司公共服務模塊化,比如:產品,會構建對應的產品系統,代碼、資料庫,介面等相對獨立,但是,這也帶來了一個問題,比如:訂單創建的場景下需要獲取的資訊分散在各個系統,

如果需要從各個公共服務系統呼叫:一是會花費大量時間,二是代碼的維護成本非常高,因此,訂單系統接入所需的公共服務模塊介面,在訂單系統即可完成對接公共系統的服務,

訂單系統核心功能

1. 訂單中所包含的內容資訊

為了使訂單系統能夠對訂單進行高效、精準的管理和跟蹤,訂單會儲存關于產品、優惠、用戶、支付資訊等一系列的訂單實時資料,來和下游系統,如:促銷、倉儲、物流進行互動,

以一個通用B2C商城的訂單為例,梳理其包含的資訊如下:

這里要注意的是訂單型別,隨著平臺業務的不斷發展,品類豐富、交易方式豐富后,需要對訂單進行多維度的分類管理,同時訂單型別利于訂單系統的擴展性,每種訂單型別將會對應一套流程及一套狀態,便于對訂單進行分類管理和復用,

2. 流程引擎

流程是指從平臺角度出發,將訂單從創建到完成的整個流轉程序進行抽象,從而形成了一套標準流程規則,而不同的產品型別或交易型別在系統中的流程會千差萬別,因此為了方便對訂單流程進行管理,會組建流程引擎模塊,

每套訂單流程中會包含正向流程及逆向流程,正向流程可以比作一次順利的網購體驗程序中,后臺系統之間的資訊流轉,逆向流程則是修改訂單、取消訂單、退款、退貨等各種動作引起的后臺系統流程,同時每個流程觸發的條件又可分為系統觸發和人工觸發兩種場景,關注公眾號:程式員白楠楠, 領取2020最新Java面試題手冊(200多頁PDF檔案),

(1)正向流程

以一個通用B2C商城的訂單系統為例,根據其實際業務場景,其訂單流程可抽象為5大步驟:訂單創建>訂單支付>訂單生產>訂單確認>訂單完成,

而每個步驟的背后,訂單是如何在多系統之間互動流轉的,可概括如下圖:

訂單創建:

用戶下單后,系統需要生成訂單,此時需要先獲取下單中涉及的商品資訊,然后獲取該商品所涉及到的優惠資訊,如果商品不參與優惠資訊,則無此環節,

接著獲取該賬戶的會員權益,這里要注意的是:優惠資訊與會員權益的區別,比如:商品滿減是優惠資訊,SUPER會員全場9.8折指的是會員權益,一個是針對商品,另一個是針對賬戶,其次就是優惠活動的疊加規則和優先級規則等,

增減庫存規則是指訂單中的商品,何時從倉儲系統中對相應商品庫存進行扣除,目前主流有兩種方式:

下單減庫存——即用戶下單成功時減少庫存數量

  • 優勢:用戶體驗友好,系統邏輯簡潔;

  • 缺點:會導致惡意下單或下單后卻不買,使得真正有需求的用戶無法購買,影響真實銷量;

解決辦法:

  1. 設定訂單有效時間,若訂單創建成功N分鐘不付款,則訂單取消,庫存回滾;

  2. 限購,用各種條件來限制買家的購買件數,比如一個賬號、一個ip,只能買一件;

  3. 風控,從技術角度進行判斷,屏蔽惡意賬號,禁止惡意賬號購買,

付款減庫存——即用戶支付完成并反饋給平臺后再減少庫存數量

  • 優勢:減少無效訂單帶來的資源損耗;

  • 缺點:因第三方支付回傳結果存在時差,同一時間多個用戶同時付款成功,會導致下單數目超過庫存,商家庫存不足容易引發斷貨和投訴,成本增加,

解決辦法:

  1. 付款前再次校驗庫存,如確認訂單要付款時再驗證一次,并友好提示用戶庫存不足;

  2. 增加提示資訊:在商品詳情頁,訂單步驟頁面提示不及時付款,不能保證有庫存等,

綜上所述,兩種方式各有優缺點,因此,需結合實際場景進行考慮,如:秒殺、搶購、促銷活動等,可使用下單減庫存的方式,而對于產品庫存量大,并發流量沒有那么強的產品使用付款減庫存的方式,

將兩種方式帶入到銷售場景中,關聯商品型別、促銷型別、供需關系等,靈活使用,以充分發揮計算機系統的優勢,

訂單支付:

用戶支付完訂單后,需要獲取訂單的支付資訊,包括支付流水號、支付時間等,支付完訂單接著就是等商家發貨,但在發貨程序中,根據平臺業務模式的不同,可能會涉及到訂單的拆分,

訂單拆分一般分兩種:

  • 一種是用戶挑選的商品來自于不同渠道(自營與商家,商家與商家);

  • 另一種是在SKU層面上拆分訂單:不同倉庫,不同運輸要求的SKU,包裹重量體積限制等因素需要將訂單拆分,

訂單拆分也是一個相對獨立的模塊,這里就不詳細描述了,

訂單生產:訂單生產,是指產品從企業到用戶這一流程的概述,如電商平臺中,商家發貨程序已有一個標準化的流程,訂單內容會發送到倉庫,倉庫對商品進行打單、揀貨、包裝、交接快遞進行配送,

訂單確認:收到貨后,訂單系統需要在快遞被簽收后提醒用戶對商品做評價,這里要注意,確認收到貨不代表交易成功,相反是售后服務的開始,

訂單完成:訂單完成是指在收到貨X天的狀態,此時訂單不在售后的支持時間范圍內,到此,一個訂單的正向流程就算走完了,

(2)逆向流程

上面說到逆向流程是各種修改訂單、取消訂單、退款、退貨等操作,需要梳理清楚這些流程與正向流程的關系,才能理清訂單系統完整的訂單流程,

訂單修改:可梳理訂單內資訊,根據資訊關聯程度及業務訴求,設定訂單的可修改范圍是什么,比如:客戶下單后,想修改識訓人地址及電話,此時只需對相應資料進行更新即可,

訂單取消:用戶提交訂單后沒有進行支付操作,此時用戶原則上屬于取消訂單,因為還未付款,則比較簡單,只需要將原本提交訂單時扣減的庫存補回,促銷優惠中使用的優惠券,權益等視平臺規則,進行相應補回,

退款:用戶支付成功后,客戶發出退款的訴求后,需商戶進行退款審核,雙方達成一致后,系統應以退款單的形式完成退款,關聯原訂單資料,因商品無變化,所以不需考慮與庫存系統的互動,僅需考慮促銷系統及支付系統互動即可,

退貨:用戶支付成功后,客戶發出退貨的訴求后,需商戶進行退款審核,雙方達成一致后,需對庫存系統進行補回,支付系統、促銷系統以退款單形式完成退款,最后,在退款/退貨流程中,需結合平臺業務場景,考慮優惠分攤的邏輯,在發生退款/退貨時,優惠該如何退回的處理規則和流程,

(3)狀態機

狀態機是管理訂單狀態邏輯的工具,狀態機可歸納為3個要素,即現態、動作、次態,

  1. 現態:是指當前所處的狀態,

  2. 動作:動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態,

  3. 次態:動作滿足后要遷往的新狀態,“次態”是相對于“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了,

狀態機的設計需要結合平臺實際業務場景,將狀態間的切換細化成了執行了某個動作,

以一個B2C商城的訂單系統舉例如下:

訂單系統為了高效的對訂單進行跟蹤和管理,會對訂單流程當中的關鍵節點,抽象出訂單狀態,而訂單狀態從不同用戶的角度可分為,系統訂單狀態、商家訂單狀態、買家訂單狀態等,

對于訂單系統來說,訂單狀態細分的顆粒度越細、越明確,訂單系統管理的精度和可靠性就越高,比如:在待付款和待發貨兩個狀態中,訂單系統后臺會細分為訂單超時取消、訂單支付失敗、訂單付款完成等,

因此,訂單狀態模塊中,通常會維護狀態映射表,以不同的用戶角色對系統訂單狀態進行重新劃分,以滿足不同用戶的需求,

除此以外,隨著電商平臺的不斷發展,不同的業務型別,所對應的訂單狀態都會有所區別,所以,訂單系統中一般會儲存多套狀態機,以滿足不同的訂單型別來使用,

訂單系統的發展

訂單系統的主體框架,和主要業務模塊已基本講完,那么隨著企業的發展,業務量和業務形式不斷變化,企業有可能形成多個訂單系統并存以滿足不同的業務需要的情況,

業務系統架構如下:

這種狀況的出現,將會給平臺帶來非常大的發展瓶頸,如:

三個訂單系統,每個訂單系統處理不同型別的訂單,沒有統一的訂單銷量、訂單狀態資訊,網站前臺對訂單的狀態展示與控制不統一,只能是在網站前臺會員中心硬代碼維護一套面向會員的統一訂單明細與狀態資料,而無線側上線后,由于不了解前臺網站會員中心的訂單狀態管理邏輯,所以需要把前臺網站的訂單明細及狀態管理再在無線應用側再實作一遍,

三套后臺訂單系統與公共業務系統如會員中心、支付與財務、促銷工具、客戶分單等系統都需要對接一遍,公共業務處理邏輯不統一,一旦邏輯變更,多個系的同一個介面都要修改一遍,介面的重復維護開發作業量大,

訂單開發目前分到事業部,各個事業部只會考慮自己的邏輯,不會考慮公共架構,只會越走越遠,碰到像無線這樣的專案,需要對接各個事業部,無線側應用上線進展慢,

因此未來的訂單系統可拆分為訂單中心與業務訂單系統兩個模塊,以管理公司所有訂單資料,并為各個模塊提供統一服務,

最后

對于企業訂單系統的搭建,并不是要做的大而全、也不是要小而精,而需要結合市場、公司、業務的實際情況來最終制定系統設計方案和產品迭代計劃,

最終,和公司整體發展相互協調,相輔相成,

關注公眾號:程式員白楠楠, 領取2020最新Java面試題手冊(200多頁PDF檔案),



轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229665.html

標籤:Java

上一篇:Redis理解

下一篇:認證授權基礎

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more