From 5bc0375793f9187e3d90b7ec6846ab4d8eac5f36 Mon Sep 17 00:00:00 2001
From: rentaiming <806181062@qq.com>
Date: 星期五, 14 六月 2024 18:59:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java |  254 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 232 insertions(+), 22 deletions(-)

diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
index 5b27bff..ceca2e9 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -7,9 +7,14 @@
 import com.google.common.collect.Lists;
 import com.ruoyi.common.core.constant.CacheConstants;
 import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
+import com.ruoyi.common.core.enums.AuditStatusEnum;
+import com.ruoyi.common.core.enums.BondStatusEnum;
 import com.ruoyi.common.core.enums.OrderFromEnum;
 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;
@@ -17,17 +22,19 @@
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.order.controller.management.dto.MgtMallOrderQuery;
 import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO;
-import com.ruoyi.order.controller.management.vo.MgtMallOrderVO;
 import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO;
+import com.ruoyi.order.controller.management.vo.MgtOrderVO;
 import com.ruoyi.order.domain.OrderReturnRequest;
 import com.ruoyi.order.domain.Paylog;
 import com.ruoyi.order.mapper.OrderAuctionBondMapper;
 import com.ruoyi.order.mapper.OrderMapper;
+import com.ruoyi.order.service.ILogisticsService;
 import com.ruoyi.order.service.IOrderReturnRequestService;
 import com.ruoyi.order.service.IOrderService;
 import com.ruoyi.order.service.IPaylogService;
 import com.ruoyi.order.util.OrderUtil;
 import com.ruoyi.order.util.SinataUtil;
+import com.ruoyi.system.api.domain.AuctionSalesroom;
 import com.ruoyi.system.api.domain.CouponMember;
 import com.ruoyi.system.api.domain.CustomConfig;
 import com.ruoyi.system.api.domain.GoodsGroupPurchase;
@@ -40,14 +47,17 @@
 import com.ruoyi.system.api.domain.dto.CouponMemberDTO;
 import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
 import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
+import com.ruoyi.system.api.domain.dto.LogisticsDTO;
 import com.ruoyi.system.api.domain.dto.MemberDTO;
 import com.ruoyi.system.api.domain.dto.MemberOrderDTO;
 import com.ruoyi.system.api.domain.dto.MemberOrderListDTO;
 import com.ruoyi.system.api.domain.dto.OrderDTO;
 import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
+import com.ruoyi.system.api.domain.vo.Express100VO;
 import com.ruoyi.system.api.domain.vo.MemberOrderListVO;
 import com.ruoyi.system.api.domain.vo.MemberTiOrderVO;
 import com.ruoyi.system.api.domain.vo.OrderVO;
+import com.ruoyi.system.api.feignClient.AuctionClient;
 import com.ruoyi.system.api.feignClient.GoodsSkuClient;
 import com.ruoyi.system.api.feignClient.MemberClient;
 import com.ruoyi.system.api.feignClient.PromotionClient;
@@ -56,16 +66,15 @@
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+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 lombok.Synchronized;
-import org.apache.commons.beanutils.BeanUtils;
-import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 
@@ -110,6 +119,11 @@
     @Resource
     private RedisService redisService;
 
