07|BDD Feature

本頁章節

使用 Given(前提)、When(操作)、Then(預期結果)描述業務情境。每個情境獨立執行;「最終」表示等待非同步流程完成,「受理取消」不等於取消完成。

Feature 檔案保留業務描述與案例識別碼,供需求討論與驗收閱讀;此頁不代表案例已執行或通過。

1 下單前主檔與同步命令的邊界行為

下載 Feature

下單端能取得履約所需主檔,並以業務識別碼防止重複下單或重複收貨。

標籤:@events @business-flow

1-1 下單端可以依貨主逐層取得商品、規格、可用倉與庫位

案例:CAT-001

Given 已建立貨主「甲貨主」及其商品「測試茶品」

And 該商品具有可下單的 SKU,且溫層為常溫

And 甲貨主可使用「北部倉」,倉內具有「北部倉庫位」

When 下單端查詢貨主清單

Then 清單包含「甲貨主」

When 下單端依甲貨主查詢商品,再依商品查詢 SKU

Then 能取得該貨主的測試茶品、常溫資訊及所屬 SKU

When 下單端查詢甲貨主的可用倉,再查詢北部倉的庫位

Then 能取得「北部倉」及「北部倉庫位」

1-2 相同貨主與上游單號不能建立第二張實體訂單

案例:CAT-002

Given 甲貨主準備了一張具有唯一上游單號、需求為 1 件的訂單

When 下單端首次提交該訂單

Then 系統接受訂單並回傳訂單識別碼

When 下單端以相同貨主、相同上游單號及完全相同內容再次提交

Then 系統以資料衝突拒絕建立第二張訂單

1-3 收貨以 receiptId 保證重試不會重複入帳,內容不同則拒絕

案例:CAT-003

Given 指定貨主與倉庫的該 SKU 尚無庫存

And 一筆具有唯一 receiptId 的收貨請求要將 5 件有效庫存收入指定庫位

When 收貨端首次提交該收貨請求

Then 系統確認該 receiptId、SKU 與收貨數量 5 件

When 收貨端以相同 receiptId 及完全相同內容重送

Then 系統仍接受該請求

And 該收貨批次的在手量為 5 件、預留量為 0 件

When 收貨端保留原 receiptId,將數量改為 6 件後提交

Then 系統以收貨請求內容衝突拒絕該請求

2 Events 模式的配貨與履約流程

下載 Feature

訂單由事件驅動配貨、倉內作業與交運;缺貨需求等待補貨,並遵守整單配貨與庫存隔離。

標籤:@events @business-flow

共通前提(Background)

Given 系統以 Events 模式協調履約

2-1 有足夠庫存時,訂單會走完配貨、倉內作業與交運

案例:EVT-FUL-001

Given 該 SKU 有 20 件在手庫存、0 件預留及 20 件可承諾量

When 貨主提交需求為 3 件的訂單

Then 系統接受訂單並回傳訂單識別碼

And 訂單最終履約完成

And 庫存作業來源對應該訂單,作業與其 3 件移動需求均已完成

And 該移動需求具有一筆 3 件的批次配置

And 恰有一張 Shipment 完成交運,並保留波次識別碼與 3 件出貨明細

And 履約查詢顯示不適用 Temporal workflow

And 該 SKU 的庫存餘額為

在手量 預留量 可承諾量
17 0 17

2-2 缺貨訂單會等待,收貨後由 availability event 喚醒並完成

案例:EVT-FUL-002

Given 該 SKU 尚無可用庫存

When 貨主提交需求為 4 件的訂單

Then 訂單保持待配貨

And 庫存作業與 4 件移動需求為已確認,尚無批次配置

And 尚未建立 Shipment

When 倉庫收進該 SKU 的 4 件有效庫存

Then 不需重送訂單,訂單最終履約完成

And 庫存作業與移動需求均已完成,並具有一筆批次配置

And Shipment 已交付承運商

2-3 ship-complete 會等所有 SKU 都足夠,不會先占用充足的那一行

案例:EVT-FUL-003

Given SKU A 有 10 件可用庫存,SKU B 尚無可用庫存

When 貨主提交包含下列明細的訂單

SKU 需求量
A 5
B 4

Then 整組庫存作業保持已確認

