From e097b03e9032a8e884c36e6a28d8b5002780daeb Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 14 二月 2025 17:02:46 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev-1.0.1' into dev-1.0.1

---
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java     |   15 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java |  160 ++++++++++
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WXCore.java                                  |   48 +++
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java                              |  243 ++++++++++++++++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java                 |    7 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java                             |   14 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java                         |    4 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSkuController.java             |   27 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java                    |    5 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java                        |    2 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java                                     |    3 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java                        |   70 +++-
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/EnvVersion.java                              |   35 ++
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java             |   11 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java                           |    1 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WxPKCS7Encoder.java                          |   63 ++++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java                      |    9 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/AuctionBidRecordVO.java         |   34 ++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/GoodsSku.java                                   |    8 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/AES.java                                     |   72 ++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/vo/GoodsSkuVO.java                     |   10 
 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java                  |   16 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java                                 |    7 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/dto/GoodsSkuDTO.java                   |    9 
 24 files changed, 820 insertions(+), 53 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
index 5ff0a3d..5ed09d8 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
@@ -7,8 +7,11 @@
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
 
 /**
  * 文件服务
@@ -29,4 +32,8 @@
 
     @PostMapping(value = "/obs/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public R<String> obsUpload(@RequestPart("file") MultipartFile file);
+
+    @PostMapping("/obs/upload/stream")
+    public R<String> obsUpload(@RequestParam("code") String code,
+                               @RequestParam("stream") InputStream stream);
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java
index 49546c9..772c3a3 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java
@@ -53,6 +53,15 @@
     @ApiModelProperty(value = "拍品数量")
     private Integer salesroomStock;
 
+    @ApiModelProperty(value = "可中拍人数")
+    private Integer bidNum;
+
+    @ApiModelProperty(value = "最高出价金额")
+    private BigDecimal maxAmount;
+
+    @ApiModelProperty(value = "一次性每人成交数量")
+    private Integer dealQuantity;
+
     @ApiModelProperty(value = "兜底成交个数")
     @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)
     private Integer guaranteedTradeVolume;
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/GoodsSku.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/GoodsSku.java
index ee9b476..51afa57 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/GoodsSku.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/GoodsSku.java
@@ -59,6 +59,12 @@
     @ApiModelProperty(value = "商品价格")
     private BigDecimal price;
 
+    @ApiModelProperty(value = "普通会员价格")
+    private BigDecimal vipPrice;
+
+    @ApiModelProperty(value = "超级会员价格")
+    private BigDecimal superVipPrice;
+
     @ApiModelProperty(value = "库存")
     private Integer stock;
 
@@ -118,7 +124,7 @@
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableLogic
     private Integer delFlag;
-    
+
     @ApiModelProperty(value = "商品封面图(大屏)")
     private String screenCoverPic;
 
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java
index 74d8b73..df982b5 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java
@@ -82,6 +82,9 @@
     @ApiModelProperty(value = "支付宝openid")
     private String zfbOpenid;
 
+    @ApiModelProperty(value = "会员分类(1:普通用户;2:会员用户;3:超级会员用户)")
+    private Integer vipClassify;
+
     @ApiModelProperty(value = "创建者")
     @TableField(value = "create_by", fill = FieldFill.INSERT)
     private String createBy;
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java
index f6c1479..5fe75b7 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java
@@ -110,6 +110,11 @@
                     Set<Long> auctionSalesroomGoodsSet, String source) {
                 return R.fail("获取商品信息失败" + cause.getMessage());
             }
+
+            @Override
+            public R<AuctionGoods> getAuctionBySkuId(Long goodsSkuId, String source) {
+                return R.fail("获取拍卖商品失败" + cause.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
index d1eabaa..879ed89 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
@@ -9,6 +9,8 @@
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.InputStream;
+
 /**
  * 文件服务降级处理
  * 
@@ -35,6 +37,11 @@
             public R<String> obsUpload(MultipartFile file) {
                 return R.fail("obs上传文件失败:" + throwable.getMessage());
             }
+
+            @Override
+            public R<String> obsUpload(String code, InputStream stream) {
+                return R.fail("obs上传文件失败:" + throwable.getMessage());
+            }
         };
     }
 
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java
index 7d25a03..e59e410 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java
@@ -108,4 +108,8 @@
     R<List<GoodsSku>> getGoodsSkuByAuctionSalesroomGoodsSet(
             @RequestBody Set<Long> auctionSalesroomGoodsSet,
             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @GetMapping("/auction-goods/getAuctionBySkuId/{goodsSkuId}")
+    R<AuctionGoods> getAuctionBySkuId(@PathVariable("goodsSkuId") Long goodsSkuId,
+                                      @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 }
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
index 07129e0..12d033c 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.constant.TokenConstants;
 import com.ruoyi.common.core.context.SecurityContextHolder;
+import com.ruoyi.common.core.exception.auth.NotLoginException;
 import com.ruoyi.common.core.utils.ServletUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.system.api.model.LoginUser;
@@ -71,6 +72,21 @@
     }
 
     /**
+     * 判断用户是否登录
+     */
+    public static boolean isLogin()
+    {
+
+        String token = SecurityUtils.getToken();
+        if (token == null)
+        {
+            return false;
+        }
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        return loginUser != null;
+    }
+
+    /**
      * 裁剪token前缀
      */
     public static String replaceTokenPrefix(String token)
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java
index 38de71b..409c8f6 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.auction.controller.inner;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.auction.service.IAuctionGoodsService;
 import com.ruoyi.common.core.domain.R;
