Browse Source

优化取消接口

zhangchen 4 days ago
parent
commit
fab2c26211

+ 33 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerConsultationOrderController.java

@@ -15,7 +15,6 @@ import shop.alien.lawyer.service.LawyerConsultationOrderService;
 import shop.alien.lawyer.service.OrderExpirationService;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
 
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -298,15 +297,46 @@ public class LawyerConsultationOrderController {
         return R.data(consultationOrderService.getConsultationOrderDetail(lawyerOrderId));
     }
 
+    /**
+     * 取消律师咨询订单(用户端)
+     * <p>
+     * 支持取消待支付和待接单状态的订单:
+     * - 待支付订单:取消后订单状态变更为已取消,同时取消订单支付超时计时器
+     * - 待接单订单:取消后订单状态变更为已退款
+     * 已取消或已完成的订单不允许再次取消
+     * </p>
+     *
+     * @param id 订单ID
+     * @return 取消结果,true表示成功,false表示失败
+     */
     @ApiOperation("取消律师咨询订单(用户端)")
     @ApiOperationSupport(order = 13)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "订单id", dataType = "String", paramType = "query", required = true)
+            @ApiImplicitParam(name = "id", value = "订单ID", dataType = "String", paramType = "query", required = true)
     })
     @PostMapping("/cancelOrder")
     public R<Boolean> cancelOrder(@RequestParam(value = "id", required = true) String id) {
         log.info("LawyerConsultationOrderController.cancelOrder?id={}", id);
-        return R.data(consultationOrderService.cancelOrder(id));
+
+        // 参数校验
+        if (id == null || id.trim().isEmpty()) {
+            log.warn("取消订单失败:订单ID为空");
+            return R.fail("订单ID不能为空");
+        }
+
+        try {
+            boolean success = consultationOrderService.cancelOrder(id);
+            if (success) {
+                log.info("取消订单成功,订单ID={}", id);
+                return R.data(true);
+            } else {
+                log.warn("取消订单失败,订单ID={}", id);
+                return R.fail("取消订单失败,请检查订单状态");
+            }
+        } catch (Exception e) {
+            log.error("取消订单异常,订单ID={},异常信息:{}", id, e.getMessage(), e);
+            return R.fail("取消订单失败:" + e.getMessage());
+        }
     }
 
     @ApiOperation("查询咨询订单信息(律师端)")

+ 15 - 11
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -1070,7 +1070,7 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
     /**
      * 取消律师咨询订单
      * <p>
-     * 取消订单前会进行以下校验和处理
+     * 取消订单的业务逻辑
      * 1. 参数校验:订单ID不能为空
      * 2. 订单存在性校验:订单必须存在
      * 3. 订单状态校验:已取消或已完成的订单不允许再次取消
@@ -1104,43 +1104,47 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         // 3. 订单状态校验
         Integer orderStatus = order.getOrderStatus();
         String orderNumber = order.getOrderNumber();
+        
+        // 提取订单状态常量,避免魔法值
         Integer cancelStatus = LawyerStatusEnum.CANCEL.getStatus();
         Integer completedStatus = LawyerStatusEnum.COMPLETE.getStatus();
         Integer waitAcceptStatus = LawyerStatusEnum.WAIT_ACCEPT.getStatus();
         Integer waitPayStatus = LawyerStatusEnum.WAIT_PAY.getStatus();
         Integer refundedStatus = LawyerStatusEnum.REFUNDED.getStatus();
 
-        // 3.1 检查订单是否已取消
-        if (cancelStatus.equals(orderStatus)) {
+        // 3.1 检查订单是否已取消(使用 Objects.equals 避免空指针异常)
+        if (Objects.equals(cancelStatus, orderStatus)) {
             log.warn("取消订单失败:订单已取消,订单ID={}, 订单编号={}", id, orderNumber);
             return false;
         }
 
         // 3.2 检查订单是否已完成
-        if (completedStatus.equals(orderStatus)) {
+        if (Objects.equals(completedStatus, orderStatus)) {
             log.warn("取消订单失败:订单已完成,不允许取消,订单ID={}, 订单编号={}", id, orderNumber);
             return false;
         }
 
         // 4. 如果订单是待支付状态,取消Redis中的订单支付超时计时器
-        if (waitPayStatus.equals(orderStatus) && StringUtils.hasText(orderNumber)) {
+        if (Objects.equals(waitPayStatus, orderStatus) && StringUtils.hasText(orderNumber)) {
             try {
                 orderExpirationService.cancelOrderPaymentTimeout(orderNumber);
                 log.info("已取消订单支付超时计时器,订单编号={}", orderNumber);
             } catch (Exception e) {
-                log.error("取消订单支付超时计时器失败,订单编号={}", orderNumber, e);
+                log.error("取消订单支付超时计时器失败,订单编号={},异常信息:{}", orderNumber, e.getMessage(), e);
                 // 继续执行取消订单操作,不因取消计时器失败而中断
             }
         }
 
         // 5. 根据订单状态更新为相应状态
-        Integer targetStatus = null;
-        if (waitAcceptStatus.equals(orderStatus)) {
+        Integer targetStatus;
+        if (Objects.equals(waitAcceptStatus, orderStatus)) {
             // 待接单状态:更新为已退款状态
             targetStatus = refundedStatus;
-        } else if (waitPayStatus.equals(orderStatus)) {
+            log.debug("待接单订单取消,将更新为已退款状态,订单ID={}", id);
+        } else if (Objects.equals(waitPayStatus, orderStatus)) {
             // 待支付状态:更新为已取消状态
             targetStatus = cancelStatus;
+            log.debug("待支付订单取消,将更新为已取消状态,订单ID={}", id);
         } else {
             log.warn("取消订单失败:订单状态不允许取消,订单ID={}, 订单编号={}, 订单状态={}", 
                     id, orderNumber, orderStatus);
@@ -1161,8 +1165,8 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
             log.info("取消订单成功,订单ID={}, 订单编号={}, 原状态={}, 新状态={}", 
                     id, orderNumber, orderStatus, targetStatus);
         } else {
-            log.error("取消订单失败:更新数据库失败,订单ID={}, 订单编号={}, 原状态={}", 
-                    id, orderNumber, orderStatus);
+            log.error("取消订单失败:更新数据库失败,订单ID={}, 订单编号={}, 原状态={}, 目标状态={}", 
+                    id, orderNumber, orderStatus, targetStatus);
         }
 
         return success;