Skip to content

投注功能(單關 / 串關 / 預約投注)

最後更新:2026-04-09


功能說明

提供使用者對體育賽事進行投注的完整流程,支援三個體育平台(FB/DB/UP)。投注類型包含:單關投注(單一賽事)、串關投注(多場賽事組合)、早盤預約投注(賽前鎖定賠率)。另支援包賠(RiskFree)投注、骰寶(SicBo/LiveGame)投注。

使用者流程

單關投注

  1. 在賽事列表或詳情頁點擊賠率項 → 加入投注購物車
  2. 彈出 BetViewController(底部 Modal 全覆蓋)
  3. 投注面板顯示:賽事名稱、玩法名稱、當前賠率、投注限額
  4. 使用者輸入投注金額 → 下方即時顯示「可贏額」
  5. 點擊「確認投注」→ 先呼叫預投注 API 確認賠率與限額
  6. 若賠率有變動 → 提示使用者確認接受新賠率
  7. 確認後呼叫下注 API
  8. 成功 → 顯示結果,播放音效;餘額不足 → 引導充值

串關投注

  1. 連續點擊多場賽事賠率 → 加入串關購物車
  2. 彈出串關面板 → 選擇串關組合(2串1、3串1、3串4 等)
  3. 輸入每注金額 → 顯示總投注額、最大可贏額
  4. 點擊「確認串關」→ 呼叫串關下注 API

