This commit is contained in:
aaron 2025-02-15 18:26:48 +08:00
parent c713ec9a50
commit dac4a1f32f
3 changed files with 22 additions and 91 deletions

View File

@ -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(

View File

@ -42,7 +42,6 @@ class MerchantOrderCreate(BaseModel):
class MerchantOrderVerify(BaseModel):
verify_code: str
class MerchantOrderInfo(BaseModel):
id: int
order_id: str