And A 的 5 件需求與 B 的 4 件需求均尚無批次配置

And 尚未建立 Shipment

When 倉庫只補入 SKU B 的 4 件有效庫存

Then 不需重送訂單,原訂單最終履約完成

And 訂單保留兩行明細

And 庫存作業與兩個移動需求均已完成

And Shipment 包含兩行出貨明細

2-4 同一 SKU 出現在兩行時會先加總需求,再一次判斷整張訂單

案例:EVT-FUL-004

Given 該 SKU 有 10 件可用庫存

When 貨主提交同一 SKU 的兩行訂單明細,數量分別為 2 件及 3 件

Then 訂單最終履約完成

And 庫存作業保留該 SKU 的兩個已完成移動需求,數量分別為 2 件及 3 件

And Shipment 保留兩行出貨明細,數量分別為 2 件及 3 件

2-5 FIFO 的隊首不足時不能跳過它配置後來的小單

案例:EVT-FUL-005

Given 該 SKU 尚無可用庫存

And 兩張訂單的預定出貨時間相同

When 貨主先提交需求為 5 件的第一張訂單,待其進入缺貨等待後再提交需求為 2 件的第二張訂單

Then 兩張訂單的庫存作業均為已確認且尚無批次配置

When 倉庫先補入 2 件有效庫存

Then 第一張與第二張訂單都仍待配貨

When 倉庫再補入 3 件有效庫存

Then 第一張訂單最終履約完成

And 第二張訂單仍待配貨

When 倉庫再補入 2 件有效庫存

Then 第二張訂單最終履約完成

2-6 相同 SKU 在同一倉庫的其他貨主有貨或補貨,不得供應目標貨主

案例:EVT-FUL-006

Given 同一倉庫中,目標貨主的該 SKU 有 2 件可用庫存,另一貨主有 7 件

When 目標貨主提交需求為 4 件的訂單

Then 目標訂單待配貨、尚無批次配置且尚未建立 Shipment

When 另一貨主提交需求為 9 件的控制訂單

Then 控制訂單也待配貨,兩個貨主的庫存均未被預留

When 倉庫替另一貨主補入 5 件該 SKU

Then 控制訂單最終以另一貨主的庫存完成 9 件交運

And 另一貨主剩餘 3 件可用庫存且沒有預留

And 目標訂單仍待配貨,原有 2 件庫存沒有被預留且沒有 Shipment

When 倉庫只替目標貨主補入 2 件該 SKU

Then 目標訂單最終以自己的庫存完成 4 件交運

And 目標貨主的在手量與預留量均為 0 件

And 另一貨主仍保有 3 件可用庫存且沒有預留

2-7 相同貨主與 SKU 在其他倉庫有貨或補貨,不得供應目標倉庫

案例:EVT-FUL-007

Given 同一貨主的該 SKU 在目標倉庫有 2 件可用庫存,在另一倉庫有 7 件

When 貨主提交由目標倉庫履約、需求為 4 件的訂單

Then 目標訂單待配貨、尚無批次配置且尚未建立 Shipment

When 貨主提交由另一倉庫履約、需求為 9 件的控制訂單

Then 控制訂單也待配貨,兩個倉庫的庫存均未被預留

When 另一倉庫收進該 SKU 的 5 件有效庫存

Then 控制訂單最終以另一倉庫的庫存完成 9 件交運

And 另一倉庫剩餘 3 件可用庫存且沒有預留

And 目標訂單仍待配貨,目標倉庫原有 2 件庫存沒有被預留且沒有 Shipment

When 目標倉庫收進該 SKU 的 2 件有效庫存

Then 目標訂單最終以目標倉庫的庫存完成 4 件交運

And 目標倉庫該 SKU 的在手量與預留量均為 0 件

And 另一倉庫仍保有 3 件可用庫存且沒有預留

3 Events 模式的取消流程

下載 Feature

可逆的訂單可以取消並退出庫存競爭;完成交運的訂單不能透過取消回復。

標籤:@events @cancellation @business-flow

共通前提(Background)

Given 系統以 Events 模式協調履約

3-1 待配貨訂單取消後不會再被補貨喚醒,庫存會留給下一張有效訂單

