ccairn

行程與梯次

一個「行程」是你上架的產品定義;真正被報名、被扣席、被開團號的是它底下的「梯次」。客人買的永遠是某一個梯次。

理解這層關係,你才能正確使用 GET /trips 與梯次相關端點——行程帶目錄與行銷內容,梯次帶日期、名額與售價。

行程與梯次的關係

一個行程(trip)是產品目錄上的一張卡:標題、目的地、天數、起價、上架狀態。它不是可賣的單位——它底下掛梯次(departure),每個梯次有自己的出發日、回程日、名額與售價,才是客人實際報名的對象。

概念是什麼在 API 上
行程 trip產品定義(目錄 / 行銷內容)/trips
梯次 departure可賣的出團單位(日期 + 名額 + 售價)/departures

行程的 statusdraft(草稿)/ published(上架)/ archived(封存);梯次的 statusselling(銷售中)/ closed / cancelled / completed。列表回傳的 activeDepartureCountnextDepartureDate 讓你不必逐筆展開就知道一個行程有沒有在賣、下一梯何時出發。

說明

訂房(lodging)不走這個模型。 住宿產品是每晚房型庫存,沒有「梯次」概念。本篇只談梯次團(tour)。

席次與保座

每個梯次有名額(capacity)與已報名數(bookedCount)。報名時平台用保座方式扣席——不是「先讀再寫」,而是條件式扣減,所以多人同時搶最後幾個位子不會超賣。

注意

名額不足時,建立訂單會回 409 conflict。這是預期行為,不是錯誤——代表這個梯次在你送出的當下已經滿了。請以重新整理名額、或改報其他梯次來處理,不要重試同一筆。

取消訂單會把席次釋回該梯次,名額即時反映。

價格通路(直客 / 同業)

同一個梯次對不同客戶可能有不同售價。成交單價由平台依通路解析,順序大致是:梯次優惠價 → 梯次價 → 行程起價,缺價則拒絕結帳。

通路意義
直客(direct)一般客人價
同業(agency)旅行同業窗口價
優惠(promo)梯次層的活動覆寫價

成交當下,平台會把當時的單價與通路快照寫進訂單明細——之後你改梯次或行程價格,不會回寫已成立的訂單。客戶分類只是結帳時的預設通路,不是訂單事實;訂單的價格事實永遠在那張單的明細上。

團號

團號是梯次的對外識別碼,貫穿報名、開票、估價、出團通知與對帳。它編碼了出團年份、地區(山域)、出發日與同日同地的流水序;海外線多帶一段航空碼:

國內團(無航空):26 YS 1010 A   → 26YS1010A
海外團(有航空):26 EG TK 1010 A → 26EGTK1010A
                  YY 地區 [航空] MMDD 序號
  • 自動產生:選好地區、(海外才有的)航空與出發日,平台拼出團號並配同地區同日的序號(A / B / C…)。團號在租戶內唯一,併發產生不會撞號。
  • 可覆寫:需要沿用舊系統團號或特例時可手填,仍須過唯一與格式檢查。
  • 可搜尋GET /tripsgroupCode 參數用團號(前綴亦可)回查含該團號梯次的行程;列表的 representativeGroupCode 是該行程近期的代表團號。

地區碼與航空碼是每個租戶自行維護的對照表(/group-codes),新增線路不需要改任何程式。停用的碼不再出現在新梯次的選項,但既有團號保留。

抽籤與備案行程

熱門梯次(國家公園山屋床位、permit 配額)的名額不是先到先得,而是抽籤決定。把梯次的分配模式設成抽籤(PATCH /departures/{id}/allocation-modemode = lottery),它底下的訂單就從「報名」變成「應募」。

說明

抽籤演算法本身不在 cairn 裡——它留在租戶既有的試算表流程。cairn 負責的是抽籤的地基結果落地:每筆應募訂單有自己的抽籤狀態(已應募 → 中籤 / 未中籤),由線控逐單裁決。應募即扣本梯次的席(代表「誰報了這梯」),抽籤搶的是外部稀缺資源、不是 cairn 的席次。

裁決有三個出口:

旅客報名抽籤梯次時,可從同行程的其他梯次自選一串有序備案(可混先到先得與抽籤梯次)。未中籤時,平台沿這串清單鏈式自動轉單:遇先到先得且有位即當下成立、遇抽籤梯次則重新應募等下一輪、清單走完才退訂金。轉單過程訂金一路結轉、自動催尾款,全程不用人工逐筆搬。備案候選一律與主梯同價,所以跨單結轉不會產生價差。

與訂單的銜接

客人報名某個梯次,就是建立一張 tour 訂單:訂單明細指向該梯次,人數(partySize)掛在訂單上。價格、訂金 / 尾款怎麼拆、收了多少,全部由訂單的金流模型接手——梯次只提供「賣什麼、什麼價、還有沒有位」。

下一步

Command Palette

Search for a command to run...