Dynamic Modeling
Sequence Diagram
sequenceDiagram
autonumber
actor User as 一般會員
actor Host as 主揪
participant UI as App 介面
participant Ctrl as 系統控制器
participant DB as 資料庫實體
Note over User, DB: 階段一:帳號註冊與能力自評
User->>UI: 填寫個資註冊帳號
UI->>DB: INSERT users
User->>UI: 填寫運動能力自評 (Level)
UI->>DB: UPDATE users
UI-->>User: 註冊完成
Note over Host, DB: 階段二:資源檢索與動態防呆預約
Host->>UI: 搜尋場地並點擊「預約」
UI->>Ctrl: reserveSlot(slot_id)
Ctrl->>Ctrl: 內部演算:計算動態鎖定時間
Ctrl->>DB: UPDATE time_slots (status='Locked')
UI-->>Host: 顯示結帳倒數,等待確認
Host->>UI: 確認付款與招募條件,建立球局
UI->>Ctrl: createGameSession(settings)
Ctrl->>DB: UPDATE time_slots (status='Booked')
Ctrl->>DB: INSERT game_sessions (status='Recruiting')
UI-->>Host: 球局建立成功,進入管理主控台
sequenceDiagram
autonumber
actor Joiner as 尋找場地者
actor Host as 主揪
participant UI as App 介面
participant Radar as 雷達控制器
participant Fin as 帳務控制器
participant DB as 資料庫實體
Host->>UI: 開啟「LBS 雷達招募」
UI->>Radar: activateRadar(session_id, radius)
Radar->>DB: UPDATE game_sessions (is_radar_active=true)
Radar-->>Joiner: LBS 空間推播 (附近有缺咖球局)
Joiner->>UI: 發送「加入請求」
UI->>DB: INSERT participants (status='Pending')
Radar-->>Host: 收到加入申請通知
Host->>UI: 審核檔案並點選「同意加入」
UI->>DB: UPDATE participants (status='Approved')
Note over UI, DB: 觸發動態計費機制
UI->>Fin: recalculateFee(session_id)
Fin->>DB: 撈取 TimeSlot 總價與 Approved 總人數
Fin->>Fin: 總價 / 總人數 = 每人應繳費用
Fin-->>UI: 推播最新帳單金額給所有參與者
sequenceDiagram
autonumber
actor User as 欲退坑會員
participant UI as App 介面
participant Ctrl as 稽核引擎 (AuditCtrl)
participant DB as 資料庫實體
User->>UI: 點擊「取消報名」
UI->>Ctrl: requestCancel(user_id, session_id)
Ctrl->>DB: 撈取 game_sessions.lock_time
alt 當前時間 < lock_time (正常退出)
Ctrl->>DB: DELETE participants
Ctrl-->>UI: 退出成功 (無懲罰)
else 當前時間 >= lock_time (逾時退坑)
Ctrl-->>UI: 觸發防呆:詢問是否「照常付費」
alt 選擇 [願意付費]
User->>UI: 確認付費
UI->>DB: UPDATE participants (status='Paid_Absent')
Ctrl-->>UI: 維持信用積分
else 選擇 [拒絕付費]
User->>UI: 堅持退出
UI->>DB: UPDATE participants (status='Malicious_Dropout')
Note over Ctrl, DB: 執行階梯式扣分演算法
Ctrl->>DB: 查詢該員近期退坑次數
Ctrl->>Ctrl: 計算扣除分數
Ctrl->>DB: UPDATE users (扣除 credit_score)
end
end