"""省钱记录表。 是 profile「累计帮你省了」和「省钱战绩」的唯一数据源:每完成一次比价/下单, 省了多少记一行。本期比价还没接后端,数据由 demo seeder 幂等灌入(source='demo'), 聚合接口照常做真实 SUM/分组;等比价真接入后,改成上报写入、停掉 seeder 即可。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, String, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class SavingsRecord(Base): __tablename__ = "savings_record" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column( Integer, ForeignKey("user.id"), index=True, nullable=False ) # 订单金额 / 省下金额,单位:分 order_amount_cents: Mapped[int] = mapped_column(Integer, nullable=False) saved_amount_cents: Mapped[int] = mapped_column(Integer, nullable=False) platform: Mapped[str | None] = mapped_column(String(32), nullable=True) title: Mapped[str | None] = mapped_column(String(128), nullable=True) # 店铺名(订单明细卡标题,如「窑鸡王(王府井店)」) shop_name: Mapped[str | None] = mapped_column(String(128), nullable=True) # 菜品名列表(JSONB),PG 上可建 GIN 索引,前 2 道直接展示,其余收进「还有 N 道菜」展开。 dishes: Mapped[list[str]] = mapped_column(JSONB, nullable=False, default=list) # 来源:demo(演示) / compare(真实比价上报) source: Mapped[str] = mapped_column(String(16), nullable=False, default="compare") created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), index=True, nullable=False ) def __repr__(self) -> str: # pragma: no cover return f""