deliveryman-api/app/models/coupon.py

72 lines
2.2 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
class CouponStatus(str, enum.Enum):
UNUSED = "未使用"
USED = "已使用"
EXPIRED = "已过期"
# 数据库模型
class CouponDB(Base):
__tablename__ = "coupons"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False)
amount = Column(Float, nullable=False)
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_amount = Column(Float, nullable=False)
expire_time = Column(DateTime(timezone=True), nullable=False)
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())
# Pydantic 模型
class CouponCreate(BaseModel):
name: str = Field(..., max_length=100)
amount: float = Field(..., gt=0)
class CouponUpdate(BaseModel):
name: Optional[str] = Field(None, max_length=100)
amount: Optional[float] = Field(None, gt=0)
class CouponInfo(BaseModel):
id: int
name: str
amount: float
create_time: datetime
class Config:
from_attributes = True
class UserCouponCreate(BaseModel):
user_id: int
coupon_id: int
expire_time: datetime
count: int = Field(..., gt=0, description="发放数量")
class UserCouponInfo(BaseModel):
id: int
user_id: int
coupon_id: int
coupon_name: str
coupon_amount: float
expire_time: datetime
status: CouponStatus
create_time: datetime
class Config:
from_attributes = True