增加积分商品预下单

This commit is contained in:
aaron 2025-02-20 17:44:39 +08:00
parent eeca3fd8ad
commit 86eda0826c
3 changed files with 68 additions and 11 deletions

View File

@ -3,7 +3,6 @@ from sqlalchemy.orm import Session
from app.models.point_product_order import (
PointProductOrderDB,
PointProductOrderCreate,
PointProductOrderUpdate,
PointProductOrderInfo,
PointProductOrderStatus
)
@ -15,9 +14,45 @@ from app.core.response import success_response, error_response, ResponseModel
from app.core.point_manager import PointManager
from typing import Optional
from datetime import datetime
from app.models.order import ShippingOrderDB, OrderStatus
router = APIRouter()
@router.get("/pre_order", response_model=ResponseModel)
async def pre_order(
order: PointProductOrderCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""预下单"""
# 检查今日是否有配送订单
orders = db.query(ShippingOrderDB).filter(
ShippingOrderDB.userid == current_user.userid,
ShippingOrderDB.status.in_([OrderStatus.CREATED, OrderStatus.RECEIVED]),
ShippingOrderDB.create_time.date() == datetime.now().date()
).all()
if len(orders) == 0:
return error_response(code=400, message="今日暂无配送订单")
product = db.query(PointProductDB).filter(
PointProductDB.id == order.product_id,
PointProductDB.is_active == True
).first()
if not product:
return error_response(code=404, message="商品不存在或已下架")
# 计算所需总积分
order_point_amount = product.point_amount * order.quantity
return success_response(data={
"order_point_amount": order_point_amount,
"orders": orders
})
@router.post("", response_model=ResponseModel)
async def create_point_product_order(
order: PointProductOrderCreate,
@ -41,6 +76,24 @@ async def create_point_product_order(
if current_user.points < total_points:
return error_response(code=400, message="积分不足")
# 检查配送订单是否存在
if order.delivery_order_id is None:
return error_response(code=400, message="配送订单不能为空")
delivery_order = db.query(ShippingOrderDB).filter(
ShippingOrderDB.orderid == order.delivery_order_id,
ShippingOrderDB.status.in_([OrderStatus.CREATED, OrderStatus.RECEIVED]),
ShippingOrderDB.create_time.date() == datetime.now().date()
).first()
if not delivery_order:
return error_response(code=404, message="配送订单不存在")
# 检查配送订单是否已支付
if delivery_order.status != OrderStatus.UNPAID:
return error_response(code=400, message="配送订单已支付")
# 创建订单
db_order = PointProductOrderDB(
orderid=PointProductOrderDB.generate_order_id(),
@ -51,24 +104,27 @@ async def create_point_product_order(
product_description=product.description,
product_point_amount=product.point_amount,
quantity=order.quantity,
order_point_amount=total_points
order_point_amount=total_points,
delivery_order_id=order.delivery_order_id,
status=PointProductOrderStatus.PENDING
)
try:
# 保存订单
db.add(db_order)
db.commit()
db.refresh(db_order)
# 扣减用户积分
point_manager = PointManager(db)
point_manager.deduct_points(
user_id=current_user.userid,
points=total_points,
description=f"兑换商品: {product.name}",
description=f"兑换积分商品",
order_id=db_order.orderid
)
# 保存订单
db.add(db_order)
db.commit()
db.refresh(db_order)
return success_response(data=PointProductOrderInfo.model_validate(db_order))
except Exception as e:
db.rollback()

View File

@ -19,7 +19,7 @@ class CommonUtils:
def generate_order_id(prefix: str) -> str:
"""
生成订单号
:param prefix: 订单前缀 M(商品订单)P(支付订单)D(配送订单)
:param prefix: 订单前缀 M(商品订单)P(支付订单)D(配送订单)E(积分兑换商品订单)
:return: 15位订单号前缀(1) + 日期(8) + 时间戳(6)
"""
now = datetime.now()

View File

@ -43,12 +43,13 @@ class PointProductOrderDB(Base):
@staticmethod
def generate_order_id() -> str:
"""生成订单号"""
return CommonUtils.generate_order_id("P") # P代表积分商品订单
return CommonUtils.generate_order_id("E") # E代表积分兑换商品订单
# Pydantic 模型
class PointProductOrderCreate(BaseModel):
product_id: int
quantity: int = Field(default=1, gt=0)
delivery_order_id: Optional[str] = None
class PointProductOrderUpdate(BaseModel):
status: PointProductOrderStatus