Appearance
投注功能(單關 / 串關 / 預約投注)
最後更新:2026-04-09
功能說明
提供使用者對體育賽事進行投注的完整流程,支援三個體育平台(FB/DB/UP)。投注類型包含:單關投注(單一賽事)、串關投注(多場賽事組合)、早盤預約投注(賽前鎖定賠率)。另支援包賠(RiskFree)投注、骰寶(SicBo/LiveGame)投注。
使用者流程
單關投注
- 在賽事列表或詳情頁點擊賠率項 → 加入投注購物車
- 彈出
BetViewController(底部 Modal 全覆蓋) - 投注面板顯示:賽事名稱、玩法名稱、當前賠率、投注限額
- 使用者輸入投注金額 → 下方即時顯示「可贏額」
- 點擊「確認投注」→ 先呼叫預投注 API 確認賠率與限額
- 若賠率有變動 → 提示使用者確認接受新賠率
- 確認後呼叫下注 API
- 成功 → 顯示結果,播放音效;餘額不足 → 引導充值
串關投注
- 連續點擊多場賽事賠率 → 加入串關購物車
- 彈出串關面板 → 選擇串關組合(2串1、3串1、3串4 等)
- 輸入每注金額 → 顯示總投注額、最大可贏額
- 點擊「確認串關」→ 呼叫串關下注 API
早盤預約投注(FB/UP)
- 在早盤列表選擇賽事並點擊賠率
- 投注面板顯示「預約投注」標識
- 確認後呼叫
v1/order/reserve/betAPI 完成預約 - 後續可修改(
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_smax | queryMarketMaxMinBetMoney API 回傳 |
| 賠率偏好設定 | 無獨立 API | 無獨立 API | recordUserPreference API(betterOdd/anyOdd/fixOdd) |
| 訂單確認輪詢 | checkOrderStatus → FBBetCommonDatas.betsIDs | checkOrderStatus → 同 FB 機制 | checkOrderStatus → DBBetCommonDatas.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 極速體育
| 功能說明 | Endpoint | Method | Content-Type | 主要參數 |
|---|---|---|---|---|
| 預投注計算(單關/串關共用) | v1/order/batchBetMatchMarketOfJumpLine | POST | json | body: 賠率、盤口等(回傳 real_odds, real_smin, real_smax, isClosed, ss) |
| 單關下注 | v1/order/bet/singlePass | POST | json | body: 投注項資訊(回傳 JSON String → FBSingleBetResultModel) |
| 串關下注 | v1/order/betMultiple | POST | json | body: 串關組合資訊(回傳 JSON String) |
| 查詢訂單狀態 | v1/order/getStakeOrderStatus | POST | json | orderIds: [String], languageType: "CMN" |
| 取得預約投注限額配置 | v1/order/reserve/getBetParameter | POST | json | body: 盤口資訊(回傳 FBCalculateAppointmentBetModel) |
| 預約下注 | v1/order/reserve/bet | POST | json | body: 預約投注項資訊 |
| 取消預約 | v1/order/reserve/cancel | POST | json | body: reserveId 等 |
| 修改預約 | v1/order/reserve/update | POST | json | body: reserveId / unitStake / odds 等 |
| 查詢預約投注結果 | v1/order/reserve/statusInfoByIds | POST | json | reserveIds: [String], languageType: "CMN" |
| 查詢預約提前結算結果 | v1/order/reserve/cashOut/statusInfoByIds | POST | json | reserveCashOutIds: [String], languageType: "CMN" |
UP/BB 體育
| 功能說明 | Endpoint | Method | Content-Type | 主要參數 |
|---|---|---|---|---|
| 預投注計算(單關/串關共用) | v1/order/batchBetMatchMarketOfJumpLine | POST | json | body: 賠率、盤口等(回傳 UPCalculateBetsDataModel / FBSeriesPassCalculateBetsDataModel) |
| 單關下注 | v1/order/bet/singlePass | POST | json | body: 投注項資訊 |
| 串關下注 | v1/order/betMultiple | POST | json | body: 串關組合資訊 |
| 查詢訂單狀態 | v1/order/getStakeOrderStatus | POST | json | orderIds: [String], languageType: "CMN" |
| 取得預約投注限額配置 | v1/order/reserve/getBetParameter | POST | json | body: 盤口資訊(回傳 FBCalculateAppointmentBetModel) |
| 預約下注 | v1/order/reserve/bet | POST | json | body: 預約投注項資訊 |
| 取消預約 | v1/order/reserve/cancel | POST | json | body: reserveId 等 |
| 修改預約 | v1/order/reserve/update | POST | json | body: reserveId / unitStake / odds 等 |
| 查詢預約投注結果 | v1/order/reserve/statusInfoByIds | POST | json | reserveIds: [String], languageType: "CMN" |
| 查詢預約提前結算結果 | v1/order/reserve/cashOut/statusInfoByIds | POST | json | reserveCashOutIds: [String], languageType: "CMN" |
備註:FB 與 UP 的投注 API endpoint 完全相同,差異在於 Request struct 分屬
FBSportAPI/UPSportAPI,各自走不同的 domain 和 auth adapter。
DB 體育
| 功能說明 | Endpoint | Method | Content-Type | 主要參數 |
|---|---|---|---|---|
| 取得最新盤口資料 | yewu13/v1/betOrder/client/queryLatestMarketInfo | POST | json | body: 盤口查詢條件(回傳 [DBQueryLatestMarketInfoModel]) |
| 查詢投注限額(最大/最小金額) | yewu13/v1/betOrder/client/queryMarketMaxMinBetMoney | POST | json | body: 盤口查詢條件(回傳 [DBOrderMaxBetMoneyModel]) |
| 投注(單關/串關共用) | yewu13/v1/betOrder/client/bet | POST | json | body: 投注項資訊(回傳 JSON String → DBBetResultModel) |
| 查詢訂單狀態 | yewu13/v1/betOrder/queryOrderStatus | GET | json | orderNos: String(多個用逗號隔開,回傳 [DBOrderStatusModel]) |
| 設定使用者投注偏好 | yewu12/v1/betOrder/client/recordUserPreference | POST | json | userBetPrefer: Int(1=更好賠率 / 2=任意賠率 / 3=固定賠率), userMarketPrefer: String("EU"/"HK") |
備註:DB 的 host 為
DBSportAPI.Host.sport,與 FB/UP 的 domain 體系不同。DB 不支援預約投注、骰寶、包賠。
共用
| 功能說明 | Namespace | Endpoint | Method | Content-Type | 主要參數 |
|---|---|---|---|---|---|
| 包賠投注配置 | STAPI | api/forehead/activity/compensation/info | POST | urlForm | 活動配置查詢 |
資料模型
FBCalculateBetsBmsModel(預投注回傳 - 投注項)
| 欄位 | 說明 |
|---|---|
real_odds | 真實賠率(用於計算可贏額) |
real_smin / real_smax | 最小/最大投注額 |
isClosed | 是否封盤 |
isBetChange | 是否賠率有變動 |
ss | 銷售狀態(1=開售, -1=未開售, 0=暫停) |
FBSingleBetResultDataModel(FB 投注結果)
| 欄位 | 類型 | 說明 |
|---|---|---|
st | Int | 原始狀態碼(0~5,decode 時映射為 orderStatus) |
id | String | 訂單 ID |
orderStatus | FBBetResultType | 訂單狀態列舉 |
ops | [FBBetResultOPS] | 投注項結果陣列 |
betName | String? | 輔助欄位 - 投注名稱 |
betCount | String? | 輔助欄位 - 注數 |
betOdds | String? | 輔助欄位 - 賠率 |
betAmount | String? | 輔助欄位 - 投注金額 |
FBBetResultType 列舉:
| 值 | 名稱 | 說明 |
|---|---|---|
| 0 | created | 待確認 |
| 1 | confirming | 確認中 |
| 2 | refused | 已拒絕 |
| 3 | canceled | 已取消 |
| 4 | confirmed | 已確認 |
| 5 | settled | 已結算 |
FBBetResultOPS(投注項結果):
| 欄位 | 說明 |
|---|---|
mid | 盤口 ID |
od | 當前賠率 |
of | 賠率狀態(-1=預設) |
bod | 原始賠率 |
DBBetResultModel(DB 投注結果)
| 欄位 | 類型 | 說明 |
|---|---|---|
code | String | 回傳碼("0000000" 為成功) |
msg | String | 回傳訊息 |
orderType | DBBetResultType | 訂單狀態(0=餘額不足, 1=確認中, 2=已確認, 3=失敗) |
data.betMoneyTotal | String? | 總投注金額(原值除以 100) |
data.maxWinMoneyTotal | String? | 最高可贏金額(原值除以 100) |
data.orderDetailRespList | [DBBetResultDetailRespListModel] | 單關訂單明細 |
data.seriesOrderRespList | [DBBetResultDetailRespListModel] | 串關訂單明細 |
DB 特殊錯誤碼處理:0400454 / 0400455 / 0402035 → 餘額不足
DBOrderResultType(DB 訂單查詢狀態)
| 值 | 名稱 | 說明 |
|---|---|---|
| 0 | confirmed | 已確認 |
| 1 | processed | 已處理 |
| 2 | refused | 已拒絕 |
| 3 | beConfirmed | 待確認 |
| 4 | fail | 失敗 |
串關限制規則
| 規則 | 三平台共通 |
|---|---|
| 最少場數 | 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 依序累加所有組合的可贏額 |
實作重點
BetViewController 架構(2025/7/10 新版):繼承
STBaseViewController<BetViewModel>,使用 Combine@Published驅動 UI弱網訂單確認機制(三平台共通邏輯):下注 API 回傳
confirming→ 延遲 0.5 秒後輪詢checkOrderStatus;輪詢後仍確認中 → 記入各平台的BetCommonDatas.betsIDs,由後台定期輪詢並彈 toast 通知結果可贏額計算:FB/UP 公式
(投注金額 * (賠率 - 1)),透過BetViewModel.countSingleCanWin()計算,結果透過STNotify.updateBetCanWinAmount推送至 Footer防重複投注:
isBetWaitingResponse為true時禁止關閉投注面板,5 秒後自動恢復骰寶(SicBo)特殊處理(僅 FB/UP):
betGameType == .sicBo→ 啟動sicBoBetsTask輪詢賠率,自動呼叫GameBalanceManager.transferToThisPlatform()轉入餘額DB 平台投注偏好:DB 獨有
RecordUserPreferenceRequest,支援三種賠率接受模式(betterOdd=更好賠率、anyOdd=任意賠率、fixOdd=固定賠率)及盤口類型偏好(EU 歐賠 / HK 港賠)DB 金額精度:DB API 回傳的
betMoneyTotal和maxWinMoneyTotal需除以 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:[...]}