跳至主要内容

US-104: 商品分類管理

User Story

作為 花店管理者 我想要 能夠自訂商品分類(類型) 以便 根據店鋪實際經營品項組織商品目錄


驗收標準 (Acceptance Criteria)

Scenario 1: 查看預設商品分類

  • Given 我是已登入的管理者
  • And 我在「系統設定 > 商品分類」頁面
  • When 頁面載入完成
  • Then 我應看到系統預設的商品分類列表:
    • 花束 (bouquet)
    • 盆花 (pot)
    • 高架花籃 (stand)
    • 花籃 (basket)
    • 盒花 (box)
    • 禮品 (gift)
    • 客製化專案 (custom)
  • And 每個分類應顯示:名稱、代碼、商品數量、狀態

Scenario 2: 新增自訂商品分類

  • Given 我是已登入的管理者
  • And 我在「商品分類」頁面
  • When 我點擊「新增分類」按鈕
  • And 我填寫分類名稱「婚禮專區」
  • And 我填寫分類代碼「WED」
  • And 我填寫分類描述「婚禮相關花卉商品」
  • And 我點擊「儲存」按鈕
  • Then 系統應創建新的商品分類
  • And 新分類應出現在分類列表中
  • And 新分類可在創建商品時選擇

Scenario 3: 編輯商品分類名稱

  • Given 我是已登入的管理者
  • And 系統中有分類「婚禮專區」
  • When 我點擊該分類的「編輯」按鈕
  • And 我修改分類名稱為「婚禮花藝」
  • And 我點擊「儲存」按鈕
  • Then 分類名稱應更新為「婚禮花藝」
  • And 已使用此分類的商品不受影響

Scenario 4: 停用商品分類

  • Given 我是已登入的管理者
  • And 分類「婚禮花藝」下有 5 個商品
  • When 我點擊該分類的「停用」按鈕
  • And 系統顯示警告「此分類下有 5 個商品,停用後這些商品將無法在訂單中選擇」
  • And 我確認停用
  • Then 分類狀態應變為「已停用」
  • And 此分類不應出現在創建商品時的選項中
  • And 此分類下的商品狀態應自動變為「已下架」

Scenario 5: 重新啟用商品分類

  • Given 我是已登入的管理者
  • And 分類「婚禮花藝」目前狀態為「已停用」
  • When 我點擊該分類的「啟用」按鈕
  • Then 分類狀態應變為「已啟用」
  • And 此分類應重新出現在創建商品時的選項中
  • And 該分類下的商品需手動重新上架

Scenario 6: 調整分類排序

  • Given 我是已登入的管理者
  • And 系統中有 8 個商品分類
  • When 我拖曳「婚禮花藝」分類到列表第 2 位
  • Then 分類順序應更新
  • And 新順序應反映在創建商品時的下拉選單中

Scenario 7: 刪除未使用的商品分類

  • Given 我是已登入的店主
  • And 分類「測試分類」下沒有任何商品
  • When 我點擊該分類的「刪除」按鈕
  • And 系統要求我確認
  • And 我點擊「確認刪除」
  • Then 該分類應被永久刪除

Scenario 8: 無法刪除有商品的分類

  • Given 我是已登入的店主
  • And 分類「花束」下有 20 個商品
  • When 我嘗試刪除該分類
  • Then 系統應顯示錯誤訊息「此分類下有 20 個商品,無法刪除。請先移除或移動這些商品。」
  • And 分類不應被刪除

Scenario 9: 無法刪除系統預設分類

  • Given 我是已登入的店主
  • And 分類「花束」是系統預設分類
  • When 我嘗試刪除該分類
  • Then 系統應顯示錯誤訊息「系統預設分類無法刪除」
  • And 分類不應被刪除

Scenario 10: 分類代碼重複驗證

  • Given 我是已登入的管理者
  • And 系統中已有代碼為「BQT」的分類
  • When 我嘗試新增分類,代碼填寫「BQT」
  • Then 系統應顯示錯誤訊息「分類代碼已存在」
  • And 分類不應被創建