案例:EVT-CAN-001

Given 一張需求為 5 件的訂單因缺貨而等待配貨

And 庫存作業已確認,尚無批次配置及 Shipment

When 客戶提交具有唯一 requestId、請求時間及原因的取消請求

Then 系統受理該取消請求並回傳相同 requestId

And 訂單、庫存作業與移動需求最終均已取消

And 沒有批次配置及 Shipment

And 取消流程最終完成,倉庫結果為沒有 Shipment,並保留訂單端處理結果

When 查詢者以另一個訂單識別碼查詢該取消請求

Then 系統回報找不到該取消流程

When 客戶重送完全相同的取消請求

Then 系統回報該請求已提出,並回傳原 requestId

When 貨主提交相同 SKU、需求為 5 件的下一張有效訂單

Then 下一張訂單進入缺貨等待,尚無批次配置

When 倉庫收進該 SKU 的 5 件有效庫存

Then 下一張有效訂單最終履約完成

And 原訂單仍維持已取消

3-2 已交運完成的訂單拒絕取消,改由退貨流程處理

案例:EVT-CAN-002

Given 一張需求為 2 件的訂單已履約完成,Shipment 已交付承運商

When 客戶提交取消請求

Then 系統先受理取消協調並回傳該 requestId

And 取消流程最終被拒絕,倉庫結果為拒絕,沒有訂單端取消結果

And 訂單仍為履約完成

And Shipment 仍為已交付承運商

4 Events 模式在倉內作業前取消 Shipment

下載 Feature

取消尚未作業的 Shipment 後,原預留能重新供應等待中的訂單。

標籤:@events @cancellation @business-flow

共通前提(Background)

Given 系統以 Events 模式協調履約

And Shipment 建立後暫緩倉內作業,保留可取消窗口

4-1 Shipment 作業前取消會釋放預留,等待訂單不需補貨即可完成

案例:EVT-SHIP-CAN-001

Given 該 SKU 有 10 件在手庫存、0 件預留及 10 件可承諾量

When 貨主提交需求為 3 件的第一張訂單

Then 第一張訂單完成配貨,庫存作業與移動需求均已指派

And 已建立一張尚未作業的 Shipment,並有一筆批次配置

And 庫存餘額為在手 10 件、預留 3 件及可承諾 7 件

When 貨主提交相同 SKU、需求為 8 件的第二張訂單

Then 第二張訂單待配貨,8 件移動需求已確認但沒有批次配置或 Shipment

And 庫存仍為在手 10 件、預留 3 件及可承諾 7 件

When 客戶在倉內作業開始前提交第一張訂單的取消請求

Then 系統受理取消請求

And 第一張訂單、庫存作業、移動需求與 Shipment 最終均已取消

And 原移動需求的批次配置已清空

And Shipment 保留原取消請求的識別碼、時間、原因及實際取消時間

And 取消流程已完成,倉庫結果為 Shipment 已取消,並保留訂單端處理結果

When 系統繼續處理等待訂單,期間不再收貨也不重送訂單

Then 第二張訂單自行完成配貨並建立一張尚未作業的 Shipment

And 第二張訂單以一筆批次配置預留 8 件

And 庫存餘額為在手 10 件、預留 8 件及可承諾 2 件

When 第二張訂單的倉內作業與交運完成

Then 第二張訂單履約完成,庫存作業與 8 件移動需求均已完成

And 第二張訂單仍只有原本那張 Shipment,出貨明細為 8 件

And 庫存餘額為在手 2 件、預留 0 件及可承諾 2 件

And 第一張訂單、庫存作業及移動需求仍已取消,沒有批次配置

And 第一張訂單仍只有一張已取消的 Shipment

5 Debezium connector 暫停後追趕

下載 Feature

事件傳遞暫停時仍能接受訂單,恢復後能繼續完成先前已接受的履約需求。

標籤:@events @messaging-resilience

5-1 Connect 暫停期間已提交的訂單,恢復後仍會從 WAL 追上並完成

案例:MSG-001

Given 系統以 Events 模式協調履約,該 SKU 有足夠庫存

And Debezium connector 已確認暫停傳遞事件

When 貨主提交需求為 2 件的訂單

Then 系統接受訂單、回傳訂單識別碼,訂單狀態為待配貨

