51521fc0dd
- 微信支付从 APIv3 降级为 APIv2(MD5/XML) - 积分系统:充值下单、微信回调、消费冻结/结算/退款 - SMS B2M 短信验证码服务 - 双 Token 认证(Access 30min + Refresh 30days) - SSE 单设备踢人 - 用户设备管理、积分账户模型 - Alembic 迁移脚本
69 lines
1.6 KiB
Python
69 lines
1.6 KiB
Python
"""
|
|
用户积分汇总表
|
|
==============
|
|
|
|
记录用户当前可用积分及累计统计。
|
|
|
|
设计说明:
|
|
- 余额是实时计算的聚合值,查询时不需要 JOIN batches
|
|
- 每次充值/消费/过期都同步更新此表
|
|
- SELECT ... FOR UPDATE 锁定此表行,防止并发超扣
|
|
"""
|
|
|
|
import uuid
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy import ForeignKey, String
|
|
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),
|
|
ForeignKey("mjk_users.id", ondelete="CASCADE"),
|
|
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="已冻结积分(预扣未结算)",
|
|
)
|