ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/BondReturnDTO.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.system.api.domain.dto; import java.util.List; import lombok.Data; /** * 拍卖商品退保证金数据传输对象 * * @author mitao * @date 2024/7/19 */ @Data public class BondReturnDTO { /** * 拍卖商品id */ private Long id; /** * 不退保证金用户id */ private List<Long> memberIdList; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
@@ -6,6 +6,7 @@ import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.AuctionGoodsListDTO; import com.ruoyi.system.api.domain.dto.BondReturnDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; @@ -140,7 +141,7 @@ } @Override public R<?> returnBondByAuctionGoodsId(Long id, String source) { public R<?> returnBondByAuctionGoodsId(BondReturnDTO bondReturnDTO, String source) { return R.fail("普通拍卖退保证金失败" + cause.getMessage()); } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
@@ -8,6 +8,7 @@ import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.AuctionGoodsListDTO; import com.ruoyi.system.api.domain.dto.BondReturnDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; @@ -176,8 +177,8 @@ * @param id 拍卖商品id * @param source 内部调用标志 */ @GetMapping("/order-auction-bond/refund-bond/{id}") R<?> returnBondByAuctionGoodsId(@PathVariable("id") Long id, @GetMapping("/order-auction-bond/refund-bond") R<?> returnBondByAuctionGoodsId(@RequestBody BondReturnDTO bondReturnDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @PutMapping("/order/autoCancelOrder/{id}") ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/management/dto/MgtArticleQuery.java
@@ -1,6 +1,7 @@ package com.ruoyi.article.controller.management.dto; import com.ruoyi.common.core.enums.ArticleTypeEnum; import com.ruoyi.common.core.enums.AuditStatusEnum; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; @@ -34,4 +35,7 @@ @ApiModelProperty(value = "上架状态 上架中 已下架") private ListingStatusEnum listingStatus; @ApiModelProperty(value = "状态 1=待审核 2=已通过 3=已拒绝") private AuditStatusEnum status; } ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
@@ -371,6 +371,8 @@ query.getListingStatus()) .eq(StringUtils.isNotNull(query.getArticleType()), Article::getArticleType, query.getArticleType()) .eq(StringUtils.isNotNull(query.getStatus()), Article::getStatus, query.getStatus()) .in(StringUtils.isNotNull(query.getArticleType()) && query.getArticleType() .equals(ArticleTypeEnum.USER_POSTING), Article::getStatus, Lists.newArrayList(AuditStatusEnum.TO_BE_REVIEWED, @@ -423,6 +425,8 @@ if (StringUtils.isNotNull(sysUser)) { articleVO.setCreateBy(sysUser.getNickName()); articleVO.setPhone(sysUser.getPhonenumber()); } else { articleVO.setCreateBy(null); } }); } @@ -433,6 +437,8 @@ if (StringUtils.isNotNull(member)) { articleVO.setCreateBy(member.getNickname()); articleVO.setPhone(member.getPhone()); } else { articleVO.setCreateBy(null); } }); voList.stream().filter(articleVO -> articleVO.getReported().equals(Boolean.TRUE)) ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionScreenController.java
@@ -113,7 +113,7 @@ /** * 添加备选商品 * * @param idList 备选商品id集合 * @param idStr 备选商品id集合 */ @PutMapping("/add-backup-goods") @ApiOperation(value = "选择备选商品", notes = "选择备选商品") ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/MgtAuctionBidRecordVO.java
@@ -1,5 +1,6 @@ package com.ruoyi.auction.controller.management.vo; import com.ruoyi.common.core.enums.BidStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; @@ -44,4 +45,7 @@ @ApiModelProperty(value = "出价次数") private Integer bidCount; @ApiModelProperty(value = "开始状态 0=淘汰 1=领先") private BidStatusEnum status; } 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")); ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -46,6 +46,7 @@ import com.ruoyi.common.core.enums.BidStatusEnum; import com.ruoyi.common.core.enums.BondStatusEnum; import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.IDhelper; import com.ruoyi.common.core.utils.StringUtils; @@ -55,12 +56,15 @@ import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.RemoteFileService; import com.ruoyi.system.api.constants.ConfigEnum; import com.ruoyi.system.api.constants.NotificationTypeConstant; import com.ruoyi.system.api.domain.AppMiniLoginVO; import com.ruoyi.system.api.domain.AuctionGoods; import com.ruoyi.system.api.domain.AuctionSalesroom; import com.ruoyi.system.api.domain.CustomConfig; 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.PromotionVideo; import com.ruoyi.system.api.domain.SysUser; @@ -72,8 +76,8 @@ import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomWdDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomVO; @@ -89,6 +93,7 @@ import io.seata.spring.annotation.GlobalTransactional; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -97,6 +102,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; @@ -824,7 +830,8 @@ .select(AuctionSalesroom::getId, AuctionSalesroom::getSalesroomName, AuctionSalesroom::getCreateTime, AuctionSalesroom::getStartTime, AuctionSalesroom::getEndTime, AuctionSalesroom::getType, AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus) AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus, AuctionSalesroom::getQrCode) .like(StringUtils.isNotEmpty(query.getSalesroomName()), AuctionSalesroom::getSalesroomName, query.getSalesroomName()) .eq(StringUtils.isNotNull(query.getAuthentication()), @@ -1110,28 +1117,28 @@ .orderByDesc(query.getSortType() == 1, AuctionBidRecord::getLastBidAmount) .orderByDesc(query.getSortType() == 2, AuctionBidRecord::getBidCount) .page(new Page<>(query.getPageCurr(), query.getPageSize())); if (StringUtils.isNull(page.getRecords())) { if (StringUtils.isEmpty(page.getRecords())) { return PageDTO.empty(page); } PageDTO<MgtAuctionBidRecordVO> mgtAuctionBidRecordVOPageDTO = PageDTO.of(page, MgtAuctionBidRecordVO.class); List<MgtAuctionBidRecordVO> list = mgtAuctionBidRecordVOPageDTO.getList(); Set<Long> goodsIdList = list.stream().map(MgtAuctionBidRecordVO::getGoodsSkuId) .collect(Collectors.toSet()); AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById( query.getId()); Set<Long> memberIdList = list.stream().map(MgtAuctionBidRecordVO::getMemberId) .collect(Collectors.toSet()); List<GoodsSku> goodsSkuList = goodsSkuClient.getGoodsListByIds(goodsIdList, GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne( auctionSalesroomGoods.getGoodsSkuId(), SecurityConstants.INNER) .getData(); List<Member> memberList = memberClient.getMemberListByIds(memberIdList, SecurityConstants.INNER) .getData(); Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream() .collect(Collectors.toMap(GoodsSku::getId, Function.identity())); Map<Long, Member> memberMap = memberList.stream() .collect(Collectors.toMap(Member::getId, Function.identity())); for (MgtAuctionBidRecordVO vo : list) { GoodsSku goodsSku = goodsSkuMap.get(vo.getGoodsSkuId()); Member member = memberMap.get(vo.getMemberId()); if (StringUtils.isNotNull(goodsSku)) { vo.setGoodsSkuName(goodsSku.getSkuName()); @@ -1227,7 +1234,10 @@ vo.setMgtAuctionBidRecordVOList( BeanUtils.copyList(list, MgtAuctionBidRecordVO.class)); } else { vo.setNextAuctionSalesroomGoods(collect.get(0)); Optional<MgtAuctionSalesroomGoodsVO> first = collect.stream() .filter(c -> c.getStatus().equals(AuctionGoodsStatusEnum.WAITING)) .findFirst(); vo.setNextAuctionSalesroomGoods(first.orElse(null)); } } } @@ -1262,10 +1272,26 @@ .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.AUCTION_ITEMS) .page(new Page<>(mgtScreenBidPage.getPageCurr(), mgtScreenBidPage.getPageSize())); if (StringUtils.isNotEmpty(page.getRecords())) { if (StringUtils.isEmpty(page.getRecords())) { return PageDTO.empty(page); } return PageDTO.of(page, MgtAuctionBidRecordVO.class); PageDTO<MgtAuctionBidRecordVO> vo = PageDTO.of(page, MgtAuctionBidRecordVO.class); List<Long> id = vo.getList().stream().map(MgtAuctionBidRecordVO::getMemberId) .collect(Collectors.toList()); List<Member> data = memberClient.getMemberListByIds(id, SecurityConstants.INNER).getData(); if (CollUtils.isNotEmpty(data)) { Map<Long, Member> memberMap = data.stream() .collect(Collectors.toMap(Member::getId, e -> e)); vo.getList().forEach(item -> { Member member = memberMap.get(item.getMemberId()); if (StringUtils.isNotNull(member)) { item.setMemberName(member.getNickname()); item.setPhone(member.getPhone()); } }); } return vo; } /** @@ -1375,8 +1401,51 @@ if (StringUtils.isNull(auctionSalesroomGoods)) { throw new ServiceException("拍卖商品不存在"); } AuctionSalesroom auctionSalesroom = this.getById( auctionSalesroomGoods.getAuctionSalesroomId()); auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED); auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); List<AuctionBidRecord> auctionBidRecordList = auctionBidRecordMapper.selectList( Wrappers.lambdaQuery(AuctionBidRecord.class) .eq(AuctionBidRecord::getAuctionSalesroomId, auctionSalesroomGoods.getAuctionSalesroomId()) .eq(AuctionBidRecord::getTargetId, auctionSalesroomGoods.getGoodsSkuId()) .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.AUCTION_ITEMS) .orderByDesc(AuctionBidRecord::getLastBidAmount)); if (CollUtils.isNotEmpty(auctionBidRecordList)) { List<AuctionBidRecord> auctionBidRecords = new ArrayList<>(); if (auctionBidRecordList.size() >= auctionSalesroomGoods.getSalesroomStock()) { for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecords.add(auctionBidRecord); } } else { for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecords.add(auctionBidRecord); } // 没有出价记录,回退库存 GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock( auctionSalesroomGoods.getSalesroomStock() - auctionBidRecordList.size()); goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } for (AuctionBidRecord auctionBidRecord : auctionBidRecords) { addOrder(auctionBidRecord.getTargetId(), auctionBidRecord.getMemberId(), auctionBidRecord.getLastBidAmount(), auctionSalesroom.getBond()); } } else { // 没有出价记录,回退库存 GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock( auctionSalesroomGoods.getSalesroomStock()); goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } Map<String, Object> map = new ConcurrentHashMap<>(); map.put("notification_type", NotificationTypeConstant.AUCTION_SALESROOM_GOODS); map.put("auctionSalesroomId", auctionSalesroomGoods.getAuctionSalesroomId().toString()); @@ -1388,6 +1457,59 @@ sysUserClient.pushAll(msg, SecurityConstants.INNER); } public void addOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount, BigDecimal bound) { OrderDTO order = new OrderDTO(); order.setGoodsSkuId(goodsSkuId); order.setOrderTime(LocalDateTime.now()); order.setOrderFrom(OrderFromEnum.AUCTION_ORDERS); order.setMemberId(memberId); AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById( goodsSkuId); order.setGoodsQuantity(1); order.setTotalAmount(lastBidAmount); order.setAuctionSalesroomId(auctionSalesroomGoods.getAuctionSalesroomId()); R<MemberAddress> memberAddressR = memberClient.getMemberAddressOne(memberId, SecurityConstants.INNER); MemberAddress memberAddress = memberAddressR.getData(); CustomConfig memberPointsMoney = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData(); CustomConfig memberPointsPoints = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_POINTS.getKey()) .getData(); if (lastBidAmount.intValue() > 0) { BigDecimal divide = lastBidAmount.divide( BigDecimal.valueOf(Long.parseLong(memberPointsMoney.getConfigValue())), 0, RoundingMode.DOWN); int points = divide.multiply( BigDecimal.valueOf( Long.parseLong((memberPointsPoints.getConfigValue())))).intValue(); order.setPoints(points); } else { order.setPoints(0); } if (memberAddress != null) { order.setReceiverCity(memberAddress.getCity()); order.setReceiverDetailAddress(memberAddress.getDetailedAddress()); order.setReceiverphone(memberAddress.getRecipientPhone()); order.setReceiverName(memberAddress.getRecipientName()); } order.setBound(bound); order.setAuctionType(AuctionOrderTypeEnum.AUCTION_ITEMS); GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(auctionSalesroomGoods.getGoodsSkuId(), SecurityConstants.INNER) .getData(); order.setSkuName(goodsSku.getSkuName()); order.setCoverPic(goodsSku.getCoverPic()); order.setPrice(lastBidAmount); orderClient.saveOrderOne(order, SecurityConstants.INNER); } /** * 开始下一拍卖商品 * @@ -1400,6 +1522,7 @@ throw new ServiceException("拍卖商品不存在"); } auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS); auctionSalesroomGoods.setStartTime(LocalDateTime.now()); auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); Map<String, Object> map = new ConcurrentHashMap<>(); map.put("notification_type", NotificationTypeConstant.AUCTION_SALESROOM_GOODS); ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/InnerOrderAuctionBondController.java
@@ -12,6 +12,7 @@ import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.AuctionGoodsListDTO; import com.ruoyi.system.api.domain.dto.BondDTO; import com.ruoyi.system.api.domain.dto.BondReturnDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; @@ -20,7 +21,6 @@ import javax.annotation.Resource; import org.apache.poi.ss.formula.functions.T; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -188,9 +188,9 @@ } @GetMapping("/refund-bond/{id}") public R<?> returnBondByAuctionGoodsId(@PathVariable("id") Long id) { iOrderAuctionBondService.returnBondByAuctionGoodsId(id); @GetMapping("/refund-bond") public R<?> returnBondByAuctionGoodsId(@RequestBody BondReturnDTO bondReturnDTO) { iOrderAuctionBondService.returnBondByAuctionGoodsId(bondReturnDTO); return R.ok(); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderAuctionBondService.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.core.enums.AuctionOrderTypeEnum; import com.ruoyi.common.core.enums.BondStatusEnum; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.BondReturnDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.vo.PayInfoVO; @@ -45,5 +46,5 @@ */ void updateOrderAuctionBondStatus(List<Long> ids, BondStatusEnum bondStatusEnum); void returnBondByAuctionGoodsId(Long id); void returnBondByAuctionGoodsId(BondReturnDTO bondReturnDTO); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderAuctionBondServiceImpl.java
@@ -19,18 +19,16 @@ import com.ruoyi.system.api.domain.AuctionGoods; import com.ruoyi.system.api.domain.AuctionSalesroom; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.BondReturnDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.feignClient.AuctionClient; 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.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -236,12 +234,13 @@ @Override @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void returnBondByAuctionGoodsId(Long id) { public void returnBondByAuctionGoodsId(BondReturnDTO bondReturnDTO) { Long id = bondReturnDTO.getId(); List<OrderAuctionBond> list = this.lambdaQuery().eq(OrderAuctionBond::getAuctionGoodsId, id) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID).list(); Set<String> orderNoSet = list.stream().map(OrderAuctionBond::getOrderNo) .collect(Collectors.toSet()); List<RefundDTO> refundDTOList = list.stream().map(item -> { List<Long> memberIdList = bondReturnDTO.getMemberIdList(); List<RefundDTO> refundDTOList = list.stream() .filter(r -> !memberIdList.contains(r.getMemberId())).map(item -> { RefundDTO refundDTO = new RefundDTO(); refundDTO.setAmount(item.getBond()); refundDTO.setOrderNo(item.getOrderNo()); ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -19,6 +19,7 @@ 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.CollUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO; @@ -1504,38 +1505,33 @@ @Override public void refundBond(Long id) { Order order = getOrder(id); OrderAuctionBond orderAuctionBond; List<OrderAuctionBond> orderAuctionBond; if (order.getAuctionOrderType() == AuctionOrderTypeEnum.AUCTION_ITEMS) { orderAuctionBond = orderAuctionBondMapper.selectOne( orderAuctionBond = orderAuctionBondMapper.selectList( Wrappers.lambdaQuery(OrderAuctionBond.class) .eq(OrderAuctionBond::getAuctionSalesroomId, order.getAuctionSalesroomId()) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID)); if (StringUtils.isNotNull(orderAuctionBond) && orderAuctionBond.getBoundStatus() == BondStatusEnum.REFUNDED) { throw new ServiceException("改拍卖会已退保证金"); } } else { orderAuctionBond = orderAuctionBondMapper.selectOne( orderAuctionBond = orderAuctionBondMapper.selectList( Wrappers.lambdaQuery(OrderAuctionBond.class) .eq(OrderAuctionBond::getAuctionGoodsId, order.getGoodsSkuId()) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID)); } Paylog paylog = iPaylogService.lambdaQuery() .eq(Paylog::getOutTradeNo, orderAuctionBond.getOrderNo()) .last("limit 1").one(); if (StringUtils.isNull(paylog)) { throw new ServiceException("支付记录不存在"); } 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); if (CollUtils.isNotEmpty(orderAuctionBond)) { for (OrderAuctionBond auctionBond : orderAuctionBond) { Paylog paylog = iPaylogService.lambdaQuery() .in(Paylog::getOutTradeNo, auctionBond.getOrderNo()) .one(); boolean result = handleRefund(auctionBond.getPaymentMethod(), paylog, auctionBond.getOrderNo()); if (result) { paylog.setState(3);// 已退款 auctionBond.setBoundStatus(BondStatusEnum.REFUNDED); iPaylogService.updateById(paylog); this.updateById(order); } } } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java
@@ -37,6 +37,7 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -151,6 +152,7 @@ * @param dto 管理后台-优惠券数据传输对象 */ @Override @Transactional(rollbackFor = Exception.class) public void updateCoupon(MgtCouponDTO dto) { Coupon coupon = this.getById(dto.getId()); if (StringUtils.isNull(coupon)) { @@ -159,6 +161,8 @@ coupon.setCouponName(dto.getCouponName()); coupon.setDescription(dto.getDescription()); this.updateById(coupon); couponMemberService.lambdaUpdate().set(CouponMember::getDescription, dto.getDescription()) .eq(CouponMember::getCouponId, dto.getId()).update(); } /**