From 77649c76ec1c3afcb93e9963243d637665b3a307 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 21 八月 2026 16:56:28 +0800
Subject: [PATCH] update

---
 backend/src/main/java/com/tourguide/modules/order/service/TourOrderService.java |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/backend/src/main/java/com/tourguide/modules/order/service/TourOrderService.java b/backend/src/main/java/com/tourguide/modules/order/service/TourOrderService.java
index 66a9a50..6f966d8 100644
--- a/backend/src/main/java/com/tourguide/modules/order/service/TourOrderService.java
+++ b/backend/src/main/java/com/tourguide/modules/order/service/TourOrderService.java
@@ -9,11 +9,13 @@
 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.system.service.GuideNotificationService;
 import com.tourguide.modules.review.entity.OrderReview;
 import com.tourguide.modules.review.mapper.OrderReviewMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -25,10 +27,13 @@
 public class TourOrderService {
     private final TourOrderMapper orderMapper;
     private final OrderReviewMapper reviewMapper;
+    private final GuideNotificationService notificationService;
 
-    public TourOrderService(TourOrderMapper orderMapper, OrderReviewMapper reviewMapper) {
+    public TourOrderService(TourOrderMapper orderMapper, OrderReviewMapper reviewMapper,
+                            GuideNotificationService notificationService) {
         this.orderMapper = orderMapper;
         this.reviewMapper = reviewMapper;
+        this.notificationService = notificationService;
     }
 
     public PageResponse<TourOrderResponse> page(long page, long size, String keyword, Long visitorId,
@@ -68,8 +73,9 @@
     }
 
     @Transactional
-    public TourOrderResponse refund(Long id) {
-        TourOrder order = requireOrder(id);
+    public TourOrderResponse refund(Long id, BigDecimal refundAmount) {
+        TourOrder order = requireOrderForUpdate(id);
+        boolean notifyGuide = OrderStatus.PENDING_MEETING.matches(order.getStatus()) && order.getGuideId() != null;
         if (OrderStatus.REFUNDED.matches(order.getStatus()) || RefundStatus.REFUNDED.matches(order.getRefundStatus())) {
             throw new BusinessException(409, "订单已退款,请勿重复操作");
         }
@@ -79,13 +85,24 @@
         if (!OrderStatus.isRefundable(order.getStatus())) {
             throw new BusinessException(409, "当前订单状态不支持退款");
         }
+        BigDecimal refundableAmount = order.getPaymentAmount() == null ? order.getAmount() : order.getPaymentAmount();
+        if (refundableAmount == null || refundableAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new BusinessException(409, "订单无可退金额");
+        }
+        if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new BusinessException(400, "退款金额必须大于0");
+        }
+        if (refundAmount.compareTo(refundableAmount) > 0) {
+            throw new BusinessException(400, "退款金额不能超过当前可退金额");
+        }
         order.setRefundStatus(RefundStatus.REFUNDED.getCode());
         order.setStatus(OrderStatus.REFUNDED.getCode());
-        order.setRefundAmount(order.getPaymentAmount() == null ? order.getAmount() : order.getPaymentAmount());
+        order.setRefundAmount(refundAmount);
         order.setRefundTime(LocalDateTime.now());
         order.setRefundOrderNo(generateRefundOrderNo());
         order.setRefundMethod(order.getPaymentMethod());
         orderMapper.updateById(order);
+        if (notifyGuide) notificationService.notifyOrderCancelled(order);
         return TourOrderResponse.from(order);
     }
 
@@ -97,6 +114,14 @@
         return order;
     }
 
+    private TourOrder requireOrderForUpdate(Long id) {
+        TourOrder order = orderMapper.selectForUpdate(id);
+        if (order == null) {
+            throw new BusinessException(404, "订单不存在");
+        }
+        return order;
+    }
+
     private String generateRefundOrderNo() {
         String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
         return "RF" + time + UUID.randomUUID().toString().replace("-", "").substring(0, 6).toUpperCase();

--
Gitblit v1.7.1