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/MiniTourOrderCommandService.java |   75 ++++++++++++++++++++++---------------
 1 files changed, 45 insertions(+), 30 deletions(-)

diff --git a/backend/src/main/java/com/tourguide/modules/order/service/MiniTourOrderCommandService.java b/backend/src/main/java/com/tourguide/modules/order/service/MiniTourOrderCommandService.java
index b6daef3..320daf1 100644
--- a/backend/src/main/java/com/tourguide/modules/order/service/MiniTourOrderCommandService.java
+++ b/backend/src/main/java/com/tourguide/modules/order/service/MiniTourOrderCommandService.java
@@ -10,15 +10,18 @@
 import com.tourguide.modules.operation.mapper.ScenicPricingMapper;
 import com.tourguide.modules.operation.service.PlatformSettingsService;
 import com.tourguide.modules.order.domain.OrderStatus;
+import com.tourguide.modules.order.domain.PaymentMethod;
 import com.tourguide.modules.order.domain.RefundStatus;
 import com.tourguide.modules.order.dto.MiniOrderCreateRequest;
 import com.tourguide.modules.order.dto.TourOrderResponse;
 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.user.entity.MiniUser;
 import com.tourguide.modules.user.entity.GuideUser;
 import com.tourguide.modules.user.mapper.GuideUserMapper;
 import com.tourguide.modules.user.service.MiniUserService;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -37,6 +40,10 @@
     private final ScenicPricingMapper pricingMapper;
     private final GuideUserMapper guideUserMapper;
     private final PlatformSettingsService platformSettingsService;
+    private final GuideNotificationService notificationService;
+    private final OrderRefundService orderRefundService;
+    private final GuideOrderMatchingService matchingService;
+    private final boolean skipPayment;
 
     public MiniTourOrderCommandService(TourOrderMapper orderMapper,
                                        MiniUserService miniUserService,
@@ -44,7 +51,11 @@
                                        ScenicMeetingPointMapper meetingPointMapper,
                                        ScenicPricingMapper pricingMapper,
                                        GuideUserMapper guideUserMapper,
-                                       PlatformSettingsService platformSettingsService) {
+                                       PlatformSettingsService platformSettingsService,
+                                       GuideNotificationService notificationService,
+                                       OrderRefundService orderRefundService,
+                                       GuideOrderMatchingService matchingService,
+                                       @Value("${tourguide.order.skip-payment:false}") boolean skipPayment) {
         this.orderMapper = orderMapper;
         this.miniUserService = miniUserService;
         this.scenicSpotMapper = scenicSpotMapper;
@@ -52,6 +63,10 @@
         this.pricingMapper = pricingMapper;
         this.guideUserMapper = guideUserMapper;
         this.platformSettingsService = platformSettingsService;
+        this.notificationService = notificationService;
+        this.orderRefundService = orderRefundService;
+        this.matchingService = matchingService;
+        this.skipPayment = skipPayment;
     }
 
     @Transactional
@@ -77,9 +92,12 @@
         order.setVisitorId(visitor.getId());
         order.setVisitorNickname(visitor.getNickname());
         order.setVisitorMobile(visitor.getMobile());
+        order.setScenicSpotId(scenicSpot.getId());
         order.setScenicName(scenicSpot.getScenicName());
+        order.setMeetingPointId(meetingPoint.getId());
         order.setMeetingPointName(meetingPoint.getPointName());
         order.setPackageName(packageName(pricing.getServiceType()));
+        order.setServicePackageId(pricing.getId());
         order.setOrderType(pricing.getServiceType());
         order.setPeopleCount(request.getPeopleCount());
         order.setUnitPrice(discountUnitPrice);
@@ -91,30 +109,22 @@
         order.setAmount(subtotalAmount);
         order.setPlacedAt(now);
         order.setMeetingPointCount(1);
-        order.setStatus(OrderStatus.PENDING_PAYMENT.getCode());
+        Integer settlementDays = platformSettingsService.getSettings().getSettlementDays();
+        order.setSettlementDays(settlementDays == null ? 1 : Math.max(0, settlementDays));
+        if (skipPayment) {
+            order.setPaymentMethod(PaymentMethod.TEMPORARY_BYPASS.getCode());
+            order.setPaymentOrderNo("TEMP" + order.getOrderNo());
+            order.setPaymentAmount(subtotalAmount);
+            order.setPaymentTime(now);
+            order.setStatus(OrderStatus.PENDING_ACCEPT.getCode());
+        } else {
+            order.setStatus(OrderStatus.PENDING_PAYMENT.getCode());
+        }
         order.setRefundStatus(RefundStatus.NONE.getCode());
         orderMapper.insert(order);
-        return TourOrderResponse.from(order);
-    }
-
-    /**
-     * 确认游客订单支付成功,并将订单流转到等待导游接单状态。
-     * 当前小程序尚未接入微信支付回调,因此由待支付页面在支付动作成功后调用;
-     * 正式接入微信支付后应由服务端支付回调触发本方法对应的领域逻辑。
-     */
-    @Transactional
-    public TourOrderResponse confirmPayment(Long visitorId, Long orderId) {
-        TourOrder order = requireVisitorOrder(visitorId, orderId);
-        if (!OrderStatus.PENDING_PAYMENT.matches(order.getStatus())) {
-            throw new BusinessException(409, "当前订单状态不支持支付");
+        if (skipPayment) {
+            matchingService.match(order.getId());
         }
-        LocalDateTime now = LocalDateTime.now();
-        order.setPaymentMethod("WECHAT");
-        order.setPaymentOrderNo("LOCAL" + order.getOrderNo());
-        order.setPaymentAmount(order.getAmount());
-        order.setPaymentTime(now);
-        order.setStatus(OrderStatus.PENDING_ACCEPT.getCode());
-        orderMapper.updateById(order);
         return TourOrderResponse.from(order);
     }
 
@@ -157,21 +167,26 @@
 
     @Transactional
     public TourOrderResponse cancel(Long visitorId, Long orderId) {
-        TourOrder order = requireVisitorOrder(visitorId, orderId);
+        TourOrder order = orderMapper.selectForUpdate(orderId);
+        if (order == null || visitorId == null || !visitorId.equals(order.getVisitorId())) {
+            throw new BusinessException(404, "订单不存在");
+        }
+        if (OrderStatus.CANCELLED.matches(order.getStatus())) {
+            return TourOrderResponse.from(order);
+        }
+        boolean notifyGuide = OrderStatus.PENDING_MEETING.matches(order.getStatus()) && order.getGuideId() != null;
         if (!OrderStatus.PENDING_PAYMENT.matches(order.getStatus())
                 && !OrderStatus.PENDING_ACCEPT.matches(order.getStatus())
                 && !OrderStatus.PENDING_MEETING.matches(order.getStatus())) {
             throw new BusinessException(409, "当前订单状态不支持取消");
         }
         order.setStatus(OrderStatus.CANCELLED.getCode());
-        if (order.getPaymentTime() != null) {
-            order.setRefundStatus(RefundStatus.REFUNDED.getCode());
-            order.setRefundAmount(order.getPaymentAmount());
-            order.setRefundTime(LocalDateTime.now());
-            order.setRefundOrderNo("RF" + generateOrderNo());
-            order.setRefundMethod(order.getPaymentMethod());
+        if (order.getPaymentTime() == null) {
+            orderMapper.updateById(order);
+        } else {
+            orderRefundService.requestRefund(order);
         }
-        orderMapper.updateById(order);
+        if (notifyGuide) notificationService.notifyVisitorCancelledOrder(order);
         return TourOrderResponse.from(order);
     }
 

--
Gitblit v1.7.1