This commit is contained in:
2026-11-04 15:35:15 +08:00
parent 4709ea4328
commit 62291c57ec
12 changed files with 363 additions and 72 deletions
+32 -6
View File
@@ -1,4 +1,6 @@
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, field_validator
from api.utils.gold_time import half_hour_start
GOLD_REGION_CODES = {
@@ -8,20 +10,29 @@ GOLD_REGION_CODES = {
class RealTimeGold(BaseModel):
updataTime: int = Field(..., ge=0, description='更新时间,Unix秒级时间戳')
updataTime: int = Field(..., ge=0, description='数据所属半小时刻度的Unix秒级时间戳,提前5分钟开始采集')
"""更新时间"""
region: str = Field(..., description='跨区')
"""跨区"""
code: str = Field(..., description='跨区code:k1、k2、k3a、k3b、k4、k5、k6、k7、k8')
goldPrice: float = Field(..., gt=0, allow_inf_nan=False, description='金币比例,1元对应的万金币数量')
goldPrice: float = Field(..., ge=0, allow_inf_nan=False, description='页面第4~10条单价均值,元/万金币,四舍五入至两位小数')
"""金价"""
@field_validator('updataTime')
@classmethod
def align_update_time(cls, value):
return half_hour_start(value)
@field_validator('goldPrice')
@classmethod
def round_gold_price(cls, value):
return round(value, 2)
class ThirdPartGoldCache(RealTimeGold):
"""内部缓存数据,不作为接口返回模型。"""
goldPrice: float = Field(..., gt=0, allow_inf_nan=False, description='首页有效报价换算为万金币/元后的算术平均值')
sampleCount: int = Field(..., ge=1, le=200, description='参与均值计算的报价条数')
sampleCount: int = Field(..., ge=1, le=7, description='第4~10条中参与均值计算的报价条数')
stale: bool = Field(..., description='数据是否已超过30分钟刷新周期')
@@ -41,7 +52,7 @@ class HistoryGold(BaseModel):
"""echarts数据"""
class OfficialGold(BaseModel):
updataTime: str = Field(..., pattern=r'^\d+$', description='更新时间,Unix秒级时间戳字符串')
updataTime: str = Field(..., pattern=r'^\d+$', description='数据所属半小时刻度的Unix秒级时间戳字符串,提前5分钟开始采集')
"""更新时间"""
region: str = Field(..., description='跨区')
"""跨区"""
@@ -52,3 +63,18 @@ class OfficialGold(BaseModel):
"""金币寄售最高成交价排名前5的价格"""
max: float | None = Field(..., description='100点券可兑换的最大万金币数量,无有效报价时为null')
min: float | None = Field(..., description='100点券可兑换的最小万金币数量,无有效报价时为null')
@field_validator('updataTime')
@classmethod
def align_update_time(cls, value):
return str(half_hour_start(int(value)))
@field_validator('goldDealRank', 'goldTopDealRank')
@classmethod
def round_ranks(cls, values):
return [round(value, 2) for value in values]
@field_validator('max', 'min')
@classmethod
def round_ratios(cls, value):
return round(value, 2) if value is not None else None