Skip to main content

Command Palette

Search for a command to run...

Event Storming 演練 - 停車場系統 - 上

Published
3 min readView as Markdown

領域專家口述業務流程

停車場入口會顯示目前停車場剩餘車位,當車輛駛入停車場入口,會先判斷是否有停車位,若是有停車位,車號辨視系統成功取得車號將會放入車輛進入,當感應車輛真的進入後,記錄車輛的車牌與其進入的時間,會將剩餘車位減一。

車輛進入之後,會給於一段緩衝時間,若是車輛在緩衝時間內出場,系統判斷可以正常出場不必繳納停車費用,若超過緩衝時間,即必須這行繳費程序之後再放行。

繳費流程要求在出場之前完成,不會與出場流程一起,繳費時會判斷是否在緩衝時間內,若是,將不必繳費請駕駛人儘快離場,並提醒剩於緩衝時間,緩衝時不會因此展延,如果緩衝時間是 15 分鐘,在第 14 分鐘進行繳費,雖然不必繳費,但會告知駕駛人剩餘不到一分鐘,以此類推。

繳費時計算費用,系統判斷規格,會有半小時或一小時計費制,並且有每天上限或無上限制,比如每半小時 20 元,每天最高上限 160 元,當計算費用完成,請駕駛者繳費,繳費提供多種付款方式,以需求進行擴充,比如現金、apple pay、 line pay 等多元付款方式,當付款完成後依場地規劃須開立發票或不須開立,若開立發票,支援電子式,或是電子發票,電子發票可支援載具、愛心碼相關規則。

付款後有緩衝時間,駕駛者必須在緩衝時間內離場,若超過,將重新計費並進行繳費,車輛正式出場後記錄離開時間,並將剩餘車位加一。

若是停車場發生異常需要通知管理者線上處理,系統可以通知管理者,管理者可以遠端處理車停進出管理,比如收費系統異常,管理者可以設定車輛暫時停止進入或開放免付費進出,若進出場記錄仍然可以正常運作,仍然必須記錄。

精煉版業務流程摘要(供Event Storming)

  • 進場流程:顯示剩餘車位 → 車輛靠近 → 辨識車號 → 判斷是否可入場 → 放行 → 感應進入 → 減一車位 → 記錄車牌、進場時間。

  • 免費緩衝:進場後啟動免費緩衝 → 緩衝內出場 → 不須付費 → 記錄出場。

  • 繳費流程:超過緩衝 → 繳費 → 支付多元 → 發票/不發票 → 通知剩餘時間。

  • 出場流程:付款後啟動有效出場時間 → 感應離場 → 加一車位 → 記錄。

  • 異常處理:設備異常 → 通知管理者 → 遠端控制 → 記錄行為與結果。

Domain Events

這些是「發生過的、不可改變的事實」。

  1. 🚗 車輛靠近停車場入口

  2. 🛑 停車場已滿

  3. ✅ 停車場有空位

  4. 🔍 車牌辨識成功

  5. ❌ 車牌辨識失敗

  6. 🚦 車輛進入停車場

  7. 🕒 車輛進場時間已記錄

  8. ➖ 剩餘車位減一

  9. 🆓 車輛在免費緩衝時間內出場

  10. 💰 車輛需付費

  11. 🧾 停車費用已計算

  12. 💵 繳費完成

  13. 📄 發票已開立

  14. 🚗 車輛離場

  15. ➕ 剩餘車位加一

  16. ⚠️ 系統異常被偵測

  17. 👨‍💻 管理者完成異常處理

命令(Commands)

命令是驅動行為的「指令」。

  1. 查詢停車場剩餘車位

  2. 辨識車牌

  3. 開啟閘門

  4. 記錄車輛進場

  5. 啟動免費緩衝計時

  6. 查詢是否需付費

  7. 計算停車費

  8. 執行付款

  9. 開立發票

  10. 啟動出場有效時間

  11. 記錄車輛出場

  12. 發送出場提醒

  13. 停止入場

  14. 開啟免付費模式

  15. 記錄異常處理結果

實體 / 聚合(Entities / Aggregates)

  1. 車輛

  2. 停場場

  3. 繳費機

策略事件節點(Policies)

進場流程 Policies

  1. 當車輛靠近停車場入口時,顯示剩餘車位數

  2. 當剩餘車位為 0 時,不開啟閘門,顯示停滿

  3. 當剩餘車位大於 0 時,啟動車牌辨識

  4. 當車牌辨識成功時,自動開啟閘門

  5. 當車輛成功進入停車場時,記錄進場時間並扣除一個車位

  6. 當車輛進入時,啟動免費緩衝時間計時

出場與計費流程 Policies

  1. 當車輛準備出場時,檢查是否仍在免費緩衝時間內

  2. 當超過免費緩衝時間時,啟動停車費用計算

  3. 當費用計算完成時,提示駕駛進行付款

  4. 當付款完成時,決定是否開立發票

  5. 當付款完成時,啟動出場有效時間計時

  6. 當駕駛出場時,記錄出場時間並釋放一個車位