業務規則 (Business Rules)

  1. 系統預設分類

    • 系統提供 7 個預設分類(花束、盆花、高架、花籃、盒花、禮品、客製化)
    • 預設分類無法刪除,但可以停用或修改名稱
    • 預設分類代碼無法修改
  2. 分類代碼規則

    • 格式: 2-5 個大寫英文字母
    • 必須唯一(租戶層級)
    • 創建後不可修改
    • 用於 SKU 編號生成
  3. 分類名稱規則

    • 長度: 1-20 個字元
    • 必須唯一(租戶層級)
    • 可隨時修改
  4. 停用/啟用規則

    • 停用分類後,該分類下的所有商品自動下架
    • 啟用分類後,商品需手動重新上架
    • 停用/啟用操作需記錄審計日誌
  5. 刪除規則

    • ROLE_OWNER 可刪除分類
    • 有商品的分類無法刪除
    • 系統預設分類無法刪除
    • 刪除操作不可復原
  6. 排序規則

    • 分類可自訂排序
    • 排序影響商品表單中的下拉選單順序
    • 預設分類排在自訂分類之前
  7. 多租戶隔離

    • 每個租戶有獨立的分類配置
    • 自訂分類僅對當前租戶可見
    • 預設分類所有租戶共享定義,但可各自停用

UI/UX 需求 (UI/UX Requirements)

頁面佈局

商品分類管理
[新增分類]

┌─────────────────────────────────────────────────────────┐
│ ≡ 花束 (BQT) 商品: 25 ✅ 已啟用 [編輯] │
├─────────────────────────────────────────────────────────┤
│ ≡ 盆花 (POT) 商品: 18 ✅ 已啟用 [編輯] │
├─────────────────────────────────────────────────────────┤
│ ≡ 高架花籃 (STD) 商品: 8 ✅ 已啟用 [編輯] │
├─────────────────────────────────────────────────────────┤
│ ≡ 婚禮花藝 (WED) 商品: 5 ⚫ 已停用 [編輯] │
└─────────────────────────────────────────────────────────┘

新增/編輯分類 Modal

┌─────────────────────────────────────┐
│ 新增商品分類 [×] │
├─────────────────────────────────────┤
│ 分類名稱 * │
│ ┌─────────────────────────────┐ │
│ │ 婚禮花藝 │ │
│ └─────────────────────────────┘ │
│ │
│ 分類代碼 * (2-5 個大寫字母) │
│ ┌─────────────────────────────┐ │
│ │ WED │ │
│ └─────────────────────────────┘ │
│ │
│ 分類描述 │
│ ┌─────────────────────────────┐ │
│ │ 婚禮相關花卉商品 │ │
│ └─────────────────────────────┘ │
│ │
│ [取消] [儲存] │
└─────────────────────────────────────┘

互動行為

  • 拖曳排序: 左側拖曳手把 (≡) 可拖曳調整順序
  • 停用/啟用: 點擊狀態標籤切換
  • 刪除: 編輯 Modal 中的「刪除分類」連結(僅無商品時可用)

技術規格 (Technical Specifications)

API 端點

1. 獲取分類列表

  • 端點: GET /api/v1/product-categories
  • 權限: ROLE_STAFF 或更高

2. 創建分類

  • 端點: POST /api/v1/product-categories
  • 權限: ROLE_MANAGER 或更高

3. 更新分類

  • 端點: PUT /api/v1/product-categories/{id}
  • 權限: ROLE_MANAGER 或更高

4. 更新分類排序

  • 端點: PUT /api/v1/product-categories/order
  • 權限: ROLE_MANAGER 或更高

5. 刪除分類

  • 端點: DELETE /api/v1/product-categories/{id}
  • 權限: ROLE_OWNER

資料模型

interface ProductCategory {
id: string;
tenantId: string;
code: string; // 分類代碼 (BQT, POT, WED...)
name: string; // 分類名稱
description?: string; // 分類描述
isSystem: boolean; // 是否為系統預設
status: 'active' | 'inactive';
sortOrder: number; // 排序順序
productCount: number; // 該分類下的商品數量
createdAt: Date;
updatedAt: Date;
}

Story Points

估算: 3 points

理由:

  • 簡單的 CRUD 操作
  • 拖曳排序增加少許複雜度
  • 需要處理與商品的關聯邏輯

相關文檔


最後更新: 2025-12-03 撰寫者: AI Assistant