From 9e8bb7747f12b908996bc38dc12a6aa7b309084c Mon Sep 17 00:00:00 2001 From: aaron <> Date: Mon, 13 Jan 2025 21:53:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E5=AE=B6=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=A7=AF=E5=88=86=E6=8A=B5=E6=89=A3=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/merchant_order.py | 65 +++++++++++++++++++++++++++-- app/models/merchant_order.py | 4 ++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 3736594..c425724 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -33,11 +33,21 @@ async def create_order( if not product: return error_response(code=404, message="商品不存在") + # 计算积分抵扣 + available_points = current_user.points or 0 + deduct_amount = min( + float(product.max_deduct_points), + available_points + ) if available_points > 0 else 0 + + # 计算实际支付金额 + original_amount = float(product.sale_price) + pay_amount = max(0, original_amount - deduct_amount) + # 生成订单号和核销码 while True: order_id = generate_order_id() verify_code = generate_verify_code() - # 检查是否已存在 exists = db.query(MerchantOrderDB).filter( (MerchantOrderDB.order_id == order_id) | (MerchantOrderDB.order_verify_code == verify_code) @@ -50,10 +60,17 @@ async def create_order( order_id=order_id, user_id=current_user.userid, merchant_product_id=order.merchant_product_id, - order_amount=order.order_amount, - status=MerchantOrderStatus.CREATED, # 创建时状态为已下单 + order_amount=original_amount, + deduct_amount=deduct_amount, + pay_amount=pay_amount, + status=MerchantOrderStatus.CREATED, order_verify_code=verify_code ) + + # 扣除用户积分 + if deduct_amount > 0: + current_user.points -= deduct_amount + db.add(db_order) try: @@ -289,4 +306,44 @@ async def get_order_detail( "merchant_phone": order.merchant_phone } - return success_response(data=order_data) \ No newline at end of file + return success_response(data=order_data) + +@router.post("/calculate-price", response_model=ResponseModel) +async def calculate_order_price( + order: MerchantOrderCreate, + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_current_user) +): + """计算订单价格 + + 1. 获取商品信息和用户积分 + 2. 计算最高可抵扣金额 + 3. 返回最终支付金额 + """ + # 查询商品信息 + product = db.query(MerchantProductDB).filter( + MerchantProductDB.id == order.merchant_product_id + ).first() + + if not product: + return error_response(code=404, message="商品不存在") + + # 获取用户积分 + available_points = current_user.points or 0 + + # 计算最高可抵扣金额(1积分 = 1分钱) + max_deduct_amount = min( + float(product.max_deduct_points), # 商品最高可抵扣金额 + available_points # 用户可用积分 + ) if available_points > 0 else 0 + + # 计算最终支付金额 + final_amount = max(0, float(product.sale_price) - max_deduct_amount) + + return success_response(data={ + "original_price": float(product.sale_price), + "available_points": available_points, + "max_deduct_points": float(product.max_deduct_points), + "max_deduct_amount": max_deduct_amount, + "final_amount": final_amount + }) \ No newline at end of file diff --git a/app/models/merchant_order.py b/app/models/merchant_order.py index 5d5cbfb..2853e8f 100644 --- a/app/models/merchant_order.py +++ b/app/models/merchant_order.py @@ -24,6 +24,8 @@ class MerchantOrderDB(Base): user_id = Column(Integer, ForeignKey("users.userid"), nullable=False) merchant_product_id = Column(Integer, ForeignKey("merchant_products.id"), nullable=False) order_amount = Column(DECIMAL(10,2), nullable=False) + deduct_amount = Column(DECIMAL(10,2), nullable=False, default=0) + pay_amount = Column(DECIMAL(10,2), nullable=False, default=0) status = Column(Enum(MerchantOrderStatus), nullable=False, default=MerchantOrderStatus.CREATED) order_verify_code = Column(String(21), unique=True, nullable=False) verify_time = Column(DateTime(timezone=True), nullable=True) @@ -41,6 +43,8 @@ class MerchantOrderInfo(BaseModel): user_id: int merchant_product_id: int order_amount: float + deduct_amount: float + pay_amount: float status: MerchantOrderStatus order_verify_code: str verify_time: Optional[datetime]