增加自动发放新人券。

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( async def get_all_coupons(
skip: int = 0, skip: int = 0,
limit: int = 10, limit: int = 10,
db: Session = Depends(get_db), db: Session = Depends(get_db)
admin: UserDB = Depends(get_admin_user)
): ):
"""获取所有优惠券列表(管理员)""" """获取所有优惠券列表(管理员)"""
coupons = db.query(CouponDB).order_by( coupons = db.query(CouponDB).order_by(

View File

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

View File

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

View File

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

View File

@ -15,6 +15,7 @@ class PointRecordDB(Base):
create_time = Column(DateTime(timezone=True), server_default=func.now()) create_time = Column(DateTime(timezone=True), server_default=func.now())
class PointRecordCreate(BaseModel): class PointRecordCreate(BaseModel):
user_id: int = Field(..., description="用户ID")
points: float = Field(..., description="积分变动值,可为正或负") points: float = Field(..., description="积分变动值,可为正或负")
description: str = Field(..., min_length=1, max_length=200) 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.sql import func
from sqlalchemy.dialects.mysql import JSON from sqlalchemy.dialects.mysql import JSON
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from .database import Base from .database import Base, get_db
from typing import Optional, List, Union from typing import Optional, List, Union
from datetime import datetime from datetime import datetime
import enum import enum
@ -71,13 +71,17 @@ class UserPasswordLogin(BaseModel):
phone: str = Field(..., pattern="^1[3-9]\d{9}$") phone: str = Field(..., pattern="^1[3-9]\d{9}$")
password: str = Field(..., min_length=6, max_length=20) password: str = Field(..., min_length=6, max_length=20)
def generate_user_code() -> str: def generate_user_code(db=None) -> str:
"""生成6位大写字母+数字的用户编码""" """生成6位大写字母+数字的用户编码"""
chars = string.ascii_uppercase + string.digits chars = string.ascii_uppercase + string.digits
while True: while True:
code = ''.join(random.choices(chars, k=6)) 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: if not exists:
return code return code