+    @Resource
+    private ILogisticsService logisticsService;
+
+    @Resource
+    private AuctionClient auctionClient;
 
     @Override
     public void saveOrderOne(OrderDTO OrderDTO) {
@@ -680,8 +694,8 @@
      * @return PageDTO<MgtMallOrderVO>
      */
     @Override
-    public PageDTO<MgtMallOrderVO> getMallOrderPage(MgtMallOrderQuery query) {
-        PageDTO<MgtMallOrderVO> pageVO;
+    public PageDTO<MgtOrderVO> getOrderPage(MgtMallOrderQuery query) {
+        PageDTO<MgtOrderVO> pageVO;
         // 封装会员条件查询对象
         MemberDTO memberDTO = null;
         Set<Long> memberIdSet = null;
@@ -716,7 +730,64 @@
         if (StringUtils.isEmpty(page.getRecords())) {
             pageVO = PageDTO.empty(page);
         }
-        pageVO = PageDTO.of(page, MgtMallOrderVO.class);
+        pageVO = PageDTO.of(page, MgtOrderVO.class);
+        if (query.getOrderFrom() == OrderFromEnum.AUCTION_ORDERS) {
+            List<MgtOrderVO> list = pageVO.getList();
+            // 封装参数查询拍卖订单保证金
+            Set<Long> orderIdSet = list.stream().map(MgtOrderVO::getId)
+                    .collect(Collectors.toSet());
+            List<OrderAuctionBond> auctionBondList = orderAuctionBondMapper.selectList(
+                    Wrappers.lambdaQuery(OrderAuctionBond.class)
+                            .in(OrderAuctionBond::getOrderId, orderIdSet)
+                            .eq(OrderAuctionBond::getBoundStatus,
+                                    BondStatusEnum.PAID));
+            Map<String, OrderAuctionBond> auctionSalesroomBondMap = auctionBondList.stream()
+                    .filter(bond -> bond.getBondType() == AuctionOrderTypeEnum.AUCTION_ITEMS)
+                    .collect(Collectors.toMap(
+                            bond -> bond.getAuctionSalesroomId() + "-" + bond.getMemberId(),
+                            Function.identity()));
+            Map<String, OrderAuctionBond> auctionSalesroomGoodsBondMap = auctionBondList.stream()
+                    .filter(bond -> bond.getBondType() == AuctionOrderTypeEnum.REGULAR_ITEMS)
+                    .collect(Collectors.toMap(
+                            bond -> bond.getAuctionGoodsId() + "-" + bond.getMemberId(),
+                            Function.identity()));
+            // 封装参数查询拍卖会
+            Set<Long> auctionSalesroomGoodsIdSet = list.stream()
+                    .filter(order -> order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS)
+                    .map(MgtOrderVO::getGoodsSkuId).collect(Collectors.toSet());
+            List<AuctionSalesroom> auctionSalesroomList = auctionClient.getAuctionSalesroomByIds(
+                            auctionSalesroomGoodsIdSet, SecurityConstants.INNER)
+                    .getData();
+            Map<Long, String> salesroomMap = auctionSalesroomList.stream()
+                    .collect(Collectors.toMap(AuctionSalesroom::getId,
+                            AuctionSalesroom::getSalesroomName));
+            list.forEach(order -> {
+                if (order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) {
+                    order.setSalesroomName(
+                            StringUtils.isNotBlank(salesroomMap.get(order.getGoodsSkuId()))
+                                    ? salesroomMap.get(order.getGoodsSkuId()) : "无");
+                    order.setBoundStatus(
+                            StringUtils.isNotNull(auctionSalesroomBondMap.get(
+                                            order.getGoodsSkuId() + "-" + order.getMemberId())
+                                    .getBoundStatus())
+                                    ? auctionSalesroomBondMap.get(
+                                            order.getGoodsSkuId() + "-" + order.getMemberId())
+                                    .getBoundStatus()
+                                    : null);
+                }
+                if (order.getAuctionType() == AuctionOrderTypeEnum.REGULAR_ITEMS) {
+                    order.setSalesroomName("无");
+                    order.setBoundStatus(
+                            StringUtils.isNotNull(auctionSalesroomGoodsBondMap.get(
+                                            order.getGoodsSkuId() + "-" + order.getMemberId())
+                                    .getBoundStatus())
+                                    ? auctionSalesroomGoodsBondMap.get(
+                                            order.getGoodsSkuId() + "-" + order.getMemberId())
+                                    .getBoundStatus()
+                                    : null);
+                }
+            });
+        }
         return pageVO;
     }
 
@@ -727,15 +798,25 @@
      * @return MgtMallOrderVO
      */
     @Override
-    public MgtMallOrderVO getMallOrderDetail(Long id) {
+    public MgtOrderVO getOrderDetail(Long id) {
         Order order = this.getById(id);
-        MgtMallOrderVO mgtMallOrderVO = BeanUtils.copyBean(order, MgtMallOrderVO.class);
+        MgtOrderVO mgtOrderVO = BeanUtils.copyBean(order, MgtOrderVO.class);
         // 查询用户信息
         Member member = memberClient.getMembeOne(order.getMemberId(), SecurityConstants.INNER)
                 .getData();
         if (StringUtils.isNotNull(member)) {
-            mgtMallOrderVO.setNickname(member.getNickname());
-            mgtMallOrderVO.setPhone(member.getPhone());
+            mgtOrderVO.setNickname(member.getNickname());
+            mgtOrderVO.setPhone(member.getPhone());
+        }
+        // 拍卖订单查询拍卖会信息
+        if (order.getOrderFrom() == OrderFromEnum.AUCTION_ORDERS && (order.getAuctionType()
+                == AuctionOrderTypeEnum.AUCTION_ITEMS)) {
+            List<AuctionSalesroom> auctionSalesroom = auctionClient.getAuctionSalesroomByIds(
+                    Lists.newArrayList(order.getGoodsSkuId())
+                    , SecurityConstants.INNER).getData();
+            if (StringUtils.isNotNull(auctionSalesroom)) {
+                mgtOrderVO.setSalesroomName(auctionSalesroom.get(0).getSalesroomName());
+            }
         }
         // 查询售后信息
         if (order.getOrderStatus() == OrderStatusEnum.AFTER_SALE) {
@@ -744,24 +825,43 @@
                             .eq(OrderReturnRequest::getOrderId,
                                     order.getId()).last("limit 1"));
             if (StringUtils.isNotNull(orderReturnRequest)) {
-                mgtMallOrderVO.setReturnRequestVO(BeanUtils.copyBean(orderReturnRequest,
+                mgtOrderVO.setReturnRequestVO(BeanUtils.copyBean(orderReturnRequest,
                         MgtOrderReturnRequestVO.class));
             }
         }
-        return mgtMallOrderVO;
+        // 如果订单状态为已发货、已完成、售后, 查询物流信息
+        if (order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED
+                || order.getOrderStatus() == OrderStatusEnum.FINISHED
+                || order.getOrderStatus() == OrderStatusEnum.AFTER_SALE) {
+            LogisticsDTO logisticsDTO = new LogisticsDTO();
+            logisticsDTO.setCompany(order.getLogisticsNum());
+            logisticsDTO.setPostid(order.getCourierNumber());
+            Express100VO logisticsList = logisticsService.getLogisticsList(logisticsDTO);
+            if (StringUtils.isNotNull(logisticsList)) {
+                mgtOrderVO.setExpress100VO(logisticsList);
+            }
+        }
+        if (order.getOrderFrom() == OrderFromEnum.SNAP_ORDERS) {
+            GoodsSeckill data = goodsSkuClient.getGoodsSeckillOne(order.getGoodsSkuId(),
+                    SecurityConstants.INNER).getData();
+            mgtOrderVO.setSeckillPrice(data.getSeckillPrice());
+        } else if (order.getOrderFrom() == OrderFromEnum.GROUP_PURCHASE_ORDERS) {
+            GoodsGroupPurchase data = goodsSkuClient.getGoodsSeckiGoodsGroupPurchaseOne(
+                    order.getGoodsSkuId(),
+                    SecurityConstants.INNER).getData();
+            mgtOrderVO.setGroupPurchasesPrice(data.getGroupPurchasePrice());
+        }
+        return mgtOrderVO;
     }
 
     /**
      * 确认发货
      *
-     * @param dto 确认收货请求对象
+     * @param dto 确认发货请求对象
      */
     @Override
     public void confirmShipmentOrder(MgtOrderConfirmShipmentDTO dto) {
-        Order order = this.getById(dto.getId());
-        if (StringUtils.isNull(order)) {
-            throw new ServiceException("订单不存在");
-        }
+        Order order = getOrder(dto.getId());
         order.setOrderStatus(OrderStatusEnum.GOODS_TO_BE_RECEIVED);
         order.setDeliveryTime(LocalDateTime.now());
         order.setCourierNumber(dto.getCourierNumber());
@@ -776,14 +876,124 @@
      */
     @Override
     public void receivedGoods(Long id) {
-        Order order = this.getById(id);
-        if (StringUtils.isNull(order)) {
-            throw new ServiceException("订单不存在");
-        }
+        Order order = getOrder(id);
         if (order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED) {
             order.setOrderStatus(OrderStatusEnum.FINISHED);
             order.setReceiveTime(LocalDateTime.now());
             this.updateById(order);
         }
     }
+
+    /**
+     * 退款
+     *
+     * @param id 订单id
+     */
+    @Override
+    public void refund(Long id) {
+        Order order = getOrder(id);
+        String orderNo = order.getOrderNo();
+        Paylog paylog = iPaylogService.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);
+                iPaylogService.updateById(paylog);
+                this.updateById(order);
+            }
+            OrderReturnRequest orderReturnRequest = new OrderReturnRequest();
+            orderReturnRequest.setOrderId(id);
+            orderReturnRequest.setRequestTime(LocalDateTime.now());
+            orderReturnRequest.setRequestType(RequestTypeEnum.REFUND);
+            orderReturnRequest.setRequestReason("管理后台退款");
+            orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED);
+            orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
+            orderReturnRequestService.save(orderReturnRequest);
+        }
+    }
+
+    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;
+    }
+
+    /**
+     * 退款退货
+     *
+     * @param id 订单id
+     */
+    @Override
+    public void refundReturn(Long id) {
+        Order order = getOrder(id);
+        if (order.getOrderStatus() == OrderStatusEnum.TO_BE_SHIPPED
+                || order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED
+                || order.getOrderStatus() == OrderStatusEnum.FINISHED) {
+            OrderReturnRequest orderReturnRequest = new OrderReturnRequest();
+            order.setOrderStatus(OrderStatusEnum.AFTER_SALE);
+            this.updateById(order);
+            orderReturnRequest.setOrderId(id);
+            orderReturnRequest.setRequestTime(LocalDateTime.now());
+            orderReturnRequest.setRequestType(RequestTypeEnum.REFUNDS_AND_RETURNS);
+            orderReturnRequest.setRequestReason("管理后台退款退货");
+            orderReturnRequest.setStatus(ReturnRequestStatusEnum.TO_BE_RETURNED);
+            orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
+            orderReturnRequestService.save(orderReturnRequest);
+        }
+
+    }
+
+    private Order getOrder(Long id) {
+        Order order = this.getById(id);
+        if (StringUtils.isNull(order)) {
+            throw new ServiceException("订单不存在");
+        }
+        return order;
+    }
+
+    /**
+     * 拍卖订单退保证金
+     *
+     * @param id 订单id
+     */
+    @Override
+    public void refundBond(Long id) {
+        Order order = getOrder(id);
+        OrderAuctionBond orderAuctionBond = orderAuctionBondMapper.selectOne(
+                Wrappers.lambdaQuery(OrderAuctionBond.class)
+                        .eq(OrderAuctionBond::getOrderId, id));
+        Paylog paylog = iPaylogService.lambdaQuery()
+                .eq(Paylog::getOutTradeNo, orderAuctionBond.getOrderNo())
+                .last("limit 1").one();
+        PaymentMethodEnum paymentMethod = orderAuctionBond.getPaymentMethod();
+        if (orderAuctionBond.getBoundStatus() == BondStatusEnum.PAID) {
+            boolean result = handleRefund(paymentMethod, paylog, orderAuctionBond.getOrderNo());
+            if (result) {
+                paylog.setState(3);// 已退款
+                orderAuctionBond.setBoundStatus(BondStatusEnum.REFUNDED);
+                iPaylogService.updateById(paylog);
+                this.updateById(order);
+            }
+        }
+    }
 }

--
Gitblit v1.7.1