From f44e4d609e7efaed9eac545137970b1e334f8106 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 21 九月 2024 09:01:36 +0800 Subject: [PATCH] 修改bug --- ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java | 114 +++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 79 insertions(+), 35 deletions(-) diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java index 9c30ad2..0e526c9 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java @@ -16,6 +16,7 @@ import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; +import com.ruoyi.common.core.utils.page.CollUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.goods.controller.management.dto.GoodsSeckillDTO; @@ -30,7 +31,6 @@ import com.ruoyi.goods.service.IGoodsSkuService; import com.ruoyi.goods.service.IMemberGoodsCollectionService; import com.ruoyi.goods.service.async.AsyncMethodService; -import com.ruoyi.system.api.constants.DelayTaskEnum; import com.ruoyi.system.api.constants.NotificationTypeConstant; import com.ruoyi.system.api.domain.GoodsBrand; import com.ruoyi.system.api.domain.GoodsCategory; @@ -53,7 +53,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -105,28 +104,25 @@ goodsSeckill.setStartStatus(StartStatusEnum.NOT_STARTED); } // 查询该时间范围内,是否已经存在该秒杀商品 + List<Long> skuIds = goodsSeckills.stream().map(GoodsSeckill::getGoodsSkuId) + .collect(Collectors.toList()); List<GoodsSeckill> list = this.lambdaQuery() .ne(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED) - .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES) - .le(GoodsSeckill::getStartTime, dto.getStartTime()) - .ge(GoodsSeckill::getEndTime, dto.getStartTime()).list(); + .in(GoodsSeckill::getGoodsSkuId, skuIds).list(); Set<Long> existGoodsSkuIdSet = list.stream().map(GoodsSeckill::getGoodsSkuId) .collect(Collectors.toSet()); if (!existGoodsSkuIdSet.isEmpty()) { List<GoodsSku> goodsSkuList = goodsSkuService.listByIds(existGoodsSkuIdSet); Map<Long, String> goodsSkuMap = goodsSkuList.stream() .collect(Collectors.toMap(GoodsSku::getId, GoodsSku::getSkuName)); - List<GoodsSeckill> collect = goodsSeckills.stream() + Optional<GoodsSeckill> first = goodsSeckills.stream() .filter(goodsSeckill -> existGoodsSkuIdSet.contains( goodsSeckill.getGoodsSkuId())) - .collect(Collectors.toList()); - if (!collect.isEmpty()) { - String goodsSkuNames = collect.stream().map(item -> { - return goodsSkuMap.get(item.getGoodsSkuId()); - }).filter(Objects::nonNull) - .collect(Collectors.joining(",")); + .findFirst(); + if (first.isPresent()) { + String skuName = goodsSkuMap.get(first.get().getGoodsSkuId()); throw new ServiceException( - String.format("添加失败,商品%s在该时间段内有其他秒杀活动", goodsSkuNames)); + String.format("添加失败,商品%s在该时间段内有其他秒杀活动", skuName)); } } this.saveBatch(goodsSeckills); @@ -147,7 +143,12 @@ goodsStockUpdDTO.setAuctionStock(seckillStock * -1); goodsStockUpdDTO.setGoodsSkuId(goodsSku.getId()); goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO)); - asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill)); + if (goodsSeckill.getEndTime().isBefore(LocalDateTime.now())) { + goodsSeckill.setStartStatus(StartStatusEnum.ENDED); + this.updateById(goodsSeckill); + } else { + asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill)); + } } } @@ -186,15 +187,28 @@ if (goodsSku.getStock() < upd.getSeckillStock()) { throw new ServiceException("编辑失败,商品库存不足"); } + Optional<GoodsSeckill> seckillOpt = this.lambdaQuery() + .ne(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED) + .ne(GoodsSeckill::getId, goodsSeckill.getId()) + .eq(GoodsSeckill::getGoodsSkuId, goodsSeckill.getGoodsSkuId()).oneOpt(); + if (seckillOpt.isPresent()) { + throw new ServiceException("编辑失败,商品在该时间段内有其他秒杀活动"); + } GoodsSeckill goodsSeckillUpd = BeanUtils.copyBean(upd, GoodsSeckill.class); goodsSeckillUpd.setListingStatus(ListingStatusEnum.ON_SHELVES); + goodsSeckillUpd.setStartStatus(StartStatusEnum.NOT_STARTED); this.updateById(goodsSeckillUpd); - GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); - goodsStockUpdDTO.setAuctionStock(upd.getSeckillStock() * -1); - goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId()); - goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO)); - if (goodsSeckill.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) { - asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill)); + + if (goodsSeckillUpd.getEndTime().isBefore(LocalDateTime.now())) { + goodsSeckillUpd.setStartStatus(StartStatusEnum.ENDED); + this.updateById(goodsSeckillUpd); + } else { + // 修改库存 + GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); + goodsStockUpdDTO.setAuctionStock(upd.getSeckillStock() * -1); + goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId()); + goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO)); + asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckillUpd)); } } @@ -210,23 +224,15 @@ throw new ServiceException("秒杀商品不存在"); } goodsSeckill.setListingStatus(dto.getListingStatus()); - if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) { - //移除该秒杀商品的延时任务 - redisService.deleteObject( - DelayTaskEnum.SECKILL_START_TASK.getCode() + "-" + goodsSeckill.getId()); - redisService.deleteObject( - DelayTaskEnum.SECKILL_END_TASK.getCode() + "-" + goodsSeckill.getId()); + if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF) + && !goodsSeckill.getStartStatus().equals(StartStatusEnum.ENDED)) { // 退回剩余库存 GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setAuctionStock(goodsSeckill.getSeckillStock()); goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId()); goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO)); - goodsSeckill.setSeckillStock(0); } this.updateById(goodsSeckill); - if (dto.getListingStatus().equals(ListingStatusEnum.ON_SHELVES)) { - asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill)); - } } /** @@ -264,9 +270,7 @@ GoodsSeckill goodsSeckill = this.getById(seckillId); // 秒杀商品不能为空且上架状态为上架中 状态为未开始 if (StringUtils.isNotNull(goodsSeckill) - && goodsSeckill.getStartStatus().equals(StartStatusEnum.NOT_STARTED) && - goodsSeckill.getListingStatus() - .equals(ListingStatusEnum.ON_SHELVES)) { + && goodsSeckill.getStartStatus().equals(StartStatusEnum.NOT_STARTED)) { //开始秒杀 this.lambdaUpdate().set(GoodsSeckill::getStartStatus, StartStatusEnum.STARTED) .eq(GoodsSeckill::getId, seckillId).update(); @@ -297,12 +301,17 @@ log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀结束<<<<<<<<<<<<<<<<<<<<", seckillId); GoodsSeckill goodsSeckill = this.getById(seckillId); if (StringUtils.isNotNull(goodsSeckill) - && goodsSeckill.getStartStatus().equals(StartStatusEnum.STARTED)) { + && !goodsSeckill.getStartStatus().equals(StartStatusEnum.ENDED)) { //结束秒杀 this.lambdaUpdate().set(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED) .eq(GoodsSeckill::getId, seckillId).update(); // 将秒杀商品从缓存中移除 redisService.deleteObject(CacheConstants.SECKILL_GOODS + goodsSeckill.getId()); + // 退回剩余库存 + GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); + goodsStockUpdDTO.setAuctionStock(goodsSeckill.getSeckillStock()); + goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId()); + goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO)); } Map<String, Object> map = new ConcurrentHashMap<>(); map.put("notification_type", NotificationTypeConstant.SECKILL); @@ -401,7 +410,9 @@ Set<Long> goodsSkuIdList = null; goodsSkuIdList = page1.stream().map(GoodsSku::getId) .collect(Collectors.toSet()); - + if (CollUtils.isEmpty(goodsSkuIdList)) { + return PageDTO.empty(0L, 0L); + } Page<GoodsSeckill> page = new Page<>(); page.setSize(homeGoodsSkuDTO.getPageSize()); page.setCurrent(homeGoodsSkuDTO.getPageCurr()); @@ -460,10 +471,21 @@ homeGoodsSeckillInfoVO.setPrice(data6.getPrice()); homeGoodsSeckillInfoVO.setSoldQuantity(byId.getSoldQuantity()); homeGoodsSeckillInfoVO.setUnit(data6.getUnit()); + homeGoodsSeckillInfoVO.setSpec(data6.getSpec()); homeGoodsSeckillInfoVO.setSpecUnit(data6.getSpecUnit()); homeGoodsSeckillInfoVO.setCoverPic(data6.getCoverPic()); homeGoodsSeckillInfoVO.setAlbum(data6.getAlbum()); homeGoodsSeckillInfoVO.setShareTitle(byId.getShareTitle()); + if (StringUtils.isNotBlank(byId.getShareTitle())) { + homeGoodsSeckillInfoVO.setShareTitle(byId.getShareTitle()); + } else { + homeGoodsSeckillInfoVO.setShareTitle(data6.getSkuName()); + } + if (StringUtils.isNotBlank(byId.getSharePic())) { + homeGoodsSeckillInfoVO.setSharePic(byId.getSharePic()); + } else { + homeGoodsSeckillInfoVO.setSharePic(data6.getCoverPic()); + } homeGoodsSeckillInfoVO.setSeckillPrice(byId.getSeckillPrice()); homeGoodsSeckillInfoVO.setDescription(data6.getDescription()); homeGoodsSeckillInfoVO.setDetail(data6.getDetail()); @@ -500,4 +522,26 @@ return homeGoodsSeckillInfoVO; } + + /** + * 结束异常的秒杀 + */ + @Override + public void updSeckillStatus() { + baseMapper.updSeckillStatus(); + } + + /** + * 根据秒杀id集合查询商品sku信息 + * + * @param seckillIdSet + * @return + */ + @Override + public List<GoodsSku> getGoodsSkuBySeckillIdSet(Set<Long> seckillIdSet) { + List<GoodsSeckill> goodsSeckills = this.listByIds(seckillIdSet); + List<Long> goodsSkuIdList = goodsSeckills.stream().map(GoodsSeckill::getGoodsSkuId) + .collect(Collectors.toList()); + return goodsSkuService.listByIds(goodsSkuIdList); + } } -- Gitblit v1.7.1