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
@@ -13,8 +13,6 @@ import io.swagger.annotations.ApiOperation; import java.util.List; import javax.annotation.Resource; 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; @@ -100,13 +98,6 @@ @ApiOperation(value = "用户端-拍卖场商品详情") public R<AuctionSalesroomGoodsInfoVO> getAuctionSalesroomGoodsInfo(@RequestBody AuctionSalesroomGoodsInfoDTO auctionSalesroomGoodsInfoDTO) { return R.ok(iAuctionSalesroomGoodsService.getAuctionSalesroomGoodsInfo(auctionSalesroomGoodsInfoDTO)); } @GetMapping("/setPopup/{id}") @ApiOperation("标记已弹出弹窗") public R<?> setPopup(@PathVariable("id") Long id) { iAuctionSalesroomGoodsService.setPopup(id); return R.ok(); } 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> @@ -171,27 +176,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 +186,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 +263,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/IAuctionSalesroomGoodsService.java
@@ -60,5 +60,4 @@ List<AuctionBidRecordVO> getAuctionBidRecord(@RequestBody AuctionSalesroomGoodsInfoDTO auctionSalesroomGoodsInfoDTO); void setPopup(Long id); } 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); @@ -666,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()); @@ -898,12 +907,4 @@ return orderClient.saveOrderOne(order, SecurityConstants.INNER).getData(); } /** * 设置弹窗状态已弹出 * @param id */ @Override public void setPopup(Long id) { } } 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); } @@ -806,6 +813,9 @@ .clientType(ClientTypeEnum.MEMBER).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 +826,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 +874,7 @@ one3.setStatus(BidStatusEnum.ELIMINATE); one3.setBidCount(1); one3.setLastBidAmount(bidVO.getLastBidAmount()); one3.setGoodsName(Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : ""); auctionBidRecordService.save(one3); } @@ -927,7 +939,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 +982,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 +1437,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 +1548,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 +1578,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 +1639,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 +1863,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/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-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)); }