Просмотр исходного кода

Merge branch 'sit' into uat-20260202

dujian 1 месяц назад
Родитель
Сommit
b9e0d0e8ce

+ 26 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreReservationController.java

@@ -296,4 +296,30 @@ public class StoreReservationController {
             return R.fail("退款失败:" + e.getMessage());
         }
     }
+
+    @ApiOperationSupport(order = 10)
+    @ApiOperation("发送订金退款短信和通知")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reservationId", value = "预约ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @PostMapping("/sendDepositRefundSmsAndNotice")
+    public R<String> sendDepositRefundSmsAndNotice(@RequestParam Integer reservationId) {
+        log.info("StoreReservationController.sendDepositRefundSmsAndNotice?reservationId={}", reservationId);
+
+        if (reservationId == null) {
+            return R.fail("预约ID不能为空");
+        }
+
+        try {
+            boolean result = storeReservationService.sendDepositRefundSmsAndNotice(reservationId);
+            if (result) {
+                return R.success("发送订金退款短信和通知成功");
+            } else {
+                return R.fail("发送订金退款短信和通知失败");
+            }
+        } catch (Exception e) {
+            log.error("发送订金退款短信和通知失败", e);
+            return R.fail("发送失败:" + e.getMessage());
+        }
+    }
 }

+ 9 - 0
alien-store/src/main/java/shop/alien/store/service/StoreReservationService.java

@@ -103,4 +103,13 @@ public interface StoreReservationService {
      * @return 本次退款成功的订单数
      */
     int retryRefundFailedOrders();
+
+    /**
+     * 发送订金退款短信和通知
+     * 根据预约ID查询预约和订单信息,然后发送退款短信和通知
+     *
+     * @param reservationId 预约ID
+     * @return 是否成功
+     */
+    boolean sendDepositRefundSmsAndNotice(Integer reservationId);
 }

+ 45 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreReservationServiceImpl.java

@@ -209,8 +209,16 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
 
                 log.info("商家端取消预约成功(付费订单),reservationId={}, orderId={}", reservationId, order.getId());
                 
-                // 发送短信通知
+                // 先发送取消通知和短信
                 sendCancelReservationSms(reservation, cancelReason);
+                
+                // 付费订单:再发送订金退款通知和短信
+                try {
+                    sendDepositRefundSmsAndNoticeInternal(reservation, order);
+                } catch (Exception smsEx) {
+                    log.error("商家取消预约后发送退款通知/短信失败,不影响取消结果,reservationId={}", reservationId, smsEx);
+                }
+                
                 return true;
             } catch (Exception e) {
                 log.error("付费订单取消退款失败,reservationId={}, orderId={}, error={}", 
@@ -345,13 +353,45 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
         }
     }
 
+    @Override
+    public boolean sendDepositRefundSmsAndNotice(Integer reservationId) {
+        log.info("StoreReservationServiceImpl.sendDepositRefundSmsAndNotice?reservationId={}", reservationId);
+
+        if (reservationId == null) {
+            throw new RuntimeException("预约ID不能为空");
+        }
+
+        // 查询预约信息
+        UserReservation reservation = this.getById(reservationId);
+        if (reservation == null) {
+            throw new RuntimeException("预约不存在");
+        }
+
+        // 查询关联的订单信息
+        LambdaQueryWrapper<UserReservationOrder> orderWrapper = new LambdaQueryWrapper<>();
+        orderWrapper.eq(UserReservationOrder::getReservationId, reservationId);
+        UserReservationOrder order = userReservationOrderService.getOne(orderWrapper);
+
+        if (order == null) {
+            throw new RuntimeException("预约订单不存在");
+        }
+
+        try {
+            sendDepositRefundSmsAndNoticeInternal(reservation, order);
+            return true;
+        } catch (Exception e) {
+            log.error("发送订金退款短信和通知失败,reservationId={}", reservationId, e);
+            throw new RuntimeException("发送订金退款短信和通知失败:" + e.getMessage());
+        }
+    }
+
     /**
-     * 发送订金退款短信和通知
+     * 发送订金退款短信和通知(内部方法)
      *
      * @param reservation 预约信息
      * @param order 订单信息
      */
-    private void sendDepositRefundSmsAndNotice(UserReservation reservation, UserReservationOrder order) {
+    private void sendDepositRefundSmsAndNoticeInternal(UserReservation reservation, UserReservationOrder order) {
         try {
             // 获取用户手机号
             String userPhone = reservation.getReservationUserPhone();
@@ -677,7 +717,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
 
         // 核销成功后,发送订金退款短信和通知
         try {
-            sendDepositRefundSmsAndNotice(reservation, order);
+            sendDepositRefundSmsAndNoticeInternal(reservation, order);
         } catch (Exception e) {
             log.error("核销后发送订金退款短信和通知失败,但不影响核销流程,verificationCode={}, orderId={}, error={}",
                     verificationCode, order.getId(), e.getMessage(), e);
@@ -1380,7 +1420,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
                 }
                 
                 // 发送短信和通知
-                sendDepositRefundSmsAndNotice(reservation, order);
+                sendDepositRefundSmsAndNoticeInternal(reservation, order);
                 log.info("退款通知和短信发送完成,outTradeNo={}, reservationId={}", outTradeNo, reservationId);
             } else {
                 log.warn("支付退款失败,不发送通知和短信,outTradeNo={}, result={}", outTradeNo, refundResult);

+ 5 - 0
alien-store/src/main/java/shop/alien/store/service/impl/UserReservationServiceImpl.java

@@ -381,6 +381,11 @@ public class UserReservationServiceImpl extends ServiceImpl<UserReservationMappe
                 list.add(vo);
             }
         }
+        // 按预约开始时间正序(支持 HH:mm 或 yyyy-MM-dd HH:mm,解析失败排最后)
+        list.sort(Comparator.comparingInt(vo -> {
+            int m = timeToMinutes(vo.getStartTime());
+            return m < 0 ? Integer.MAX_VALUE : m;
+        }));
         return list;
     }