And 在事件傳遞暫停的觀察期間,訂單仍待配貨

When 恢復 Debezium connector,且 connector 與傳遞任務已恢復運作

Then 不需重送訂單,先前已提交的訂單最終履約完成

And 已完成的庫存作業來源對應該訂單,移動需求亦已完成

And 恰有一張 Shipment 已交付承運商

And 履約查詢沒有 Temporal workflow

6 Temporal 模式的配貨與履約流程

下載 Feature

Workflow 協調履約並保留處理結果,缺貨等待與庫存隔離仍遵守相同業務規則。

標籤:@temporal @business-flow

共通前提(Background)

Given 系統以 Temporal 模式協調履約

6-1 Temporal workflow 會完成訂單履約並保留終態

案例:TMP-FUL-001

Given 該 SKU 有 20 件在手庫存、0 件預留及 20 件可承諾量

When 貨主提交需求為 4 件的訂單

Then 系統接受訂單並回傳訂單識別碼

And 訂單最終履約完成

And 庫存作業來源對應該訂單,作業與 4 件移動需求均已完成

And 該移動需求具有一筆 4 件的批次配置

And 恰有一張 Shipment 完成交運,並保留波次識別碼與一行 4 件出貨明細

And 可查詢該訂單的 workflow,流程已結束、配貨已提交且結果為履約完成

And Workflow 記錄的 Shipment 與實際交運的 Shipment 相同

And 該 SKU 的庫存餘額為

在手量 預留量 可承諾量
16 0 16

6-2 Temporal workflow 在缺貨期間保持等待,補貨後從原 workflow 繼續完成

案例:TMP-FUL-002

Given 該 SKU 尚無可用庫存

When 貨主提交需求為 3 件的訂單

Then 庫存作業已確認,移動需求尚無批次配置且尚未建立 Shipment

And 可查詢該訂單的 workflow,流程停在配貨階段、配貨已請求且尚無終態結果

When 倉庫收進該 SKU 的 3 件有效庫存

Then 不需重送訂單,該訂單最終履約完成

And 庫存作業與移動需求均已完成,並具有一筆批次配置

And 該訂單的 workflow 仍可查詢,流程已結束且結果為履約完成

6-3 Temporal 已完成交運時同樣拒絕取消

案例:TMP-FUL-003

Given 一張需求為 2 件的訂單已履約完成,workflow 結果為履約完成

When 客戶提交取消請求

Then 系統以 workflow 已無法接受取消請求的衝突拒絕該請求

And 訂單仍為履約完成

And Workflow 結果仍為履約完成

6-4 相同 SKU 在同一倉庫的其他貨主有貨或補貨,不得供應目標貨主

案例:TMP-FUL-004

Given 同一倉庫中,目標貨主的該 SKU 有 2 件可用庫存,另一貨主有 7 件

When 目標貨主提交需求為 4 件的訂單

Then 目標訂單待配貨、尚無批次配置且尚未建立 Shipment

When 另一貨主提交需求為 9 件的控制訂單

Then 控制訂單也待配貨,兩個貨主的庫存均未被預留

When 倉庫替另一貨主補入 5 件該 SKU

Then 控制訂單最終以另一貨主的庫存完成 9 件交運,workflow 結果為履約完成

And 另一貨主剩餘 3 件可用庫存且沒有預留

And 目標訂單仍待配貨,原有 2 件庫存沒有被預留且沒有 Shipment

When 倉庫只替目標貨主補入 2 件該 SKU

Then 目標訂單最終以自己的庫存完成 4 件交運,workflow 結果為履約完成

And 目標貨主的在手量與預留量均為 0 件

And 另一貨主仍保有 3 件可用庫存且沒有預留

6-5 相同貨主與 SKU 在其他倉庫有貨或補貨,不得供應目標倉庫

案例:TMP-FUL-005

Given 同一貨主的該 SKU 在目標倉庫有 2 件可用庫存,在另一倉庫有 7 件

When 貨主提交由目標倉庫履約、需求為 4 件的訂單

Then 目標訂單待配貨、尚無批次配置且尚未建立 Shipment

When 貨主提交由另一倉庫履約、需求為 9 件的控制訂單

