package com.tourguide.modules.order.service; import com.tourguide.common.huifu.RequestSeqUtil; import com.tourguide.modules.order.domain.PaymentMethod; import com.tourguide.modules.order.domain.RefundStatus; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.order.payment.PaymentRefundGateway; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.time.LocalDateTime; @Service public class OrderRefundService { private static final Logger log = LoggerFactory.getLogger(OrderRefundService.class); private final TourOrderMapper orderMapper; private final PaymentRefundGateway paymentRefundGateway; public OrderRefundService(TourOrderMapper orderMapper, PaymentRefundGateway paymentRefundGateway) { this.orderMapper = orderMapper; this.paymentRefundGateway = paymentRefundGateway; } public void requestRefund(TourOrder order) { if (order.getPaymentTime() == null || RefundStatus.REFUNDED.matches(order.getRefundStatus())) { return; } if (RefundStatus.REFUNDING.matches(order.getRefundStatus()) && StringUtils.hasText(order.getRefundOrderNo())) { return; } BigDecimal refundAmount = order.getPaymentAmount() == null ? order.getAmount() : order.getPaymentAmount(); if (!StringUtils.hasText(order.getRefundOrderNo())) { order.setRefundOrderNo(RequestSeqUtil.generateForBusiness("RF")); } order.setRefundStatus(RefundStatus.REFUNDING.getCode()); order.setRefundAmount(refundAmount); order.setRefundMethod(order.getPaymentMethod()); if (PaymentMethod.TEMPORARY_BYPASS.matches(order.getPaymentMethod())) { order.setRefundStatus(RefundStatus.REFUNDED.getCode()); order.setRefundTime(LocalDateTime.now()); orderMapper.updateById(order); return; } orderMapper.updateById(order); try { paymentRefundGateway.refund(order, refundAmount); } catch (RuntimeException exception) { order.setRefundStatus(RefundStatus.REFUND_FAILED.getCode()); orderMapper.updateById(order); log.error("Order refund request failed, orderId={}, orderNo={}, refundOrderNo={}", order.getId(), order.getOrderNo(), order.getRefundOrderNo(), exception); } } }