Преглед изворни кода

添加“订单确认收货接口”、“取消退货接口接口”接口

wangzhijun пре 1 недеља
родитељ
комит
0010d55f40

+ 17 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductOrderController.java

@@ -5,12 +5,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderOperateDTO;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
 import com.ylx.massage.domain.vo.ProductOrderDetailVo;
 import com.ylx.massage.domain.vo.ProductOrderListVo;
 import com.ylx.massage.service.IProductOrderInfoService;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -97,4 +100,18 @@ public class ProductOrderController extends BaseController {
             return R.fail(e.getMessage());
         }
     }
+
+    @ApiOperation("订单确认收货接口")
+    @PutMapping("/confirm/receipt")
+    public R confirmReceipt(@Validated @RequestBody ProductOrderOperateDTO dto) {
+        this.productOrderInfoService.confirmReceipt(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("取消退货接口接口")
+    @PutMapping("/cancel/return")
+    public R cancelReturn(@Validated @RequestBody ProductOrderOperateDTO dto) {
+        this.productOrderInfoService.cancelReturn(dto);
+        return R.ok();
+    }
 }

+ 20 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/ProductOrderOperateDTO.java

@@ -0,0 +1,20 @@
+package com.ylx.massage.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("商品订单操作通用DTO")
+public class ProductOrderOperateDTO {
+
+    @NotNull(message = "订单ID不能为空")
+    @ApiModelProperty("订单ID")
+    private Long orderId;
+
+    @ApiModelProperty("操作备注/原因")
+    private String remark;
+
+}

+ 6 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/IProductOrderInfoService.java

@@ -1,11 +1,11 @@
 package com.ylx.massage.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.ProductOrderInfo;
-import com.ylx.massage.domain.TOrder;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderOperateDTO;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
 import com.ylx.massage.domain.vo.ProductOrderDetailVo;
 import com.ylx.massage.domain.vo.ProductOrderListVo;
@@ -48,4 +48,8 @@ public interface IProductOrderInfoService extends IService<ProductOrderInfo> {
      * @return 订单详情
      */
     ProductOrderDetailVo getProductOrderDetail(String orderNo, String openId);
+
+    void confirmReceipt(ProductOrderOperateDTO dto);
+
+    void cancelReturn(ProductOrderOperateDTO dto);
 }

+ 70 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductOrderInfoServiceImpl.java

@@ -1,14 +1,18 @@
 package com.ylx.massage.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.exception.ServiceException;
+import com.ylx.common.utils.SecurityUtils;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderOperateDTO;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
 import com.ylx.massage.domain.vo.ProductOrderDetailVo;
 import com.ylx.massage.domain.vo.ProductOrderListVo;
@@ -23,7 +27,6 @@ import com.ylx.massage.service.TRechargeService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.utils.OrderNumberGenerator;
 import com.ylx.product.domain.ProductOrderAddress;
-import com.ylx.product.domain.vo.ProductOrderAddressVo;
 import com.ylx.product.service.IProductOrderAddressService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -345,4 +348,70 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         detail.setOrderStatusName(ProductOrderStatusEnum.getDescByCode(detail.getOrderStatus()));
         return detail;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmReceipt(ProductOrderOperateDTO dto) {
+
+        // 1. 获取当前登录用户(公共方法提取)
+        WxLoginUser loginUser = getCurrentWxLoginUser();
+
+        // 2. 查询并校验订单(公共方法提取)
+        ProductOrderInfo productOrderInfo = getAndCheckOrder(dto.getOrderId(), loginUser.getCOpenid());
+
+        // 3. 状态校验:必须是 待收货 才能确认收货
+        if (!ProductOrderStatusEnum.WAIT_RECEIVE.getCode().equals(productOrderInfo.getOrderStatus())) {
+            throw new RuntimeException("订单状态异常,仅待收货状态可确认收货");
+        }
+
+        // 修改订单信息
+        LocalDateTime now = LocalDateTime.now();
+        productOrderInfo.setOrderStatus(ProductOrderStatusEnum.RECEIVED.getCode());
+        productOrderInfo.setReceiveTime(now);
+        productOrderInfo.setUpdateTime(now);
+        this.updateById(productOrderInfo);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelReturn(ProductOrderOperateDTO dto) {
+
+        // 1. 获取当前登录用户(公共方法提取)
+        WxLoginUser loginUser = getCurrentWxLoginUser();
+
+        // 2. 查询并校验订单(公共方法提取)
+        ProductOrderInfo productOrderInfo = getAndCheckOrder(dto.getOrderId(), loginUser.getCOpenid());
+
+        // 3. 状态校验:必须是 退货中/退款中 才能取消退货
+        if (!ProductOrderStatusEnum.RETURNING.getCode().equals(productOrderInfo.getOrderStatus())) {
+            throw new RuntimeException("订单状态异常,仅退货中状态可取消退货");
+        }
+        // 修改订单信息
+        LocalDateTime now = LocalDateTime.now();
+        productOrderInfo.setOrderStatus(ProductOrderStatusEnum.WAIT_RECEIVE.getCode());
+        productOrderInfo.setUpdateTime(now);
+        this.updateById(productOrderInfo);
+    }
+
+    private WxLoginUser getCurrentWxLoginUser() {
+        WxLoginUser loginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(loginUser)) {
+            throw new RuntimeException("用户未登录或登录已过期");
+        }
+        return loginUser;
+    }
+
+    private ProductOrderInfo getAndCheckOrder(Long orderId, String openId) {
+        LambdaQueryWrapper<ProductOrderInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProductOrderInfo::getId, orderId)
+                .eq(ProductOrderInfo::getOpenId, openId);
+
+        // 订单是单条,直接用 selectOne 更合理
+        ProductOrderInfo orderInfo = this.productOrderInfoMapper.selectOne(queryWrapper);
+        if (ObjectUtil.isNull(orderInfo)) {
+            throw new RuntimeException("订单不存在或无权限操作");
+        }
+        return orderInfo;
+    }
+
 }