From 7106d8205f0af944a34b880405c1b33effcc5393 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期五, 19 七月 2024 22:06:33 +0800 Subject: [PATCH] 修改bug --- ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java | 197 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 163 insertions(+), 34 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 70f0106..fa8ca17 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 @@ -65,6 +65,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; @@ -314,13 +315,16 @@ // 查询出价记录 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(); + for (int i = 0; i < auctionGoods.getAuctionStock(); i++) { + AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i); + auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); + auctionBidRecordList.add(auctionBidRecord); + } + auctionBidRecordService.updateBatchById(auctionBidRecordList); + // 创建待支付订单 CustomConfig moneyConfig = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData(); @@ -330,32 +334,35 @@ 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) { + 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()); + 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); } - 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(); @@ -374,9 +381,13 @@ 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(); @@ -664,15 +675,133 @@ } @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() .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)) { + // 中标 + for (int i = 0; i < auctionGoods.getAuctionStock(); i++) { + AuctionBidRecord auctionBidRecord = auctionBidRecords.get(i); + auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); + auctionBidRecordList.add(auctionBidRecord); + } + auctionBidRecordService.updateBatchById(auctionBidRecordList); + // 创建待支付订单 + CustomConfig moneyConfig = sysUserClient.getconfig( + ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData(); + CustomConfig pointsConfig = sysUserClient.getconfig( + ConfigEnum.MEMBER_POINTS_POINTS.getKey()).getData(); + BigDecimal ratio = + BigDecimal.valueOf(Double.parseDouble( + pointsConfig.getConfigValue())) + .divide(BigDecimal.valueOf(Double.parseDouble( + moneyConfig.getConfigValue())), 0, RoundingMode.DOWN); + + 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()); + } + // 远程调用订单服务进行退款 + 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, + 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")); -- Gitblit v1.7.1