"""admin 首页轮播种子 schemas。金额单位:分(前端展示 ÷100 取元)。 种子 = 生成规则:masked_user 可空(空→feed 随机合成名)、金额是 [min_cents, max_cents] 区间。 """ from __future__ import annotations from pydantic import BaseModel, Field class OpsMarqueeSeedOut(BaseModel): id: int masked_user: str | None = None min_cents: int max_cents: int enabled: bool sort_order: int created_at: str | None = None class OpsMarqueeSeedCreate(BaseModel): masked_user: str | None = None # 空 / 不传 → feed 随机合成脱敏名 min_cents: int max_cents: int enabled: bool = True sort_order: int = 0 class OpsMarqueeSeedUpdate(BaseModel): # masked_user:不传=不改;传空串=清空(改回随机合成);传值=固定该名 masked_user: str | None = None min_cents: int | None = None max_cents: int | None = None enabled: bool | None = None sort_order: int | None = None class OpsMarqueeSeedBulkCreate(BaseModel): """批量生成 count 条自动合成名种子(冷启动铺量)。""" count: int min_cents: int max_cents: int enabled: bool = True class OpsMarqueeSeedBatchDelete(BaseModel): """批量删除选中的种子。""" ids: list[int] = Field(..., max_length=500) # 上限防超大列表(审计行/IN 子句过大) class OpsMarqueeSeedBatchEnable(BaseModel): """批量启用 / 停用选中的种子。""" ids: list[int] = Field(..., max_length=500) enabled: bool class OpsSavingsFeedPreviewItem(BaseModel): masked_user: str saved_amount_cents: int time: str class OpsSavingsFeedPreviewOut(BaseModel): """运营预览:实际混播出来的 feed(真实记录会插队,与客户端一致)。""" items: list[OpsSavingsFeedPreviewItem] class OpsRealRecordItem(BaseModel): masked_user: str # 脱敏后展示名(与 app 一致) saved_amount_cents: int # 节省金额(分) created_at: str # 比价记录时间(YYYY-MM-DD HH:MM) user_id: int # 真实 user_id(供运营核对,不下发客户端) class OpsRealRecordsOut(BaseModel): """分页浏览「全部可展示的真实记录」(success+省>0,不去重、稳定顺序)。""" items: list[OpsRealRecordItem] total: int # 满足条件的真实记录总数(算页数用)