From 2427b05aeca08ee3c4998843bf749d35440d461b Mon Sep 17 00:00:00 2001
From: rentaiming <806181662@qq.com>
Date: 星期六, 15 六月 2024 21:33:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java |  197 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 191 insertions(+), 6 deletions(-)

diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java
index 8c661f5..7954d9d 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java
@@ -2,31 +2,52 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.enums.AuditStatusEnum;
 import com.ruoyi.common.core.enums.OrderStatusEnum;
+import com.ruoyi.common.core.enums.PaymentMethodEnum;
+import com.ruoyi.common.core.enums.RequestTypeEnum;
 import com.ruoyi.common.core.enums.ReturnRequestStatusEnum;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
+import com.ruoyi.common.core.utils.page.PageDTO;
+import com.ruoyi.order.controller.management.dto.MgtOrderReturnRequestQuery;
+import com.ruoyi.order.controller.management.dto.MgtReturnRequestAuditDTO;
+import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO;
 import com.ruoyi.order.domain.OrderReturnRequest;
+import com.ruoyi.order.domain.Paylog;
 import com.ruoyi.order.mapper.OrderMapper;
 import com.ruoyi.order.mapper.OrderReturnRequestMapper;
 import com.ruoyi.order.service.IOrderReturnRequestService;
+import com.ruoyi.order.util.SinataUtil;
 import com.ruoyi.system.api.domain.CustomConfig;
-import com.ruoyi.system.api.domain.GoodsCategory;
 import com.ruoyi.system.api.domain.Member;
 import com.ruoyi.system.api.domain.Order;
+import com.ruoyi.system.api.domain.dto.LogisticsDTO;
+import com.ruoyi.system.api.domain.dto.MemberDTO;
 import com.ruoyi.system.api.domain.dto.OrderReturnDTO;
+import com.ruoyi.system.api.domain.vo.Express100VO;
 import com.ruoyi.system.api.domain.vo.OrderReturnVO;
+import com.ruoyi.system.api.feignClient.MemberClient;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import com.ruoyi.system.api.util.HuaWeiOBSUtil;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -43,7 +64,12 @@
 
     @Resource
     private OrderMapper orderMapper;
-
+    @Resource
+    private MemberClient memberClient;
+    @Resource
+    private LogisticsServiceImpl logisticsService;
+    @Resource
+    private PaylogServiceImpl paylogService;
     @Override
     public void saveOrderReturnRequest(OrderReturnDTO OrderReturnDTO) {
 
@@ -95,4 +121,163 @@
         OrderReturnVO orderReturnVO = BeanUtils.copyBean(one, OrderReturnVO.class);
         return orderReturnVO;
     }
