import json from pydantic import BaseModel, Field from typing import Optional from datetime import datetime class ChestBase(BaseModel): title: str = Field(..., min_length=1, max_length=200) option_a: str = Field(..., min_length=1, max_length=100) option_b: str = Field(..., min_length=1, max_length=100) countdown_seconds: int = Field(default=300, ge=10, le=3600) # 10秒到1小时 class ChestCreate(ChestBase): pass class ChestResponse(ChestBase): id: int streamer_id: int status: int pool_a: int pool_b: int total_bets: int locked_at: Optional[datetime] = None settled_at: Optional[datetime] = None result: Optional[str] = None created_at: datetime time_remaining: int = 0 # 改为非可选字段,默认值为0 # 计算属性 @property def total_pool(self) -> int: return self.pool_a + self.pool_b @property def odds_a(self) -> float: """计算A边赔率 (1 : X)""" if self.pool_a == 0: return 0.0 # 修改赔率计算方式,只对获胜方抽水 return round((self.pool_a + self.pool_b * 0.9) / self.pool_a, 2) @property def odds_b(self) -> float: """计算B边赔率 (1 : X)""" if self.pool_b == 0: return 0.0 # 修改赔率计算方式,只对获胜方抽水 return round((self.pool_b + self.pool_a * 0.9) / self.pool_b, 2) class Config: from_attributes = True class BetCreate(BaseModel): chest_id: int option: str = Field(..., pattern="^[AB]$") amount: int = Field(..., gt=0) class BetResponse(BaseModel): id: int user_id: int chest_id: int option: str amount: int payout: int status: str created_at: datetime class Config: from_attributes = True class ChestSettle(BaseModel): """宝箱结算""" result: str = Field(..., pattern="^(A|B|REFUND)$") class ChestLock(BaseModel): """宝箱封盘""" pass