增加自动发放新人券。
This commit is contained in:
parent
debc632e92
commit
5a7c7170d0
@ -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(
|
||||||
|
|||||||
@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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)
|
||||||
@ -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):
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user