US-303: 客戶訂單歷史與統計
User Story
作為 店員 我想要 能夠查看客戶的訂單歷史與消費統計 以便 了解客戶的購買習慣並提供更好的服務
驗收標準 (Acceptance Criteria)
Scenario 1: 查看客戶詳情頁(基本資訊)
- Given 我是已登入的店員
- And 系統中有客戶「王小明」(編號: ABC-CUST-000001)
- And 該客戶累計消費 $8,500,共 12 筆訂單
- When 我點擊客戶列表中的「王小明」
- Then 系統應導航至客戶詳情頁
- And 頁面應顯示以下基本資訊:
- 客戶編號: ABC-CUST-000001
- 客戶姓名: 王小明
- 客戶等級徽章: VIP
- 客戶狀態: 啟用
- 電話: 0912-345-678
- Email: wang@example.com
- 註冊日期: 2025-01-15
- 最後消費日期: 2025-10-31
Scenario 2: 查看訂單歷史列表(最近 10 筆)
- Given 我在客戶「王小明」的詳情頁
- And 該客戶共有 12 筆訂單
- Then 訂單歷史區塊應顯示最近 10 筆訂單
- And 每筆訂單應顯示:
- 訂單編號
- 訂單日期
- 訂單金額
- 訂單狀態(已完成/進行中/已取消)
- And 訂單應依日期降序排列(最新訂單在上)
- And 區塊底部應顯示「查看所有訂單」連結
Scenario 3: 查看所有訂單
- Given 我在客戶「王小明」的詳情頁
- And 訂單歷史區塊顯示「查看所有訂單」連結
- When 我點擊「查看所有訂單」連結
- Then 系統應導航至訂單列表頁
- And 訂單列表應自動套用過濾條件「客戶: 王小明」
- And 列表應顯示該客戶的所有訂單(包含已取消的訂單)
Scenario 4: 點擊訂單進入詳情頁
- Given 我在客戶「王小明」的詳情頁
- And 訂單歷史列表顯示訂單「ABC-20251031-0001」
- When 我點擊訂單編號「ABC-20251031-0001」
- Then 系統應導航至訂單詳情頁
- And 訂單詳情頁應顯示完整的訂單資訊
Scenario 5: 查看消費統計(基本指標)
- Given 我在客戶「王小明」的詳情頁
- Then 消費統計區塊應顯示以下指標:
- 總訂單數: 12 筆
- 累計消費金額: $8,500
- 平均訂單金額: $708($8,500 / 12)
- 最後消費日期: 2025-10-31
Scenario 6: 查看最常購買的商品(Top 3)
- Given 我在客戶「王小明」的詳情頁
- And 該客戶最常購買的商品為:
- 玫瑰花束(12 朵)- 購買 5 次
- 百合花束(6 朵)- 購買 3 次
- 祝賀花籃 - 購買 2 次
- Then 消費統計區塊應顯示 Top 3 商品列表
- And 每個商品應顯示:
- 商品名稱
- 購買次數
- 佔比(購買次數 / 總訂單數)
Scenario 7: 查看消費趨勢圖表(近 12 個月)
- Given 我在客戶「王小明」的詳情頁
- And 該客戶近 12 個月的消費記錄如下:
- 2024-11: $500
- 2024-12: $800
- 2025-01: $1,200
- ...
- Then 消費統計區塊應顯示折線圖
- And 圖表 X 軸為月份(近 12 個月)
- And 圖表 Y 軸為消費金額
- And 滑鼠 Hover 時顯示該月的詳細金額
Scenario 8: 查看客戶備註(含歷史記錄)
- Given 我在客戶「王小明」的詳情頁
- And 該客戶有 2 筆備註記錄:
- 2025-10-01: 「喜歡粉色玫瑰」(記錄人: 店員 A)
- 2025-09-15: 「需提前一天確認配送時間」(記錄人: 店員 B)
- Then 備註區塊應顯示所有備註記錄
- And 每筆備註應顯示:
- 備註內容
- 記錄時間
- 記錄人
- And 備註應依時間降序排列(最新備註在上)
Scenario 9: 新增客戶備註
- Given 我在客戶「王小明」的詳情頁
- When 我在備註區塊輸入「不要百合花」
- And 我點擊「新增備註」按鈕
- Then 系統應儲存備註
- And 新備註應立即顯示在備註列表最上方
- And 備註應自動記錄當前時間與我的姓名
Scenario 10: 查看客戶地址列表
- Given 我在客戶「王小明」的詳情頁
- And 該客戶有 2 個地址:
- 台北市信義區信義路五段 7 號(預設地址)
- 新北市板橋區中山路一段 100 號
- Then 地址區塊應顯示所有地址
- And 預設地址應有特殊標記(星號或徽章)
- And 每個地址應可編輯/刪除
Scenario 11: 企業客戶詳情頁(額外資訊)
- Given 我在企業客戶「XX 科技公司」的詳情頁
- Then 頁面應額外顯示企業客戶特有資訊:
- 統一編號: 12345678
- 產業類別: 科技
- 合作開始日期: 2025-01-01
- 月結帳期: 月結 30 天
- And 聯絡人列表應顯示所有聯絡人
- And 主要聯絡人應有特殊標記
Scenario 12: 無訂單歷史的新客戶
- Given 我在新客戶「李大華」的詳情頁
- And 該客戶尚未下過任何訂單
- Then 訂單歷史區塊應顯示「尚無訂單記錄」訊息
- And 應顯示「為此客戶創建訂單」按鈕
- And 消費統計區塊應顯示:
- 總訂單數: 0 筆
- 累計消費金額: $0
- 平均訂單金額: N/A
- And 消費趨勢圖表應顯示空狀態
業務規則 (Business Rules)
-
訂單歷史顯示規則
- 預設顯示最近 10 筆訂單
- 包含所有狀態的訂單(已完成/進行中/已取消)
- 依訂單日期降序排列
-
消費統計計算規則
- 累計消費金額: 僅計算「已完成」且「已支付」的訂單
- 總訂單數: 包含所有狀態的訂單(不含已取消)
- 平均訂單金額: 累計消費金額 / 總訂單數(已完成的訂單)
- 最常購買商品: 統計所有已完成訂單的商品項目
-
消費趨勢圖表規則
- 統計近 12 個月的消費金額
- 僅計算「已完成」且「已支付」的訂單
- 月份無訂單時顯示 $0
-
客戶備註規則
- 備註為內部使用(不顯示給客戶)
- 每筆備註自動記錄時間與記錄人
- 備註不可刪除(僅可新增)
-
地址管理規則
- 客戶可有多個地址
- 必須有一個預設地址(若僅一個地址,自動設為預設)
- 刪除地址時若為預設地址,需先設定其他地址為預設
-
多租戶隔離
- 訂單歷史僅顯示當前租戶的訂單
- 客戶詳情頁需檢查客戶是否屬於當前租戶
UI/UX 需求 (UI/UX Requirements)
頁面佈局
桌面版
┌─────────────────────────────────────────────────┐
│ 客戶詳情 [編輯] [停用客戶] │
├─────────────────────────────────────────────────┤
│ ┌─ 客戶資訊卡片 ────────────────────────────┐ │
│ │ ABC-CUST-000001 [VIP] [啟用] │ │
│ │ 王小明 │ │
│ │ 0912-345-678 │ wang@example.com │ │
│ │ 註冊: 2025-01-15 │ 最後消費: 2025-10-31 │ │
│ └───────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ ┌─ 消費統計 ───────────────────────────────┐ │
│ │ 總訂單: 12 筆 │ 累計: $8,500 │ 平均: $708 │ │
│ │ │ │
│ │ 最常購買商品 (Top 3): │ │
│ │ 1. 玫瑰花束 (5 次, 42%) │ │
│ │ 2. 百合花束 (3 次, 25%) │ │
│ │ 3. 祝賀花籃 (2 次, 17%) │ │
│ │ │ │
│ │ [消費趨勢圖表 - 近 12 個月折線圖] │ │
│ └───────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ ┌─ 訂單歷史 (最近 10 筆) ───────────────────┐ │
│ │ 訂單編號 日期 金額 狀態 │ │
│ │ ABC-20251031-0001 10/31 $1,200 已完成 │ │
│ │ ABC-20251015-0005 10/15 $800 已完成 │ │
│ │ ... │ │
│ │ [查看所有訂單 →] │ │
│ └───────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ ┌─ 地址管理 ───────────────────────────────┐ │
│ │ ⭐ 台北市信義區信義路五段 7 號 (預設) │ │
│ │ 新北市板橋區中山路一段 100 號 │ │
│ │ [新增地址] │ │
│ └───────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ ┌─ 客戶備註 ───────────────────────────────┐ │
│ │ 2025-10-01 10:00 - 店員 A │ │
│ │ 「喜歡粉色玫瑰」 │ │
│ │ │ │
│ │ 2025-09-15 14:30 - 店員 B │ │
│ │ 「需提前一天確認配送時間」 │ │
│ │ │ │
│ │ [新增備註.........................] [送出]│ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
手機版(卡片模式)
┌─────────────────────┐
│ ← 客戶詳情 [•••] │
├─────────────────────┤
│ ┌─ 客戶資訊 ──────┐ │
│ │ ABC-001 [VIP] │ │
│ │ 王小明 [啟用] │ │
│ │ 0912-345-678 │ │
│ └─────────────────┘ │
├─────────────────────┤
│ ┌─ 消費統計 ──────┐ │
│ │ 訂單: 12 筆 │ │
│ │ 累計: $8,500 │ │
│ │ [圖表折疊] │ │
│ └─────────────────┘ │
├─────────────────────┤
│ ┌─ 訂單歷史 ──────┐ │
│ │ ABC-20251031... │ │
│ │ 10/31 | $1,200 │ │
│ │ [查看所有 →] │ │
│ └─────────────────┘ │
└─────────────────────┘
互動行為
-
客戶資訊卡片
- 顯示客戶等級徽章(VIP/VVIP)
- 顯示客戶狀態徽章(啟用/停用)
- 點擊「編輯」按鈕進入編輯模式
- 點擊「停用客戶」按鈕開啟確認 Modal(僅管理者)
-
消費統計區塊
- 使用 StatCard 組件顯示關鍵指標
- 最常購買商品以進度條顯示佔比
- 消費趨勢圖表使用 Recharts(折線圖)
- Hover 時顯示該月詳細金額
-
訂單歷史列表
- 點擊訂單編號進入訂單詳情頁
- 訂單狀態以徽章顯示(已完成/進行中/已取消)
- 「查看所有訂單」連結導航至訂單列表頁並套用過濾
-
地址管理
- 預設地址以星號標記
- 每個地址顯示編輯/刪除按鈕(Hover 時顯示)
- 點擊「新增地址」按鈕開啟內嵌表單
-
客戶備註
- 備註以時間線形式顯示
- 新增備註時顯示文字輸入框
- 按 Enter 或點擊「送出」按鈕提交
錯誤訊息
- API 錯誤: Toast 通知「載入失敗,請稍後再試」
- 無訂單歷史: 「尚無訂單記錄」+ 「創建訂單」按鈕
載入狀態
- 頁面載入中: Skeleton 載入動畫(卡片區塊)
- 圖表載入中: Spinner
技術規格 (Technical Specifications)
API 端點
1. 獲取客戶詳情
- 端點:
GET /api/v1/customers/{id} - 權限要求:
ROLE_STAFF或更高 - 多租戶隔離: 檢查客戶是否屬於當前租戶
響應 Payload:
{
"id": "abc123",
"customerNumber": "ABC-CUST-000001",
"type": "individual", // 'individual' | 'corporate'
"name": "王小明",
"companyName": null,
"phone": "0912345678",
"email": "wang@example.com",
"status": "active", // 'active' | 'inactive'
"tier": "vip", // 'regular' | 'vip' | 'vvip'
"tags": ["常客", "喜歡玫瑰"],
"totalSpent": 8500,
"totalOrders": 12,
"averageOrderAmount": 708,
"lastOrderDate": "2025-10-31T10:00:00Z",
"createdAt": "2025-01-15T10:00:00Z",
"updatedAt": "2025-10-31T10:00:00Z",
// 個人客戶專屬
"gender": "male", // 'male' | 'female' | 'other'
"birthday": "1990-05-15",
// 企業客戶專屬
"taxId": null,
"industry": null,
"cooperationStartDate": null,
"paymentTerms": null,
// 地址
"addresses": [
{
"id": "addr1",
"address": "台北市信義區信義路五段 7 號",
"isDefault": true,
"label": "住家"
}
],
// 聯絡人(企業客戶)
"contacts": []
}
2. 獲取客戶訂單歷史
- 端點:
GET /api/v1/customers/{id}/orders - 權限要求:
ROLE_STAFF或更高
查詢參數:
{
limit?: number, // 預設: 10
page?: number, // 預設: 1
}
響應 Payload:
{
"orders": [
{
"id": "order1",
"orderNumber": "ABC-20251031-0001",
"orderDate": "2025-10-31T10:00:00Z",
"totalAmount": 1200,
"status": "completed", // 'pending' | 'in_progress' | 'completed' | 'cancelled'
"deliveryDate": "2025-11-01"
}
],
"pagination": {
"page": 1,
"limit": 10,
"totalPages": 2,
"totalItems": 12
}
}
3. 獲取客戶消費統計
- 端點:
GET /api/v1/customers/{id}/stats - 權限要求:
ROLE_STAFF或更高
響應 Payload:
{
"totalOrders": 12,
"totalSpent": 8500,
"averageOrderAmount": 708,
"lastOrderDate": "2025-10-31T10:00:00Z",
// Top 3 最常購買商品
"topProducts": [
{
"productId": "prod1",
"productName": "玫瑰花束(12 朵)",
"purchaseCount": 5,
"percentage": 42 // 5 / 12 = 0.42
},
{
"productId": "prod2",
"productName": "百合花束(6 朵)",
"purchaseCount": 3,
"percentage": 25
},
{
"productId": "prod3",
"productName": "祝賀花籃",
"purchaseCount": 2,
"percentage": 17
}
],
// 近 12 個月消費趨勢
"monthlyTrend": [
{ "month": "2024-11", "amount": 500 },
{ "month": "2024-12", "amount": 800 },
{ "month": "2025-01", "amount": 1200 },
// ...
]
}
4. 獲取客戶備註
- 端點:
GET /api/v1/customers/{id}/notes - 權限要求:
ROLE_STAFF或更高
響應 Payload:
{
"notes": [
{
"id": "note1",
"content": "喜歡粉色玫瑰",
"createdAt": "2025-10-01T10:00:00Z",
"createdBy": {
"id": "user1",
"name": "店員 A"
}
}
]
}
5. 新增客戶備註
- 端點:
POST /api/v1/customers/{id}/notes - 權限要求:
ROLE_STAFF或更高
請求 Payload:
{
"content": "不要百合花"
}
響應 Payload:
{
"id": "note2",
"content": "不要百合花",
"createdAt": "2025-11-04T10:00:00Z",
"createdBy": {
"id": "user2",
"name": "店員 B"
}
}
元件架構
src/applets/customer-applet/
├── CustomerDetailPage.tsx # 客戶詳情主頁面
├── components/
│ ├── CustomerInfoCard.tsx # 客戶資訊卡片
│ ├── CustomerStatsCard.tsx # 消費統計卡片
│ ├── CustomerOrderHistory.tsx # 訂單歷史列表
│ ├── CustomerTrendChart.tsx # 消費趨勢圖表
│ ├── CustomerAddressList.tsx # 地址列表
│ ├── CustomerNotes.tsx # 客戶備註
│ └── TopProductsList.tsx # 最常購買商品列表
├── hooks/
│ ├── useCustomerDetail.ts # 客戶詳情邏輯
│ ├── useCustomerStats.ts # 消費統計邏輯
│ └── useCustomerNotes.ts # 備註邏輯
└── types.ts # TypeScript 類型定義
測試需求 (Test Requirements)
單元測試
- 消費統計計算邏輯(平均訂單金額)
- Top 3 商品計算邏輯
- 月份趨勢數據處理邏輯
整合測試
- 客戶詳情 API 整合
- 訂單歷史 API 整合
- 消費統計 API 整合
- 客戶備註 API 整合
E2E 測試
- Scenario 1: 查看客戶詳情頁
- Scenario 2: 查看訂單歷史列表
- Scenario 3: 查看所有訂單
- Scenario 4: 點擊訂單進入詳情頁
- Scenario 5: 查看消費統計
- Scenario 6: 查看 Top 3 商品
- Scenario 7: 查看消費趨勢圖表
- Scenario 8: 查看客戶備註
- Scenario 9: 新增客戶備註
- Scenario 10: 查看地址列表
- Scenario 11: 企業客戶詳情頁
- Scenario 12: 無訂單歷史的新客戶
驗收檢查清單 (Acceptance Checklist)
- 客戶詳情頁正確顯示基本資訊
- 訂單歷史列表正確顯示(最近 10 筆)
- 「查看所有訂單」連結功能正常
- 點擊訂單進入詳情頁
- 消費統計指標正確計算
- Top 3 商品列表正確顯示
- 消費趨勢圖表正確顯示
- 客戶備註列表正確顯示
- 新增客戶備註功能正常
- 地址列表正確顯示
- 企業客戶詳情頁額外資訊正確顯示
- 無訂單歷史的新客戶空狀態正確
- 響應式設計正常(桌面/手機)
- 載入狀態正確顯示
- 錯誤處理正確
Story Points
估算: 8 points
理由:
- 需要整合多個 API(詳情、訂單歷史、統計、備註)
- 包含複雜的統計計算(Top 3 商品、消費趨勢)
- 需要圖表組件(Recharts 折線圖)
- 需要處理個人客戶與企業客戶的差異
- 包含地址管理、備註管理等多個子功能
相關文檔
最後更新: 2025-11-04 撰寫者: Product Team