SBE Scenario 2: 確認簽收並上傳照片
場景描述
配送員完成配送後,上傳簽收照片並將訂單狀態變更為「已簽收」。
Given(前置條件)
系統狀態
- 當前日期: 2025-12-02
- 當前租戶:
ABC(ABC 花店) - 已登入用戶: 李配送 (ROLE_DELIVERY)
測試資料
配送中訂單
{
"orderId": "ABC-20251201-0001",
"orderNumber": "ABC-20251201-0001",
"tenantId": "ABC",
"status": "out_for_delivery",
"customer": {
"name": "李大華",
"phone": "0912-345-678"
},
"deliveryAddress": {
"address": "台北市信義區信義路五段 7 號"
},
"deliveryDate": "2025-12-02",
"deliveryTimeSlot": "14:00-18:00",
"productionPhotos": [
"https://cdn.example.com/photos/ABC-20251201-0001/design-1.jpg"
]
}
When(執行操作)
步驟 1: 點擊確認簽收
- 配送員在訂單卡片上點擊「確認簽收」按鈕
- 系統顯示照片上傳對話框(而非確認對話框)
步驟 2: 上傳簽收照片
- 對話框標題: 「上傳簽收照片」
- 說明文字: 「請上傳至少一張簽收照片以確認收貨」
- 配送員使用手機拍攝 1 張簽收照片
- 照片預覽顯示
步驟 3: 確認簽收
- 「確認簽收」按鈕啟用(照片數量 >= 1)
- 配送員點擊「確認簽收」按鈕
Then(預期結果)
API 請求
端點: PATCH /api/v1/orders/ABC-20251201-0001/status
Request Body
{
"newStatus": "delivered",
"photoUrls": [
"https://cdn.example.com/photos/ABC-20251201-0001/receipt-1.jpg"
]
}
Response Body (200 OK)
{
"orderId": "ABC-20251201-0001",
"oldStatus": "out_for_delivery",
"newStatus": "delivered",
"updatedAt": "2025-12-02T15:30:00Z",
"updatedBy": {
"userId": "user-003",
"userName": "李配送",
"role": "ROLE_DELIVERY"
},
"message": "訂單狀態已更新為「已簽收」",
"photoCount": 1
}
UI 反饋
1. 成功訊息
- Toast 通知: 「狀態更新成功」
- 訊息類型: 成功(綠色)
2. 對話框關閉
- 照片上傳對話框自動關閉
pendingAction狀態清空
3. 列表更新
- 訂單從「配送中」分組消失
- 訂單不再顯示在配送員工作台(因狀態已變更為
delivered)
資料庫變更
1. 更新 orders 表
UPDATE orders
SET status = 'delivered',
updated_at = '2025-12-02T15:30:00Z'
WHERE order_id = 'ABC-20251201-0001';
2. 新增訂單照片記錄
{
"orderId": "ABC-20251201-0001",
"photoType": "delivery",
"photos": [
{
"id": "photo-003",
"url": "https://cdn.example.com/photos/ABC-20251201-0001/receipt-1.jpg",
"uploadedAt": "2025-12-02T15:30:00Z",
"uploadedBy": "user-003"
}
]
}
3. 新增狀態歷史記錄
{
"id": "history-005",
"orderId": "ABC-20251201-0001",
"tenantId": "ABC",
"oldStatus": "out_for_delivery",
"newStatus": "delivered",
"timestamp": "2025-12-02T15:30:00Z",
"operatorId": "user-003",
"operatorName": "李配送",
"operatorRole": "ROLE_DELIVERY",
"description": "確認簽收,上傳簽收照片",
"metadata": {
"photoCount": 1,
"photoType": "delivery"
}
}
通知觸發
Email 通知(發送給客戶)
親愛的李大華先生/小姐,
您的訂單 ABC-20251201-0001 已成功簽收!
簽收時間:2025-12-02 15:30
配送員:李配送
點擊查看簽收照片:
https://app.example.com/orders/ABC-20251201-0001/photos
感謝您的訂購!
ABC 花店
後續自動流轉
若訂單支付狀態為「已支付」,系統將自動執行:
UPDATE orders
SET status = 'completed',
updated_at = '2025-12-02T15:30:00Z'
WHERE order_id = 'ABC-20251201-0001'
AND payment_status = 'paid';
錯誤場景
未上傳照片嘗試簽收
Given
- 照片上傳對話框已開啟
- 未選擇任何照片
When
- 配送員查看「確認簽收」按鈕
Then
- 按鈕為禁用狀態(disabled)
- 無法點擊
- 需上傳至少一張簽收照片才能繼續
驗證檢查清單
照片上傳
- 照片上傳對話框正確顯示
- 對話框標題為「上傳簽收照片」
- 照片預覽功能正常
- 至少一張照片驗證正確
狀態流轉
- 訂單狀態從
out_for_delivery變更為delivered - 照片類型標記為
delivery - 狀態歷史記錄包含照片資訊
通知系統
- 客戶收到簽收通知 Email
- Email 包含簽收照片連結
UI 更新
- 對話框正確關閉
- 訂單從列表消失
- 成功通知顯示
最後更新: 2025-12-19