郵輪B2C P3 選擇艙房(QueryCategory)
API Content
說明
P2、P3 的「艙房 / 人數」燈箱按〔確認〕後打這支,帶行程與各房人數,回每間房可選的方案卡片與艙型頁籤。一張卡片=方案 × 艙型 × 票價。同一筆訂位要再查一次時,改帶 Page_Id 打這支(重查)。
- 方法:POST
- 路徑:
Cruise/Products/QueryCategory
- 對應畫面:P3 選擇艙房
使用重點:
- 全部房一起回:切換艙房 1、2 用
Room_List裡那間的資料,不用重打
- P3 按〔重選艙房與人數〕(APP 導覽列放大鏡)確認後,帶新的人數重打這支(新查詢,不帶
Page_Id)
- WEB 頁首行程摘要、APP 導覽列直接綁
Itinerary_Info,重查也會回
Page_Id要留著,一筆訂位一個,進選艙房頁之後的步驟都帶它。新查詢(不帶Page_Id)才會換新的:舊的作廢,已選的艙型、房號要重選
- 新查詢會建新的訂位,等於放棄舊的:舊訂位有佔房(打過 CreateHold、手上有
Hold_Until_Time)才先呼叫放掉全部佔房(POST Cruise/Products/ReleaseAllHolds,只帶Page_Id)放掉舊訂位的房;P3 一般沒佔房,直接新查詢(見 ReleaseAllHolds 文件)
- 重查(帶
Page_Id):Page_Id不變,已選的艙型、房號都還在。兩個時機:
- ① 按〔下一步〕進旅客填寫頁時有房間沒佔到:回 P3,帶
Page_Id和那間的Room_Seq重查,讓客人重選那一間的艙型、房號;佔到的那間不用重選
- ② P3 重整:帶
Page_Id、不帶Room_Seq,全部房重查,再看回應每間的Hold_Until_Time:任一間有值(進過填寫頁、還有保留,超過 15 分鐘也算)就先打放掉全部佔房(POST Cruise/Products/ReleaseAllHolds),用這次查到的卡片、同一個Page_Id全部房重選;都是 null 就不打,沒進過填寫頁的選擇前端自己存的還原。從填寫頁回 P3 不是重整,佔房留著
- 選定房號不用重打:進旅客填寫頁才佔房,卡片不會變。艙型只剩一間時,第一間選走後第二間還看得到卡片,要到選房號才看到沒有可選的房
- 任一間
Category_List是空陣列:不進 P3,燈箱不關、顯示錯誤狀態——頂端紅條「目前無符合所選人數的可訂艙房,請調整艙房/人數再試」(顯示 9 秒後消失);只有Category_List空的那一間框變紅(按+/-後消失),另一間不標
- 卡片照片直接綁
Image_List,照順序輪播,第一張是封面;空陣列顯示預設圖。艙房介紹用Profile_Id對 P2 艙房介紹(GetCabinProfile)的Profile_List;艙房名稱、入住人數這支直接回
- 選房方式跟確認、退改一樣是 Type+Text:卡片顯示
Cabin_Selectable_Type,點「系統配房」(WEB 提示框、APP 說明面板)顯示Cabin_Selectable_Text,文字不用寫死
- 按〔選擇〕帶
Page_Id、Room_Seq和這張卡片的Category_Id查房號;在彈窗按〔選擇此艙房〕前端記下這張卡片的Plan_Id、Category_Id、Fare_Code和房號(不打 API);按〔下一步:填寫旅客資料〕時各房一起送出,帶Session_Version。查房號見 QueryCabin 文件;送出見 CreateHold 文件
- 勾選後的篩選比對、排序、「共 N 筆」、〔已選擇〕前端做,不重打;回應照價格低到高排
- 篩選面板的選項與價格範圍直接綁這間的
Filter_Info,切換艙房換用那間的。頁籤的筆數與最低價不跟著勾選變,「共 N 筆」才是篩選後的筆數
- 「全部艙房」頁籤就是
Type_Price_List第一筆(Profile_Type是all),筆數與最低價後端算好
Fare_Price是顯示價,實付總額以進填寫頁的金額為準,兩邊可能差一點
- 買不到的艙型不列卡片:頁籤照列,
Fare_Price是 null、Category_Count是 0,顯示「(0) 售完」
- 這版不回:〔已售完〕〔即將開賣〕這兩種卡片、刪除線原價
- 方案詳情的內容在另一支
GetPolicyDetail,帶卡片的Policy_Rule_Id
文件版本:v1.0(未交付)
規格調整
| 日期 | 版本 | 調整內容 |
|---|---|---|
| 2026/11/11 | v1.0(未交付) | 初版 |
Request Schema
Body
有沒有帶 Page_Id 分兩種:新查詢帶行程、各房人數、Request_Mode;重查帶 Page_Id(只查一間再加 Room_Seq),其他欄位不用帶。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Page_Id | 重查必填。上一次回應的 Page_Id。有帶就是重查;新查詢不帶 | String | 6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f |
| Room_Seq | 選填,重查才看。只查第幾間;不帶=全部房都查 | Int | 2 |
| Itinerary_Id | 新查詢必填。行程編號(P2 航程詳情 Itinerary_List 的同名欄) | Int | 5001 |
| Departure_Date | 新查詢必填。出發日 yyyy/MM/dd(P2 航程詳情 Itinerary_List 的同名欄)。要跟 Itinerary_Id 是同一筆 | String | 2026/10/01 |
| Room_List | 新查詢必填。一間房一筆,最多幾間看 Booking_Limit 的 Room_Max | List | 參考 Room_List |
| Request_Mode | 新查詢必填。呼叫端平台:WEB/APP(同 P1 搜尋) | String | WEB |
Room_List
新查詢才帶。一間房一筆,順序就是艙房 1、2。跟回應的 Room_List 同名,內容不同。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Adt_Count | 必填。這間的大人數 | Int | 2 |
| Chd_Count | 必填。這間的小孩數,沒有給 0 | Int | 0 |
| Inf_Count | 必填。這間的嬰兒數,沒有給 0 | Int | 0 |
JSON 範例
新查詢:
{
"Itinerary_Id": 5001,
"Departure_Date": "2026/10/01",
"Room_List": [
{
"Adt_Count": 2,
"Chd_Count": 0,
"Inf_Count": 0
},
{
"Adt_Count": 2,
"Chd_Count": 1,
"Inf_Count": 0
}
],
"Request_Mode": "WEB"
}重查第 2 間:
{
"Page_Id": "6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f",
"Room_Seq": 2
}Response Schema
回應主體
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Result_Info | 結果資訊;前端先看 Is_Success | Object | 參考 Result_Info |
| Result_Data | 成功時是本端點的資料;不是成功時只放該代碼要帶的資料(見「錯誤回應」),沒有就是 {} | Object | 參考 Result_Data |
Result_Info
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Is_Success | true=成功;false=看 Result_Code | Bool | true |
| Result_Code | 結果代碼(四碼數字);成功是空字串;其他見「錯誤回應」 | String | |
| Result_Message | 給客人看的訊息;成功是空字串 | String |
Result_Data
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Page_Id | 訂位鑰匙,一筆訂位一個;重查回的跟帶進來的一樣。進選艙房頁之後的步驟、重查都用這一個,不分房。畫面不顯示 | String | 6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f |
| Session_Version | 訂位版本。新查詢是 1,重查回目前的值;進旅客填寫頁時帶這個;之後每支寫入都回新的值,前端帶最新的 | Int | 1 |
| Itinerary_Info | 頁首行程摘要、APP 導覽列 | Object | 參考 Itinerary_Info |
| Room_List | 每間房一筆,順序同 Request 的 Room_List | List | 參考 Room_List |
Itinerary_Info
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Itinerary_Id | 行程編號,〔重選艙房與人數〕開燈箱用 | Int | 5001 |
| Product_Id | 產品編號,〔重選日期〕回 P2 用 | Int | 101 |
| Brand_Code | 品牌代碼。頁籤 ⓘ 打艙房介紹(GetCabinProfile)、〔重選艙房與人數〕打燈箱範圍(InitBookingLimit)時帶;畫面不顯示 | String | DCL |
| Ship_Code | 船艦代碼。用法同 Brand_Code;畫面不顯示 | String | DA |
| Product_Title | 麵包屑,照原樣顯示 | String | 迪士尼探險號|新加坡出發 3 晚海上假期 |
| Nav_Title | WEB 頁首標題 | String | 迪士尼探險號 (3晚) |
| Departure_Date | 出發日 yyyy/MM/dd,星期前端算 | String | 2026/10/01 |
| Return_Date | 回程日 yyyy/MM/dd,星期前端算 | String | 2026/10/04 |
| Room_Count | 幾間房,「2 間房」 | Int | 2 |
| Adt_Count | 全部房的大人數 | Int | 4 |
| Chd_Count | 全部房的小孩數,0 不顯示 | Int | 1 |
| Inf_Count | 全部房的嬰兒數,0 不顯示 | Int | 0 |
Room_List
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Room_Seq | 第幾間房。重查帶了 Room_Seq 時,Room_List 只有那一間 | Int | 1 |
| Adt_Count | 這間的大人數;已選艙房卡片「2 大人・2 小孩・1 嬰兒」、APP 底部膠囊逐房顯示,重整後燈箱帶回原本的設定 | Int | 2 |
| Chd_Count | 這間的小孩數 | Int | 0 |
| Inf_Count | 這間的嬰兒數 | Int | 0 |
| Hold_Until_Time | 這間的佔房到期時間(進旅客填寫頁佔到才有);沒佔房是 null,新查詢一定是 null。P3 重整後用它判斷有沒有保留:任一間有值就先打 ReleaseAllHolds 放掉全部,再全部房重選 | String | null |
| Type_Price_List | 艙型頁籤,這艘船的每個分類一筆 | List | 參考 Type_Price_List |
| Category_List | 方案卡片,照 Fare_Price 低到高排。空陣列=這間沒有可訂艙房 | List | 參考 Category_List |
| Filter_Info | 篩選面板的選項與價格範圍 | Object | 參考 Filter_Info |
Filter_Info
篩選面板的初始值,從這間全部卡片 distinct 出來,不受勾選影響。切換艙房換用那間的;勾選後的比對前端做。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Fare_Price_Min | 「每房價格」滑桿最低。沒有卡片是 null | Int | 39800 |
| Fare_Price_Max | 「每房價格」滑桿最高。沒有卡片是 null | Int | 69120 |
| Fare_Range_List | 價格區間按鈕 | List | 參考 Fare_Range_List |
| Channel_Type_List | 「產品類型」選項 | List | 參考 篩選選項 |
| Confirm_Refund_List | 「確認與退改」選項:立即確認、有條件取消。這間沒有的不列;兩個選項比對不同欄,看 Field_Name | List | 參考 篩選選項 |
| Cabin_Selectable_List | 「選房方式」選項 | List | 參考 篩選選項 |
Fare_Range_List
🟡 切法待定,先等分四段;沒有卡片的區間不回,所以可能少於四段。金額格式前端依平台顯示。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Fare_Price_Min | 這一段最低 | Int | 39800 |
| Fare_Price_Max | 這一段最高 | Int | 47130 |
篩選選項
三個選項清單的每一筆。勾選後保留 Field_Name 那一欄等於 Value 的卡片;同一組勾多個取聯集,不同組取交集,價格範圍算一組。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Value | 比對值 | String | Cruqo |
| Text | 選項顯示文字 | String | 船司直營 |
| Field_Name | 比對 Category_List 的哪一欄:Channel_Type/Confirm_Type/Refund_Type/Cabin_Selectable_Type | String | Channel_Type |
Type_Price_List
第一筆固定是全部艙房,後面分類與順序同 GetCabinProfile 的 Cabin_Type_List。
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Profile_Type | 分類代碼,對 Category_List 的同名欄。all=全部艙房,顯示全部卡片 | String | all |
| Profile_Type_Name | 頁籤名稱 | String | 全部艙房 |
| Fare_Price | 這一類最低價,台幣整數。null=這一類沒有卡片,顯示「售完」 | Int | 39800 |
| Category_Count | 這一類有幾張卡片,頁籤括號的筆數 | Int | 4 |
Category_List
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Plan_Id | 方案編號。按〔選擇〕帶回 | Int | 8101 |
| Category_Id | 艙型編號。按〔選擇〕帶回 | Int | 6011 |
| Fare_Code | 票價代碼。按〔選擇〕帶回,畫面不顯示 | String | BESTPRICE |
| Category_Code | 艙型代碼,卡片標題的「11A」 | String | 11A |
| Profile_Id | 艙型範本編號。艙房介紹:只帶這個呼叫 GetCabinProfile(Profile_Id),回這一個範本 | Int | 301 |
| Profile_Name | 艙房名稱,卡片標題的「內艙」 | String | 內艙 |
| Guest_Min | 最少入住人數,「入住 2–4 人」的 2 | Int | 2 |
| Guest_Max | 最多入住人數,「入住 2–4 人」的 4 | Int | 4 |
| Profile_Type | 分類代碼,對頁籤 | String | interior |
| Image_List | 卡片照片,第一張是封面。同範本的卡片內容相同。空陣列顯示預設圖 | List | 參考 Image_List |
| Channel_Type | 產品類型代碼:Cruqo/Self_Block。「產品類型」篩選比對這欄 | String | Cruqo |
| Channel_Type_Name | 卡片標籤:Cruqo=船司直營、Self_Block=可樂獨家 | String | 船司直營 |
| Promo_Text | 促銷標籤,一張最多一句。null 不顯示 | String | 20%優惠 |
| Fare_Price | 這間房實際人數的整間價(含稅),台幣整數 | Int | 39800 |
| Policy_Rule_Id | 條款規則編號:查方案詳情(GetPolicyDetail)帶這個;也看得出這張卡套的是哪條規則 | Int | 31 |
| Confirm_Type | 確認方式:立即確認/人工回覆。「確認與退改」篩選比對這欄 | String | 立即確認 |
| Confirm_Text | 確認方式的顯示文字,後端組好,例「48 小時內回覆確認」 | String | 立即確認 |
| Refund_Type | 退改類型:不可更改取消及退費/有條件取消。「確認與退改」篩選比對這欄,圖示顏色也看這欄 | String | 不可更改取消及退費 |
| Refund_Text | 退改的顯示文字,後端組好,卡片直接顯示:「不可更改、取消及退費」/「有條件取消」 | String | 不可更改、取消及退費 |
| Cabin_Selectable_Type | 選房方式:可自選房號/系統配房。卡片顯示這欄,「選房方式」篩選也比對這欄 | String | 系統配房 |
| Cabin_Selectable_Text | 點「系統配房」開的說明文字。可自選房號時是 null,不顯示 ⓘ | String | GTY「郵輪保證艙房」保證可以預訂到你所選擇的房種(包括視野有遮擋的艙房),艙房號碼、層數及位置將由遊輪公司系統配房,無法提出要求,並以遊輪公司之最後安排為準,所派發之艙房號碼、層數及位置客人無法更改及異議。 |
| Is_Bonus | true 顯示「方案詳情 (含贈品)」,false 顯示「方案詳情」 | Bool | true |
一筆是一張卡片,不是一個艙型。同一艙型可能有好幾張卡:票價不同就是不同卡片,可能同價、條款不同,都要列,所以 Category_Id 會重複。
Image_List
| 名稱 | 描述 | 屬性 | 範例 |
|---|---|---|---|
| Image_Url | 圖片網址 | String | https://img.example.com/cruise/da-in-01.jpg |
| Alt_Text | 圖片替代文字 | String | 內艙 |
JSON 範例
範例是第 1 間 2 大人、第 2 間 2 大人 1 小孩。
{
"Result_Info": {
"Is_Success": true,
"Result_Code": "",
"Result_Message": ""
},
"Result_Data": {
"Page_Id": "6f1e2d3c-4b5a-4c7d-8e9f-0a1b2c3d4e5f",
"Session_Version": 1,
"Itinerary_Info": {
"Itinerary_Id": 5001,
"Product_Id": 101,
"Brand_Code": "DCL",
"Ship_Code": "DA",
"Product_Title": "迪士尼探險號|新加坡出發 3 晚海上假期",
"Nav_Title": "迪士尼探險號 (3晚)",
"Departure_Date": "2026/10/01",
"Return_Date": "2026/10/04",
"Room_Count": 2,
"Adt_Count": 4,
"Chd_Count": 1,
"Inf_Count": 0
},
"Room_List": [
{
"Room_Seq": 1,
"Adt_Count": 2,
"Chd_Count": 0,
"Inf_Count": 0,
"Hold_Until_Time": null,
"Type_Price_List": [
{
"Profile_Type": "all",
"Profile_Type_Name": "全部艙房",
"Fare_Price": 39800,
"Category_Count": 4
},
{
"Profile_Type": "interior",
"Profile_Type_Name": "內艙房",
"Fare_Price": 39800,
"Category_Count": 2
},
{
"Profile_Type": "oceanview",
"Profile_Type_Name": "海景艙房",
"Fare_Price": 49520,
"Category_Count": 1
},
{
"Profile_Type": "balcony",
"Profile_Type_Name": "陽台艙房",
"Fare_Price": 69120,
"Category_Count": 1
},
{
"Profile_Type": "suite",
"Profile_Type_Name": "禮賓級艙房",
"Fare_Price": null,
"Category_Count": 0
}
],
"Category_List": [
{
"Plan_Id": 8101,
"Category_Id": 6011,
"Fare_Code": "BESTPRICE",
"Category_Code": "11A",
"Profile_Id": 301,
"Profile_Name": "內艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "interior",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-in-01.jpg",
"Alt_Text": "內艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": "20%優惠",
"Fare_Price": 39800,
"Policy_Rule_Id": 31,
"Confirm_Type": "立即確認",
"Confirm_Text": "立即確認",
"Refund_Type": "不可更改取消及退費",
"Refund_Text": "不可更改、取消及退費",
"Cabin_Selectable_Type": "系統配房",
"Cabin_Selectable_Text": "GTY「郵輪保證艙房」保證可以預訂到你所選擇的房種(包括視野有遮擋的艙房),艙房號碼、層數及位置將由遊輪公司系統配房,無法提出要求,並以遊輪公司之最後安排為準,所派發之艙房號碼、層數及位置客人無法更改及異議。",
"Is_Bonus": true
},
{
"Plan_Id": 8101,
"Category_Id": 6011,
"Fare_Code": "XTRA_GST_HALF",
"Category_Code": "11A",
"Profile_Id": 301,
"Profile_Name": "內艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "interior",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-in-01.jpg",
"Alt_Text": "內艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": null,
"Fare_Price": 39800,
"Policy_Rule_Id": 32,
"Confirm_Type": "人工回覆",
"Confirm_Text": "48 小時內回覆確認",
"Refund_Type": "有條件取消",
"Refund_Text": "有條件取消",
"Cabin_Selectable_Type": "系統配房",
"Cabin_Selectable_Text": "GTY「郵輪保證艙房」保證可以預訂到你所選擇的房種(包括視野有遮擋的艙房),艙房號碼、層數及位置將由遊輪公司系統配房,無法提出要求,並以遊輪公司之最後安排為準,所派發之艙房號碼、層數及位置客人無法更改及異議。",
"Is_Bonus": false
},
{
"Plan_Id": 8101,
"Category_Id": 6009,
"Fare_Code": "BESTPRICE",
"Category_Code": "09A",
"Profile_Id": 311,
"Profile_Name": "海景艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "oceanview",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-ov-01.jpg",
"Alt_Text": "海景艙"
},
{
"Image_Url": "https://img.example.com/cruise/da-ov-02.jpg",
"Alt_Text": "海景艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": null,
"Fare_Price": 49520,
"Policy_Rule_Id": 33,
"Confirm_Type": "立即確認",
"Confirm_Text": "立即確認",
"Refund_Type": "不可更改取消及退費",
"Refund_Text": "不可更改、取消及退費",
"Cabin_Selectable_Type": "可自選房號",
"Cabin_Selectable_Text": null,
"Is_Bonus": false
},
{
"Plan_Id": 8101,
"Category_Id": 6007,
"Fare_Code": "BESTPRICE",
"Category_Code": "07A",
"Profile_Id": 321,
"Profile_Name": "陽台艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "balcony",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-ba-01.jpg",
"Alt_Text": "陽台艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": null,
"Fare_Price": 69120,
"Policy_Rule_Id": 33,
"Confirm_Type": "立即確認",
"Confirm_Text": "立即確認",
"Refund_Type": "不可更改取消及退費",
"Refund_Text": "不可更改、取消及退費",
"Cabin_Selectable_Type": "可自選房號",
"Cabin_Selectable_Text": null,
"Is_Bonus": false
}
],
"Filter_Info": {
"Fare_Price_Min": 39800,
"Fare_Price_Max": 69120,
"Fare_Range_List": [
{
"Fare_Price_Min": 39800,
"Fare_Price_Max": 47130
},
{
"Fare_Price_Min": 47131,
"Fare_Price_Max": 54460
},
{
"Fare_Price_Min": 61791,
"Fare_Price_Max": 69120
}
],
"Channel_Type_List": [
{
"Value": "Cruqo",
"Text": "船司直營",
"Field_Name": "Channel_Type"
}
],
"Confirm_Refund_List": [
{
"Value": "立即確認",
"Text": "立即確認",
"Field_Name": "Confirm_Type"
},
{
"Value": "有條件取消",
"Text": "有條件取消",
"Field_Name": "Refund_Type"
}
],
"Cabin_Selectable_List": [
{
"Value": "可自選房號",
"Text": "可自選房號",
"Field_Name": "Cabin_Selectable_Type"
},
{
"Value": "系統配房",
"Text": "系統配房",
"Field_Name": "Cabin_Selectable_Type"
}
]
}
},
{
"Room_Seq": 2,
"Adt_Count": 2,
"Chd_Count": 1,
"Inf_Count": 0,
"Hold_Until_Time": null,
"Type_Price_List": [
{
"Profile_Type": "all",
"Profile_Type_Name": "全部艙房",
"Fare_Price": 52600,
"Category_Count": 2
},
{
"Profile_Type": "interior",
"Profile_Type_Name": "內艙房",
"Fare_Price": 52600,
"Category_Count": 1
},
{
"Profile_Type": "oceanview",
"Profile_Type_Name": "海景艙房",
"Fare_Price": 64800,
"Category_Count": 1
},
{
"Profile_Type": "balcony",
"Profile_Type_Name": "陽台艙房",
"Fare_Price": null,
"Category_Count": 0
},
{
"Profile_Type": "suite",
"Profile_Type_Name": "禮賓級艙房",
"Fare_Price": null,
"Category_Count": 0
}
],
"Category_List": [
{
"Plan_Id": 8101,
"Category_Id": 6011,
"Fare_Code": "BESTPRICE",
"Category_Code": "11A",
"Profile_Id": 301,
"Profile_Name": "內艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "interior",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-in-01.jpg",
"Alt_Text": "內艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": "20%優惠",
"Fare_Price": 52600,
"Policy_Rule_Id": 31,
"Confirm_Type": "立即確認",
"Confirm_Text": "立即確認",
"Refund_Type": "不可更改取消及退費",
"Refund_Text": "不可更改、取消及退費",
"Cabin_Selectable_Type": "系統配房",
"Cabin_Selectable_Text": "GTY「郵輪保證艙房」保證可以預訂到你所選擇的房種(包括視野有遮擋的艙房),艙房號碼、層數及位置將由遊輪公司系統配房,無法提出要求,並以遊輪公司之最後安排為準,所派發之艙房號碼、層數及位置客人無法更改及異議。",
"Is_Bonus": true
},
{
"Plan_Id": 8101,
"Category_Id": 6009,
"Fare_Code": "BESTPRICE",
"Category_Code": "09A",
"Profile_Id": 311,
"Profile_Name": "海景艙",
"Guest_Min": 2,
"Guest_Max": 4,
"Profile_Type": "oceanview",
"Image_List": [
{
"Image_Url": "https://img.example.com/cruise/da-ov-01.jpg",
"Alt_Text": "海景艙"
},
{
"Image_Url": "https://img.example.com/cruise/da-ov-02.jpg",
"Alt_Text": "海景艙"
}
],
"Channel_Type": "Cruqo",
"Channel_Type_Name": "船司直營",
"Promo_Text": null,
"Fare_Price": 64800,
"Policy_Rule_Id": 33,
"Confirm_Type": "立即確認",
"Confirm_Text": "立即確認",
"Refund_Type": "不可更改取消及退費",
"Refund_Text": "不可更改、取消及退費",
"Cabin_Selectable_Type": "可自選房號",
"Cabin_Selectable_Text": null,
"Is_Bonus": false
}
],
"Filter_Info": {
"Fare_Price_Min": 52600,
"Fare_Price_Max": 64800,
"Fare_Range_List": [
{
"Fare_Price_Min": 52600,
"Fare_Price_Max": 55650
},
{
"Fare_Price_Min": 61751,
"Fare_Price_Max": 64800
}
],
"Channel_Type_List": [
{
"Value": "Cruqo",
"Text": "船司直營",
"Field_Name": "Channel_Type"
}
],
"Confirm_Refund_List": [
{
"Value": "立即確認",
"Text": "立即確認",
"Field_Name": "Confirm_Type"
}
],
"Cabin_Selectable_List": [
{
"Value": "可自選房號",
"Text": "可自選房號",
"Field_Name": "Cabin_Selectable_Type"
},
{
"Value": "系統配房",
"Text": "系統配房",
"Field_Name": "Cabin_Selectable_Type"
}
]
}
}
]
}
}錯誤回應
200 的代碼在 Result_Info.Result_Code、訊息在 Result_Message;400、500 只回一句訊息,代碼在訊息開頭(格式「代碼|訊息」,例「4002|Start_Date 格式錯誤」)。訊息欄除了「重複訂位」與「出發日期已無法訂購,請重新選擇」已定,其他是暫定文字,UIUX 定稿後只改文字、不改代碼;N=第幾間。
| HTTP | Result_Code | 中文名稱 | 訊息(給客人看) | 情境 | 前端動作 |
|---|---|---|---|---|---|
| 400 | 4003 | 參數值不在範圍 | 不給客人看(訊息開頭是代碼) | Request_Mode 不在允許值 | 前端帶錯值,修正後重打 |
| 200 | 3004 | 行程不可售 | 出發日期已無法訂購,請改選其他出發日期 | 行程不可售(停售、出發前 5 天內等)、品牌或船艦沒啟用、銷售平台不含(新查詢、重查都是) | 導回 P2 改出發日 |
| 200 | 5003 | 選擇已失效 | 選擇已失效,請重新查詢 | 新查詢的 Departure_Date 跟 Itinerary_Id 對不上 | 導回 P2 |
| 200 | 5002 | 房數或人數不符 | 艙房數或人數不符,請調整 | 房數、每間房人數超出範圍 | 顯示錯誤訊息,回燈箱重選 |
| 200 | 2001 | 訂位資料不存在 | 訂位資料已失效,請重新選擇 | 重查帶的 Page_Id 找不到 | 手上有行程與人數就在 P3 開「艙房/人數」燈箱重新查詢(在 P4 先回 P3);沒有就回 P2 重新選 |
| 200 | 2002 | 訂單已成立 | 訂單已成立 | 重查帶的 Page_Id 已經成立訂單 | 導向訂單頁 |
| 200 | 5003 | 選擇已失效 | 選擇已失效,請重新查詢 | 重查帶的 Room_Seq 不是這筆訂位的房 | 前端帶錯值,修正後重打 |
| 200 | 6005 | 供應商無回應 | 系統忙碌,請稍後再試 | 查艙型時供應商重試後還是沒回應 | 顯示「系統忙碌,請稍後再試」,可以重試 |
| 200 | 6001 | 供應商拒絕 | 訂位未成功,請聯絡客服 | 查艙型時供應商回錯誤(沒有名額不算錯誤,那一類不列) | 顯示訊息+客服導引 |
| 200 | 6006 | 供應商連線設定錯誤 | 訂位系統暫時無法使用,請聯絡客服 | 跟供應商的連線設定有誤(後端已告警) | 顯示訊息+客服導引 |
| 500 | 9999 | 系統錯誤 | 9999|系統發生錯誤,請稍後再試 | 系統錯誤(未預期的例外) | 顯示友善錯誤訊息,可以重試 |
測試情境/單元測試(開發前規劃)
畫面呼叫
舊版畫面
新版畫面
P2 燈箱按〔確認〕呼叫本 API → 每間都有卡片才進 P3,顯示頁籤與卡片;任一間沒有卡片,燈箱不關、顯示錯誤狀態。P3 按〔重選艙房與人數〕確認後再呼叫一次。雛形:UIUX 20260922 版 WEB P3-W01、W02、W08,APP P3-A01、A03~A05。
畫面欄位對照(WEB)
先看整頁(雛形 WEB P3-W01);灰色虛線=不在本 API。卡片擠,另拉細節圖。圖片可點開放大。

細節 1:方案卡(P3-W01 第 1 張)

細節 2:篩選面板(P3-W12)

WEB 不顯示:Page_Id、Session_Version、Fare_Code(進填寫頁時帶)、Brand_Code、Ship_Code(打艙房介紹、燈箱範圍用)。頁籤上的 ⓘ 開艙房介紹(同 P3-W09),打 GetCabinProfile,帶品牌、船艦代碼和這個頁籤的 Profile_Type。
畫面欄位對照(APP)
先看整頁(雛形 APP P3-A01);卡片、篩選另拉細節圖。圖片可點開放大。

細節 1:房型卡片(P3-A01 第 1 張)

細節 2:篩選面板(P3-A03)

APP 不顯示:Page_Id、Session_Version、Fare_Code(進填寫頁時帶)、Brand_Code、Ship_Code(打艙房介紹、燈箱範圍用)。