電話接單不是一個動作,而是一串有先後依賴的處理。用事件描述流程,能讓每個階段的成功、失敗與等待狀態被看見。
為什麼用事件描述流程
如果系統只提供一個「建立訂單」的函式,失敗時很難判斷問題發生在哪裡:是通話沒收到、語音沒轉好、地址沒擷取,還是派遣系統沒有回應?把流程拆成事件之後,每個階段都有明確的輸入、輸出與狀態,也比較容易重試或交給人工。
這裡的事件是設計概念,不是現行系統的介面規格。命名僅用於說明流程。
流程中的事件
- call.received:電話進線,建立通話識別碼與基本脈絡。
- transcript.ready:逐字稿完成,附上時間標記與音訊參照。
- order.extracted:欄位擷取完成,包含各欄位的信心與來源片段。
- order.review_required:低信心或衝突資訊需要人工確認。
- order.confirmed:人工或規則確認完成,訂單內容定案。
- dispatch.requested:向派遣流程提出需求。
- dispatch.updated:派遣結果或狀態變更。
事件之間不應假設同步完成。語音轉文字可能比通話結束晚幾秒,人工覆核可能隔幾分鐘才發生,派遣系統也可能暫時無法回應。流程必須能處理這些等待與中斷。
失敗處理
- 冪等:同一個事件重送時,不應重複建立訂單或重複派遣。
- 重試與退避:外部服務暫時失敗時,依錯誤類型決定是否重試,而不是無限制重送。
- 待處理佇列:無法自動處理的事件需要被保存與提醒,而不是消失。
- 人工覆核:把不確定性顯性化,讓營運人員知道該確認哪一個欄位。
- 補償:已建立的錯誤結果需要有可追蹤的修正方式,而不是直接覆寫。
原則是先讓失敗可見,再談自動化。若失敗只留在日誌深處,營運人員就無法判斷訂單是否真的成立。
可觀測性
事件流程需要一個共同的關聯識別碼,把通話、逐字稿、擷取結果、覆核與派遣串在一起。每個階段應記錄狀態轉換、處理時間與失敗原因。這些紀錄同時支援除錯、營運檢視與後續的測試比較。
紀錄本身也涉及隱私。通話音訊與逐字稿可能包含個人資訊,因此需要遮蔽、權限控制與保存期限,而不是無限制保留。
設計原則
事件驅動不是為了追求架構複雜度,而是為了讓流程中的不確定性有位置可以停留。對車隊營運而言,一個「等待人工確認」的狀態,遠比一個默默失敗的訂單更容易處理。
內容說明
本文為技術概念與工程方法整理,不代表產品已上線功能、效能數據或任何客戶實測結果。