diff --git a/app/api/endpoints/point_product_order.py b/app/api/endpoints/point_product_order.py index 59c3d84..6a0dbf8 100644 --- a/app/api/endpoints/point_product_order.py +++ b/app/api/endpoints/point_product_order.py @@ -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() diff --git a/app/core/utils.py b/app/core/utils.py index 4c9853a..823ef40 100644 --- a/app/core/utils.py +++ b/app/core/utils.py @@ -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() diff --git a/app/models/point_product_order.py b/app/models/point_product_order.py index 953fa82..ce4a91b 100644 --- a/app/models/point_product_order.py +++ b/app/models/point_product_order.py @@ -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