在 Day 25、Day26 的文章中,我們深入探討了 POS 系統中商品管理的前端 CRUD 介面設計,並借鑒了 CustomerManagement.vue
的實作模式,規劃了如何透過組件化和 Pinia Store 來高效管理商品資料。商品是零售系統的基石,而將商品轉化為實際銷售的,正是「訂單流程」。
訂單流程是任何商業系統的核心動脈,它不僅僅是簡單的資料記錄,更涉及一系列複雜的狀態變遷、業務邏輯判斷以及多方協同作業。
從顧客下單、付款、商家處理、出貨到最終完成,每個環節都可能產生不同的狀態和事件。如果沒有一個清晰、嚴謹的設計,訂單流程很容易變得混亂且難以維護。
今天,我們將引入一個強大的設計工具:「狀態機 (State Machine)」,來幫助我們理解和設計銷售系統的訂單流程。
透過狀態機,我們能夠將複雜的訂單生命週期清晰地模型化,確保狀態轉換的正確性,並為前端介面和後端邏輯的協同工作奠定堅實的基礎。
一個典型的訂單流程可能包含以下挑戰:
這些複雜性使得傳統的條件判斷 (if-else) 難以維護,且容易出錯。這正是狀態機大顯身手的地方。
狀態機是一種數學模型,用於描述一個系統在不同時間點所處的「狀態 (State)」,以及在接收到特定「事件 (Event)」時,如何從一個狀態「轉換 (Transition)」到另一個狀態。
一個狀態機由以下三個核心元素組成:
狀態機的優點:
現在,讓我們為 POS 系統的訂單流程設計一個簡化的狀態機。
我們首先定義訂單可能經歷的核心狀態:
PENDING_PAYMENT
(待付款):訂單已建立,等待顧客付款。PAID
(已付款):顧客已成功付款。PROCESSING
(處理中):商家已確認訂單,準備出貨。SHIPPED
(已出貨):商品已交由物流運送。COMPLETED
(已完成):顧客已收到商品,訂單流程結束。CANCELLED
(已取消):訂單在付款前或付款後被取消。REFUND_REQUESTED
(退款申請中):顧客申請退款。REFUNDED
(已退款):退款已處理完成。接下來,我們定義觸發狀態轉換的事件:
PAYMENT_SUCCESS
(付款成功)PAYMENT_FAILED
(付款失敗)CANCEL_ORDER
(取消訂單)CONFIRM_ORDER
(商家確認訂單)SHIP_ORDER
(商家出貨)DELIVER_ORDER
(物流送達)REQUEST_REFUND
(顧客申請退款)PROCESS_REFUND
(商家處理退款)ORDER_TIMEOUT
(訂單超時未付款)以下是訂單狀態機的簡化轉換規則示意:
graph TD
A[Start] --> B(PENDING_PAYMENT)
B -- PAYMENT_SUCCESS --> C(PAID)
B -- CANCEL_ORDER --> G(CANCELLED)
B -- ORDER_TIMEOUT --> G
C -- CONFIRM_ORDER --> D(PROCESSING)
C -- CANCEL_ORDER --> G
C -- REQUEST_REFUND --> H(REFUND_REQUESTED)
D -- SHIP_ORDER --> E(SHIPPED)
D -- CANCEL_ORDER --> G
E -- DELIVER_ORDER --> F(COMPLETED)
E -- REQUEST_REFUND --> H
F -- REQUEST_REFUND --> H
H -- PROCESS_REFUND --> I(REFUNDED)
H -- CANCEL_REFUND --> C(PAID) // 商家拒絕退款,回到已付款
G -- End --> J[End]
I -- End --> J
F -- End --> J
PENDING_PAYMENT
:
PAYMENT_SUCCESS
事件 -> 轉換到 PAID
。CANCEL_ORDER
事件或 ORDER_TIMEOUT
事件 -> 轉換到 CANCELLED
。PAID
:
CONFIRM_ORDER
事件 -> 轉換到 PROCESSING
。CANCEL_ORDER
事件 -> 轉換到 CANCELLED
(可能需要退款流程)。REQUEST_REFUND
事件 -> 轉換到 REFUND_REQUESTED
。PROCESSING
:
SHIP_ORDER
事件 -> 轉換到 SHIPPED
。CANCEL_ORDER
事件 -> 轉換到 CANCELLED
(可能需要退款流程)。SHIPPED
:
DELIVER_ORDER
事件 -> 轉換到 COMPLETED
。REQUEST_REFUND
事件 -> 轉換到 REFUND_REQUESTED
。COMPLETED
:
REQUEST_REFUND
事件 -> 轉換到 REFUND_REQUESTED
。REFUND_REQUESTED
:
PROCESS_REFUND
事件 -> 轉換到 REFUNDED
。CANCEL_REFUND
事件 (商家拒絕退款) -> 轉換回 PAID
(或 COMPLETED
,視業務邏輯而定)。CANCELLED
和 REFUNDED
通常是終止狀態,不能再進行轉換。狀態機的設計理念在前後端協同開發中尤為重要:
後端 (Backend):
transitions
,Java 的 Spring State Machine
)來實現狀態機邏輯。前端 (Frontend) - 狀態的呈現與事件的發送:
PENDING_PAYMENT
,前端顯示「去付款」按鈕。點擊後發送 PAYMENT_SUCCESS
事件給後端。PAID
,前端顯示「取消訂單」按鈕。點擊後發送 CANCEL_ORDER
事件給後端。在 Vue.js 專案中,我們可以這樣應用狀態機的概念:
stores/order.js
):
orders
) 和單一訂單詳情 (currentOrder
) 的狀態。fetchOrders()
, fetchOrderById(id)
, sendOrderEvent(orderId, eventType, payload)
。OrderList.vue
:展示訂單列表,根據訂單狀態顯示不同的標籤或顏色。OrderDetail.vue
:訂單詳情頁面,這是狀態機邏輯在前端最集中的體現。
currentOrder.status
動態渲染不同的操作按鈕(例如「去付款」、「確認收貨」、「申請退款」)。orderStore.sendOrderEvent(orderId, 'EVENT_TYPE')
,將事件發送給後端。CONFIRM_ORDER
或 SHIP_ORDER
事件。今天,我們深入探討了 POS 系統中訂單流程的複雜性,並引入了「狀態機」這一強大工具來進行設計。透過明確定義訂單的狀態、事件和轉換規則,我們能夠構建出一個清晰、健壯且易於維護的訂單管理系統。前端負責根據狀態呈現介面和發送事件,後端則作為狀態機的權威,負責處理所有狀態轉換的業務邏輯。
這種設計模式不僅提升了系統的穩定性,也使得未來業務邏輯的擴展變得更加容易。
明日,Day 28:[Systemの呼吸・伍之型] 儀表板 - 數據視覺化與圖表。心を燃やせ 🔥!