From 855921d253a4854d4fb78b83bfcf7c6e93b3f68d Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 29 五月 2024 19:43:50 +0800
Subject: [PATCH] 1.提交【管理后台】团购、拍卖商品立即结束退款处理 2.提交【管理后台】拍卖场管理部分接口

---
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java |  101 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 98 insertions(+), 3 deletions(-)

diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
index 8c1c8df..f97c276 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -12,18 +12,30 @@
 import com.ruoyi.auction.service.IAuctionBidRecordService;
 import com.ruoyi.auction.service.IAuctionGoodsService;
 import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
 import com.ruoyi.common.core.enums.AuctionStartStatusEnum;
+import com.ruoyi.common.core.enums.BidStatusEnum;
+import com.ruoyi.common.core.enums.BondStatusEnum;
+import com.ruoyi.common.core.enums.OrderFromEnum;
 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.system.api.domain.GoodsSku;
 import com.ruoyi.system.api.domain.Member;
+import com.ruoyi.system.api.domain.MemberAddress;
+import com.ruoyi.system.api.domain.OrderAuctionBond;
+import com.ruoyi.system.api.domain.dto.OrderDTO;
+import com.ruoyi.system.api.domain.dto.RefundDTO;
 import com.ruoyi.system.api.feignClient.GoodsSkuClient;
 import com.ruoyi.system.api.feignClient.MemberClient;
+import com.ruoyi.system.api.feignClient.OrderClient;
 import io.seata.spring.annotation.GlobalTransactional;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
@@ -45,8 +57,9 @@
 public class AuctionGoodsServiceImpl extends ServiceImpl<AuctionGoodsMapper, AuctionGoods> implements IAuctionGoodsService {
 
     private final GoodsSkuClient goodsSkuClient;
-    private final IAuctionBidRecordService auctionBidRecordService;
     private final MemberClient memberClient;
+    private final OrderClient orderClient;
+    private final IAuctionBidRecordService auctionBidRecordService;
     /**
      * 获取拍卖商品列表的分页数据
      *
@@ -154,7 +167,8 @@
         AuctionGoodsVO auctionGoodsVO = BeanUtils.copyBean(auctionGoods, AuctionGoodsVO.class);
         if (!auctionGoods.getStartStatus().equals(AuctionStartStatusEnum.IN_PREVIEW)) {
             List<AuctionBidRecord> list = auctionBidRecordService.lambdaQuery()
-                    .eq(AuctionBidRecord::getGoodsSkuId, auctionGoods.getGoodsSkuId())
+                    .eq(AuctionBidRecord::getTargetId, auctionGoodsVO.getId())
+                    .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.REGULAR_ITEMS)
                     .orderByDesc(AuctionBidRecord::getLastBidAmount).list();
             if (StringUtils.isNotEmpty(list)) {
                 Set<Long> collect = list.stream().map(AuctionBidRecord::getMemberId)
@@ -181,12 +195,93 @@
      * @param id 拍卖商品id
      */
     @Override
+    @GlobalTransactional(rollbackFor = Exception.class)
+    @Transactional
     public void stopAuctionGoods(Long id) {
         AuctionGoods auctionGoods = this.lambdaQuery().eq(AuctionGoods::getId, id)
                 .eq(AuctionGoods::getStartStatus, AuctionStartStatusEnum.IN_AUCTION).one();
         if (StringUtils.isNull(auctionGoods)) {
             throw new ServiceException("拍卖商品不存在");
         }
-        
+        if (auctionGoods.getStartStatus().equals(AuctionStartStatusEnum.IN_AUCTION)) {
+            // 查询出价记录
+            List<AuctionBidRecord> auctionBidRecords = auctionBidRecordService.getBidRecordByGoodsId(
+                    id);
+            Long memberId = null;
+            if (StringUtils.isNotEmpty(auctionBidRecords)) {
+                // 中标
+                AuctionBidRecord auctionBidRecord = auctionBidRecords.get(0);
+                auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
+                auctionBidRecordService.updateById(auctionBidRecord);
+                memberId = auctionBidRecord.getMemberId();
+                // 创建待支付订单
+                OrderDTO orderDTO = new OrderDTO();
+                orderDTO.setAuctionType(AuctionOrderTypeEnum.REGULAR_ITEMS);
+                orderDTO.setGoodsQuantity(auctionGoods.getAuctionStock());
+                orderDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId());
+                orderDTO.setBound(auctionGoods.getBond());
+                orderDTO.setMemberId(auctionBidRecord.getMemberId());
+                orderDTO.setTotalAmount(auctionBidRecord.getLastBidAmount());
+                orderDTO.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
+                orderDTO.setOrderTime(LocalDateTime.now());
+                MemberAddress data = memberClient.getMemberAddressOne(
+                        auctionBidRecord.getMemberId(), SecurityConstants.INNER).getData();
+                if (StringUtils.isNotNull(data)) {
+                    orderDTO.setReceiverName(data.getRecipientName());
+                    orderDTO.setReceiverCity(data.getReceiverCity());
+                    orderDTO.setReceiverDetailAddress(data.getDetailedAddress());
+                    orderDTO.setReceiverphone(data.getRecipientPhone());
+                }
+                orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER);
+            } else {
+                // 没有人出价,退回拍卖商品库存
+                goodsSkuClient.returningStock(auctionGoods.getGoodsSkuId(),
+                        auctionGoods.getAuctionStock(), SecurityConstants.INNER);
+            }
+            // 结束拍卖
+            this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.ENDED)
+                    .eq(AuctionGoods::getId, id).update();
+            // 查询已支付保证金记录
+            List<OrderAuctionBond> auctionBondList = orderClient.getOrderAuctionBondList(id,
+                    AuctionOrderTypeEnum.REGULAR_ITEMS,
+                    BondStatusEnum.PAID,
+                    SecurityConstants.INNER).getData();
+            if (StringUtils.isNotEmpty(auctionBondList)) {
+                List<RefundDTO> refundDTOList = new ArrayList<>();
+                for (OrderAuctionBond orderAuctionBond : auctionBondList) {
+                    // 已中标需在订单完成后退保证金
+                    if (orderAuctionBond.getMemberId().equals(memberId)) {
+                        continue;
+                    }
+                    RefundDTO refundDTO = new RefundDTO();
+                    refundDTO.setOrderNo(orderAuctionBond.getOrderNo());
+                    refundDTO.setAmount(orderAuctionBond.getBond());
+                }
+                // 远程调用订单服务进行退款
+                Map<String, Object> data = orderClient.refund(refundDTOList,
+                        SecurityConstants.INNER).getData();
+                // 处理退款返回结果
+                List<String> successfulOrders = new ArrayList<>();
+                List<String> failedOrders = new ArrayList<>();
+
+                data.forEach((key, value) -> {
+                    if ((boolean) value) {
+                        successfulOrders.add(key);
+                    } else {
+                        failedOrders.add(key);
+                    }
+                });
+                log.info("订单号:{},退款失败", failedOrders);
+                // 退款成功的订单修改状态
+                List<Long> ids = auctionBondList.stream().map(bond -> {
+                    if (successfulOrders.contains(bond.getOrderNo())) {
+                        return bond.getId();
+                    }
+                    return null;
+                }).filter(Objects::nonNull).collect(Collectors.toList());
+                // 远程调用订单服务修改订单状态
+                orderClient.updateOrderAuctionBondStatus(ids, BondStatusEnum.PAID);
+            }
+        }
     }
 }

--
Gitblit v1.7.1