增加积分商品预下单
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 (
|
from app.models.point_product_order import (
|
||||||
PointProductOrderDB,
|
PointProductOrderDB,
|
||||||
PointProductOrderCreate,
|
PointProductOrderCreate,
|
||||||
PointProductOrderUpdate,
|
|
||||||
PointProductOrderInfo,
|
PointProductOrderInfo,
|
||||||
PointProductOrderStatus
|
PointProductOrderStatus
|
||||||
)
|
)
|
||||||
@ -15,9 +14,45 @@ from app.core.response import success_response, error_response, ResponseModel
|
|||||||
from app.core.point_manager import PointManager
|
from app.core.point_manager import PointManager
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from app.models.order import ShippingOrderDB, OrderStatus
|
||||||
|
|
||||||
router = APIRouter()
|
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)
|
@router.post("", response_model=ResponseModel)
|
||||||
async def create_point_product_order(
|
async def create_point_product_order(
|
||||||
order: PointProductOrderCreate,
|
order: PointProductOrderCreate,
|
||||||
@ -41,6 +76,24 @@ async def create_point_product_order(
|
|||||||
if current_user.points < total_points:
|
if current_user.points < total_points:
|
||||||
return error_response(code=400, message="积分不足")
|
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(
|
db_order = PointProductOrderDB(
|
||||||
orderid=PointProductOrderDB.generate_order_id(),
|
orderid=PointProductOrderDB.generate_order_id(),
|
||||||
@ -51,24 +104,27 @@ async def create_point_product_order(
|
|||||||
product_description=product.description,
|
product_description=product.description,
|
||||||
product_point_amount=product.point_amount,
|
product_point_amount=product.point_amount,
|
||||||
quantity=order.quantity,
|
quantity=order.quantity,
|
||||||
order_point_amount=total_points
|
order_point_amount=total_points,
|
||||||
|
delivery_order_id=order.delivery_order_id,
|
||||||
|
status=PointProductOrderStatus.PENDING
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# 保存订单
|
||||||
|
db.add(db_order)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
db.refresh(db_order)
|
||||||
|
|
||||||
# 扣减用户积分
|
# 扣减用户积分
|
||||||
point_manager = PointManager(db)
|
point_manager = PointManager(db)
|
||||||
point_manager.deduct_points(
|
point_manager.deduct_points(
|
||||||
user_id=current_user.userid,
|
user_id=current_user.userid,
|
||||||
points=total_points,
|
points=total_points,
|
||||||
description=f"兑换商品: {product.name}",
|
description=f"兑换积分商品",
|
||||||
order_id=db_order.orderid
|
order_id=db_order.orderid
|
||||||
)
|
)
|
||||||
|
|
||||||
# 保存订单
|
|
||||||
db.add(db_order)
|
|
||||||
db.commit()
|
|
||||||
db.refresh(db_order)
|
|
||||||
|
|
||||||
return success_response(data=PointProductOrderInfo.model_validate(db_order))
|
return success_response(data=PointProductOrderInfo.model_validate(db_order))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
|
|||||||
@ -19,7 +19,7 @@ class CommonUtils:
|
|||||||
def generate_order_id(prefix: str) -> str:
|
def generate_order_id(prefix: str) -> str:
|
||||||
"""
|
"""
|
||||||
生成订单号
|
生成订单号
|
||||||
:param prefix: 订单前缀,如 M(商品订单)、P(支付订单)、D(配送订单)
|
:param prefix: 订单前缀,如 M(商品订单)、P(支付订单)、D(配送订单)、E(积分兑换商品订单)
|
||||||
:return: 15位订单号:前缀(1位) + 日期(8位) + 时间戳(6位)
|
:return: 15位订单号:前缀(1位) + 日期(8位) + 时间戳(6位)
|
||||||
"""
|
"""
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
|||||||
@ -43,12 +43,13 @@ class PointProductOrderDB(Base):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_order_id() -> str:
|
def generate_order_id() -> str:
|
||||||
"""生成订单号"""
|
"""生成订单号"""
|
||||||
return CommonUtils.generate_order_id("P") # P代表积分商品订单
|
return CommonUtils.generate_order_id("E") # E代表积分兑换商品订单
|
||||||
|
|
||||||
# Pydantic 模型
|
# Pydantic 模型
|
||||||
class PointProductOrderCreate(BaseModel):
|
class PointProductOrderCreate(BaseModel):
|
||||||
product_id: int
|
product_id: int
|
||||||
quantity: int = Field(default=1, gt=0)
|
quantity: int = Field(default=1, gt=0)
|
||||||
|
delivery_order_id: Optional[str] = None
|
||||||
|
|
||||||
class PointProductOrderUpdate(BaseModel):
|
class PointProductOrderUpdate(BaseModel):
|
||||||
status: PointProductOrderStatus
|
status: PointProductOrderStatus
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user