deliveryman-api/app/models/coupon.py
2025-04-06 20:20:43 +08:00

124 lines
4.1 KiB
Python

from datetime import datetime
from typing import Optional
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Enum
from sqlalchemy.sql import func
from pydantic import BaseModel, Field
from .database import Base
import enum
from sqlalchemy.orm import relationship
class CouponStatus(str, enum.Enum):
UNUSED = "UNUSED"
USED = "USED"
EXPIRED = "EXPIRED"
class CouponType(str, enum.Enum):
PRODUCT = "PRODUCT" # 商品
CASH = "CASH" # 现金
# 数据库模型
class CouponDB(Base):
__tablename__ = "coupons"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False)
amount = Column(Float, nullable=False)
coupon_type = Column(Enum(CouponType), nullable=False, default=CouponType.CASH)
create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now())
class UserCouponDB(Base):
__tablename__ = "user_coupons"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey("users.userid"), index=True)
coupon_id = Column(Integer, ForeignKey("coupons.id"), index=True)
coupon_name = Column(String(100), nullable=False)
coupon_type = Column(Enum(CouponType), nullable=False)
coupon_amount = Column(Float, nullable=False)
expire_time = Column(DateTime(timezone=True), nullable=False)
used_time = Column(DateTime(timezone=True), nullable=True)
status = Column(Enum(CouponStatus), default=CouponStatus.UNUSED)
create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now())
class CouponIssueRecordDB(Base):
"""优惠券发放记录表"""
__tablename__ = "coupon_issue_records"
id = Column(Integer, primary_key=True, autoincrement=True)
coupon_id = Column(Integer, ForeignKey("coupons.id"), nullable=False)
user_id = Column(Integer, ForeignKey("users.userid"), nullable=False)
operator_id = Column(Integer, ForeignKey("users.userid"), nullable=False) # 操作人ID
count = Column(Integer, nullable=False, default=1) # 发放数量
issue_time = Column(DateTime(timezone=True), nullable=False, server_default=func.now())
remark = Column(String(200), nullable=True) # 备注信息
# 关联关系
coupon = relationship("CouponDB", backref="issue_records")
user = relationship("UserDB", foreign_keys=[user_id], backref="received_coupon_records")
operator = relationship("UserDB", foreign_keys=[operator_id], backref="operated_coupon_records")
# Pydantic 模型
class CouponCreate(BaseModel):
name: str = Field(..., max_length=100)
amount: Optional[float] = Field(None)
coupon_type: CouponType = Field(CouponType.CASH)
class CouponUpdate(BaseModel):
name: Optional[str] = Field(None, max_length=100)
amount: Optional[float] = Field(None)
coupon_type: CouponType = Field(CouponType.CASH)
class CouponInfo(BaseModel):
id: int
name: str
amount: float
coupon_type: CouponType
create_time: datetime
class Config:
from_attributes = True
class UserCouponCreate(BaseModel):
user_id: int
coupon_id: int
expire_time: datetime
remark: Optional[str] = None
count: int = Field(..., gt=0, description="发放数量")
class UserCouponInfo(BaseModel):
id: int
user_id: int
coupon_id: int
coupon_name: str
coupon_amount: float
coupon_type: CouponType
expire_time: datetime
used_time: Optional[datetime] = None
status: CouponStatus
create_time: datetime
class Config:
from_attributes = True
class CouponIssueRecordCreate(BaseModel):
coupon_id: int
user_id: int
count: int = 1
remark: Optional[str] = None
class CouponIssueRecordInfo(BaseModel):
id: int
coupon_id: int
user_id: int
operator_id: int
count: int
issue_time: datetime
remark: Optional[str] = None
coupon_name: Optional[str] = None
user_nickname: Optional[str] = None
operator_nickname: Optional[str] = None
class Config:
from_attributes = True