@@ -100,4 +101,14 @@
     R<List<GoodsSku>> getGoodsSkuByAuctionGoodsIdSet(@RequestBody Set<Long> auctionGoodsIdSet) {
         return R.ok(auctionGoodsService.getGoodsSkuByAuctionGoodsIdSet(auctionGoodsIdSet));
     }
+
+    /**
+     * 根据商品id获取拍卖商品
+     */
+    @InnerAuth
+    @GetMapping("/getAuctionBySkuId/{goodsSkuId}")
+    R<AuctionGoods> getAuctionBySkuId(@PathVariable("goodsSkuId") Long goodsSkuId) {
+        return R.ok(auctionGoodsService.getOne(new LambdaQueryWrapper<AuctionGoods>()
+                .eq(AuctionGoods::getGoodsSkuId, goodsSkuId)));
+    }
 }
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
index 4fab669..d7e8fdc 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
@@ -4,22 +4,20 @@
 import com.ruoyi.auction.controller.management.dto.MgtAuctionGoodsDTO;
 import com.ruoyi.auction.controller.management.dto.MgtAuctionGoodsQuery;
 import com.ruoyi.auction.controller.management.vo.MgtAuctionGoodsVO;
+import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
 import com.ruoyi.auction.service.IAuctionGoodsService;
+import com.ruoyi.auction.service.IAuctionSalesroomGoodsService;
+import com.ruoyi.auction.service.IAuctionSalesroomService;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.page.PageDTO;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
+import com.ruoyi.system.api.feignClient.GoodsSkuClient;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
-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;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -100,4 +98,7 @@
         return R.ok();
     }
 
+
+
+
 }
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java
index 80f5cd5..71eaa4b 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java
@@ -1,28 +1,52 @@
 package com.ruoyi.auction.controller.management;
 
 
+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.google.zxing.WriterException;
 import com.ruoyi.auction.controller.management.dto.MgtAuctionSaleroomBidRecordQuery;
 import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomDTO;
 import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomQuery;
+import com.ruoyi.auction.controller.management.vo.AuctionBidRecordVO;
 import com.ruoyi.auction.controller.management.vo.MgtAuctionBidRecordVO;
 import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomVO;
+import com.ruoyi.auction.domain.AuctionBidRecord;
+import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
+import com.ruoyi.auction.service.IAuctionSalesroomGoodsService;
 import com.ruoyi.auction.service.IAuctionSalesroomService;
+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.exception.ServiceException;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.page.BeanUtils;
 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.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 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.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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * <p>
