173 lines
5.5 KiB
Python
173 lines
5.5 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
from app.models.point_product_order import (
|
|
PointProductOrderDB,
|
|
PointProductOrderCreate,
|
|
PointProductOrderUpdate,
|
|
PointProductOrderInfo,
|
|
PointProductOrderStatus
|
|
)
|
|
from app.models.point_product import PointProductDB
|
|
from app.models.database import get_db
|
|
from app.api.deps import get_current_user, get_admin_user, get_deliveryman_user
|
|
from app.models.user import UserDB
|
|
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
|
|
|
|
router = APIRouter()
|
|
|
|
@router.post("", response_model=ResponseModel)
|
|
async def create_point_product_order(
|
|
order: PointProductOrderCreate,
|
|
db: Session = Depends(get_db),
|
|
current_user: UserDB = Depends(get_current_user)
|
|
):
|
|
"""创建积分商品订单"""
|
|
# 查询商品信息
|
|
product = db.query(PointProductDB).filter(
|
|
PointProductDB.id == order.product_id,
|
|
PointProductDB.is_active == True
|
|
).first()
|
|
|
|
if not product:
|
|
return error_response(code=404, message="商品不存在或已下架")
|
|
|
|
# 计算所需总积分
|
|
total_points = product.point_amount * order.quantity
|
|
|
|
# 检查用户积分是否足够
|
|
if current_user.points < total_points:
|
|
return error_response(code=400, message="积分不足")
|
|
|
|
# 创建订单
|
|
db_order = PointProductOrderDB(
|
|
orderid=PointProductOrderDB.generate_order_id(),
|
|
user_id=current_user.userid,
|
|
product_id=product.id,
|
|
product_name=product.name,
|
|
product_image=product.product_image,
|
|
product_description=product.description,
|
|
product_point_amount=product.point_amount,
|
|
quantity=order.quantity,
|
|
order_point_amount=total_points
|
|
)
|
|
|
|
try:
|
|
# 扣减用户积分
|
|
point_manager = PointManager(db)
|
|
point_manager.deduct_points(
|
|
user_id=current_user.userid,
|
|
points=total_points,
|
|
description=f"兑换商品: {product.name}",
|
|
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()
|
|
return error_response(code=500, message=f"创建订单失败: {str(e)}")
|
|
|
|
@router.get("", response_model=ResponseModel)
|
|
async def get_point_product_orders(
|
|
status: Optional[PointProductOrderStatus] = None,
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(20, ge=1, le=100),
|
|
db: Session = Depends(get_db),
|
|
current_user: UserDB = Depends(get_current_user)
|
|
):
|
|
"""获取积分商品订单列表"""
|
|
query = db.query(PointProductOrderDB).filter(
|
|
PointProductOrderDB.user_id == current_user.userid
|
|
)
|
|
|
|
if status:
|
|
query = query.filter(PointProductOrderDB.status == status)
|
|
|
|
total = query.count()
|
|
|
|
orders = query.order_by(PointProductOrderDB.create_time.desc())\
|
|
.offset(skip)\
|
|
.limit(limit)\
|
|
.all()
|
|
|
|
return success_response(data={
|
|
"total": total,
|
|
"items": [PointProductOrderInfo.model_validate(o) for o in orders]
|
|
})
|
|
|
|
@router.get("/{orderid}", response_model=ResponseModel)
|
|
async def get_point_product_order(
|
|
orderid: str,
|
|
db: Session = Depends(get_db),
|
|
current_user: UserDB = Depends(get_current_user)
|
|
):
|
|
"""获取积分商品订单详情"""
|
|
order = db.query(PointProductOrderDB).filter(
|
|
PointProductOrderDB.orderid == orderid,
|
|
PointProductOrderDB.user_id == current_user.userid
|
|
).first()
|
|
|
|
if not order:
|
|
return error_response(code=404, message="订单不存在")
|
|
|
|
return success_response(data=PointProductOrderInfo.model_validate(order))
|
|
|
|
|
|
# 接受订单
|
|
@router.post("/{orderid}/accept", response_model=ResponseModel)
|
|
async def accept_point_product_order(
|
|
orderid: str,
|
|
db: Session = Depends(get_db),
|
|
deliveryman: UserDB = Depends(get_deliveryman_user)
|
|
):
|
|
order = db.query(PointProductOrderDB).filter(
|
|
PointProductOrderDB.orderid == orderid,
|
|
PointProductOrderDB.status == PointProductOrderStatus.PENDING
|
|
).first()
|
|
|
|
if not order:
|
|
return error_response(code=404, message="订单不存在")
|
|
|
|
if order.status != PointProductOrderStatus.PENDING:
|
|
return error_response(code=400, message="订单状态不正确")
|
|
|
|
# 更新订单状态
|
|
order.status = PointProductOrderStatus.CONFIRMED
|
|
db.commit()
|
|
db.refresh(order)
|
|
|
|
return success_response(data=PointProductOrderInfo.model_validate(order))
|
|
|
|
# 拒绝订单
|
|
@router.post("/{orderid}/reject", response_model=ResponseModel)
|
|
async def reject_point_product_order(
|
|
orderid: str,
|
|
db: Session = Depends(get_db),
|
|
deliveryman: UserDB = Depends(get_deliveryman_user)
|
|
):
|
|
order = db.query(PointProductOrderDB).filter(
|
|
PointProductOrderDB.orderid == orderid,
|
|
PointProductOrderDB.status == PointProductOrderStatus.PENDING
|
|
).first()
|
|
|
|
if not order:
|
|
return error_response(code=404, message="订单不存在")
|
|
|
|
if order.status != PointProductOrderStatus.PENDING:
|
|
return error_response(code=400, message="订单状态不正确")
|
|
|
|
# 更新订单状态
|
|
order.status = PointProductOrderStatus.CANCELLED
|
|
db.commit()
|
|
db.refresh(order)
|
|
|
|
return success_response(data=PointProductOrderInfo.model_validate(order))
|
|
|