|
|
@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import shop.alien.entity.store.MerchantPaymentOrder;
|
|
|
import shop.alien.entity.store.StoreBookingTable;
|
|
|
import shop.alien.entity.store.StoreInfo;
|
|
|
import shop.alien.entity.store.UserReservation;
|
|
|
@@ -23,6 +24,7 @@ import shop.alien.store.config.BaseRedisService;
|
|
|
import shop.alien.store.listener.RedisKeyExpirationHandler;
|
|
|
import shop.alien.store.service.StoreBookingTableService;
|
|
|
import shop.alien.store.service.StoreInfoService;
|
|
|
+import shop.alien.store.service.MerchantPaymentOrderService;
|
|
|
import shop.alien.store.service.StoreReservationService;
|
|
|
import shop.alien.store.service.UserReservationOrderService;
|
|
|
import shop.alien.store.service.StoreBookingBusinessHoursService;
|
|
|
@@ -75,6 +77,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
private final StoreBookingBusinessHoursService storeBookingBusinessHoursService;
|
|
|
private final StoreBookingSettingsService storeBookingSettingsService;
|
|
|
private final EssentialHolidayComparisonMapper essentialHolidayComparisonMapper;
|
|
|
+ private final MerchantPaymentOrderService merchantPaymentOrderService;
|
|
|
|
|
|
/** 预约状态:已取消 */
|
|
|
private static final int STATUS_CANCELLED = 3;
|
|
|
@@ -1366,4 +1369,42 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public shop.alien.entity.result.R<String> refundByOrderId(Integer orderId, String refundReason, Integer refundType) {
|
|
|
+ log.info("StoreReservationServiceImpl.refundByOrderId?orderId={}, refundReason={}, refundType={}", orderId, refundReason, refundType);
|
|
|
+ if (orderId == null) {
|
|
|
+ return shop.alien.entity.result.R.fail("订单ID不能为空");
|
|
|
+ }
|
|
|
+ UserReservationOrder order = userReservationOrderService.getById(orderId);
|
|
|
+ if (order == null) {
|
|
|
+ return shop.alien.entity.result.R.fail("预订订单不存在");
|
|
|
+ }
|
|
|
+ if (order.getPaymentStatus() == null || order.getPaymentStatus() != 1) {
|
|
|
+ return shop.alien.entity.result.R.fail("订单未支付或已退款,无法退款");
|
|
|
+ }
|
|
|
+ if (order.getOrderCostType() == null || order.getOrderCostType() != 1) {
|
|
|
+ return shop.alien.entity.result.R.fail("免费订单无需退款");
|
|
|
+ }
|
|
|
+ if (order.getOutTradeNo() == null || order.getOutTradeNo().trim().isEmpty()) {
|
|
|
+ return shop.alien.entity.result.R.fail("订单无商户订单号,无法退款");
|
|
|
+ }
|
|
|
+ MerchantPaymentOrder paymentOrder = merchantPaymentOrderService.getPaidByOrderId(orderId);
|
|
|
+ if (paymentOrder == null || paymentOrder.getPayType() == null || paymentOrder.getPayType().trim().isEmpty()) {
|
|
|
+ return shop.alien.entity.result.R.fail("未找到已支付记录或支付方式,无法退款");
|
|
|
+ }
|
|
|
+ String amount = order.getDepositAmount() != null ? order.getDepositAmount().toString() : null;
|
|
|
+ if (amount == null || amount.trim().isEmpty()) {
|
|
|
+ return shop.alien.entity.result.R.fail("订单订金金额异常,无法退款");
|
|
|
+ }
|
|
|
+ String reason = refundReason != null && !refundReason.trim().isEmpty() ? refundReason.trim() : "按订单退款";
|
|
|
+ int type = refundType != null ? refundType : 1;
|
|
|
+ try {
|
|
|
+ MerchantPaymentStrategy strategy = merchantPaymentStrategyFactory.getStrategy(paymentOrder.getPayType());
|
|
|
+ return strategy.refund(order.getStoreId(), order.getOutTradeNo(), amount, reason, type);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("通过订单ID退款异常,orderId={}", orderId, e);
|
|
|
+ return shop.alien.entity.result.R.fail("退款失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|