From 7c64e1f11d274027f36dbddf9cbad3059097d712 Mon Sep 17 00:00:00 2001 From: misworga831 Date: Mon, 16 Oct 2023 11:48:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=95=86=E5=93=81=E7=B4=A2=E5=BC=95=EF=BC=8C=E9=94=80=E9=87=8F?= =?UTF-8?q?=EF=BC=8C=E8=AF=84=E8=AE=BA=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/StockUpdateExecute.java | 7 +- .../lili/listener/GoodsMessageListener.java | 2 +- .../goods/entity/dto/GoodsSearchParams.java | 7 ++ .../goods/entity/dto/GoodsSkuStockDTO.java | 3 + .../modules/goods/mapper/GoodsSkuMapper.java | 3 + .../goods/service/GoodsSkuService.java | 19 +++- .../serviceimpl/GoodsSkuServiceImpl.java | 86 ++++++++++--------- 7 files changed, 81 insertions(+), 46 deletions(-) diff --git a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java index 6736cbe0..023f8d14 100644 --- a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java @@ -322,8 +322,6 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { for (int i = 0; i < skuStocks.size(); i++) { goodsSkus.get(i).setQuantity(Convert.toInt(skuStocks.get(i).toString())); } - //批量修改商品库存 - goodsSkuService.updateBatchById(goodsSkus); //促销库存处理 if (!promotionKey.isEmpty()) { @@ -336,7 +334,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { promotionGoodsService.updatePromotionGoodsStock(promotionGoods); } //商品库存,包含sku库存集合,批量更新商品库存相关 - goodsSkuService.updateGoodsStuck(goodsSkus); + goodsSkuService.updateGoodsStock(goodsSkus); log.info("订单确认,库存同步:商品信息--{};促销信息---{}", goodsSkus, promotionGoods); @@ -369,8 +367,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { } log.info("订单取消,库存还原:{}", goodsSkus); //批量修改商品库存 - goodsSkuService.updateBatchById(goodsSkus); - goodsSkuService.updateGoodsStuck(goodsSkus); + goodsSkuService.updateGoodsStock(goodsSkus); } } diff --git a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java index 8ed979cb..e9057121 100644 --- a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java @@ -492,7 +492,7 @@ public class GoodsMessageListener implements RocketMQListener { } int buyCount = goodsSku.getBuyCount() + goodsCompleteMessage.getBuyNum(); goodsSku.setBuyCount(buyCount); - goodsSkuService.update(goodsSku); + goodsSkuService.updateGoodsSkuBuyCount(goodsSku.getId(), buyCount); this.goodsIndexService.updateIndex(MapUtil.builder(new HashMap()).put("id", goodsCompleteMessage.getSkuId()).build(), MapUtil.builder(new HashMap()).put("buyCount", buyCount).build()); diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java index 7f10d1f7..27bb3bb9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java @@ -1,5 +1,6 @@ package cn.lili.modules.goods.entity.dto; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; @@ -9,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.*; import java.util.Arrays; +import java.util.List; /** * 商品查询条件 @@ -34,6 +36,9 @@ public class GoodsSearchParams extends PageVO { @ApiModelProperty(value = "商品编号") private String id; + @ApiModelProperty(value = "商品编号") + private List ids; + @ApiModelProperty(value = "商家ID") private String storeId; @@ -133,6 +138,8 @@ public class GoodsSearchParams extends PageVO { queryWrapper.eq("sales_model", salesModel); } + queryWrapper.in(CollUtil.isNotEmpty(ids), "id", ids); + queryWrapper.eq("delete_flag", false); this.betweenWrapper(queryWrapper); return queryWrapper; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java index 694df3c9..97181f83 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java @@ -12,6 +12,9 @@ import lombok.Data; @Data public class GoodsSkuStockDTO { + @ApiModelProperty(value = "商品id") + private String goodsId; + @ApiModelProperty(value = "商品skuId") private String skuId; diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java index e17f6d41..90bc010e 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java @@ -2,6 +2,7 @@ package cn.lili.modules.goods.mapper; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; +import cn.lili.modules.goods.entity.dto.GoodsSkuStockDTO; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -114,4 +115,6 @@ public interface GoodsSkuMapper extends BaseMapper { @Select("SELECT *,g.params as params FROM li_goods_sku gs inner join li_goods g on gs.goods_id = g.id ${ew.customSqlSegment}") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + @Select("SELECT id as sku_id, quantity, goods_id FROM li_goods_sku ${ew.customSqlSegment}") + List queryStocks(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java index f31247c8..3447cb4e 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java @@ -209,7 +209,7 @@ public interface GoodsSkuService extends IService { * * @param goodsSkus */ - void updateGoodsStuck(List goodsSkus); + void updateGoodsStock(List goodsSkus); /** * 更新SKU评价数量 @@ -249,4 +249,21 @@ public interface GoodsSkuService extends IService { * @param goodsOperationDTO 商品操作信息 */ void renderGoodsSkuList(List goodsSkuList, GoodsOperationDTO goodsOperationDTO); + + /** + * 更新商品sku购买数量 + * + * @param skuId skuId + * @param buyCount 购买数量 + */ + void updateGoodsSkuBuyCount(String skuId, int buyCount); + + /** + * 更新商品sku评分 + * + * @param skuId skuId + * @param grade 评分 + * @param commentNum 评论数量 + */ + void updateGoodsSkuGrade(String skuId, double grade,int commentNum); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index 1c9c134f..17aa7546 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -3,7 +3,6 @@ package cn.lili.modules.goods.serviceimpl; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; @@ -148,7 +147,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i if (!goodsSkus.isEmpty()) { this.saveOrUpdateBatch(goodsSkus); - this.updateStock(goodsSkus); + this.updateGoodsStock(goodsSkus); } } @@ -199,7 +198,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i skuList.stream().map(BaseEntity::getId).collect(Collectors.toList())); this.remove(unnecessarySkuIdsQuery); this.saveOrUpdateBatch(skuList); - this.updateStock(skuList); + this.updateGoodsStock(skuList); } } @@ -385,7 +384,9 @@ public class GoodsSkuServiceImpl extends ServiceImpl i List goodsSkus = this.getGoodsSkuListByGoodsId(goods.getId()); for (GoodsSku sku : goodsSkus) { cache.remove(GoodsSkuService.getCacheKeys(sku.getId())); - cache.put(GoodsSkuService.getCacheKeys(sku.getId()), sku); + if (GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) && GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) { + cache.put(GoodsSkuService.getCacheKeys(sku.getId()), sku); + } } } } @@ -520,8 +521,23 @@ public class GoodsSkuServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) public void updateStocks(List goodsSkuStockDTOS) { - for (GoodsSkuStockDTO goodsSkuStockDTO : goodsSkuStockDTOS) { - this.updateStock(goodsSkuStockDTO.getSkuId(), goodsSkuStockDTO.getQuantity()); + List skuIds = goodsSkuStockDTOS.stream().map(GoodsSkuStockDTO::getSkuId).collect(Collectors.toList()); + List goodsSkuStockList = this.baseMapper.queryStocks(GoodsSearchParams.builder().ids(skuIds).build().queryWrapper()); + Map> groupByGoodsIds = goodsSkuStockList.stream().collect(Collectors.groupingBy(GoodsSkuStockDTO::getGoodsId)); + + //统计每个商品的库存 + for (Map.Entry> entry : groupByGoodsIds.entrySet()) { + //库存 + Integer quantity = 0; + for (GoodsSkuStockDTO goodsSku : entry.getValue()) { + goodsSkuStockDTOS.stream().filter(i -> i.getSkuId().equals(goodsSku.getSkuId())).findFirst().ifPresent(i -> goodsSku.setQuantity(i.getQuantity())); + if (entry.getKey().equals(goodsSku.getGoodsId())) { + quantity += goodsSku.getQuantity(); + } + this.updateStock(goodsSku.getSkuId(), goodsSku.getQuantity()); + } + //保存商品库存结果 + goodsService.updateStock(entry.getKey(), quantity); } } @@ -531,28 +547,23 @@ public class GoodsSkuServiceImpl extends ServiceImpl i GoodsSku goodsSku = getGoodsSkuByIdFromCache(skuId); if (goodsSku != null) { //判断商品sku是否已经下架(修改商品库存为0时 会自动下架商品),再次更新商品库存时 需更新商品索引 - Boolean isFlag = goodsSku.getQuantity()<= 0; + boolean isFlag = goodsSku.getQuantity() <= 0; goodsSku.setQuantity(quantity); - boolean update = - this.update(new LambdaUpdateWrapper().eq(GoodsSku::getId, skuId).set(GoodsSku::getQuantity, quantity)); + boolean update = this.update(new LambdaUpdateWrapper().eq(GoodsSku::getId, skuId).set(GoodsSku::getQuantity, quantity)); if (update) { cache.remove(CachePrefix.GOODS.getPrefix() + goodsSku.getGoodsId()); } cache.put(GoodsSkuService.getCacheKeys(skuId), goodsSku); cache.put(GoodsSkuService.getStockCacheKey(skuId), quantity); - //更新商品库存 - List goodsSkus = new ArrayList<>(); - goodsSkus.add(goodsSku); - this.updateGoodsStuck(goodsSkus); this.promotionGoodsService.updatePromotionGoodsStock(goodsSku.getId(), quantity); //商品库存为0是删除商品索引 if (quantity <= 0) { goodsIndexService.deleteIndexById(goodsSku.getId()); } //商品SKU库存为0并且商品sku状态为上架时更新商品库存 - if(isFlag && StrUtil.equals(goodsSku.getMarketEnable(),GoodsStatusEnum.UPPER.name())) { + if (isFlag && CharSequenceUtil.equals(goodsSku.getMarketEnable(), GoodsStatusEnum.UPPER.name())) { List goodsIds = new ArrayList<>(); goodsIds.add(goodsSku.getGoodsId()); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX.name(), goodsIds)); @@ -575,22 +586,18 @@ public class GoodsSkuServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) - public void updateGoodsStuck(List goodsSkus) { - Map> groupByGoodsIds = - goodsSkus.stream().collect(Collectors.groupingBy(GoodsSku::getGoodsId)); - //获取相关的sku集合 - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.in(GoodsSku::getGoodsId, groupByGoodsIds.keySet()); - List goodsSkuList = this.list(lambdaQueryWrapper); + public void updateGoodsStock(List goodsSkus) { + Map> groupByGoodsIds = goodsSkus.stream().collect(Collectors.groupingBy(GoodsSku::getGoodsId)); //统计每个商品的库存 for (String goodsId : groupByGoodsIds.keySet()) { //库存 Integer quantity = 0; - for (GoodsSku goodsSku : goodsSkuList) { + for (GoodsSku goodsSku : goodsSkus) { if (goodsId.equals(goodsSku.getGoodsId())) { quantity += goodsSku.getQuantity(); } + this.updateStock(goodsSku.getId(), goodsSku.getQuantity()); } //保存商品库存结果 goodsService.updateStock(goodsId, quantity); @@ -618,7 +625,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i double grade = NumberUtil.mul(NumberUtil.div(highPraiseNum, goodsSku.getCommentNum().doubleValue(), 2), 100); goodsSku.setGrade(grade); //修改规格 - this.update(goodsSku); + this.updateGoodsSkuGrade(skuId, grade, goodsSku.getCommentNum()); //修改规格索引,发送mq消息 @@ -667,22 +674,6 @@ public class GoodsSkuServiceImpl extends ServiceImpl i return this.count(queryWrapper); } - /** - * 修改库存 - * - * @param goodsSkus 商品SKU - */ - private void updateStock(List goodsSkus) { - //总库存数量 - Integer quantity = 0; - for (GoodsSku sku : goodsSkus) { - this.updateStock(sku.getId(), sku.getQuantity()); - quantity += sku.getQuantity(); - } - //修改商品库存 - goodsService.updateStock(goodsSkus.get(0).getGoodsId(), quantity); - } - /** * 批量渲染商品sku @@ -700,6 +691,23 @@ public class GoodsSkuServiceImpl extends ServiceImpl i } } + @Override + public void updateGoodsSkuBuyCount(String skuId, int buyCount) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(GoodsSku::getId, skuId); + updateWrapper.set(GoodsSku::getBuyCount, buyCount); + this.update(updateWrapper); + } + + @Override + public void updateGoodsSkuGrade(String skuId, double grade, int commentNum) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(GoodsSku::getId, skuId); + updateWrapper.set(GoodsSku::getGrade, grade); + updateWrapper.set(GoodsSku::getCommentNum, commentNum); + this.update(updateWrapper); + } + /** * 渲染商品sku *