+
+    /**
+     * 获取售后管理列表分页数据
+     *
+     * @param query 售后管理查询对象
+     * @return PageDTO<MgtOrderReturnRequestVO>
+     */
+    @Override
+    public PageDTO<MgtOrderReturnRequestVO> getOrderReturnRequestPage(
+            MgtOrderReturnRequestQuery query) {
+        Set<Long> memberIdSet;
+        Page<MgtOrderReturnRequestVO> page = new Page<>(query.getPageCurr(), query.getPageSize());
+        if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank(
+                query.getPhone())) {
+            MemberDTO memberDTO = new MemberDTO();
+            memberDTO.setNickname(query.getNickname());
+            memberDTO.setPhone(query.getPhone());
+            List<Member> memberList = memberClient.getMemberListByCondition(memberDTO,
+                    SecurityConstants.INNER).getData();
+            if (StringUtils.isEmpty(memberList)) {
+                return PageDTO.empty(page);
+            }
+            memberIdSet = memberList.stream().map(Member::getId)
+                    .collect(Collectors.toSet());
+        }
+        page = baseMapper.getOrderReturnRequestPage(page, query);
+        if (StringUtils.isEmpty(page.getRecords())) {
+            return PageDTO.empty(page);
+        }
+        Set<Long> memIdSet = page.getRecords().stream().map(MgtOrderReturnRequestVO::getMemberId)
+                .collect(Collectors.toSet());
+        List<Member> members = memberClient.getMemberListByIds(memIdSet, SecurityConstants.INNER)
+                .getData();
+        Map<Long, Member> memberMap = members.stream()
+                .collect(Collectors.toMap(Member::getId, Function.identity()));
+        page.getRecords().forEach(item -> {
+            Member member = memberMap.get(item.getMemberId());
+            if (StringUtils.isNotNull(member)) {
+                item.setNickname(member.getNickname());
+                item.setPhone(member.getPhone());
+            }
+        });
+        return PageDTO.of(page);
+    }
+
+    /**
+     * 查看详情
+     *
+     * @param id 售后id
+     * @return MgtOrderReturnRequestVO
+     */
+    @Override
+    public MgtOrderReturnRequestVO getOrderReturnRequestDetail(Long id) {
+        MgtOrderReturnRequestVO returnRequestVO = baseMapper.getOrderReturnRequestDetail(id);
+        // 远程调用member服务,获取会员信息
+        Member member = memberClient.getMembeOne(returnRequestVO.getMemberId(),
+                SecurityConstants.INNER).getData();
+        if (StringUtils.isNotNull(member)) {
+            returnRequestVO.setNickname(member.getNickname());
+            returnRequestVO.setPhone(member.getPhone());
+        }
+        if (returnRequestVO.getRequestType() == RequestTypeEnum.REFUNDS_AND_RETURNS
+                && returnRequestVO.getStatus()
+                == ReturnRequestStatusEnum.TO_BE_RECEIVED_BY_THE_PLATFORM
+                && returnRequestVO.getAuditStatus() == AuditStatusEnum.PASSED) {
+            LogisticsDTO logisticsDTO = new LogisticsDTO();
+            logisticsDTO.setCompany(returnRequestVO.getLogisticsNum());
+            logisticsDTO.setPostid(returnRequestVO.getCourierNumber());
+            Express100VO logisticsList = logisticsService.getLogisticsList(logisticsDTO);
+            if (StringUtils.isNotNull(logisticsList)) {
+                returnRequestVO.setExpress100VO(logisticsList);
+            }
+        }
+        return returnRequestVO;
+    }
+
+    /**
+     * 审核
+     *
+     * @param dto 管理后台-售后审核传输对象
+     */
+    @Override
+    public void auditReturnRequest(MgtReturnRequestAuditDTO dto) {
+        OrderReturnRequest orderReturnRequest = getOrderReturnRequest(dto.getId());
+        if (orderReturnRequest.getAuditStatus() != AuditStatusEnum.TO_BE_REVIEWED) {
+            throw new ServiceException("该售后已被审核");
+        }
+        if (dto.getAuditStatus() == AuditStatusEnum.PASSED) {
+            orderReturnRequest.setStatus(ReturnRequestStatusEnum.TO_BE_RETURNED);
+            orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
+        } else {
+            orderReturnRequest.setStatus(ReturnRequestStatusEnum.REJECTED);
+            orderReturnRequest.setAuditStatus(AuditStatusEnum.REJECTED);
+            orderReturnRequest.setRefuseReason(dto.getRefuseComment());
+        }
+        this.updateById(orderReturnRequest);
+    }
+
+    private OrderReturnRequest getOrderReturnRequest(Long id) {
+        OrderReturnRequest orderReturnRequest = this.getById(id);
+        if (StringUtils.isNull(orderReturnRequest)) {
+            throw new ServiceException("售后不存在");
+        }
+        return orderReturnRequest;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmReturnRequest(Long id) {
+        OrderReturnRequest orderReturnRequest = getOrderReturnRequest(id);
+        if (orderReturnRequest.getStatus()
+                != ReturnRequestStatusEnum.TO_BE_RECEIVED_BY_THE_PLATFORM
+                || orderReturnRequest.getAuditStatus() != AuditStatusEnum.PASSED) {
+            throw new ServiceException("该售后状态不允许确认收货");
+        }
+        orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED);
+        orderReturnRequest.setPlatformReceiptTime(LocalDateTime.now());
+        this.updateById(orderReturnRequest);
+        // 退款
+        Order order = orderMapper.selectById(orderReturnRequest.getOrderId());
+
+        if (StringUtils.isNull(order)) {
+            throw new ServiceException("订单不存在");
+        }
+        String orderNo = order.getOrderNo();
+        Paylog paylog = paylogService.lambdaQuery().eq(Paylog::getOutTradeNo, orderNo)
+                .last("limit 1").one();
+        PaymentMethodEnum paymentMethod = order.getPaymentMethod();
+        if (StringUtils.isNotNull(paylog)) {
+            boolean result = handleRefund(paymentMethod, paylog, orderNo);
+            if (result) {
+                paylog.setState(3);// 已退款
+                order.setOrderStatus(OrderStatusEnum.REFUNDED);
+                paylogService.updateById(paylog);
+                orderMapper.updateById(order);
+            }
+        }
+    }
+
+    private boolean handleRefund(PaymentMethodEnum paymentMethod, Paylog paylog, String orderNo) {
+        boolean result = false;
+        if (paymentMethod == PaymentMethodEnum.WECHAT) {
+            String refundMoney = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100D);
+            int refundFee = Integer.parseInt(
+                    refundMoney.substring(0, refundMoney.length() - 3));
+            String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100D);
+            Integer totalFee = Integer.parseInt(money.substring(0, money.length() - 3));
+            String regEx = "[^0-9]";
+            Pattern p = Pattern.compile(regEx);
+            Matcher m = p.matcher(orderNo);
+            String ma = m.replaceAll("").trim();
+            result = paylogService.refundForWxpay(2, paylog.getTradeNo(),
+                    paylog.getOutTradeNo(), "R" + ma, totalFee, refundFee, "4");
+        } else if (paymentMethod == PaymentMethodEnum.ALIPAY) {
+            result = paylogService.refundForAlipay(paylog.getOutTradeNo(), paylog.getTradeNo(),
+                    paylog.getPayMoney());
+        }
+        return result;
+    }
 }

--
Gitblit v1.7.1