diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index aa85b8f..ee76c7f 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -29,6 +29,7 @@ from app.core.qcloud import qcloud_manager from app.core.imageprocessor import process_image, ImageFormat from starlette.datastructures import Headers from app.models.merchant_order import MerchantOrderVerify +from app.core.point_manager import PointManager, PointRecordType router = APIRouter() @@ -205,6 +206,18 @@ async def verify_order( order.MerchantOrderDB.verify_user_id = merchant_user.userid order.MerchantOrderDB.status = MerchantOrderStatus.VERIFIED + + # 如果有积分奖励,赠送积分 + if order.MerchantProductDB.gift_points > 0: + point_manager = PointManager(db) + point_manager.add_points( + order.MerchantOrderDB.user_id, + order.MerchantProductDB.gift_points, + PointRecordType.CONSUME_RETURN, + f"团购券核销奖励", + order.MerchantOrderDB.order_id + ) + # 对商家进行结算 account_manager = AccountManager(db) settlement_amount = float(order.MerchantProductDB.settlement_amount) @@ -245,6 +258,14 @@ async def apply_refund( order.status = MerchantOrderStatus.REFUNDING try: + # 调用微信支付退款 + wechat = WeChatClient() + await wechat.apply_refund( + order_id=order.order_id, + total_amount=int(float(order.pay_amount) * 100), # 转换为分 + reason="用户申请退款" + ) + db.commit() return success_response( message="退款申请成功", @@ -254,50 +275,6 @@ async def apply_refund( db.rollback() return error_response(code=500, message=f"申请退款失败: {str(e)}") -@router.post("/{order_id}/refund/confirm", response_model=ResponseModel) -async def confirm_refund( - order_id: str, - db: Session = Depends(get_db), - current_user: UserDB = Depends(get_admin_user) -): - """确认退款(管理员)""" - # 查询订单和用户信息 - order = db.query(MerchantOrderDB).join( - UserDB, - MerchantOrderDB.user_id == UserDB.userid - ).filter( - MerchantOrderDB.order_id == order_id, - MerchantOrderDB.status == MerchantOrderStatus.REFUNDING # 只能确认退款中的订单 - ).first() - - if not order: - return error_response(code=404, message="订单不存在或状态不正确") - - try: - ## 如果订单有支付金额,则发起微信退款 - if order.pay_amount > 0: - # 退款 - wechat = WeChatClient() - try: - await wechat.apply_refund( - order_id=order.order_id, - total_amount=int(float(order.pay_amount) * 100), # 转换为分 - reason="用户申请退款" - ) - except Exception as e: - return error_response(code=500, message=f"退款失败: {str(e)}") - else: - # 更新状态为已退款 - order.status = MerchantOrderStatus.REFUNDED - db.commit() - - return success_response( - message="退款确认成功", - data=MerchantOrderInfo.model_validate(order) - ) - except Exception as e: - db.rollback() - return error_response(code=500, message=f"确认退款失败: {str(e)}") @router.get("/{order_id}", response_model=ResponseModel) async def get_order_detail( @@ -398,51 +375,6 @@ async def calculate_order_price( "amount": product.sale_price }) -class RefundRequest(BaseModel): - """退款请求""" - order_id: str - -@router.post("/refund/approve", response_model=ResponseModel) -async def refund_merchant_order( - request: RefundRequest, - db: Session = Depends(get_db), - admin_user: UserDB = Depends(get_admin_user) -): - """ - 审核通过退款申请(管理员接口) - - - 检查订单是否处于退款中状态 - - 调用微信支付退款接口 - - 退款状态由微信支付回调更新 - """ - try: - # 查询订单 - order = db.query(MerchantOrderDB).filter( - MerchantOrderDB.order_id == request.order_id, - MerchantOrderDB.status == MerchantOrderStatus.REFUNDING, # 只能退款申请中的订单 - MerchantOrderDB.pay_status == True # 已支付的订单 - ).first() - - if not order: - return error_response(code=404, message="订单不存在或状态不正确") - - # 调用微信支付退款 - wechat = WeChatClient() - try: - await wechat.apply_refund( - order_id=order.order_id, - total_amount=int(float(order.pay_amount) * 100), # 转换为分 - reason="用户申请退款" - ) - except Exception as e: - return error_response(code=500, message=f"申请退款失败: {str(e)}") - - db.commit() - return success_response(message="退款申请成功") - - except Exception as e: - db.rollback() - return error_response(code=500, message=f"处理退款失败: {str(e)}") @router.get("/{order_id}/verify-qrcode", response_model=ResponseModel) async def get_order_qrcode( diff --git a/app/api/endpoints/wechat.py b/app/api/endpoints/wechat.py index 49caa96..9b519d8 100644 --- a/app/api/endpoints/wechat.py +++ b/app/api/endpoints/wechat.py @@ -353,7 +353,7 @@ async def refund_notify( PointRecordType.CONSUME_DEDUCT, f"订单退款,返还积分", order.order_id - ) + ) elif out_trade_no.startswith('P'): # 商家在线买单 order = db.query(MerchantPayOrderDB).filter( diff --git a/app/models/merchant_order.py b/app/models/merchant_order.py index 25defe1..922f00d 100644 --- a/app/models/merchant_order.py +++ b/app/models/merchant_order.py @@ -42,7 +42,6 @@ class MerchantOrderCreate(BaseModel): class MerchantOrderVerify(BaseModel): verify_code: str - class MerchantOrderInfo(BaseModel): id: int order_id: str