Files
meijiaka-zy/python-api/app/models/user_point.py
T
小鱼开发 fbef15ba7e chore(alembic): 重建单一初始迁移脚本
- 合并为单一初始全量迁移,覆盖 users/user_devices/user_points/point_batches/point_transactions/point_recharge_orders
- 去掉所有 ForeignKey 约束(业务层软删除,不依赖数据库级联)
- 去掉不必要的索引,仅保留 Unique 约束自带索引
- 修复 mjk_users.id 为 UUID 类型(非 String(36))
- 修复 user_device.last_active_at 时区类型一致性(添加 timezone=True)
2026-05-08 14:40:22 +08:00

68 lines
1.5 KiB
Python

"""
用户积分汇总表
==============
记录用户当前可用积分及累计统计。
设计说明:
- 余额是实时计算的聚合值,查询时不需要 JOIN batches
- 每次充值/消费/过期都同步更新此表
- SELECT ... FOR UPDATE 锁定此表行,防止并发超扣
"""
import uuid
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.models.base import BaseModelBigInt
class UserPoint(BaseModelBigInt):
"""用户积分汇总"""
__tablename__ = "mjk_user_points"
user_id: Mapped[uuid.UUID] = mapped_column(
UUID(as_uuid=True),
unique=True,
nullable=False,
comment="用户 ID",
)
balance: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="当前可用积分(已扣除冻结)",
)
total_recharged: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="累计充值积分",
)
total_consumed: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="累计消费积分",
)
total_expired: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="累计过期积分",
)
total_refunded: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="累计返还积分(预扣后返还)",
)
frozen: Mapped[int] = mapped_column(
default=0,
nullable=False,
comment="已冻结积分(预扣未结算)",
)