update.
This commit is contained in:
parent
c713ec9a50
commit
dac4a1f32f
@ -29,6 +29,7 @@ from app.core.qcloud import qcloud_manager
|
|||||||
from app.core.imageprocessor import process_image, ImageFormat
|
from app.core.imageprocessor import process_image, ImageFormat
|
||||||
from starlette.datastructures import Headers
|
from starlette.datastructures import Headers
|
||||||
from app.models.merchant_order import MerchantOrderVerify
|
from app.models.merchant_order import MerchantOrderVerify
|
||||||
|
from app.core.point_manager import PointManager, PointRecordType
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@ -205,6 +206,18 @@ async def verify_order(
|
|||||||
order.MerchantOrderDB.verify_user_id = merchant_user.userid
|
order.MerchantOrderDB.verify_user_id = merchant_user.userid
|
||||||
order.MerchantOrderDB.status = MerchantOrderStatus.VERIFIED
|
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)
|
account_manager = AccountManager(db)
|
||||||
settlement_amount = float(order.MerchantProductDB.settlement_amount)
|
settlement_amount = float(order.MerchantProductDB.settlement_amount)
|
||||||
@ -245,6 +258,14 @@ async def apply_refund(
|
|||||||
order.status = MerchantOrderStatus.REFUNDING
|
order.status = MerchantOrderStatus.REFUNDING
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# 调用微信支付退款
|
||||||
|
wechat = WeChatClient()
|
||||||
|
await wechat.apply_refund(
|
||||||
|
order_id=order.order_id,
|
||||||
|
total_amount=int(float(order.pay_amount) * 100), # 转换为分
|
||||||
|
reason="用户申请退款"
|
||||||
|
)
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
return success_response(
|
return success_response(
|
||||||
message="退款申请成功",
|
message="退款申请成功",
|
||||||
@ -254,50 +275,6 @@ async def apply_refund(
|
|||||||
db.rollback()
|
db.rollback()
|
||||||
return error_response(code=500, message=f"申请退款失败: {str(e)}")
|
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)
|
@router.get("/{order_id}", response_model=ResponseModel)
|
||||||
async def get_order_detail(
|
async def get_order_detail(
|
||||||
@ -398,51 +375,6 @@ async def calculate_order_price(
|
|||||||
"amount": product.sale_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)
|
@router.get("/{order_id}/verify-qrcode", response_model=ResponseModel)
|
||||||
async def get_order_qrcode(
|
async def get_order_qrcode(
|
||||||
|
|||||||
@ -353,7 +353,7 @@ async def refund_notify(
|
|||||||
PointRecordType.CONSUME_DEDUCT,
|
PointRecordType.CONSUME_DEDUCT,
|
||||||
f"订单退款,返还积分",
|
f"订单退款,返还积分",
|
||||||
order.order_id
|
order.order_id
|
||||||
)
|
)
|
||||||
|
|
||||||
elif out_trade_no.startswith('P'): # 商家在线买单
|
elif out_trade_no.startswith('P'): # 商家在线买单
|
||||||
order = db.query(MerchantPayOrderDB).filter(
|
order = db.query(MerchantPayOrderDB).filter(
|
||||||
|
|||||||
@ -42,7 +42,6 @@ class MerchantOrderCreate(BaseModel):
|
|||||||
|
|
||||||
class MerchantOrderVerify(BaseModel):
|
class MerchantOrderVerify(BaseModel):
|
||||||
verify_code: str
|
verify_code: str
|
||||||
|
|
||||||
class MerchantOrderInfo(BaseModel):
|
class MerchantOrderInfo(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
order_id: str
|
order_id: str
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user