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