@@ -40,6 +64,9 @@
 public class MgtAuctionSalesroomController {
 
     private final IAuctionSalesroomService auctionSalesroomService;
+    private final AuctionBidRecordMapper auctionBidRecordMapper;
+    private final IAuctionSalesroomGoodsService auctionSalesroomGoodsService;
+    private final GoodsSkuClient goodsSkuClient;
 
     /**
      * 分页查询拍卖场
@@ -114,4 +141,125 @@
             @Validated @RequestBody MgtAuctionSaleroomBidRecordQuery query) {
         return R.ok(auctionSalesroomService.getAuctionSalesroomBidRecordList(query));
     }
+
+    /**
+     * 删除拍卖场
+     */
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除拍卖场", notes = "删除拍卖场")
+    public R<?> deleteAuctionSalesroom(@PathVariable("id") Long id){
+        auctionSalesroomService.removeById(id);
+        return R.ok();
+    }
+
+
+    /**
+     * 导出列表
+     */
+    @ApiOperation("导出列表")
+    @PostMapping("/export")
+    @ApiImplicitParam(name = "ids", value = "查询条件", required = true)
+    public void export(@RequestBody String query, HttpServletResponse response) {
+        // 验证输入是否为空或格式不正确
+        if (StringUtils.isEmpty(query)) {
+            throw new ServiceException("查询条件不能为空");
+        }
+
+        JSONObject jsonObject = JSONObject.parseObject(query);
+        List<String> ids = jsonObject.getList("ids", String.class);
+
+        // 验证ids是否为空
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new ServiceException("ids不能为空");
+        }
+
+        List<AuctionBidRecord> auctionBidRecordList = auctionBidRecordMapper.selectList(
+                new LambdaQueryWrapper<AuctionBidRecord>()
+                        .in(!CollectionUtils.isEmpty(ids),AuctionBidRecord::getAuctionSalesroomId, ids)
+                        .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.AUCTION_ITEMS)
+        );
+
+        if (CollectionUtils.isEmpty(auctionBidRecordList)) {
+            return;
+        }
+
+        // 提取 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");
+        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(result);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/AuctionBidRecordVO.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/AuctionBidRecordVO.java
new file mode 100644
index 0000000..5d1f8d2
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/vo/AuctionBidRecordVO.java
@@ -0,0 +1,34 @@
+package com.ruoyi.auction.controller.management.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class AuctionBidRecordVO {
+    @ExcelProperty(value = "序号")
+    private Integer num;
+
+    @ExcelProperty(value = "姓名")
+    private String nickname;
+
+    @ExcelProperty(value = "电话")
+    private String phone;
+
+    @ExcelProperty(value = "单品出价金额")
+    private BigDecimal lastBidAmount;
+
+    @ExcelProperty(value = "总价")
+    private BigDecimal totalAmount;
+
+    @ExcelProperty(value = "出价时间")
+    private LocalDateTime lastBidTime;
+
+    @ExcelProperty(value = "拍卖会名称")
+    private String auctionSalesroomName;
+
+    @ExcelProperty(value = "拍品名称")
+    private String goodsSkuName;
+}
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java
index 52554ed..472e2b2 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java
@@ -1,22 +1,18 @@
 package com.ruoyi.auction.domain;
 
