Ver Fonte

Merge remote-tracking branch 'origin/point_dev' into point_dev

jinshihui há 4 dias atrás
pai
commit
319ccd1acc

+ 8 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AfterSaleOrderController.java

@@ -43,6 +43,14 @@ public class AfterSaleOrderController {
         return R.ok();
     }
 
+    @ApiOperation("取消退货/取消申请")
+    @Log(title = "取消退货/取消申请", businessType = BusinessType.UPDATE)
+    @PutMapping("/cancel/{orderId}")
+    public R cancel(@PathVariable Long orderId) {
+        this.afterSaleOrderService.cancel(orderId);
+        return R.ok();
+    }
+
     @ApiOperation("售后信息修改物流单号")
     @Log(title = "售后信息修改物流单号", businessType = BusinessType.UPDATE)
     @PutMapping

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/AfterSaleOrder.java

@@ -46,7 +46,7 @@ public class AfterSaleOrder implements Serializable {
     private Integer afterSaleStatus;
 
     /** 申请原因 */
-    private Integer applyReason;
+    private String applyReason;
 
     /** 问题描述 */
     private String applyDesc;

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/AfterSaleOrderDTO.java

@@ -25,7 +25,7 @@ public class AfterSaleOrderDTO {
 
     @NotNull(message = "申请原因不能为空")
     @ApiModelProperty(value = "申请原因", required = true)
-    private Integer applyReason;
+    private String applyReason;
 
     @ApiModelProperty(value = "售后类型 (1退货 2换货)")
     private Integer afterSaleType;

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/OrderAfterSaleVo.java

@@ -23,7 +23,7 @@ public class OrderAfterSaleVo {
     private LocalDateTime createTime;
 
     @ApiModelProperty("申请原因")
-    private Integer applyReason;
+    private String applyReason;
 
     @ApiModelProperty("售后状态:0待审核 1审核通过 2审核拒绝 3待买家退货 4待商家收货 5退款处理中 6售后完成")
     private Integer afterSaleStatus;

+ 3 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/enums/AfterSaleStatusEnum.java

@@ -17,7 +17,9 @@ public enum AfterSaleStatusEnum {
 
     REFUND_PROCESSING(5, "退款处理中"),
 
-    COMPLETE(6, "售后完成");
+    COMPLETE(6, "售后完成"),
+
+    CANCELLED(7, "售后取消");
 
     private final Integer code;
 

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IAfterSaleOrderService.java

@@ -13,4 +13,6 @@ public interface IAfterSaleOrderService extends IService<AfterSaleOrder> {
     OrderAfterSaleVo getOrderAfterSaleVo(Long orderId);
 
     void edit(AfterSaleOrderUpdateDTO dto);
+
+    void cancel(Long orderId);
 }

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

@@ -68,4 +68,6 @@ public interface IProductOrderInfoService extends IService<ProductOrderInfo> {
     void editLogisticsNo(ProductOrderEditLogisticsNo dto);
 
     void editConsigneesInfo(ProductOrderOperateDTO dto);
+
+    ProductOrderInfo getAndCheckOrder(Long orderId, String openId);
 }

+ 76 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/AfterSaleOrderServiceImpl.java

@@ -2,17 +2,21 @@ package com.ylx.massage.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.AfterSaleOrder;
+import com.ylx.massage.domain.ProductOrderInfo;
 import com.ylx.massage.domain.dto.AfterSaleOrderDTO;
 import com.ylx.massage.domain.dto.AfterSaleOrderUpdateDTO;
 import com.ylx.massage.domain.vo.OrderAfterSaleVo;
 import com.ylx.massage.enums.AfterSaleStatusEnum;
+import com.ylx.massage.enums.ProductOrderStatusEnum;
 import com.ylx.massage.mapper.AfterSaleOrderMapper;
 import com.ylx.massage.service.IAfterSaleOrderService;
+import com.ylx.massage.service.IProductOrderInfoService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -24,6 +28,8 @@ public class AfterSaleOrderServiceImpl extends ServiceImpl<AfterSaleOrderMapper,
 
     @Resource
     private AfterSaleOrderMapper afterSaleOrderMapper;
+    @Resource
+    private IProductOrderInfoService productOrderInfoService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -32,7 +38,15 @@ public class AfterSaleOrderServiceImpl extends ServiceImpl<AfterSaleOrderMapper,
         // 1. 获取当前登录用户(公共方法提取)
         WxLoginUser loginUser = getCurrentWxLoginUser();
 
-        // 2. 添加售后订单
+        // 2. 查询并校验订单(公共方法提取)
+        ProductOrderInfo productOrderInfo = this.productOrderInfoService.getAndCheckOrder(dto.getOrderId(), loginUser.getCOpenid());
+
+        // 3. 状态校验:必须不能是 售后中 才能发起售后
+        if (ProductOrderStatusEnum.AFTER_SALES.getCode().equals(productOrderInfo.getOrderStatus())) {
+            throw new ServiceException("订单状态异常,不能重复发起售后");
+        }
+
+        // 4. 添加售后订单
         AfterSaleOrder entity = new AfterSaleOrder();
         BeanUtil.copyProperties(dto, entity);
         entity.setOpenId(loginUser.getCOpenid());
@@ -40,7 +54,21 @@ public class AfterSaleOrderServiceImpl extends ServiceImpl<AfterSaleOrderMapper,
         entity.setAfterSaleStatus(AfterSaleStatusEnum.WAIT_AUDIT.getCode());
         entity.setAfterSaleNo(generateAfterSaleNo(dto.getOrderId()));
 
-        this.afterSaleOrderMapper.insert(entity);
+        boolean insertResult = super.save(entity);
+        if (!insertResult) {
+            throw new ServiceException("创建售后订单失败");
+        }
+
+        // 5. 更新订单状态
+        ProductOrderInfo updateInfo = new ProductOrderInfo();
+        updateInfo.setId(productOrderInfo.getId());
+        updateInfo.setOrderStatus(ProductOrderStatusEnum.AFTER_SALES.getCode());
+        updateInfo.setUpdateTime(LocalDateTime.now());
+
+        boolean updateResult = this.productOrderInfoService.updateById(updateInfo);
+        if (!updateResult) {
+            throw new ServiceException("订单状态已变更,请刷新后重试");
+        }
     }
 
     @Override
@@ -61,6 +89,52 @@ public class AfterSaleOrderServiceImpl extends ServiceImpl<AfterSaleOrderMapper,
         this.afterSaleOrderMapper.updateById(afterSaleOrder);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancel(Long orderId) {
+
+        // 1. 获取当前登录用户(公共方法提取)
+        WxLoginUser loginUser = getCurrentWxLoginUser();
+
+        // 2. 查询并校验订单(公共方法提取)
+        ProductOrderInfo productOrderInfo = this.productOrderInfoService.getAndCheckOrder(orderId, loginUser.getCOpenid());
+
+        // 3. 状态校验:必须是 退货中/退款中 才能取消退货
+        if (!ProductOrderStatusEnum.AFTER_SALES.getCode().equals(productOrderInfo.getOrderStatus())) {
+            throw new ServiceException("订单状态异常,仅售后中状态可取消售后");
+        }
+
+        // 4. 取消售后订单
+        LambdaQueryWrapper<AfterSaleOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AfterSaleOrder::getOrderId, orderId)
+                .eq(AfterSaleOrder::getOpenId, loginUser.getCOpenid())
+                .eq(AfterSaleOrder::getAfterSaleStatus, AfterSaleStatusEnum.WAIT_AUDIT.getCode());
+
+        AfterSaleOrder afterSaleOrder = this.afterSaleOrderMapper.selectOne(queryWrapper);
+        if (ObjectUtil.isNull(afterSaleOrder)) {
+            throw new ServiceException("未找到可取消的售后订单");
+        }
+
+        // 更新售后订单状态为已取消
+        afterSaleOrder.setAfterSaleStatus(AfterSaleStatusEnum.CANCELLED.getCode());
+        afterSaleOrder.setUpdateTime(LocalDateTime.now());
+        boolean afterSaleUpdateResult  = this.updateById(afterSaleOrder);
+        if (!afterSaleUpdateResult ) {
+            throw new ServiceException("取消售后订单失败");
+        }
+
+        // 5. 更新订单状态
+        ProductOrderInfo updateInfo = new ProductOrderInfo();
+        updateInfo.setId(productOrderInfo.getId());
+        updateInfo.setOrderStatus(ProductOrderStatusEnum.WAIT_RECEIVE.getCode());
+        updateInfo.setUpdateTime(LocalDateTime.now());
+
+        boolean orderUpdateResult  = this.productOrderInfoService.updateById(updateInfo);
+        if (!orderUpdateResult ) {
+            throw new ServiceException("订单状态已变更,请刷新后重试");
+        }
+    }
+
     private WxLoginUser getCurrentWxLoginUser() {
         WxLoginUser loginUser = SecurityUtils.getWxLoginUser();
         if (ObjectUtil.isNull(loginUser)) {

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

@@ -570,7 +570,8 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         return loginUser;
     }
 
-    private ProductOrderInfo getAndCheckOrder(Long orderId, String openId) {
+    @Override
+    public ProductOrderInfo getAndCheckOrder(Long orderId, String openId) {
         LambdaQueryWrapper<ProductOrderInfo> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(ProductOrderInfo::getId, orderId);
 

+ 1 - 1
nightFragrance-massage/src/main/resources/mapper/massage/AfterSaleOrderMapper.xml

@@ -44,7 +44,7 @@
         LEFT JOIN after_sale_order_fee f ON a.id = f.after_sale_order_id
         WHERE
             a.order_id = #{orderId}
-        AND a.is_deleted = 0
+        AND a.after_sale_status != 7
     </select>
 
 </mapper>