增加积分商品预下单
This commit is contained in:
parent
eeca3fd8ad
commit
86eda0826c
@ -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()
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user