mitao
2024-07-29 fc8b51f40e71aa09bb49f407c1e9f68ac94ceb58
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -12,8 +12,10 @@
import com.ruoyi.auction.controller.management.vo.MgtAuctionBidRecordVO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionGoodsVO;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.auction.domain.AuctionBondJl;
import com.ruoyi.auction.domain.AuctionBrowseRecord;
import com.ruoyi.auction.domain.MemberAuctionCollection;
import com.ruoyi.auction.mapper.AuctionBondJlMapper;
import com.ruoyi.auction.mapper.AuctionGoodsMapper;
import com.ruoyi.auction.service.IAuctionBidRecordService;
import com.ruoyi.auction.service.IAuctionBrowseRecordService;
@@ -65,6 +67,7 @@
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
@@ -113,6 +116,9 @@
    @Resource
    private IAuctionBrowseRecordService iAuctionBrowseRecordService;
    @Resource
    private AuctionBondJlMapper auctionBondJlMapper;
    /**
     * 获取拍卖商品列表的分页数据
@@ -274,13 +280,17 @@
                        .collect(Collectors.toSet());
                List<Member> memberList = memberClient.
                        getMemberListByIds(collect, SecurityConstants.INNER).getData();
                Map<Long, String> memberMap = memberList.stream()
                        .collect(Collectors.toMap(Member::getId, Member::getNickname));
                Map<Long, Member> memberMap = memberList.stream()
                        .collect(Collectors.toMap(Member::getId, e -> e));
                List<MgtAuctionBidRecordVO> mgtAuctionBidRecordVOS = BeanUtils.copyList(list,
                        MgtAuctionBidRecordVO.class);
                for (MgtAuctionBidRecordVO vo : mgtAuctionBidRecordVOS) {
                    String memberName = memberMap.get(vo.getMemberId());
                    vo.setMemberName(StringUtils.isNotEmpty(memberName) ? memberName : "");
                    Member member = memberMap.get(vo.getMemberId());
                    if (StringUtils.isNotNull(member)) {
                        vo.setMemberName(member.getNickname());
                        vo.setPhone(member.getPhone());
                    }
                }
                auctionGoodsVO.setRecordList(mgtAuctionBidRecordVOS);
            }
@@ -302,46 +312,79 @@
        if (StringUtils.isNull(auctionGoods)) {
            throw new ServiceException("拍卖商品不存在");
        }
        // 远程调用商品服务,获取商品信息
        GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(auctionGoods.getGoodsSkuId(),
                        SecurityConstants.INNER)
                .getData();
        if (auctionGoods.getStartStatus().equals(AuctionStartStatusEnum.IN_AUCTION)) {
            // 查询出价记录
            List<AuctionBidRecord> auctionBidRecords = auctionBidRecordService.getBidRecordByGoodsId(
                    id);
            Long memberId = null;
            List<AuctionBidRecord> auctionBidRecordList = new ArrayList<>();
            if (StringUtils.isNotEmpty(auctionBidRecords)) {
                // 中标
                AuctionBidRecord auctionBidRecord = auctionBidRecords.get(0);
                auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                auctionBidRecordService.updateById(auctionBidRecord);
                memberId = auctionBidRecord.getMemberId();
                if (auctionBidRecords.size() >= auctionGoods.getAuctionStock()) {
                    // 中标
                    for (int i = 0; i < auctionGoods.getAuctionStock(); i++) {
                        AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i);
                        auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                        auctionBidRecordList.add(auctionBidRecord);
                    }
                } else {
                    // 中标
                    for (int i = 0; i < auctionBidRecords.size(); i++) {
                        AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i);
                        auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                        auctionBidRecordList.add(auctionBidRecord);
                    }
                    // 退回剩余库存
                    GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                    goodsStockUpdDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId());
                    goodsStockUpdDTO.setAuctionStock(
                            auctionGoods.getAuctionStock() - auctionBidRecords.size());
                    goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                            SecurityConstants.INNER);
                }
                auctionBidRecordService.updateBatchById(auctionBidRecordList);
                // 创建待支付订单
                CustomConfig moneyConfig = sysUserClient.getconfig(
                        ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData();
                CustomConfig pointsConfig = sysUserClient.getconfig(
                        ConfigEnum.MEMBER_POINTS_POINTS.getKey()).getData();
                double ratio =
                        Double.parseDouble(
                                pointsConfig.getConfigValue()) / Double.parseDouble(
                                moneyConfig.getConfigValue());
                OrderDTO orderDTO = new OrderDTO();
                orderDTO.setAuctionType(AuctionOrderTypeEnum.REGULAR_ITEMS);
                orderDTO.setGoodsQuantity(auctionGoods.getAuctionStock());
                orderDTO.setGoodsSkuId(auctionGoods.getId());
                orderDTO.setBound(auctionGoods.getBond());
                orderDTO.setMemberId(auctionBidRecord.getMemberId());
                orderDTO.setTotalAmount(auctionBidRecord.getLastBidAmount());
                orderDTO.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
                orderDTO.setOrderTime(LocalDateTime.now());
                orderDTO.setPoints(auctionBidRecord.getLastBidAmount()
                        .multiply(BigDecimal.valueOf(ratio)).intValue());
                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());
                for (AuctionBidRecord auctionBidRecord : auctionBidRecordList) {
                    BigDecimal lastBidAmount = auctionBidRecord.getLastBidAmount();
                    BigDecimal divide = lastBidAmount.divide(
                            new BigDecimal(moneyConfig.getConfigValue()), 0, RoundingMode.DOWN);
                    int points = divide.multiply(
                            new BigDecimal(pointsConfig.getConfigValue())).intValue();
                    OrderDTO orderDTO = new OrderDTO();
                    orderDTO.setAuctionType(AuctionOrderTypeEnum.REGULAR_ITEMS);
                    orderDTO.setGoodsQuantity(auctionGoods.getAuctionStock());
                    orderDTO.setGoodsSkuId(auctionGoods.getId());
                    orderDTO.setBound(auctionGoods.getBond());
                    orderDTO.setMemberId(auctionBidRecord.getMemberId());
                    orderDTO.setTotalAmount(auctionBidRecord.getLastBidAmount());
                    orderDTO.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
                    orderDTO.setOrderTime(LocalDateTime.now());
                    orderDTO.setPoints(points);
                    orderDTO.setBound(auctionGoods.getBond());
                    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());
                    }
                    if (StringUtils.isNotNull(goodsSku)) {
                        orderDTO.setCoverPic(goodsSku.getCoverPic());
                        orderDTO.setPrice(goodsSku.getPrice());
                        orderDTO.setSkuName(goodsSku.getSkuName());
                    }
                    orderDTO.setOrderTimeSx(auctionGoods.getEndTime());
                    orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER);
                }
                orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER);
            } else {
                // 没有人出价,退回拍卖商品库存
                GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
@@ -360,14 +403,19 @@
                    SecurityConstants.INNER).getData();
            if (StringUtils.isNotEmpty(auctionBondList)) {
                List<RefundDTO> refundDTOList = new ArrayList<>();
                List<Long> unRefundMemberIdList = auctionBidRecordList.stream()
                        .map(AuctionBidRecord::getMemberId).collect(
                                Collectors.toList());
                for (OrderAuctionBond orderAuctionBond : auctionBondList) {
                    // 已中标需在订单完成后退保证金
                    if (orderAuctionBond.getMemberId().equals(memberId)) {
                    if (unRefundMemberIdList.contains(orderAuctionBond.getMemberId())) {
                        continue;
                    }
                    RefundDTO refundDTO = new RefundDTO();
                    refundDTO.setOrderNo(orderAuctionBond.getOrderNo());
                    refundDTO.setAmount(orderAuctionBond.getBond());
                    refundDTOList.add(refundDTO);
                }
                // 远程调用订单服务进行退款
                Map<String, Object> data = orderClient.refund(refundDTOList,
@@ -392,7 +440,8 @@
                    return null;
                }).filter(Objects::nonNull).collect(Collectors.toList());
                // 远程调用订单服务修改订单状态
                orderClient.updateOrderAuctionBondStatus(ids, BondStatusEnum.PAID,SecurityConstants.INNER);
                orderClient.updateOrderAuctionBondStatus(ids, BondStatusEnum.REFUNDED,
                        SecurityConstants.INNER);
            }
        }
    }
@@ -404,11 +453,23 @@
            List<GoodsSku> goodsSku = goodsSkuClient.getGoodsByName(auctionGoodsListDTO.getGoodsSkuName(),
                            SecurityConstants.INNER)
                    .getData();
            goodsSkuIdList = goodsSku.stream().map(GoodsSku::getId)
                    .collect(Collectors.toSet());
            if (goodsSku!=null){
                goodsSkuIdList = goodsSku.stream().map(GoodsSku::getId)
                        .collect(Collectors.toSet());
            }
        }
        AuctionGoodsListPageDTO auctionGoodsListPageDTO=new AuctionGoodsListPageDTO();
        auctionGoodsListPageDTO.setGoodsSkuIdList(goodsSkuIdList);
        if (StringUtils.isNotEmpty(auctionGoodsListDTO.getGoodsSkuName())) {
            if (goodsSkuIdList != null) {
                auctionGoodsListPageDTO.setGoodsSkuIdList(goodsSkuIdList);
            } else {
                goodsSkuIdList = new HashSet<>();
                goodsSkuIdList.add(0L);
                auctionGoodsListPageDTO.setGoodsSkuIdList(goodsSkuIdList);
            }
        }
        Page<AuctionGoodsListVO> page = new Page<>();
        page.setSize(auctionGoodsListDTO.getPageSize());
@@ -478,7 +539,6 @@
        auctionGoodsinfoVO.setSpec(goodsSkuOne.getSpec());
        auctionGoodsinfoVO.setSpecUnit(goodsSkuOne.getSpecUnit());
        auctionGoodsinfoVO.setShareTitle(goodsSkuOne.getShareTitle());
        auctionGoodsinfoVO.setSpecUnit(goodsSkuOne.getSpecUnit());
        auctionGoodsinfoVO.setDetail(goodsSkuOne.getDetail());
        auctionGoodsinfoVO.setBond(byId.getBond());
        auctionGoodsinfoVO.setYears(goodsSkuOne.getYears());
@@ -521,12 +581,18 @@
        }else {
            auctionGoodsinfoVO.setIsCollection(1);
        }
        List<OrderAuctionBond> datas = orderClient.getAuctionGoodsOrderAuctionBondList(auctionGoodsListDTO, SecurityConstants.INNER).getData();
        if (datas.size()>0){
            auctionGoodsinfoVO.setIsApply(2);
        }else{
            auctionGoodsinfoVO.setIsApply(1);
        }
        LambdaQueryWrapper<AuctionBondJl> wrapper8=Wrappers.lambdaQuery();
        wrapper8.eq(AuctionBondJl::getAuctionGoodsId,byId.getId());
        wrapper8.eq(AuctionBondJl::getMemberId,auctionGoodsListDTO.getMemberId());
        wrapper8.eq(AuctionBondJl::getIsState,0);
        AuctionBondJl auctionBondJl = auctionBondJlMapper.selectOne(wrapper8);
       if(auctionBondJl!=null){
               auctionGoodsinfoVO.setIsApply(2);
           }else{
               auctionGoodsinfoVO.setIsApply(1);
           }
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime newTime7 = now.minusDays(7);
@@ -550,11 +616,11 @@
        LambdaQueryWrapper<AuctionBidRecord> wrapper5= Wrappers.lambdaQuery();
        wrapper5.eq(AuctionBidRecord::getAuctionType,1);
        wrapper5.eq(AuctionBidRecord::getTargetId,byId.getId());
        wrapper5.eq(AuctionBidRecord::getMemberId,auctionGoodsListDTO.getMemberId());
        wrapper5.eq(AuctionBidRecord::getDelFlag,0);
        AuctionBidRecord list5 = auctionBidRecordService.getOne(wrapper5);
        if (list5!=null){
            auctionGoodsinfoVO.setZgBid(list5.getLastBidAmount());
        wrapper5.orderByDesc(AuctionBidRecord::getLastBidAmount);
        List<AuctionBidRecord> list2 = auctionBidRecordService.list(wrapper5);
        if (list2.size()>0){
            auctionGoodsinfoVO.setZgBid(list2.get(0).getLastBidAmount());
        }
@@ -608,7 +674,7 @@
        Page<AuctionGoodsListVO> page = new Page<>();
        page.setSize(auctionGoodsListDTO.getPageSize());
        page.setCurrent(auctionGoodsListDTO.getPageCurr());
        List<AuctionGoods> auctionGoodsPgeList = auctionGoodsMapper.getAuctionGoodsPgeList(page, auctionGoodsListPageDTO);
        List<AuctionGoods> auctionGoodsPgeList = auctionGoodsMapper.getAuctionGoodsPgeList1(page, auctionGoodsListPageDTO);
        List<AuctionGoodsListVO> auctionGoodsVOS=new ArrayList<>();
        for (AuctionGoods auctionGoods:auctionGoodsPgeList){
            AuctionGoodsListVO auctionGoodsVO=new AuctionGoodsListVO();
@@ -649,15 +715,144 @@
    }
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    @Transactional
    public void endAuctionGoods(Long id) throws JsonProcessingException {
        AuctionGoods auctionGoods = this.getById(id);
        if (StringUtils.isNotNull(auctionGoods) && auctionGoods.getListingStatus().equals(
                ListingStatusEnum.ON_SHELVES) && auctionGoods.getStartStatus()
        if (StringUtils.isNotNull(auctionGoods) && auctionGoods.getStartStatus()
                .equals(AuctionStartStatusEnum.IN_AUCTION)) {
            auctionGoods.setStartStatus(AuctionStartStatusEnum.ENDED);
            this.updateById(auctionGoods);
            orderClient.returnBondByAuctionGoodsId(id, SecurityConstants.INNER);
            // 远程调用商品服务,获取商品信息
            GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(auctionGoods.getGoodsSkuId(),
                            SecurityConstants.INNER)
                    .getData();
            if (auctionGoods.getStartStatus().equals(AuctionStartStatusEnum.IN_AUCTION)) {
                // 查询出价记录
                List<AuctionBidRecord> auctionBidRecords = auctionBidRecordService.getBidRecordByGoodsId(
                        id);
                List<AuctionBidRecord> auctionBidRecordList = new ArrayList<>();
                if (StringUtils.isNotEmpty(auctionBidRecords)) {
                    if (auctionBidRecords.size() >= auctionGoods.getAuctionStock()) {
                        // 中标
                        for (int i = 0; i < auctionGoods.getAuctionStock(); i++) {
                            AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i);
                            auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                            auctionBidRecordList.add(auctionBidRecord);
                        }
                    } else {
                        // 中标
                        for (int i = 0; i < auctionBidRecords.size(); i++) {
                            AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i);
                            auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                            auctionBidRecordList.add(auctionBidRecord);
                        }
                        // 退回剩余库存
                        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                        goodsStockUpdDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId());
                        goodsStockUpdDTO.setAuctionStock(
                                auctionGoods.getAuctionStock() - auctionBidRecords.size());
                        goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                                SecurityConstants.INNER);
                    }
                    auctionBidRecordService.updateBatchById(auctionBidRecordList);
                    // 创建待支付订单
                    CustomConfig moneyConfig = sysUserClient.getconfig(
                            ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData();
                    CustomConfig pointsConfig = sysUserClient.getconfig(
                            ConfigEnum.MEMBER_POINTS_POINTS.getKey()).getData();
                    for (AuctionBidRecord auctionBidRecord : auctionBidRecordList) {
                        BigDecimal lastBidAmount = auctionBidRecord.getLastBidAmount();
                        BigDecimal divide = lastBidAmount.divide(
                                new BigDecimal(moneyConfig.getConfigValue()), 0, RoundingMode.DOWN);
                        int points = divide.multiply(
                                new BigDecimal(pointsConfig.getConfigValue())).intValue();
                        OrderDTO orderDTO = new OrderDTO();
                        orderDTO.setAuctionType(AuctionOrderTypeEnum.REGULAR_ITEMS);
                        orderDTO.setGoodsQuantity(auctionGoods.getAuctionStock());
                        orderDTO.setGoodsSkuId(auctionGoods.getId());
                        orderDTO.setBound(auctionGoods.getBond());
                        orderDTO.setMemberId(auctionBidRecord.getMemberId());
                        orderDTO.setTotalAmount(lastBidAmount);
                        orderDTO.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
                        orderDTO.setOrderTime(LocalDateTime.now());
                        orderDTO.setPoints(points);
                        orderDTO.setBound(auctionGoods.getBond());
                        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());
                        }
                        if (StringUtils.isNotNull(goodsSku)) {
                            orderDTO.setCoverPic(goodsSku.getCoverPic());
                            orderDTO.setPrice(goodsSku.getPrice());
                            orderDTO.setSkuName(goodsSku.getSkuName());
                        }
                        orderDTO.setOrderTimeSx(auctionGoods.getEndTime());
                        orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER);
                    }
                } else {
                    // 没有人出价,退回拍卖商品库存
                    GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                    goodsStockUpdDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId());
                    goodsStockUpdDTO.setAuctionStock(auctionGoods.getAuctionStock());
                    goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                            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<>();
                    List<Long> unRefundMemberIdList = auctionBidRecordList.stream()
                            .map(AuctionBidRecord::getMemberId).collect(
                                    Collectors.toList());
                    for (OrderAuctionBond orderAuctionBond : auctionBondList) {
                        // 已中标需在订单完成后退保证金
                        if (unRefundMemberIdList.contains(orderAuctionBond.getMemberId())) {
                            continue;
                        }
                        RefundDTO refundDTO = new RefundDTO();
                        refundDTO.setOrderNo(orderAuctionBond.getOrderNo());
                        refundDTO.setAmount(orderAuctionBond.getBond());
                        refundDTOList.add(refundDTO);
                    }
                    // 远程调用订单服务进行退款
                    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.REFUNDED,
                            SecurityConstants.INNER);
                }
            }
            Map<String, Object> map = new ConcurrentHashMap<>();
            map.put("notification_type", NotificationTypeConstant.AUCTION_GOODS);
            map.put("notification_time", DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"));