Files
mindfulness/server/app/db/models/push_send_log.py
2026-02-12 13:54:34 +08:00

43 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from __future__ import annotations
from datetime import date, datetime
from sqlalchemy import Date, DateTime, Index, Integer, SmallInteger, String, Text, UniqueConstraint, func
from sqlalchemy.orm import Mapped, mapped_column
from app.db.base import Base
class PushSendLog(Base):
"""
推送发送日志(用于幂等防重复 + 可观测)。
"""
__tablename__ = "push_send_log"
__table_args__ = (
UniqueConstraint("client_user_id", "local_date", "slot_index", name="uniq_user_date_slot"),
Index("idx_push_log_user_date", "client_user_id", "local_date"),
Index("idx_push_log_status", "status"),
)
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True, comment="主键")
client_user_id: Mapped[str] = mapped_column(String(length=64), nullable=False, comment="客户端用户标识UUID")
local_date: Mapped[date] = mapped_column(Date, nullable=False, comment="用户时区的本地日期(用于幂等)")
slot_index: Mapped[int] = mapped_column(SmallInteger, nullable=False, comment="当天第几条1..times_per_day")
scheduled_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, comment="计划发送时间UTC")
sent_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, comment="实际发送时间UTC")
status: Mapped[str] = mapped_column(String(length=16), nullable=False, server_default="scheduled", comment="scheduled/sent/failed")
error: Mapped[str | None] = mapped_column(Text, nullable=True, comment="失败原因(可选)")
# 发送内容快照(用于观测 + 去重)
content_id: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="推送文案内容 ID可选")
title: Mapped[str | None] = mapped_column(String(length=128), nullable=True, comment="推送标题(可选)")
body: Mapped[str | None] = mapped_column(Text, nullable=True, comment="推送正文(可选)")
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, server_default=func.now(), comment="创建时间")