早盤預約投注(FB/UP)

  1. 在早盤列表選擇賽事並點擊賠率
  2. 投注面板顯示「預約投注」標識
  3. 確認後呼叫 v1/order/reserve/bet API 完成預約
  4. 後續可修改(v1/order/reserve/update)或取消(v1/order/reserve/cancel

頁面跳轉

  • 賽事列表/詳情頁點擊賠率 → BetViewController(底部 Modal)
  • 餘額不足 → SingleBetNotEnoughMoney(導引充值頁)
  • 賠率調整提示 → STAppointmentAdjustOddView(Alert)

三平台功能差異對照表

功能FB 極速體育UP/BB 體育DB 體育
單關投注支援支援支援
串關投注支援(最多 10 場)支援(最多 10 場)支援(最多 10 場)
早盤預約投注支援支援不支援(僅 UI 預留 appointmentBetChanged)
預約修改/取消支援支援不支援
骰寶(SicBo)支援支援不支援
包賠(RiskFree)支援支援不支援
投注限額來源預投注 API 回傳 real_smin / real_smax預投注 API 回傳 real_smin / real_smaxqueryMarketMaxMinBetMoney API 回傳
賠率偏好設定無獨立 API無獨立 APIrecordUserPreference API(betterOdd/anyOdd/fixOdd)
訂單確認輪詢checkOrderStatusFBBetCommonDatas.betsIDscheckOrderStatus → 同 FB 機制checkOrderStatusDBBetCommonDatas.betsIDs

技術視角(開發看這裡)

相關檔案

類型檔案路徑
ViewController(投注面板)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/BetViewController.swift
ViewModel(投注面板)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/BetViewModel/BetViewModel.swift
ViewController(FB 串關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/SeriesBet/FBSeriesPassBetViewController.swift
ViewController(UP 串關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/SeriesBet/UPSeriesPassBetViewController.swift
ViewController(DB 單關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/SingleBet/DBSingleBetViewController.swift
ViewController(DB 串關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/SeriesBet/DBSeriesPassBetViewController.swift
Service(FB 投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/FBBetsService.swift
Service(DB 投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/service/DBBetsService.swift
Service(UP 投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/Service/UPBetsService.swift
View(投注結果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SingleBetResultView.swift
View(賠率調整提示)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/AppointmentBet/STAppointmentAdjustOddView.swift
Model(FB 預投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/SingleBetModel/FBCalculateBetsModel.swift
Model(FB 投注結果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/SingleBetModel/FBSingleBetResultModel.swift
Model(DB 投注結果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/service/DBBetResultModel.swift
Model(DB 訂單狀態)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/service/DBCheckOrderModel/DBOrderStatusModel.swift
Config(FB 商戶設定)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/FBMerchantConfig/FBMerchantDetailService.swift
Tools(包賠投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Tools/RiskFreeBetting.swift
Adapter(投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Adapter/BetAdapter.swift
Adapter(串關賽事)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Adapter/SeriesPassMatchAdapter.swift
ViewController(投注基底)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Controller/BaseBetViewController.swift
Tools(影片工具)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/STVideoTools.swift
Tools(投注共用函式)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Tools/BetCommonFuncs.swift
Model(投注共用)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Tools/BetCommonModel.swift
Tools(計時器代理)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/Tools/TimerProxy.swift
View(餘額標籤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BalanceLabel.swift
View(預投注 TableView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetContentView/PreBetCommonTableView.swift
Cell(預投注下方)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetContentView/PreBetDownCell.swift
Cell(預投注上方)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetContentView/PreBetTopCell.swift
View(投注鍵盤)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetKeyboardView.swift
Cell(投注賽事資訊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetMatchInfoCell.swift
Cell(投注金額資訊)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetMoneyInfoCell.swift
View(串關成功 Table)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SeriePassSuccessTable.swift
Cell(串關成功賠率)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SerieSuccessOddCell.swift
View(串關確認)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SeriesPassConfirmView.swift
View(串關成功投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SeriesPassSuccessBetView.swift
View(單關確認)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SingleBetConfirmView.swift
View(餘額不足)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetResultView/SingleBetNotEnoughMoney.swift
View(Table Footer)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetTableFooter.swift
View(Table Header)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/BetTableHeader.swift
View(購物車)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/CartView.swift
View(自訂輸入框)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/Base/View/CustomTextFieldFroBeyKeyboard.swift
Model(DB 共用資料)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/DBBetCommonDatas.swift
Model(DB 開始投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/DBStartBetModel.swift
Model(DB 最新盤口資料)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/service/DBQueryLatestMarketInfoModel/DBQueryLatestMarketInfoModel.swift
Model(DB 最大最小投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/DB/service/DBQueryMarketMaxMinBetMondyModel/DBOrderMaxBetMoney.swift
Model(FB 共用資料)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/FBBetCommonDatas.swift
Model(FB 商戶設定)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/FBMerchantConfig/FBMerchantDetailModel.swift
Model(FB 開始投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/FBStartBetModel.swift
Model(FB 預約投注共用)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/AppointmentBetModel/FBAppointmentBetCommModel.swift
Model(FB 預約結果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/AppointmentBetModel/FBAppointmentResultModel.swift
Model(FB 預約投注結果查詢)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/AppointmentBetModel/FBAskAppointmentBetResultModel.swift
Model(FB 預約提前結算結果查詢)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/AppointmentBetModel/FBAskAppointmentCashResultModel.swift
Model(FB 預約投注限額)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/AppointmentBetModel/FBCalculateAppointmentBetModel.swift
Model(FB 訂單狀態)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/CheckOrderModel/FBOrderStatusModel.swift
Model(FB 串關投注結果)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/SeriesPassBetModel/FBSeriesPassBetResultModel.swift
Model(FB 串關計算)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/SeriesPassBetModel/FBSeriesPassCalculateBetsModel.swift
Model(UB 預投注計算)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/Service/SingleBetModel/UBCalculateBetsModel.swift
ViewController(FB 單關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/FB/SingleBet/FBSingleBetViewController.swift
ViewController(UP 單關)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/SingleBet/UPSingleBetViewController.swift
Model(UP 共用資料)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/UPBetCommonDatas.swift
Service(UP 商戶設定)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/UPMerchantConfig/UPMerchantDetailService.swift
Model(UP 開始投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Bets/UP/UPStartBetModel.swift
Manager(投注管理)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/BetManager.swift
ViewModel Extension(LiveGame)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/BetViewModel/BetViewModel+LiveGame.swift
Model(確認中提示)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/Model/BetListConfirmingAlertModel.swift
Model(LiveGame 開始投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/Model/LiveGameStartBetModel.swift
Protocol(開始投注)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/Protocol/StartBetModelProtocol.swift
View(新預投注 TableView)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/NewBet/View/NewPreBetCommonTableView.swift
API(FB 預約投注)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+AppointmentBetsRequest.swift
API(FB 預投注計算)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+CalculateBetsRequest.swift
API(FB 取消預約)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+CancleAppointmentBetsRequest.swift
API(FB 預約投注結果查詢)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+CheckAppointmentBetsResultRequest.swift
API(FB 預約提前結算結果查詢)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+CheckAppointmentCashOutResultRequest.swift
API(FB 訂單狀態查詢)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+CheckOrderStatusRequest.swift
API(FB 修改預約)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+ModifyAppointmentBetsRequest.swift
API(FB 預約投注限額)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+ReserveBetParameterRequest.swift
API(FB 串關下注)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+SeriesBetsRequest.swift
API(FB 單關下注)/Users/user/Work/bbsport-new/BBSport/API/FBSportAPI/Bet/FBSportAPI+SingleBetsRequest.swift
API(UP 預約投注)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+AppointmentBetsRequest.swift
API(UP 預投注計算)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+CalculateBetsRequest.swift
API(UP 取消預約)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+CancleAppointmentBetsRequest.swift
API(UP 預約投注結果查詢)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+CheckAppointmentBetsResultRequest.swift
API(UP 預約提前結算結果查詢)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+CheckAppointmentCashOutResultRequest.swift
API(UP 訂單狀態查詢)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+CheckOrderStatusRequest.swift
API(UP 修改預約)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+ModifyAppointmentBetsRequest.swift
API(UP 預約投注限額)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+ReserveBetParameterRequest.swift
API(UP 串關下注)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+SeriesBetsRequest.swift
API(UP 單關下注)/Users/user/Work/bbsport-new/BBSport/API/UPSportAPI/Bet/UPSportAPI+SingleBetsRequest.swift
API(DB 投注)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Bet/DBSportAPI+BetRequest.swift
API(DB 最新盤口)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Bet/DBSportAPI+LatestMarketInfoRequest.swift
API(DB 投注限額)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Bet/DBSportAPI+MarketMaxMinBetMoneyRequest.swift
API(DB 訂單狀態)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Bet/DBSportAPI+OrderStatusRequest.swift
API(DB 使用者偏好)/Users/user/Work/bbsport-new/BBSport/API/DBSportAPI/Bet/DBSportAPI+RecordUserPreferenceRequest.swift
Manager(遊戲餘額)/Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameBalanceManager/GameBalanceManager.swift
API(STAPI 渠道投注列表)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+GameBetByChannelRequest.swift
API(STAPI 投注列表)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+GameBetListRequest.swift
API(STAPI 直播投注)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+LiveGameBet.swift
API(STAPI 直播預投注資訊)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+LiveGamePreBetInfo.swift
API(STAPI 渠道刷新)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+RefreshByChannelRequest.swift
API(STAPI 包賠投注確認)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+RiskFreeBetBetConfirmationRequest.swift
API(STAPI 包賠設定)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/STAPI+RiskFreeBetConfigurationRequest.swift
Model(直播投注資訊)/Users/user/Work/bbsport-new/BBSport/API/STAPI/Bet/Model/LiveGameBetInfoModel.swift
API(購買爆料)/Users/user/Work/bbsport-new/BBSport/API/STAPI/STAPI+PurchaseExplosiveRequest.swift

API

FB 極速體育

功能說明EndpointMethodContent-Type主要參數
預投注計算(單關/串關共用)v1/order/batchBetMatchMarketOfJumpLinePOSTjsonbody: 賠率、盤口等(回傳 real_odds, real_smin, real_smax, isClosed, ss
單關下注v1/order/bet/singlePassPOSTjsonbody: 投注項資訊(回傳 JSON String → FBSingleBetResultModel
串關下注v1/order/betMultiplePOSTjsonbody: 串關組合資訊(回傳 JSON String)
查詢訂單狀態v1/order/getStakeOrderStatusPOSTjsonorderIds: [String], languageType: "CMN"
取得預約投注限額配置v1/order/reserve/getBetParameterPOSTjsonbody: 盤口資訊(回傳 FBCalculateAppointmentBetModel
預約下注v1/order/reserve/betPOSTjsonbody: 預約投注項資訊
取消預約v1/order/reserve/cancelPOSTjsonbody: reserveId 等
修改預約v1/order/reserve/updatePOSTjsonbody: reserveId / unitStake / odds 等
查詢預約投注結果v1/order/reserve/statusInfoByIdsPOSTjsonreserveIds: [String], languageType: "CMN"
查詢預約提前結算結果v1/order/reserve/cashOut/statusInfoByIdsPOSTjsonreserveCashOutIds: [String], languageType: "CMN"

UP/BB 體育

功能說明EndpointMethodContent-Type主要參數
預投注計算(單關/串關共用)v1/order/batchBetMatchMarketOfJumpLinePOSTjsonbody: 賠率、盤口等(回傳 UPCalculateBetsDataModel / FBSeriesPassCalculateBetsDataModel
單關下注v1/order/bet/singlePassPOSTjsonbody: 投注項資訊
串關下注v1/order/betMultiplePOSTjsonbody: 串關組合資訊
查詢訂單狀態v1/order/getStakeOrderStatusPOSTjsonorderIds: [String], languageType: "CMN"
取得預約投注限額配置v1/order/reserve/getBetParameterPOSTjsonbody: 盤口資訊(回傳 FBCalculateAppointmentBetModel
預約下注v1/order/reserve/betPOSTjsonbody: 預約投注項資訊
取消預約v1/order/reserve/cancelPOSTjsonbody: reserveId 等
修改預約v1/order/reserve/updatePOSTjsonbody: reserveId / unitStake / odds 等
查詢預約投注結果v1/order/reserve/statusInfoByIdsPOSTjsonreserveIds: [String], languageType: "CMN"
查詢預約提前結算結果v1/order/reserve/cashOut/statusInfoByIdsPOSTjsonreserveCashOutIds: [String], languageType: "CMN"

備註:FB 與 UP 的投注 API endpoint 完全相同,差異在於 Request struct 分屬 FBSportAPI / UPSportAPI,各自走不同的 domain 和 auth adapter。

DB 體育

功能說明EndpointMethodContent-Type主要參數
取得最新盤口資料yewu13/v1/betOrder/client/queryLatestMarketInfoPOSTjsonbody: 盤口查詢條件(回傳 [DBQueryLatestMarketInfoModel]
查詢投注限額(最大/最小金額)yewu13/v1/betOrder/client/queryMarketMaxMinBetMoneyPOSTjsonbody: 盤口查詢條件(回傳 [DBOrderMaxBetMoneyModel]
投注(單關/串關共用)yewu13/v1/betOrder/client/betPOSTjsonbody: 投注項資訊(回傳 JSON String → DBBetResultModel
查詢訂單狀態yewu13/v1/betOrder/queryOrderStatusGETjsonorderNos: String(多個用逗號隔開,回傳 [DBOrderStatusModel]
設定使用者投注偏好yewu12/v1/betOrder/client/recordUserPreferencePOSTjsonuserBetPrefer: Int(1=更好賠率 / 2=任意賠率 / 3=固定賠率), userMarketPrefer: String("EU"/"HK")

備註:DB 的 host 為 DBSportAPI.Host.sport,與 FB/UP 的 domain 體系不同。DB 不支援預約投注、骰寶、包賠。

共用

功能說明NamespaceEndpointMethodContent-Type主要參數
包賠投注配置STAPIapi/forehead/activity/compensation/infoPOSTurlForm活動配置查詢

資料模型

FBCalculateBetsBmsModel(預投注回傳 - 投注項)

欄位說明
real_odds真實賠率(用於計算可贏額)
real_smin / real_smax最小/最大投注額
isClosed是否封盤
isBetChange是否賠率有變動
ss銷售狀態(1=開售, -1=未開售, 0=暫停)

FBSingleBetResultDataModel(FB 投注結果)

欄位類型說明
stInt原始狀態碼(0~5,decode 時映射為 orderStatus
idString訂單 ID
orderStatusFBBetResultType訂單狀態列舉
ops[FBBetResultOPS]投注項結果陣列
betNameString?輔助欄位 - 投注名稱
betCountString?輔助欄位 - 注數
betOddsString?輔助欄位 - 賠率
betAmountString?輔助欄位 - 投注金額

FBBetResultType 列舉:

名稱說明
0created待確認
1confirming確認中
2refused已拒絕
3canceled已取消
4confirmed已確認
5settled已結算

FBBetResultOPS(投注項結果):

欄位說明
mid盤口 ID
od當前賠率
of賠率狀態(-1=預設)
bod原始賠率

DBBetResultModel(DB 投注結果)

欄位類型說明
codeString回傳碼("0000000" 為成功)
msgString回傳訊息
orderTypeDBBetResultType訂單狀態(0=餘額不足, 1=確認中, 2=已確認, 3=失敗)
data.betMoneyTotalString?總投注金額(原值除以 100)
data.maxWinMoneyTotalString?最高可贏金額(原值除以 100)
data.orderDetailRespList[DBBetResultDetailRespListModel]單關訂單明細
data.seriesOrderRespList[DBBetResultDetailRespListModel]串關訂單明細

DB 特殊錯誤碼處理:0400454 / 0400455 / 0402035 → 餘額不足

DBOrderResultType(DB 訂單查詢狀態)

名稱說明
0confirmed已確認
1processed已處理
2refused已拒絕
3beConfirmed待確認
4fail失敗

串關限制規則

規則三平台共通
最少場數2 場(2串1 為最小串關組合)
最多場數10 場(購物車滿 10 個時提示「最多串10場賽事」)
同場賽事限制同一場賽事(matchId 相同)只能選 1 個投注項,新加入時自動覆蓋舊的,並提示「同場賽事只支持一個串關,其他同場次串關已經移除」
串關組合類型支援 N串1(不包號)及 N串M(包號),例如:2串1、3串1、3串4、4串1、4串11、5串1、5串26、6串1、6串57、7串1、7串120、8串1、8串247、9串1、9串502、10串1、10串1013
可贏額計算(DB)DBBetsService.getOBCanWinAmount() — 不包號:找出所有 C(n,k) 組合,每組乘積 * 投注額再加總;包號:從 2 到 combo 依序累加所有組合的可贏額

實作重點

  1. BetViewController 架構(2025/7/10 新版):繼承 STBaseViewController<BetViewModel>,使用 Combine @Published 驅動 UI

  2. 弱網訂單確認機制(三平台共通邏輯):下注 API 回傳 confirming → 延遲 0.5 秒後輪詢 checkOrderStatus;輪詢後仍確認中 → 記入各平台的 BetCommonDatas.betsIDs,由後台定期輪詢並彈 toast 通知結果

  3. 可贏額計算:FB/UP 公式 (投注金額 * (賠率 - 1)),透過 BetViewModel.countSingleCanWin() 計算,結果透過 STNotify.updateBetCanWinAmount 推送至 Footer

  4. 防重複投注isBetWaitingResponsetrue 時禁止關閉投注面板,5 秒後自動恢復

  5. 骰寶(SicBo)特殊處理(僅 FB/UP):betGameType == .sicBo → 啟動 sicBoBetsTask 輪詢賠率,自動呼叫 GameBalanceManager.transferToThisPlatform() 轉入餘額

  6. DB 平台投注偏好:DB 獨有 RecordUserPreferenceRequest,支援三種賠率接受模式(betterOdd=更好賠率、anyOdd=任意賠率、fixOdd=固定賠率)及盤口類型偏好(EU 歐賠 / HK 港賠)

  7. DB 金額精度:DB API 回傳的 betMoneyTotalmaxWinMoneyTotal 需除以 100 才是實際金額(分轉元)


API 呼叫流程

點擊賠率加入注單

用戶點擊賠率按鈕 → showBetView(FBStartBetModel)
  → 無 API 呼叫,直接顯示投注面板

投注面板開啟 (賠率即時刷新)

FBSingleBetViewController.startTask()
  ├─ FB/UP: 每 2 秒輪詢
  │  └─ [API] POST v1/order/batchBetMatchMarketOfJumpLine
  │     {languageType:"CMN", betMatchMarketList:[{type, matchId, marketId}]}
  │     → 回傳: 最新賠率、限額(min/max)、盤口變動

  └─ DB: 每 5 秒輪詢
     ├─ [API 1] POST yewu13/v1/betOrder/client/queryLatestMarketInfo
     │  {matchIdList, playOptionIdList}
     └─ [API 2] POST yewu13/v1/betOrder/client/queryMarketMaxMinBetMoney
        {marketIdList}

提交單注

用戶點擊下注 → handlePlaceBet() (本地驗證金額)
  ├─ FB/UP:
  │  └─ [API 1] POST v1/order/bet/singlePass
  │     {singleBetList:[{oddsChange, unitStake, betOptionList:[...]}]}
  │     ├─ orderStatus=confirmed → 成功
  │     ├─ orderStatus=created/confirming → 等 0.5s
  │     │  └─ [API 2] POST v1/order/getStakeOrderStatus {orderIds, languageType}
  │     ├─ orderStatus=refused → 失敗
  │     └─ code=3001 → 餘額不足

  └─ DB:
     └─ [API 1] POST yewu13/v1/betOrder/client/bet
        {orderDetailRespList:[{matchId, playOptionId, oddsValues, unitStake}]}
        ├─ orderType=confirmed → 成功
        ├─ orderType=confirming → 等 0.5s
        │  └─ [API 2] GET yewu13/v1/betOrder/queryOrderStatus {orderNos}
        └─ orderType=noMoney → 餘額不足

提交串關

FB/UP:
  └─ [API] POST v1/order/betMultiple
     {multipleType:1, singleBetList:[...], betName:"3串1", betCount, betOdds}
     └─ confirming → 同上 getStakeOrderStatus 輪詢

預約投注 (僅 FB/UP)

開啟預約面板
  └─ [API 1] POST v1/order/reserve/getBetParameter {type, marketId, matchId}
     → 回傳預約限額

提交預約
  └─ [API 2] POST v1/order/reserve/bet {unitStake, odds, type, marketId}

修改預約
  └─ [API 3] POST v1/order/reserve/update {reserveId, unitStake, odds}

查詢預約結果
  └─ [API 4] POST v1/order/reserve/checkBetResult {orders:[...]}