-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.baomidou.mybatisplus.annotation.*;
 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 java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
 /**
  * <p>
  * 出价记录表
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
index 850c498..99fa12c 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
@@ -81,4 +81,6 @@
     List<AuctionGoods> getAuctionGoodsBySkuId(Long id);
 
     List<GoodsSku> getGoodsSkuByAuctionGoodsIdSet(Set<Long> auctionGoodsIdSet);
+
+
 }
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/AES.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/AES.java
new file mode 100644
index 0000000..d497b5e
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/AES.java
@@ -0,0 +1,72 @@
+package com.ruoyi.auction.util.weChat;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.*;
+
+/**
+* AES加密
+* @author pzb
+* @Date 2021/12/3 15:43
+*/
+public class AES {
+
+    public static boolean initialized = false;
+
+    /**
+     * AES解密
+     *
+     * @param content
+     *            密文
+     * @return
+     * @throws InvalidAlgorithmParameterException
+     * @throws NoSuchProviderException
+     */
+    public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
+        initialize();
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            Key sKeySpec = new SecretKeySpec(keyByte, "AES");
+            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (NoSuchProviderException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void initialize() {
+        if (initialized)
+            return;
+        Security.addProvider(new BouncyCastleProvider());
+        initialized = true;
+    }
+
+    // 生成iv
+    public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
+        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
+        params.init(new IvParameterSpec(iv));
+        return params;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/EnvVersion.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/EnvVersion.java
new file mode 100644
index 0000000..41dd328
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/EnvVersion.java
@@ -0,0 +1,35 @@
+package com.ruoyi.auction.util.weChat;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/12/10 15:56
+ */
+public enum EnvVersion {
+	/**
+	 * 开发版
+	 */
+	DEVELOP("develop"),
+	/**
+	 * 体验版
+	 */
+	TRIAL("trial"),
+	/**
+	 * 线上版本
+	 */
+	RELEASE("release");
+	
+	
+	EnvVersion(String version) {
+		this.version = version;
+	}
+	
+	private String version;
+	
+	public String getVersion() {
+		return version;
+	}
+	
+	public void setVersion(String version) {
+		this.version = version;
+	}
+}
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WXCore.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WXCore.java
new file mode 100644
index 0000000..d13f78b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WXCore.java
@@ -0,0 +1,48 @@
+package com.ruoyi.auction.util.weChat;
+
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Value;
+
+public class WXCore {
+
+    private static final String WATERMARK = "watermark";
+
+    @Value("${wx.appletsAppid}")
+    private static String appid ;
+
+
+
+    /**
+     * 解密数据
+     * @return
+     * @throws Exception
+     */
+    public static String decrypt(String encryptedData, String sessionKey, String iv){
+        String result = "";
+        try {
+            AES aes = new AES();
+            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
+            if(null != resultByte && resultByte.length > 0){
+                result = new String(WxPKCS7Encoder.decode(resultByte), "UTF-8");
+//                JSONObject jsonObject = JSON.parseObject(result);
+//                String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString("appid");
+//                if(!appid.equals(decryptAppid)){
+//                    result = "";
+//                }
+            }
+        } catch (Exception e) {
+            result = "";
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    public static void main(String[] args) throws Exception{
+        String appId = "wx4f4bc4dec97d474b";
+        String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
+        String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
+        String iv = "r7BXXKkLb8qrSNn05n0qiA==";
+        System.out.println(decrypt(encryptedData, sessionKey, iv));
+    }
+}
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java
new file mode 100644
index 0000000..d7de046
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WeChatUtil.java
@@ -0,0 +1,243 @@
+package com.ruoyi.auction.util.weChat;
+
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+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 javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 微信工具类
+ */
+@Slf4j
+@Component
+public class WeChatUtil {
+
+    @Value("${wx.appletsAppid}")
+    private String wxAppletsAppid;
+
+    @Value("${wx.appletsAppSecret}")
+    private String wxAppletsAppSecret;
+
+//    @Value("${wx.appid}")
+    private String webAppId;
+
+//    @Value("${wx.appSecret}")
+    private String webAppSecret;
+    
+    @Resource
+    private RedisService redisService;
+    @Resource
+    private RemoteFileService remoteFileService;
+    
+    
+
+
+    /**
+     * 小程序使用jscode获取openid
+     * @param jscode
+     * @return
+     */
+    public Map<String, Object> code2Session(String jscode) {
+        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret
+                + "&js_code=" + jscode + "&grant_type=authorization_code";
+        HttpRequest get = HttpUtil.createGet(url);
+        HttpResponse response = get.execute();
+        int status = response.getStatus();
+        if(200 != status){
+            throw new RuntimeException(response.body());
+        }
+        JSONObject jsonObject = JSON.parseObject(response.body());
+        int errcode = jsonObject.getIntValue("errcode");
+        Map<String, Object> map = new HashMap<>();
+        map.put("errcode", errcode);
+        if(errcode == 0){//成功
+            map.put("openid", jsonObject.getString("openid"));
+            map.put("sessionKey", jsonObject.getString("session_key"));
+            map.put("unionid", jsonObject.getString("unionid"));
+            return map;
+        }
+        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 40029){//code 无效
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 45011){//频率限制,每个用户每分钟100次
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        return null;
+    }
+    
+    
+    public String getWxAppletsAccessToken(){
+        Object wxAppletsAccessToken = redisService.getCacheObject("wxAppletsAccessToken");
+        if(null != wxAppletsAccessToken){
+            return wxAppletsAccessToken.toString();
+        }
+        String appletsAccessToken = getAppletsAccessToken();
+        redisService.setCacheObject("wxAppletsAccessToken", appletsAccessToken, 7200L, TimeUnit.SECONDS);
+        return appletsAccessToken;
+    }
+    
+
+    /**
+     * 获取微信小程序token
+     * @return
+     */
+    public String getAppletsAccessToken() {
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret;
+        HttpRequest get = HttpUtil.createGet(url);
+        HttpResponse response = get.execute();
+        if(response.getStatus() != 200){
+            return "";
+        }
+        JSONObject jsonObject = JSON.parseObject(response.body());
+        return jsonObject.getString("access_token");
+    }
+
+
+    /**
+     * 网站应用登录
+     * @param code
+     * @return
+     */
+    public Map<String, String> webAccessToken(String code) throws Exception{
+        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + webAppId + "&secret=" + webAppSecret + "&code=" + code + "&grant_type=authorization_code";
+        HttpRequest get = HttpUtil.createGet(url);
+        HttpResponse response = get.execute();
+        if(response.getStatus() != 200){
+            return null;
+        }
+        JSONObject jsonObject = JSON.parseObject(response.body());
+        int errcode = jsonObject.getIntValue("errcode");
+        Map<String, String> map = new HashMap<>();
+        if(errcode == 0){//成功
+            map.put("access_token", jsonObject.getString("access_token"));
+            map.put("openid", jsonObject.getString("openid"));
+            map.put("refresh_token", jsonObject.getString("refresh_token"));
+            map.put("unionid", jsonObject.getString("unionid"));
+            return map;
+        }
+        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 40029){//code 无效
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 45011){//频率限制,每个用户每分钟100次
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        return map;
+    }
+
+
+    /**
+     * 获取微信个人信息
+     * @param access_token
+     * @param openid
+     * @return
+     */
+    public Map<String, Object> getUserInfo(String access_token, String openid) throws Exception{
+        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
+        HttpRequest get = HttpUtil.createGet(url);
+        HttpResponse response = get.execute();
+        if(response.getStatus() != 200){
+            return null;
+        }
+        JSONObject jsonObject = JSON.parseObject(response.body());
+        int errcode = jsonObject.getIntValue("errcode");
+        Map<String, Object> map = new HashMap<>();
+        if(errcode == 0){//成功
+            map.put("nickname", jsonObject.getString("nickname"));
+            map.put("openid", jsonObject.getString("openid"));
+            map.put("sex", jsonObject.getString("sex"));
+            map.put("headimgurl", jsonObject.getString("headimgurl"));
+            return map;
+        }
+        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 40029){//code 无效
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        if(errcode == 45011){//频率限制,每个用户每分钟100次
+            map.put("msg", jsonObject.getString("errmsg"));
+            return map;
+        }
+        return map;
+    }
+
+    
+
+
+    /**
+     * 获取小程序二维码
+     * @param page      跳转页 例如 pages/index/index
+     * @param scene     参数 a=1&b=2
+     */
+    public InputStream getwxacodeunlimit(String page, String scene, EnvVersion env_version){
+        try {
+            String token = getWxAppletsAccessToken();
+            if(StringUtils.isEmpty(token)){
+                System.err.println("获取接口调用凭证失败");
+            }
+            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token;
+            Map<String, Object> param = new HashMap<>();
+            param.put("scene", scene);
+            param.put("page", page);
+            param.put("env_version", env_version.getVersion());
+    
+            HttpRequest post = HttpUtil.createPost(url);
+            post.header(Header.CONTENT_TYPE, "application/json;charset=UTF-8");
+            post.body(JSON.toJSONString(param));
+            HttpResponse execute = post.execute();
+            byte[] bytes = execute.bodyBytes();
+            String body1 = execute.body();
+            System.err.println(body1);
+            System.err.println(Base64.encodeBase64String(bytes));
+            return new ByteArrayInputStream(bytes);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+    
+    
+    /**
+     * 获取微信小程序二维码
+     * @param page
+     * @param scene
+     * @param filePath
+     * @return
+     */
+    public String getwxacodeunlimit(String page, String scene, EnvVersion env_version, String filePath){
+        InputStream getwxacodeunlimit = getwxacodeunlimit(page, scene, env_version);
+//        File file = FileUtil.writeFromStream(getwxacodeunlimit, new File(filePath));
+//        return file.getPath();
+        return remoteFileService.obsUpload("png", getwxacodeunlimit).getData();
+    }
+}
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WxPKCS7Encoder.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WxPKCS7Encoder.java
new file mode 100644
index 0000000..4821687
--- /dev/null
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/util/weChat/WxPKCS7Encoder.java
@@ -0,0 +1,63 @@
+package com.ruoyi.auction.util.weChat;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+* 微信小程序加解密
+* @author pzb
+* @Date 2021/12/3 15:43
+*/
+public class WxPKCS7Encoder {
+    private static final Charset CHARSET = Charset.forName("utf-8");
+    private static final int BLOCK_SIZE = 32;
+
+    /**
+     * 获得对明文进行补位填充的字节.
+     *
+     * @param count
+     *            需要进行填充补位操作的明文字节个数
+     * @return 补齐用的字节数组
+     */
+    public static byte[] encode(int count) {
+        // 计算需要填充的位数
+        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+        if (amountToPad == 0) {
+            amountToPad = BLOCK_SIZE;
+        }
+        // 获得补位所用的字符
+        char padChr = chr(amountToPad);
+        String tmp = new String();
+        for (int index = 0; index < amountToPad; index++) {
+            tmp += padChr;
+        }
+        return tmp.getBytes(CHARSET);
+    }
+
+    /**
+     * 删除解密后明文的补位字符
+     *
+     * @param decrypted
+     *            解密后的明文
+     * @return 删除补位字符后的明文
+     */
+    public static byte[] decode(byte[] decrypted) {
+        int pad = decrypted[decrypted.length - 1];
+        if (pad < 1 || pad > 32) {
+            pad = 0;
+        }
+        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+    }
+
+    /**
+     * 将数字转化成ASCII码对应的字符,用于对明文进行补码
+     *
+     * @param a
+     *            需要转化的数字
+     * @return 转化得到的字符
+     */
+    public static char chr(int a) {
+        byte target = (byte) (a & 0xFF);
+        return (char) target;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSkuController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSkuController.java
index 6cbb9bb..55a9d28 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSkuController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSkuController.java
@@ -2,6 +2,7 @@
 
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.page.PageDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsInfoTitleQuery;
@@ -19,20 +20,16 @@
 import com.ruoyi.goods.service.IGoodsInfoTitleService;
 import com.ruoyi.goods.service.IGoodsSeriesService;
 import com.ruoyi.goods.service.IGoodsSkuService;
+import com.ruoyi.system.api.domain.AuctionGoods;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
+import com.ruoyi.system.api.feignClient.AuctionClient;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-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;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -55,7 +52,7 @@
     private final IGoodsCategoryService goodsCategoryService;
     private final IGoodsInfoTitleService goodsInfoTitleService;
     private final IGoodsFlavorTypeService goodsFlavorTypeService;
-
+    private final AuctionClient auctionClient;
     /**
      * 获取商品分类列表的接口 该接口不需要接收任何参数,调用后返回商品分类的列表信息。
      *
@@ -169,4 +166,18 @@
     public R<GoodsSkuVO> getGoodsDetail(@PathVariable("id") Long id) {
         return R.ok(goodsSkuService.getGoodsDetail(id));
     }
+
+    /**
+     * 删除商品
+     */
+    @ApiOperation("删除商品")
+    @DeleteMapping("/delete/{id}")
+    public R<Void> delete(@PathVariable("id") Long id) {
+        R<AuctionGoods> auctionR = auctionClient.getAuctionBySkuId(id, SecurityConstants.INNER);
+        if (auctionR.getData() != null){
+            return R.fail("该商品正在拍卖中,无法删除");
+        }
+        goodsSkuService.removeById(id);
+        return R.ok();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/dto/GoodsSkuDTO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/dto/GoodsSkuDTO.java
index 60b6560..3c6f93c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/dto/GoodsSkuDTO.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/dto/GoodsSkuDTO.java
@@ -53,6 +53,15 @@
     @NotNull(message = "商品价格不能为空")
     private BigDecimal price;
 
+    @ApiModelProperty(value = "普通会员价格")
+    @NotNull(message = "普通会员价格不能为空")
+    private BigDecimal vipPrice;
+
+    @ApiModelProperty(value = "超级会员价格")
+    @NotNull(message = "超级会员价格不能为空")
+    private BigDecimal superVipPrice;
+
+
     @ApiModelProperty(value = "库存")
     @NotNull(message = "库存不能为空")
     private Integer stock;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/vo/GoodsSkuVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/vo/GoodsSkuVO.java
index 55df9f1..da8b6c9 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/vo/GoodsSkuVO.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/vo/GoodsSkuVO.java
@@ -5,11 +5,13 @@
 import com.ruoyi.system.api.domain.vo.GoodsInfoTitleValueVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
-import lombok.Data;
+
 /**
  * @author mitao
  * @date 2024/5/20
@@ -45,6 +47,12 @@
     @ApiModelProperty(value = "商品价格")
     private BigDecimal price;
 
+    @ApiModelProperty(value = "普通会员价格")
+    private BigDecimal vipPrice;
+
+    @ApiModelProperty(value = "超级会员价格")
+    private BigDecimal superVipPrice;
+
     @ApiModelProperty(value = "库存")
     private Integer stock;
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
index efdd4b7..51e7216 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -8,16 +8,16 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.core.constant.SecurityConstants;
-import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
-import com.ruoyi.common.core.enums.ListingStatusEnum;
-import com.ruoyi.common.core.enums.OrderFromEnum;
-import com.ruoyi.common.core.enums.StartStatusEnum;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.enums.*;
 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.Checker;
 import com.ruoyi.common.core.utils.page.CollUtils;
 import com.ruoyi.common.core.utils.page.PageDTO;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.goods.controller.management.dto.GoodsInfoTitleValueDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsSkuDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsSkuQuery;
@@ -33,17 +33,7 @@
 import com.ruoyi.goods.service.IGoodsInfoTitleValueService;
 import com.ruoyi.goods.service.IGoodsSkuService;
 import com.ruoyi.goods.service.IMemberGoodsCollectionService;
-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.Order;
+import com.ruoyi.system.api.domain.*;
 import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
 import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
@@ -53,7 +43,10 @@
 import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO;
 import com.ruoyi.system.api.feignClient.AuctionClient;
 import com.ruoyi.system.api.feignClient.GoodsSkuClient;
+import com.ruoyi.system.api.feignClient.MemberClient;
 import com.ruoyi.system.api.feignClient.OrderClient;
+
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -69,6 +62,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -105,8 +99,13 @@
     @Resource
     private IMemberGoodsCollectionService iMemberGoodsCollectionService;
 
+    @Resource
+    private MemberClient memberClient;
+
 
     private static final ObjectMapper objectMapper = new ObjectMapper();
+    @Autowired
+    private TokenService tokenService;
 
     /**
      * 保存商品SKU信息。
@@ -341,6 +340,11 @@
 
     @Override
     public PageDTO<HomeGoodsSkuListVO> getHomeGoodsSkuVOList(HomeGoodsSkuDTO homeGoodsSkuDTO) {
+        Long userId = SecurityUtils.getUserId();
+        R<Member> memberR = memberClient.getMemberByUserId(userId, SecurityConstants.INNER);
+        Member member = memberR.getData();
+        Integer vipClassify = member.getVipClassify();
+
         Page<GoodsSku> page = new Page<>();
         page.setSize(homeGoodsSkuDTO.getPageSize());
         page.setCurrent(homeGoodsSkuDTO.getPageCurr());
@@ -439,10 +443,13 @@
             wrapper3.last(",IF(isnull(sort_num),1,0), sort_num DESC,create_time DESC" );
         }
 
-
         Page<GoodsSku> page1 = this.page(page, wrapper3);
-        PageDTO<HomeGoodsSkuListVO> articleCommentsVOPageDTO = PageDTO.of(page1, HomeGoodsSkuListVO.class);
-        return  articleCommentsVOPageDTO;
+        for (GoodsSku record : page1.getRecords()) {
+            // 获取会员价格
+            BigDecimal vipPrice = getVipPrice(record.getId());
+            record.setPrice(vipPrice);
+        }
+        return PageDTO.of(page1, HomeGoodsSkuListVO.class);
 
     }
 
@@ -468,7 +475,6 @@
         if (data3!=null) {
             homeGoodsSkuInfoVO.setFlavorType(data3.getFlavorTypeName());
         }
-        homeGoodsSkuInfoVO.setPrice(byId.getPrice());
         homeGoodsSkuInfoVO.setSoldQuantity(byId.getSoldQuantity());
         homeGoodsSkuInfoVO.setUnit(byId.getUnit());
         homeGoodsSkuInfoVO.setSpec(byId.getSpec());
@@ -513,7 +519,9 @@
                     "=============================没有查询到团购信息=============================");
             homeGoodsSkuInfoVO.setIsGoodsGroupPurchase(1);
         }
-
+        // 获取会员价格
+        BigDecimal vipPrice = getVipPrice(byId.getId());
+        homeGoodsSkuInfoVO.setPrice(vipPrice);
 
         LambdaQueryWrapper<MemberGoodsCollection> wrapper3= Wrappers.lambdaQuery();
         wrapper3.eq(MemberGoodsCollection::getDelFlag,0);
@@ -547,7 +555,7 @@
         wrapper4.ge(GoodsBrowseRecord::getCreateTime, newTime7)
                 .le(GoodsBrowseRecord::getCreateTime,now );
         List<GoodsBrowseRecord> list2 = iGoodsBrowseRecordService.list(wrapper4);
-        if (list2.size()==0){
+        if (list2.isEmpty()){
             GoodsBrowseRecord auctionBrowseRecord=new GoodsBrowseRecord();
             auctionBrowseRecord.setMemberId(homeGoodsSkuDTO.getMemberId());
             auctionBrowseRecord.setGoodsSkuId(homeGoodsSkuDTO.getGoodsSkuId());
@@ -558,6 +566,26 @@
         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();
+        }
+        throw new ServiceException("会员等级错误");
+    }
+
     @Override
     public List<getHomeGoodsSkuXxiVO> getHomeGoodsSkuXxi(HomeGoodsSkuDTO homeGoodsSkuDTO) {
         List<getHomeGoodsSkuXxiVO> homeGoodsSkuXxiVOS=new ArrayList<>();
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
index f090cfb..85f9b40 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -573,6 +573,7 @@
 
     @Override
     public MemberTiOrderVO updMemberOrder(MemberOrderDTO memberOrderDTO) {
+
         Order order = baseMapper.selectById(memberOrderDTO.getId());
         if(memberOrderDTO.getOrderRemark()!=null){
             order.setOrderRemark(memberOrderDTO.getOrderRemark());

--
Gitblit v1.7.1