17个文件已修改
1个文件已添加
603 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ForepartAuctionSalesroomGoodsVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/PopUpVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionBidRecordController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomGoodsController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtAuctionSalesroomQuery.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtScreenSalesroomGoodsDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionBidRecordMapper.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionBidRecordService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBidRecordServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionBidRecordMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ForepartAuctionSalesroomGoodsVO.java
@@ -105,4 +105,13 @@
    @ApiModelProperty(value = "商品介绍")
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String goodsDescription;
    @ApiModelProperty(value = "可中拍人数")
    private Integer bidNum;
    @ApiModelProperty(value = "最高出价金额")
    private BigDecimal maxAmount;
    @ApiModelProperty(value = "一次性每人成交数量")
    private Integer dealQuantity;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/PopUpVO.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.api.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author mitao
 * @date 2025/3/11
 */
@Data
@ApiModel("拍卖结果弹窗视图对象")
public class PopUpVO {
    @ApiModelProperty("出价记录id")
    private Long auctionBidRecordId;
    @ApiModelProperty("商品名称")
    private String goodsName;
    @ApiModelProperty("是否中拍 1:是 0:否")
    private Integer successFlag;
    @ApiModelProperty("订单id")
    private Long orderId;
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionBidRecordController.java
@@ -1,22 +1,27 @@
package com.ruoyi.auction.controller.forepart;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.auction.service.IAuctionBidRecordService;
import com.ruoyi.auction.service.IAuctionSalesroomGoodsService;
import com.ruoyi.auction.service.IAuctionSalesroomService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.system.api.domain.dto.BidDTO;
import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO;
import com.ruoyi.system.api.domain.vo.PopUpVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.annotation.Resource;
import lombok.Synchronized;
import org.springframework.web.bind.annotation.*;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
@@ -65,4 +70,17 @@
        return R.ok(iAuctionSalesroomGoodsService.getAuctionBidRecord(auctionSalesroomGoodsInfoDTO));
    }
    @GetMapping("/setPopup/{auctionBidRecordId}")
    @ApiOperation("标记已弹出弹窗")
    public R<?> setPopup(@PathVariable("auctionBidRecordId") Long auctionBidRecordId) {
        iAuctionBidRecordService.setPopup(auctionBidRecordId);
        return R.ok();
    }
    @ApiOperation("【2024.12.31】查询用户弹窗")
    @GetMapping("/popupList")
    public R<List<PopUpVO>> popupList() {
        List<PopUpVO> popupList = iAuctionBidRecordService.popupList();
        return R.ok(popupList);
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomGoodsController.java
@@ -101,6 +101,4 @@
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java
@@ -3,9 +3,7 @@
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.google.zxing.WriterException;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSaleroomBidRecordQuery;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomDTO;
@@ -25,29 +23,36 @@
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.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
@@ -100,7 +105,9 @@
        }
        try {
            String qrCode = weChatUtil.getwxacodeunlimit("pagesA/auctionDetail/auctionDetail", "id=" + auctionSalesroom.getAuctionSalesroomNo(),
            String qrCode = weChatUtil.getwxacodeunlimit("pages/mall/mall",
                    "id=" + auctionSalesroom.getAuctionSalesroomNo() + "&t="
                            + auctionSalesroom.getType().getCode(),
                    EnvVersion.TRIAL, null); // TODO 上线需要修改为正式环境
            auctionSalesroom.setQrCode(qrCode);
            auctionSalesroomService.updateById(auctionSalesroom);
@@ -171,27 +178,8 @@
    @ApiOperation("导出列表")
    @PostMapping("/export")
    public void export(@RequestBody MgtAuctionSalesroomQuery query, HttpServletResponse response) {
        PageDTO<MgtAuctionSalesroomVO> page = auctionSalesroomService.getAuctionSalesroomPage(query);
        if (page.isEmpty()){
            response.setContentType(
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            try {
                String fileName = URLEncoder.encode(
                                "优惠券领取明细" + DateUtils.format(new Date(), "yyyyMMddHHmmss"), "UTF-8")
                        .replaceAll("\\+", "%20");
                response.setHeader("Content-disposition",
                        "attachment;filename*=utf-8''" + fileName + ".xlsx");
                EasyExcel.write(response.getOutputStream(), AuctionBidRecordVO.class)
                        .sheet("优惠券领取明细")
                        .doWrite(new ArrayDeque<>());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        List<MgtAuctionSalesroomVO> list = page.getList();
        List<AuctionBidRecordVO> result = Collections.emptyList();
        List<MgtAuctionSalesroomVO> list = auctionSalesroomService.getAuctionSalesroomList(query);
        List<Long> ids = list.stream().map(MgtAuctionSalesroomVO::getId).collect(Collectors.toList());
@@ -200,72 +188,76 @@
                        .in(!CollectionUtils.isEmpty(ids),AuctionBidRecord::getAuctionSalesroomId, ids)
                        .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.AUCTION_ITEMS)
        );
        if (CollUtils.isNotEmpty(auctionBidRecordList)) {
            // 提取 goodsIds 和 auctionSalesroomIds
            Set<Long> goodsIds = auctionBidRecordList.stream()
                    .map(AuctionBidRecord::getTargetId)
                    .collect(Collectors.toSet());
        if (CollectionUtils.isEmpty(auctionBidRecordList)) {
            return;
            Set<Long> auctionSalesroomIds = auctionBidRecordList.stream()
                    .map(AuctionBidRecord::getAuctionSalesroomId)
                    .collect(Collectors.toSet());
            // 查询拍卖场商品信息
            List<AuctionSalesroomGoods> salesroomGoodss = auctionSalesroomGoodsService.list(
                    new LambdaQueryWrapper<AuctionSalesroomGoods>()
                            .in(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomIds)
                            .in(AuctionSalesroomGoods::getGoodsSkuId, goodsIds)
            );
            Map<String, AuctionSalesroomGoods> roomMap = salesroomGoodss.stream()
                    .collect(Collectors.toMap(
                            i -> String.format("%s-%s", i.getAuctionSalesroomId(),
                                    i.getGoodsSkuId()),
                            i -> i
                    ));
            // 查询拍卖场信息
            List<AuctionSalesroom> auctionSalesroomList = auctionSalesroomService.listByIds(
                    auctionSalesroomIds);
            Map<Long, AuctionSalesroom> auctionSalesroomMap = auctionSalesroomList.stream()
                    .collect(Collectors.toMap(AuctionSalesroom::getId, e -> e));
            // 查询商品信息
            R<List<GoodsSku>> goodsListByIdsR = goodsSkuClient.getGoodsListByIds(goodsIds,
                    SecurityConstants.INNER);
            if (R.isError(goodsListByIdsR)) {
                throw new ServiceException("查询商品信息失败");
            }
            List<GoodsSku> goodsSkuList = goodsListByIdsR.getData();
            Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream()
                    .collect(Collectors.toMap(GoodsSku::getId, e -> e));
            // 构建结果列表
            result = auctionBidRecordList.stream().map(auctionBidRecord -> {
                AuctionBidRecordVO auctionBidRecordVO = BeanUtils.copyBean(auctionBidRecord,
                        AuctionBidRecordVO.class);
                auctionBidRecordVO.setNum(auctionBidRecordList.indexOf(auctionBidRecord) + 1);
                AuctionSalesroomGoods salesroomGoods = roomMap.get(
                        String.format("%s-%s", auctionBidRecord
                                .getAuctionSalesroomId(), auctionBidRecord.getTargetId()));
                if (salesroomGoods != null) {
                    BigDecimal totalAmount = auctionBidRecord.getLastBidAmount()
                            .multiply(new BigDecimal(salesroomGoods
                                    .getDealQuantity()));
                    auctionBidRecordVO.setTotalAmount(totalAmount);
                }
                AuctionSalesroom auctionSalesroom = auctionSalesroomMap.get(
                        auctionBidRecord.getAuctionSalesroomId());
                if (auctionSalesroom != null) {
                    auctionBidRecordVO.setAuctionSalesroomName(auctionSalesroom.getSalesroomName());
                }
                GoodsSku goodsSku = goodsSkuMap.get(auctionBidRecord.getTargetId());
                if (goodsSku != null) {
                    auctionBidRecordVO.setGoodsSkuName(goodsSku.getSkuName());
                }
                return auctionBidRecordVO;
            }).collect(Collectors.toList());
        }
        // 提取 goodsIds 和 auctionSalesroomIds
        Set<Long> goodsIds = auctionBidRecordList.stream()
                .map(AuctionBidRecord::getTargetId)
                .collect(Collectors.toSet());
        Set<Long> auctionSalesroomIds = auctionBidRecordList.stream()
                .map(AuctionBidRecord::getAuctionSalesroomId)
                .collect(Collectors.toSet());
        // 查询拍卖场商品信息
        List<AuctionSalesroomGoods> salesroomGoodss = auctionSalesroomGoodsService.list(
                new LambdaQueryWrapper<AuctionSalesroomGoods>()
                        .in(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomIds)
                        .in(AuctionSalesroomGoods::getGoodsSkuId, goodsIds)
        );
        Map<String, AuctionSalesroomGoods> roomMap = salesroomGoodss.stream()
                .collect(Collectors.toMap(
                        i -> String.format("%s-%s", i.getAuctionSalesroomId(), i.getGoodsSkuId()),
                        i -> i
                ));
        // 查询拍卖场信息
        List<AuctionSalesroom> auctionSalesroomList = auctionSalesroomService.listByIds(auctionSalesroomIds);
        Map<Long, AuctionSalesroom> auctionSalesroomMap = auctionSalesroomList.stream()
                .collect(Collectors.toMap(AuctionSalesroom::getId, e -> e));
        // 查询商品信息
        R<List<GoodsSku>> goodsListByIdsR = goodsSkuClient.getGoodsListByIds(goodsIds, SecurityConstants.INNER);
        if (R.isError(goodsListByIdsR)) {
            throw new ServiceException("查询商品信息失败");
        }
        List<GoodsSku> goodsSkuList = goodsListByIdsR.getData();
        Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream().collect(Collectors.toMap(GoodsSku::getId, e -> e));
        // 构建结果列表
        List<AuctionBidRecordVO> result = auctionBidRecordList.stream().map(auctionBidRecord -> {
            AuctionBidRecordVO auctionBidRecordVO = BeanUtils.copyBean(auctionBidRecord, AuctionBidRecordVO.class);
            auctionBidRecordVO.setNum(auctionBidRecordList.indexOf(auctionBidRecord) + 1);
            AuctionSalesroomGoods salesroomGoods = roomMap.get(String.format("%s-%s", auctionBidRecord
                    .getAuctionSalesroomId(), auctionBidRecord.getTargetId()));
            if (salesroomGoods != null) {
                BigDecimal totalAmount = auctionBidRecord.getLastBidAmount().multiply(new BigDecimal(salesroomGoods
                        .getDealQuantity()));
                auctionBidRecordVO.setTotalAmount(totalAmount);
            }
            AuctionSalesroom auctionSalesroom = auctionSalesroomMap.get(auctionBidRecord.getAuctionSalesroomId());
            if (auctionSalesroom != null) {
                auctionBidRecordVO.setAuctionSalesroomName(auctionSalesroom.getSalesroomName());
            }
            GoodsSku goodsSku = goodsSkuMap.get(auctionBidRecord.getTargetId());
            if (goodsSku != null) {
                auctionBidRecordVO.setGoodsSkuName(goodsSku.getSkuName());
            }
            return auctionBidRecordVO;
        }).collect(Collectors.toList());
        response.setContentType(
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
@@ -273,12 +265,12 @@
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        try {
            String fileName = URLEncoder.encode(
                            "优惠券领取明细" + DateUtils.format(new Date(), "yyyyMMddHHmmss"), "UTF-8")
                            "拍卖场出价记录" + DateUtils.format(new Date(), "yyyyMMddHHmmss"), "UTF-8")
                    .replaceAll("\\+", "%20");
            response.setHeader("Content-disposition",
                    "attachment;filename*=utf-8''" + fileName + ".xlsx");
            EasyExcel.write(response.getOutputStream(), AuctionBidRecordVO.class)
                    .sheet("优惠券领取明细")
                    .sheet("拍卖场出价记录")
                    .doWrite(result);
        } catch (IOException e) {
            throw new RuntimeException(e);
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtAuctionSalesroomQuery.java
@@ -8,7 +8,6 @@
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -41,7 +40,7 @@
    private LocalDateTime endTime;
    @ApiModelProperty(value = "拍卖场Id")
    private List<Long> ids;
    private List<String> ids;
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtScreenSalesroomGoodsDTO.java
@@ -34,7 +34,6 @@
    private BigDecimal minimumMarkupAmount;
    @ApiModelProperty(value = "拍品数量")
    @NotNull(message = "拍品数量不能为空")
    private Integer salesroomStock;
    @ApiModelProperty(value = "兜底成交个数")
@@ -44,4 +43,14 @@
    @NotNull(message = "拍卖时间不能为空")
    private Integer listingDuration;
    @ApiModelProperty(value = "一次性每人成交数量")
    private Integer dealQuantity;
    @ApiModelProperty(value = "可中拍人数")
    @NotNull(message = "可中拍人数不能为空")
    private Integer bidNum;
    @ApiModelProperty(value = "最高出价金额")
    private BigDecimal maxAmount;
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java
@@ -1,17 +1,21 @@
package com.ruoyi.auction.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.BidStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
@@ -86,4 +90,10 @@
    @ApiModelProperty("关联订单id")
    private Long orderId;
    @ApiModelProperty("弹窗通知状态:(0:未通知;1:已通知)")
    private Integer notifyFlag;
    @ApiModelProperty("商品名称")
    private String goodsName;
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionBidRecordMapper.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.system.api.domain.vo.PopUpVO;
import java.util.List;
/**
 * <p>
@@ -13,5 +15,10 @@
 */
public interface AuctionBidRecordMapper extends BaseMapper<AuctionBidRecord> {
    /**
     * 获取弹窗列表
     * @param id
     * @return
     */
    List<PopUpVO> popupList(Long id);
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionBidRecordService.java
@@ -1,8 +1,9 @@
package com.ruoyi.auction.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.vo.PopUpVO;
import java.util.List;
/**
@@ -21,4 +22,16 @@
    public List<AuctionBidRecord> getAuctionBidRecordList(AuctionSalesroomDTO auctionSalesroomGoodsDTO);
    List<AuctionBidRecord> getBidRecordByGoodsId(Long id);
    /**
     * 标记已弹出弹窗
     * @param auctionBidRecordId
     */
    void setPopup(Long auctionBidRecordId);
    /**
     * 【2024.12.31】查询用户弹窗
     * @return
     */
    List<PopUpVO> popupList();
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomService.java
@@ -81,6 +81,13 @@
    PageDTO<MgtAuctionSalesroomVO> getAuctionSalesroomPage(MgtAuctionSalesroomQuery query);
    /**
     * 分页查询拍卖场
     *
     * @param query 拍卖场查询对象
     * @return PageDTO<MgtAuctionSalesroomVO>
     */
    List<MgtAuctionSalesroomVO> getAuctionSalesroomList(MgtAuctionSalesroomQuery query);
    /**
     * 查看二维码
     *
     * @param id 拍卖场id
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBidRecordServiceImpl.java
@@ -7,11 +7,20 @@
import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper;
import com.ruoyi.auction.service.IAuctionBidRecordService;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.BidStatusEnum;
import com.ruoyi.common.core.enums.DisabledEnum;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.vo.PopUpVO;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.model.LoginUser;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -29,6 +38,8 @@
    @Resource
    private AuctionSalesroomGoodsMapper auctionSalesroomGoodsMapper;
    @Resource
    private MemberClient memberClient;
    @Override
    public List<AuctionBidRecord> getAuctionBidRecordList(AuctionSalesroomDTO auctionSalesroomGoodsDTO) {
@@ -43,8 +54,8 @@
                wrapper.orderByAsc(AuctionBidRecord::getLastBidTime);
                auctionBidRecordList = this.list(wrapper);
                //判断
                if (auctionBidRecordList.size()>=auctionSalesroomGoods.getSalesroomStock()){
                    for (int i=0;i<auctionSalesroomGoods.getSalesroomStock();i++){
                if (auctionBidRecordList.size() >= auctionSalesroomGoods.getBidNum()) {
                    for (int i = 0; i < auctionSalesroomGoods.getBidNum(); i++) {
                        AuctionBidRecord auctionBidRecord= auctionBidRecordList.get(i);
                        auctionBidRecord.setStatus(BidStatusEnum.LEAD);
                    }
@@ -78,4 +89,32 @@
                        AuctionOrderTypeEnum.REGULAR_ITEMS)
                .orderByDesc(AuctionBidRecord::getLastBidAmount).list();
    }
    /**
     * 标记已弹出弹窗
     * @param auctionBidRecordId
     */
    @Override
    public void setPopup(Long auctionBidRecordId) {
        this.lambdaUpdate()
                .set(AuctionBidRecord::getNotifyFlag, DisabledEnum.YES.getCode())
                .eq(AuctionBidRecord::getId, auctionBidRecordId).update();
    }
    /**
     * 【2024.12.31】查询用户弹窗
     * @return
     */
    @Override
    public List<PopUpVO> popupList() {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        R<Member> member = memberClient.getMemberByUserId(loginUser.getUserid(),
                SecurityConstants.INNER);
        List<PopUpVO> res = Collections.emptyList();
        if (R.isSuccess(member)) {
            Member memberData = member.getData();
            res = baseMapper.popupList(memberData.getId());
        }
        return res;
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java
@@ -163,7 +163,10 @@
        forepartAuctionSalesroomGoodsVO.setGoodsSkuName(goodsSku.getSkuName());
        forepartAuctionSalesroomGoodsVO.setGoodsSkustatus(auctionSalesroomGoods.getStatus().getCode());
        forepartAuctionSalesroomGoodsVO.setStartingPrice(auctionSalesroomGoods.getStartingPrice());
        forepartAuctionSalesroomGoodsVO.setSalesroomStock(auctionSalesroomGoods.getSalesroomStock());
        // forepartAuctionSalesroomGoodsVO.setSalesroomStock(auctionSalesroomGoods.getSalesroomStock());
        forepartAuctionSalesroomGoodsVO.setBidNum(auctionSalesroomGoods.getBidNum());
        forepartAuctionSalesroomGoodsVO.setDealQuantity(auctionSalesroomGoods.getDealQuantity());
        forepartAuctionSalesroomGoodsVO.setMaxAmount(auctionSalesroomGoods.getMaxAmount());
        forepartAuctionSalesroomGoodsVO.setListingDuration(auctionSalesroomGoods.getListingDuration());
        forepartAuctionSalesroomGoodsVO.setStartTime(auctionSalesroomGoods.getStartTime());
        forepartAuctionSalesroomGoodsVO.setCoverPic(goodsSku.getScreenCoverPic());
@@ -392,7 +395,8 @@
                GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                goodsStockUpdDTO.setGoodsSkuId(salesroomGoods.getGoodsSkuId());
                goodsStockUpdDTO.setAuctionStock(salesroomGoods.getSalesroomStock());
                goodsStockUpdDTO.setAuctionStock(
                        salesroomGoods.getBidNum() * salesroomGoods.getDealQuantity());
                goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                        SecurityConstants.INNER);
@@ -519,7 +523,7 @@
            if (auctionBidRecordList.size() > 0) {
                //判断
                if (auctionBidRecordList.size() >= auctionSalesroomGoods.getBidNum()) {
                    for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) {
                    for (int i = 0; i < auctionSalesroomGoods.getBidNum(); i++) {
                        AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i);
                        auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                        Long orderId = AddOrder(auctionBidRecord.getTargetId(),
@@ -538,7 +542,9 @@
                } else {
                    GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                    goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId());
                    goodsStockUpdDTO.setAuctionStock(auctionSalesroomGoods.getSalesroomStock()- auctionBidRecordList.size());
                    goodsStockUpdDTO.setAuctionStock(auctionSalesroomGoods.getBidNum()
                            * auctionSalesroomGoods.getDealQuantity() - auctionBidRecordList.size()
                            * auctionSalesroomGoods.getDealQuantity());
                    goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                            SecurityConstants.INNER);
@@ -569,13 +575,15 @@
                            .equals(BidStatusEnum.SUCCESSFUL))
                    .map(AuctionBidRecord::getMemberId)
                    .collect(Collectors.toList());
            Map<Long, Long> bidMap = auctionBidRecordList.stream().collect(
                    Collectors.toMap(AuctionBidRecord::getMemberId, AuctionBidRecord::getId));
            if (CollUtils.isNotEmpty(successMemberIdList)) {
                List<Member> successMemberList = memberClient.getMemberListByIds(
                        successMemberIdList, SecurityConstants.INNER).getData();
                if (CollUtils.isNotEmpty(successMemberList)) {
                    // 推送websocket消息
                    sendWebsocketMsg(auctionSalesroomGoods.getId(), successMemberList, goodsSku, 1,
                            orderIdMap);
                            orderIdMap, bidMap);
                    // 发送短信通知
                    List<String> mobileList = successMemberList.stream().map(Member::getPhone)
                            .collect(Collectors.toList());
@@ -590,7 +598,7 @@
                if (CollUtils.isNotEmpty(failedMemberList)) {
                    // 推送websocket消息
                    sendWebsocketMsg(auctionSalesroomGoods.getId(), failedMemberList, goodsSku, 0,
                            orderIdMap);
                            orderIdMap, bidMap);
                    // 发送短信通知
                    List<String> mobileList = failedMemberList.stream().map(Member::getPhone)
                            .collect(Collectors.toList());
@@ -630,7 +638,7 @@
     * @param successFlag // 中标状态 1:中标 0:未中标
     */
    private void sendWebsocketMsg(Long id, List<Member> memberList, GoodsSku goodsSku,
            Integer successFlag, Map<Long, String> userIdMap) {
            Integer successFlag, Map<Long, String> userIdMap, Map<Long, Long> bidMap) {
        for (Member member : memberList) {
            Map<String, Object> map = new ConcurrentHashMap<>();
            map.put("notification_type", NotificationTypeConstant.AUCTION_POPUP);
@@ -639,6 +647,7 @@
            map.put("goods_name", Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : "");
            map.put("success_flag", successFlag);
            map.put("order_id", successFlag == 1 ? userIdMap.getOrDefault(member.getId(), "") : "");
            map.put("auction_bid_record_id", bidMap.getOrDefault(member.getId(), 0L));
            String msg = JSONObject.toJSONString(map);
            sysUserClient.pushBatch(
                    WebsocketMessageDTO.builder().message(msg).userId(member.getUserId()).build(),
@@ -663,7 +672,10 @@
        AuctionSalesroomGoodsInfoVO.setGoodsSkuId(byId1.getId());
        AuctionSalesroomGoodsInfoVO.setGoodsSkuName(goodsSku.getSkuName());
        AuctionSalesroomGoodsInfoVO.setStartingPrice(byId1.getStartingPrice());
        AuctionSalesroomGoodsInfoVO.setSalesroomStock(byId1.getSalesroomStock());
        // AuctionSalesroomGoodsInfoVO.setSalesroomStock(byId1.getSalesroomStock());
        AuctionSalesroomGoodsInfoVO.setBidNum(byId1.getBidNum());
        AuctionSalesroomGoodsInfoVO.setMaxAmount(byId1.getMaxAmount());
        AuctionSalesroomGoodsInfoVO.setDealQuantity(byId1.getDealQuantity());
        AuctionSalesroomGoodsInfoVO.setSalesroomType(byId.getType().getCode());
        AuctionSalesroomGoodsInfoVO.setGoodsSkustatus(byId1.getStatus().getCode());
        AuctionSalesroomGoodsInfoVO.setListingDuration(byId1.getListingDuration());
@@ -894,6 +906,5 @@
        order.setGoodsId(auctionSalesroomGoods.getGoodsSkuId());
        return orderClient.saveOrderOne(order, SecurityConstants.INNER).getData();
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -36,7 +36,6 @@
import com.ruoyi.auction.service.IAuctionGoodsService;
import com.ruoyi.auction.service.IAuctionSalesroomService;
import com.ruoyi.auction.service.IAuctionVideoService;
import com.ruoyi.auction.util.CreateQrCode;
import com.ruoyi.auction.util.HttpUtils;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants;
@@ -516,7 +515,7 @@
            forepartAuctionSalesroomGoodsVO.setGoodsSkuId(salesroomGoods.getId());
            forepartAuctionSalesroomGoodsVO.setCoverPic(goodsSku.getCoverPic());
            forepartAuctionSalesroomGoodsVO.setStartingPrice(salesroomGoods.getStartingPrice());
            forepartAuctionSalesroomGoodsVO.setSalesroomStock(salesroomGoods.getSalesroomStock());
            // forepartAuctionSalesroomGoodsVO.setSalesroomStock(salesroomGoods.getSalesroomStock());
            forepartAuctionSalesroomGoodsVO.setGoodsSkustatus(salesroomGoods.getStatus().getCode());
            forepartAuctionSalesroomGoodsVO.setMinimumMarkupAmount(salesroomGoods.getMinimumMarkupAmount());
            forepartAuctionSalesroomGoodsVO.setStartTime(salesroomGoods.getStartTime());
@@ -524,6 +523,9 @@
            forepartAuctionSalesroomGoodsVO.setListingDuration(salesroomGoods.getListingDuration());
            forepartAuctionSalesroomGoodsVO.setSpec(goodsSku.getSpec());
            forepartAuctionSalesroomGoodsVO.setSpecUnit(goodsSku.getSpecUnit());
            forepartAuctionSalesroomGoodsVO.setDealQuantity(salesroomGoods.getDealQuantity());
            forepartAuctionSalesroomGoodsVO.setMaxAmount(salesroomGoods.getMaxAmount());
            forepartAuctionSalesroomGoodsVO.setBidNum(salesroomGoods.getBidNum());
            LambdaQueryWrapper<AuctionBidRecord> wrapper1=Wrappers.lambdaQuery();
            wrapper1.eq(AuctionBidRecord::getMemberId,memberAuctionSalesroomDTO.getMemberId());
            wrapper1.eq(AuctionBidRecord::getAuctionSalesroomId,byId.getId());
@@ -698,6 +700,9 @@
            if (bidVO.getAuctionType() == 2) {
                AuctionSalesroomGoods byId = auctionSalesroomGoodsMapper.selectById(
                        bidVO.getTargetId());
                R<GoodsSku> goodsSkuOneR = goodsSkuClient.getGoodsSkuOne(byId.getGoodsSkuId(),
                        SecurityConstants.INNER);
                GoodsSku goodsSku = goodsSkuOneR.getData();
                // 判断否大于最高价
                if (byId.getMaxAmount().compareTo(bidVO.getLastBidAmount()) < 0) {
                    throw new ServiceException("出价不能高出最高价");
@@ -730,7 +735,7 @@
                wrapper3.orderByDesc(AuctionBidRecord::getLastBidAmount);
                wrapper3.last("limit 1");
                AuctionBidRecord one3 = auctionBidRecordService.getOne(wrapper3);
                if (byId.getSalesroomStock() == 1) {
                if (byId.getBidNum() == 1) {
                    if (one3 != null) {
                        if (bidVO.getLastBidAmount().doubleValue() < one3.getLastBidAmount()
                                .doubleValue()) {
@@ -746,7 +751,8 @@
                }
                BigDecimal bigDecimal = byId.getStartingPrice().add(byId.getMinimumMarkupAmount());
                if (bigDecimal.doubleValue() > bidVO.getLastBidAmount().doubleValue()) {
                if (bigDecimal.doubleValue() > bidVO.getLastBidAmount().doubleValue()
                        && count > 0) {
                    throw new ServiceException("出价不能比每次最少加价低");
                }
@@ -779,6 +785,7 @@
                    one.setStatus(BidStatusEnum.ELIMINATE);
                    one.setBidCount(1);
                    one.setLastBidAmount(bidVO.getLastBidAmount());
                    one.setGoodsName(Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : "");
                    auctionBidRecordService.save(one);
                }
@@ -804,8 +811,15 @@
                String finalMsg = msg;
                sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(finalMsg)
                        .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER);
                // 发送短信
                authClient.sendSms(
                        SmsSendDTO.builder().mobileList(Lists.newArrayList(membeOne.getPhone()))
                                .content("出价成功").build(), SecurityConstants.INNER);
            } else {
                AuctionGoods byId = auctionGoodsService.getById(bidVO.getTargetId());
                R<GoodsSku> goodsSkuOneR = goodsSkuClient.getGoodsSkuOne(byId.getGoodsSkuId(),
                        SecurityConstants.INNER);
                GoodsSku goodsSku = goodsSkuOneR.getData();
                // 查询用户出价记录判断是否第一次出价 首次出价,可以只出起拍价,而不是需要比起拍价高。
                Long count = auctionBidRecordService.lambdaQuery()
                        .eq(AuctionBidRecord::getTargetId, bidVO.getTargetId())
@@ -816,7 +830,8 @@
                    throw new ServiceException("出价不能比起拍价低");
                }
                BigDecimal bigDecimal = byId.getStartingPrice().add(byId.getMinimumMarkupAmount());
                if (bigDecimal.doubleValue() > bidVO.getLastBidAmount().doubleValue()) {
                if (bigDecimal.doubleValue() > bidVO.getLastBidAmount().doubleValue()
                        && count > 0) {
                    throw new ServiceException("出价不能比每次最少加价低");
                }
                LambdaQueryWrapper<AuctionBidRecord> wrapper1 = Wrappers.lambdaQuery();
@@ -863,6 +878,7 @@
                    one3.setStatus(BidStatusEnum.ELIMINATE);
                    one3.setBidCount(1);
                    one3.setLastBidAmount(bidVO.getLastBidAmount());
                    one3.setGoodsName(Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : "");
                    auctionBidRecordService.save(one3);
                }
@@ -881,6 +897,10 @@
                String finalMsg = msg;
                sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(finalMsg)
                        .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER);
                // 发送短信
                authClient.sendSms(
                        SmsSendDTO.builder().mobileList(Lists.newArrayList(membeOne.getPhone()))
                                .content("出价成功").build(), SecurityConstants.INNER);
            }
        } finally {
@@ -927,7 +947,7 @@
                        AuctionSalesroom::getEndTime, AuctionSalesroom::getType,
                        AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus,
                        AuctionSalesroom::getQrCode)
                .in(StringUtils.isNotNull(query.getIds()), AuctionSalesroom::getId,query.getIds())
                .in(CollUtils.isNotEmpty(query.getIds()), AuctionSalesroom::getId, query.getIds())
                .like(StringUtils.isNotEmpty(query.getSalesroomName()),
                        AuctionSalesroom::getSalesroomName, query.getSalesroomName())
                .eq(StringUtils.isNotNull(query.getAuthentication()),
@@ -970,6 +990,52 @@
        return auctionSalesroomVOPageDTO;
    }
    @Override
    public List<MgtAuctionSalesroomVO> getAuctionSalesroomList(MgtAuctionSalesroomQuery query) {
        // 分页查询
        List<AuctionSalesroom> auctionSalesroomList = this.lambdaQuery()
                .select(AuctionSalesroom::getId, AuctionSalesroom::getSalesroomName,
                        AuctionSalesroom::getCreateTime, AuctionSalesroom::getStartTime,
                        AuctionSalesroom::getEndTime, AuctionSalesroom::getType,
                        AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus,
                        AuctionSalesroom::getQrCode)
                .in(CollUtils.isNotEmpty(query.getIds()), AuctionSalesroom::getId, query.getIds())
                .like(StringUtils.isNotEmpty(query.getSalesroomName()),
                        AuctionSalesroom::getSalesroomName, query.getSalesroomName())
                .eq(StringUtils.isNotNull(query.getAuthentication()),
                        AuctionSalesroom::getAuthentication, query.getAuthentication())
                .eq(StringUtils.isNotNull(query.getStatus()), AuctionSalesroom::getStatus,
                        query.getStatus()).between(
                        StringUtils.isNotNull(query.getStartTime()) && StringUtils.isNotNull(
                                query.getEndTime()), AuctionSalesroom::getStartTime,
                        query.getStartTime(),
                        query.getEndTime())
                .orderByDesc(AuctionSalesroom::getCreateTime)
                .list();
        List<MgtAuctionSalesroomVO> list = BeanUtils.copyList(auctionSalesroomList,
                MgtAuctionSalesroomVO.class);
        List<Long> auctionSalesroomIdList = list.stream().map(MgtAuctionSalesroomVO::getId)
                .collect(Collectors.toList());
        if (StringUtils.isNotEmpty(auctionSalesroomIdList)) {
            // 所有拍卖场的拍卖商品
            List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList(
                    Wrappers.<AuctionSalesroomGoods>lambdaQuery()
                            .in(AuctionSalesroomGoods::getAuctionSalesroomId,
                                    auctionSalesroomIdList));
            // 计算每个拍卖场所有拍品数量
            Map<Long, Integer> map = auctionSalesroomGoods.stream()
                    .collect(Collectors.groupingBy(AuctionSalesroomGoods::getAuctionSalesroomId,
                            Collectors.summingInt(AuctionSalesroomGoods::getBidNum)));
            for (MgtAuctionSalesroomVO mgtAuctionSalesroomVO : list) {
                Integer i = map.get(mgtAuctionSalesroomVO.getId());
                if (StringUtils.isNotNull(i)) {
                    mgtAuctionSalesroomVO.setAuctionGoodsNum(i);
                }
            }
        }
        return list;
    }
    @Override
    @Transactional
@@ -1379,7 +1445,7 @@
        // 扣减库存
        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
        goodsStockUpdDTO.setGoodsSkuId(data.getId());
        goodsStockUpdDTO.setAuctionStock(dto.getSalesroomStock() * -1);
        goodsStockUpdDTO.setAuctionStock(dto.getBidNum() * dto.getDealQuantity() * -1);
        R<?> result = goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                SecurityConstants.INNER);
        if (result.getCode() != Constants.SUCCESS) {
@@ -1490,8 +1556,8 @@
                if (CollUtils.isNotEmpty(auctionBidRecordList)) {
                    List<AuctionBidRecord> auctionBidRecords = new ArrayList<>();
                    Map<Long, String> orderIdMap = new HashMap<>();
                    if (auctionBidRecordList.size() >= auctionSalesroomGoods.getSalesroomStock()) {
                        for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) {
                    if (auctionBidRecordList.size() >= auctionSalesroomGoods.getBidNum()) {
                        for (int i = 0; i < auctionSalesroomGoods.getBidNum(); i++) {
                            AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i);
                            auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL);
                            auctionBidRecords.add(auctionBidRecord);
@@ -1520,8 +1586,10 @@
                        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                        goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId());
                        goodsStockUpdDTO.setAuctionStock(
                                auctionSalesroomGoods.getSalesroomStock()
                                        - auctionBidRecordList.size());
                                auctionSalesroomGoods.getBidNum()
                                        * auctionSalesroomGoods.getDealQuantity()
                                        - auctionBidRecordList.size()
                                        * auctionSalesroomGoods.getDealQuantity());
                        goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                                SecurityConstants.INNER);
                    }
@@ -1579,7 +1647,8 @@
                    GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                    goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId());
                    goodsStockUpdDTO.setAuctionStock(
                            auctionSalesroomGoods.getSalesroomStock());
                            auctionSalesroomGoods.getBidNum()
                                    * auctionSalesroomGoods.getDealQuantity());
                    goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                            SecurityConstants.INNER);
                }
@@ -1802,7 +1871,8 @@
                // 等待中的商品退库存
                GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                goodsStockUpdDTO.setGoodsSkuId(salesroomGoods.getGoodsSkuId());
                goodsStockUpdDTO.setAuctionStock(salesroomGoods.getSalesroomStock());
                goodsStockUpdDTO.setAuctionStock(
                        salesroomGoods.getBidNum() * salesroomGoods.getDealQuantity());
                dtoList.add(goodsStockUpdDTO);
            }
            // 批量更新商品库存
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java
@@ -9,20 +9,18 @@
import com.ruoyi.auction.util.CreateQrCode;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.system.api.RemoteFileService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
/**
 * 微信工具类
@@ -96,7 +94,7 @@
            return wxAppletsAccessToken.toString();
        }
        String appletsAccessToken = getAppletsAccessToken();
        redisService.setCacheObject("wxAppletsAccessToken", appletsAccessToken, 7200L, TimeUnit.SECONDS);
        redisService.setCacheObject("wxAppletsAccessToken", appletsAccessToken, 7000L, TimeUnit.SECONDS);
        return appletsAccessToken;
    }
    
ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionBidRecordMapper.xml
@@ -2,4 +2,25 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.auction.mapper.AuctionBidRecordMapper">
  <select id="popupList" resultType="com.ruoyi.system.api.domain.vo.PopUpVO"
    parameterType="java.lang.Long">
    SELECT tabr.id AS auctionBidRecordId,
    tabr.order_id,
    tabr.goods_name,
    CASE
    WHEN tabr.`status` = 0 THEN
    0
    WHEN tabr.`status` = 2 THEN
    1
    END
    AS successFlag
    FROM t_auction_bid_record tabr
    LEFT JOIN t_auction_goods tag ON tabr.auction_type = 1
    AND tag.id = tabr.target_id AND tag.start_status = 3
    LEFT JOIN t_auction_salesroom_goods tasg ON tabr.auction_type = 2 AND tasg.`status` = 3
    AND tasg.id = tabr.target_id
    <where>
      tabr.member_id = #{id}
    </where>
  </select>
</mapper>
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -8,8 +8,11 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.*;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.ListingStatusEnum;
import com.ruoyi.common.core.enums.MemberVipClassifyEnum;
import com.ruoyi.common.core.enums.OrderFromEnum;
import com.ruoyi.common.core.enums.StartStatusEnum;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.page.BeanUtils;
@@ -33,7 +36,18 @@
import com.ruoyi.goods.service.IGoodsInfoTitleValueService;
import com.ruoyi.goods.service.IGoodsSkuService;
import com.ruoyi.goods.service.IMemberGoodsCollectionService;
import com.ruoyi.system.api.domain.*;
import com.ruoyi.system.api.domain.AuctionGoods;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.GoodsBrand;
import com.ruoyi.system.api.domain.GoodsCategory;
import com.ruoyi.system.api.domain.GoodsFlavorType;
import com.ruoyi.system.api.domain.GoodsGroupPurchase;
import com.ruoyi.system.api.domain.GoodsSeckill;
import com.ruoyi.system.api.domain.GoodsSeries;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
import com.ruoyi.system.api.domain.dto.ListStatusDTO;
@@ -45,7 +59,7 @@
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.OrderClient;
import com.ruoyi.system.api.model.LoginUser;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -439,11 +453,19 @@
        }
        Page<GoodsSku> page1 = this.page(page, wrapper3);
        for (GoodsSku record : page1.getRecords()) {
            // 获取会员价格
            BigDecimal vipPrice = getVipPrice(record.getId());
            record.setPrice(vipPrice);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        Member member = memberClient.getMemberByUserId(loginUser.getUserid(),
                SecurityConstants.INNER).getData();
        // 用户已登录 有会员等级 会员等级不为普通用户 则获取会员价格
        if (SecurityUtils.isLogin() && Objects.nonNull(member.getVipClassify())
                && !member.getVipClassify().equals(MemberVipClassifyEnum.NORMAL.getCode())) {
            for (GoodsSku record : page1.getRecords()) {
                // 获取会员价格
                BigDecimal vipPrice = getVipPrice(record.getId(), member.getVipClassify());
                record.setPrice(vipPrice);
            }
        }
        return PageDTO.of(page1, HomeGoodsSkuListVO.class);
    }
@@ -479,7 +501,7 @@
        homeGoodsSkuInfoVO.setDescription(byId.getDescription());
        homeGoodsSkuInfoVO.setStock(byId.getStock());
        homeGoodsSkuInfoVO.setDetail(byId.getDetail());
        homeGoodsSkuInfoVO.setPrice(byId.getPrice());
        if (StringUtils.isBlank(byId.getShareTitle())) {
            homeGoodsSkuInfoVO.setShareTitle(byId.getSkuName());
        } else {
@@ -515,8 +537,16 @@
            homeGoodsSkuInfoVO.setIsGoodsGroupPurchase(1);
        }
        // 获取会员价格
        BigDecimal vipPrice = getVipPrice(byId.getId());
        homeGoodsSkuInfoVO.setPrice(vipPrice);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        Member member = memberClient.getMemberByUserId(loginUser.getUserid(),
                SecurityConstants.INNER).getData();
        // 用户已登录 有会员等级 会员等级不为普通用户 则获取会员价格
        if (SecurityUtils.isLogin() && Objects.nonNull(member.getVipClassify())
                && !member.getVipClassify().equals(MemberVipClassifyEnum.NORMAL.getCode())) {
            // 获取会员价格
            BigDecimal vipPrice = getVipPrice(byId.getId(), member.getVipClassify());
            homeGoodsSkuInfoVO.setPrice(vipPrice);
        }
        LambdaQueryWrapper<MemberGoodsCollection> wrapper3= Wrappers.lambdaQuery();
        wrapper3.eq(MemberGoodsCollection::getDelFlag,0);
@@ -561,24 +591,15 @@
        return homeGoodsSkuInfoVO;
    }
    private BigDecimal getVipPrice(Long goodsSkuId){
        if (SecurityUtils.isLogin()) {
            Long userId = SecurityUtils.getUserId();
            GoodsSku byId = getById(goodsSkuId);
            Member member = memberClient.getMemberByUserId(userId, SecurityConstants.INNER).getData();
            Integer vipClassify = member.getVipClassify();
            if (MemberVipClassifyEnum.NORMAL.getCode().equals(vipClassify)) {
                return byId.getPrice();
            }else if (MemberVipClassifyEnum.VIP.getCode().equals(vipClassify)){
                return byId.getVipPrice();
            }else if (MemberVipClassifyEnum.SUPER_VIP.getCode().equals(vipClassify)){
                return byId.getSuperVipPrice();
            }
        }else {
            return getById(goodsSkuId).getPrice();
    private BigDecimal getVipPrice(Long goodsSkuId, Integer vipClassify) {
        GoodsSku byId = getById(goodsSkuId);
        BigDecimal price = BigDecimal.ZERO;
        if (MemberVipClassifyEnum.VIP.getCode().equals(vipClassify)) {
            price = byId.getVipPrice();
        } else if (MemberVipClassifyEnum.SUPER_VIP.getCode().equals(vipClassify)) {
            price = byId.getSuperVipPrice();
        }
        throw new ServiceException("会员等级错误");
        return price;
    }
    @Override
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java
@@ -49,8 +49,7 @@
    @ResponseBody
    @InnerAuth
    public R<Long> saveOrderOne(@RequestBody OrderDTO OrderDTO) {
        orderService.saveOrderOne(OrderDTO);
        return R.ok();
        return R.ok(orderService.saveOrderOne(OrderDTO));
    }