增加自动发放新人券。

This commit is contained in:
aaron 2025-01-07 11:01:44 +08:00
parent debc632e92
commit 5a7c7170d0
7 changed files with 40 additions and 19 deletions

View File

@ -136,8 +136,7 @@ async def get_user_coupons(
async def get_all_coupons(
skip: int = 0,
limit: int = 10,
db: Session = Depends(get_db),
admin: UserDB = Depends(get_admin_user)
db: Session = Depends(get_db)
):
"""获取所有优惠券列表(管理员)"""
coupons = db.query(CouponDB).order_by(

View File

@ -14,14 +14,17 @@ router = APIRouter()
async def add_points(
record: PointRecordCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user) # 仅管理员可操作
admin: UserDB = Depends(get_admin_user) # 仅管理员可操作
):
"""增加用户积分"""
user = db.query(UserDB).filter(UserDB.userid == current_user.userid).first()
user = db.query(UserDB).filter(UserDB.userid == record.user_id).first()
if not user:
return error_response(code=404, message="用户不存在")
# 创建积分记录
point_record = PointRecordDB(
user_id=user.userid,
user_id=record.user_id,
points=record.points,
description=record.description
)

View File

@ -15,6 +15,7 @@ from app.core.security import create_access_token, set_jwt_cookie, clear_jwt_coo
from app.core.response import success_response, error_response, ResponseModel
from pydantic import BaseModel, Field
from typing import List
from datetime import datetime
router = APIRouter()
@ -87,7 +88,7 @@ async def login(
user = db.query(UserDB).filter(UserDB.phone == phone).first()
if not user:
# 生成用户编码
user_code = generate_user_code()
user_code = generate_user_code(db)
user = UserDB(
username=f"user_{phone[-4:]}",
@ -144,7 +145,7 @@ async def mock_login(
user = db.query(UserDB).filter(UserDB.phone == request.phone).first()
if not user:
# 生成用户编码
user_code = generate_user_code()
user_code = generate_user_code(db)
user = UserDB(
username=f"user_{request.phone[-4:]}",
@ -309,6 +310,9 @@ def issue_register_coupons(db: Session, user_id: int):
"""
register_coupons = settings.REGISTER_COUPONS
# 设置过期时间为3个月后
expire_time = datetime.now() + timedelta(days=90)
for config in register_coupons:
coupon = db.query(CouponDB).filter(
CouponDB.id == config["coupon_id"]
@ -319,6 +323,9 @@ def issue_register_coupons(db: Session, user_id: int):
user_coupon = UserCouponDB(
user_id=user_id,
coupon_id=coupon.id,
coupon_name=coupon.name,
coupon_amount=coupon.amount,
expire_time=expire_time,
status="unused"
)
db.add(user_coupon)

View File

@ -7,9 +7,9 @@ from .database import Base
import enum
class CouponStatus(str, enum.Enum):
UNUSED = "未使用"
USED = "已使用"
EXPIRED = "已过期"
UNUSED = "UNUSED"
USED = "USED"
EXPIRED = "EXPIRED"
# 数据库模型
class CouponDB(Base):

View File

@ -7,11 +7,15 @@ from .database import Base
import enum
class OrderStatus(str, enum.Enum):
PENDING = "pending"
ACCEPTED = "accepted"
UNPAID = "unpaid"
COMPLETED = "completed"
CANCELLED = "cancelled"
CREATED = "created" # 已下单
ACCEPTED = "accepted" # 已接单
UNPAID = "unpaid" # 未支付
COMPLETED = "completed" # 已完成
CANCELLED = "cancelled" # 已取消
class DeliveryMethod(str, enum.Enum):
DELIVERY_TO_DOOR = "delivery_to_door" # 放在门口
DELIVERY_TO_ROOM = "delivery_to_room" # 投递到家
# 数据库模型
class ShippingOrderDB(Base):
@ -25,10 +29,11 @@ class ShippingOrderDB(Base):
coupon_discount_amount = Column(Float, default=0)
coupon_id = Column(Integer, ForeignKey("user_coupons.id"), nullable=True)
final_amount = Column(Float, nullable=False)
status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.PENDING)
status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.CREATED)
cancel_reason = Column(String(200), nullable=True) # 取消原因
complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL多个URL用逗号分隔
create_time = Column(DateTime(timezone=True), server_default=func.now())
delivery_method = Column(Enum(DeliveryMethod), nullable=False, default=DeliveryMethod.DELIVERY_TO_DOOR)
class ShippingOrderPackageDB(Base):
__tablename__ = "shipping_order_packages"
@ -50,6 +55,7 @@ class OrderCreate(BaseModel):
original_amount: float = Field(..., ge=0)
coupon_id: Optional[int] = None
packages: List[OrderPackage]
delivery_method: DeliveryMethod = Field(default=DeliveryMethod.DELIVERY_TO_DOOR)
class OrderInfo(BaseModel):
orderid: str
@ -63,6 +69,7 @@ class OrderInfo(BaseModel):
status: OrderStatus
complete_images: Optional[List[str]] = None
create_time: datetime
delivery_method: DeliveryMethod
def __init__(self, **data):
super().__init__(**data)

View File

@ -15,6 +15,7 @@ class PointRecordDB(Base):
create_time = Column(DateTime(timezone=True), server_default=func.now())
class PointRecordCreate(BaseModel):
user_id: int = Field(..., description="用户ID")
points: float = Field(..., description="积分变动值,可为正或负")
description: str = Field(..., min_length=1, max_length=200)

View File

@ -2,7 +2,7 @@ from sqlalchemy import Column, String, DateTime, Integer, Boolean, Enum, Foreign
from sqlalchemy.sql import func
from sqlalchemy.dialects.mysql import JSON
from pydantic import BaseModel, Field
from .database import Base
from .database import Base, get_db
from typing import Optional, List, Union
from datetime import datetime
import enum
@ -71,13 +71,17 @@ class UserPasswordLogin(BaseModel):
phone: str = Field(..., pattern="^1[3-9]\d{9}$")
password: str = Field(..., min_length=6, max_length=20)
def generate_user_code() -> str:
def generate_user_code(db=None) -> str:
"""生成6位大写字母+数字的用户编码"""
chars = string.ascii_uppercase + string.digits
while True:
code = ''.join(random.choices(chars, k=6))
# 检查是否已存在
exists = UserDB.query.filter_by(user_code=code).first()
if db:
exists = db.query(UserDB).filter(UserDB.user_code == code).first()
else:
db = next(get_db())
exists = db.query(UserDB).filter(UserDB.user_code == code).first()
if not exists:
return code