Then 控制訂單也待配貨,兩個倉庫的庫存均未被預留

When 另一倉庫收進該 SKU 的 5 件有效庫存

Then 控制訂單最終以另一倉庫的庫存完成 9 件交運,workflow 結果為履約完成

And 另一倉庫剩餘 3 件可用庫存且沒有預留

And 目標訂單仍待配貨,目標倉庫原有 2 件庫存沒有被預留且沒有 Shipment

When 目標倉庫收進該 SKU 的 2 件有效庫存

Then 目標訂單最終以目標倉庫的庫存完成 4 件交運,workflow 結果為履約完成

And 目標倉庫該 SKU 的在手量與預留量均為 0 件

And 另一倉庫仍保有 3 件可用庫存且沒有預留

7 Temporal workflow 的取消分支

下載 Feature

Workflow 協調無 Shipment 與已有 Shipment 的取消,並保留請求身分與最終結果。

標籤:@temporal @cancellation @business-flow

共通前提(Background)

Given 系統以 Temporal 模式協調履約

7-1 尚未配到庫存時,workflow 不需 Shipment 就能取消訂單

案例:TMP-CAN-001

Given 一張需求為 2 件的訂單因缺貨等待配貨

And 該訂單的 workflow 已存在,庫存作業已確認且尚無批次配置或 Shipment

When 客戶提交具有唯一 requestId、請求時間及原因的取消請求

Then 系統受理取消請求

And 訂單、庫存作業與移動需求最終均已取消

And 沒有建立 Shipment

And Workflow 已結束,流程結果與取消狀態均為訂單已取消

And Workflow 保留該取消請求的 requestId

7-2 workflow 取消 Shipment 後釋放預留,等待訂單不需補貨即可完成

案例:TMP-CAN-002

Given 該 SKU 有 10 件在手庫存、0 件預留及 10 件可承諾量

And Shipment 建立後暫緩倉內作業,保留可取消窗口

When 貨主提交需求為 3 件的第一張訂單

Then 該訂單的 workflow 已存在,並已建立一張尚未作業的 Shipment

And 庫存餘額為在手 10 件、預留 3 件及可承諾 7 件

When 貨主提交相同 SKU、需求為 8 件的第二張訂單

Then 第二張訂單待配貨,8 件移動需求已確認但沒有批次配置或 Shipment

And 庫存仍為在手 10 件、預留 3 件及可承諾 7 件

When 暫停事件傳遞,並確認 Connect 與所有傳遞任務已暫停

And 客戶在倉內作業開始前提交第一張訂單的取消請求

Then 系統受理該取消請求

When 客戶保留原 requestId 與請求時間,只修改取消原因後重送

Then 系統回報取消內容衝突,並回傳原 requestId

When 客戶保留原 requestId 與取消原因,只修改請求時間後重送

Then 系統回報取消內容衝突,並回傳原 requestId

When 客戶重送完全相同的原始取消請求

Then 系統回報該請求已提出,並回傳原 requestId

And 第一張訂單尚未完成取消

And Workflow 取消狀態為已請求,保留原始請求時間

When 恢復事件傳遞

Then 第一張訂單、庫存作業、移動需求與 Shipment 最終均已取消

And 原移動需求的批次配置已清空

And Shipment 保留原取消請求的識別碼、時間、原因及實際取消時間

And 第一張訂單的 workflow 已結束,流程結果與取消狀態均為訂單已取消

When 系統繼續處理等待訂單,期間不再收貨也不重送訂單

Then 第二張訂單自行完成配貨並建立一張尚未作業的 Shipment

And 第二張訂單以一筆批次配置預留 8 件

And 庫存餘額為在手 10 件、預留 8 件及可承諾 2 件

When 第二張訂單的倉內作業與交運完成

Then 第二張訂單履約完成,庫存作業與 8 件移動需求均已完成

And 第二張訂單仍只有原本那張 Shipment,出貨明細為 8 件

And 第二張訂單的 workflow 已結束,結果為履約完成

And 庫存餘額為在手 2 件、預留 0 件及可承諾 2 件

And 第一張訂單、庫存作業及移動需求仍已取消,沒有批次配置

And 第一張訂單仍只有一張已取消的 Shipment