異常處理流程 Policies

  1. 當系統偵測異常時,即時通知管理者

  2. 當管理者處理異常時,決定是否暫停入場或開放免付費模式

  3. 當異常狀態中,仍須維持進出記錄正常運作

Event → Policy → Command 樣式

Event Storming 中,我們習慣用這樣的三段式流來呈現:

元素顏色功能說明
Event🟧 橘色發生的事情(「過去式」描述)
Policy🟦 藍色當事件發生後,業務應自動觸發什麼反應
Command🟨 黃色被觸發的具體行動,通常是「做某事」

車輛靠近入口事件範例

[ 車輛靠近入口 ](橘,Event)
          ↓
[ 顯示剩餘車位數 ](藍,Policy)
          ↓
[ 查詢剩餘車位 ](黃,Command

進場流程 Policies 與 Commands

#事件 (Event)Policy (業務策略性述說)Command (操作命令)
1車車靠近入口應即時顯示停車場剩餘容量狀態查詢剩餘車位
2剩餘車位為 0應拒絕進場以避免超負(無 Command, 單純提示)
3有剩餘車位應執行車牌識別以確保進場合法性啟動車牌識別
4車牌識別成功應自動允許車車進場以提升效率開啟閘門
5車牌識別失敗應通知人工介入以維持服務不中斷啟動人工提醒或依託
6車車進場成功應同步更新容量與記錄以便後續計費記錄進場資訊、剩餘車位減一
7車車進場應立即啟動免費停車計時以保障消費者權益啟動免費等待計時
8車車准備出場應檢查是否符合免費出場條件以保障公平查詢停車記錄
9符合免費條件應提示用戶無需付款可直接出場(無 Command, 單純提示)
10超過免費時間應根據規範計算合理停車費產生啟動計算費產生
11費產生完成應提示駕駛人進行付款操作(無 Command, 這是手動啟動)
12駕駛人付款應確認是否需要開立發票以符合規定開立發票
13付款完成應提供合理有效的出場時間限制啟動出場計時
14車車出場成功應即時更新停車容量與離場記錄記錄離場資訊、剩餘車位加一
15系統發現異常應主動通知管理人員以快速回應發送異常通知
16異常處理完成應據規則恢復或變更進出控制策略停止進場 / 啟動免費模式
17異常狀態中進出場即使異常也應持續維持進出場記錄(無 Command)

More from this blog

關於 Hash index

什麼是 Hash Index? Hash Index 是資料庫系統中的一種索引結構,它使用雜湊函數(Hash Function)將索引鍵(Key)映射到資料表中的記錄位置。相較於傳統的 B-Tree 索引,Hash Index 在某些特定查詢場景下能提供更高效的性能。 基本原理 Hash Index 的核心原理是: 使用雜湊函數將索引鍵轉換為雜湊值(Hash Value) 雜湊值決定資料記錄在雜湊表(Hash Table)中的儲存位置 查詢時,系統對索引鍵應用相同的雜湊函數,直接定位到對應...

Jul 26, 20251 min read
關於 Hash index

Event Storming 演練 - 停車場系統 - 下

邊界情境 實際做法: 當大家走到「車輛靠近入口 → 辨識 → 進場」的事件時,突然有人問: 「那如果有人卡在入口不走呢?」 此時 facilitator(主持人)會立刻拿一張粉紅貼紙寫: 複製編輯🚧 車輛卡在入口太久 然後貼在「車輛靠近入口」的旁邊,不急著解決,先繼續主流程。 快速記錄格式(現場慣用) 元素怎麼寫 事件粉紅貼紙,寫「異常行為:XXX」 策略建議藍貼紙,可直接寫「應提示駕駛讓道」 命令建議黃貼紙,可寫「發送通知、記錄異常」 👉 不強求完...

Jul 10, 20252 min read

TypeScript - Type 那點事

隨便記 將類型定義放在 .types.ts 或 .d.ts 檔案中,此兩者副檔名有何差異? 在 TypeScript 開發中,.types.ts 和 .d.ts 檔案都用於定義類型,但它們的用途和特性有所不同: .types.ts 用途: 通常用於在 TypeScript 專案內部,定義專案中使用的類型。 這些檔案包含 TypeScript 程式碼,可以包含類型別名、介面、列舉等。 .types.ts 檔案會被 TypeScript 編譯器編譯成 JavaScript 檔案(.js...

Jun 28, 20251 min read

碼農筆記 - 設計思維

Mark it Work, Mark it Right, Mark it Fast 可測試性 可閱讀性 可觀察性 可維護性 可擴展性 健壯性 安全性 效能與資源效率 可部署性 可配置性 🧠 最佳實踐心法 別一開始就追求 Make it Fast,先求穩定,再求優雅,最後才是效能。 重構是常態不是例外,Make it Right 應視為開發常規而非技術債還債。 性能瓶頸來自實測,而不是預測。 Make it Right 意指 程式碼結構清晰 命名具語意 關...

Jun 10, 20251 min read

我的工作筆記

8 posts

雖是全端碼農,主力還是後端功能,php + mysql + redis 使用 Laravel 框架,node + mysql + redis 使用 Adonisjs v5。