mitao
2024-07-19 7106d8205f0af944a34b880405c1b33effcc5393
修改bug
1个文件已添加
13个文件已修改
457 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/BondReturnDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/management/dto/MgtArticleQuery.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionScreenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/MgtAuctionBidRecordVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/InnerOrderAuctionBondController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderAuctionBondService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderAuctionBondServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
    /**