Browse Source

新增订单完成接口

zhangchen 3 weeks ago
parent
commit
227126048e

+ 13 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerConsultationOrderController.java

@@ -377,5 +377,18 @@ public class LawyerConsultationOrderController {
         return consultationOrderService.applyRefund(clientUserId, orderId, applyRefundReason);
     }
 
+    @ApiOperation("用户完成订单")
+    @ApiOperationSupport(order = 18)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "clientUserId", value = "客户端用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "orderId", value = "订单ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "applyRefundReason", value = "申请退款原因", dataType = "String", paramType = "query", required = true)
+    })
+    @PostMapping("/completeOrder")
+    public R<Boolean> completeOrder(@RequestParam Integer clientUserId, @RequestParam Integer orderId) {
+        log.info("LawyerConsultationOrderController.completeOrder?clientUserId={},orderId{}", clientUserId, orderId);
+        return consultationOrderService.completeOrder(clientUserId, orderId);
+    }
+
 }
 

+ 10 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/LawyerConsultationOrderService.java

@@ -143,5 +143,15 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @return
      */
     R<Boolean> applyRefund(Integer clientUserId, Integer orderId, String applyRefundReason);
+
+
+    /**
+     * 用户端完成订单
+     *
+     * @param clientUserId
+     * @param orderId
+     * @return
+     */
+    R<Boolean> completeOrder(Integer clientUserId, Integer orderId);
 }
 

+ 78 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -1424,6 +1424,84 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
     }
 
     /**
+     * 用户端完成订单
+     * <p>
+     * 完成订单前会进行以下校验和处理:
+     * 1. 参数校验:用户ID和订单ID不能为空
+     * 2. 订单存在性校验:订单必须存在
+     * 3. 订单归属校验:订单必须属于该用户
+     * 4. 订单状态校验:只有进行中(2)状态的订单可以完成
+     * 5. 更新订单状态为已完成(3),并更新完成时间
+     * </p>
+     *
+     * @param clientUserId 客户端用户ID
+     * @param orderId      订单ID
+     * @return 完成订单结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> completeOrder(Integer clientUserId, Integer orderId) {
+        log.info("开始完成订单,用户ID={}, 订单ID={}", clientUserId, orderId);
+
+        // 1. 参数校验
+        if (clientUserId == null || clientUserId <= 0) {
+            log.warn("完成订单失败:用户ID为空或无效,clientUserId={}", clientUserId);
+            return R.fail("用户ID不能为空");
+        }
+
+        if (orderId == null || orderId <= 0) {
+            log.warn("完成订单失败:订单ID为空或无效,orderId={}", orderId);
+            return R.fail("订单ID不能为空");
+        }
+
+        // 2. 查询订单信息
+        LawyerConsultationOrder order = consultationOrderMapper.selectById(orderId);
+        if (order == null) {
+            log.warn("完成订单失败:订单不存在,订单ID={}", orderId);
+            return R.fail("订单不存在");
+        }
+
+        // 3. 订单归属校验:订单必须属于该用户
+        if (!clientUserId.equals(order.getClientUserId())) {
+            log.warn("完成订单失败:订单不属于该用户,订单ID={}, 订单用户ID={}, 请求用户ID={}",
+                    orderId, order.getClientUserId(), clientUserId);
+            return R.fail("订单不属于该用户,无法完成订单");
+        }
+
+        // 4. 订单状态校验:只有进行中(2)状态的订单可以完成
+        Integer orderStatus = order.getOrderStatus();
+        Integer inProgressStatus = LawyerStatusEnum.INPROGRESS.getStatus(); // 2:进行中
+        Integer completeStatus = LawyerStatusEnum.COMPLETE.getStatus(); // 3:已完成
+
+        if (!inProgressStatus.equals(orderStatus)) {
+            log.warn("完成订单失败:订单状态不允许完成,订单ID={}, 订单编号={}, 订单状态={}",
+                    orderId, order.getOrderNumber(), orderStatus);
+            return R.fail("只有进行中的订单可以完成");
+        }
+
+        // 5. 更新订单状态为已完成(3),并更新咨询结束时间和更新时间
+        LambdaUpdateWrapper<LawyerConsultationOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        Date now = new Date();
+        updateWrapper.eq(LawyerConsultationOrder::getId, orderId)
+                .set(LawyerConsultationOrder::getOrderStatus, completeStatus)
+                .set(LawyerConsultationOrder::getEndTime, now)
+                .set(LawyerConsultationOrder::getUpdatedTime, now);
+
+        int updateCount = consultationOrderMapper.update(null, updateWrapper);
+        boolean success = updateCount > 0;
+
+        // 6. 记录操作结果
+        if (success) {
+            log.info("完成订单成功,订单ID={}, 订单编号={}, 原状态={}, 新状态=已完成",
+                    orderId, order.getOrderNumber(), orderStatus);
+            return R.data(true, "订单已完成");
+        } else {
+            log.error("完成订单失败:更新数据库失败,订单ID={}, 订单编号={}", orderId, order.getOrderNumber());
+            return R.fail("完成订单失败,请稍后重试");
+        }
+    }
+
+    /**
      * 格式化收益金额(分转元)
      *
      * @param revenueInCents 收益金额(单位:分)