From 217543344493b9d62a0e02623cc09e4645d8cccb Mon Sep 17 00:00:00 2001 From: misworga831 Date: Wed, 24 Jan 2024 18:52:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=BF=94=E8=BF=98=E4=BF=83=E9=94=80=E5=95=86?= =?UTF-8?q?=E5=93=81=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/StockUpdateExecute.java | 80 ++++++++++++++++++- 1 file changed, 77 insertions(+), 3 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 46aae99d..49d19de6 100644 --- a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java @@ -96,7 +96,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { keys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); int i = -orderItem.getNum(); values.add(Integer.toString(i)); - setPromotionStock(keys, values, orderItem); + setPromotionStock(keys, values, orderItem, true); } List stocks = cache.multiGet(keys); @@ -134,6 +134,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { keys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); int i = orderItem.getNum(); values.add(Integer.toString(i)); + setPromotionStock(keys, values, orderItem, false); } //批量脚本执行库存回退 Boolean skuResult = stringRedisTemplate.execute(quantityScript, keys, values.toArray()); @@ -239,7 +240,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { * @param values 缓存value值 * @param sku 购物车信息 */ - private void setPromotionStock(List keys, List values, OrderItem sku) { + private void setPromotionStock(List keys, List values, OrderItem sku, boolean deduction) { if (sku.getPromotionType() != null) { //如果此促销有库存概念,则计入 String[] skuPromotions = sku.getPromotionType().split(","); @@ -249,7 +250,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { .findFirst() .ifPresent(promotionTypeEnum -> { keys.add(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, sku.getPromotionId().split(",")[currentIndex], sku.getSkuId())); - int num = -sku.getNum(); + int num = deduction ? -sku.getNum() : sku.getNum(); values.add(Integer.toString(num)); }); } @@ -371,6 +372,69 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { List goodsSkus = new ArrayList<>(); //sku库存key 集合 List skuKeys = new ArrayList<>(); + //促销商品 + List promotionGoods = new ArrayList<>(); + //促销库存key 集合 + List promotionKey = new ArrayList<>(); + + //循环订单 + for (OrderItem orderItem : order.getOrderItems()) { + skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); + + GoodsSku goodsSku = new GoodsSku(); + goodsSku.setId(orderItem.getSkuId()); + goodsSku.setGoodsId(orderItem.getGoodsId()); + //如果有促销信息 + if (null != orderItem.getPromotionType() && null != orderItem.getPromotionId()) { + + //如果促销有库存信息 + String[] skuPromotions = orderItem.getPromotionType().split(","); + for (int i = 0; i < skuPromotions.length; i++) { + int currentIndex = i; + Arrays.stream(PromotionTypeEnum.haveStockPromotion).filter(promotionTypeEnum -> promotionTypeEnum.name().equals(skuPromotions[currentIndex])) + .findFirst() + .ifPresent(promotionTypeEnum -> { + //修改砍价商品库存 + String promotionId = orderItem.getPromotionId().split(",")[currentIndex]; + //修改砍价商品库存 + if (promotionTypeEnum.equals(PromotionTypeEnum.KANJIA)) { + KanjiaActivity kanjiaActivity = kanjiaActivityService.getById(promotionId); + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsDetail(kanjiaActivity.getKanjiaActivityGoodsId()); + + Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, promotionId, orderItem.getSkuId())).toString()); + kanjiaActivityGoodsDTO.setStock(stock); + + kanjiaActivityGoodsService.updateById(kanjiaActivityGoodsDTO); + //修改积分商品库存 + } else if (promotionTypeEnum.equals(PromotionTypeEnum.POINTS_GOODS)) { + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetail(promotionId); + Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, promotionId, orderItem.getSkuId())).toString()); + pointsGoodsVO.setActiveStock(stock); + pointsGoodsService.updateById(pointsGoodsVO); + } else { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionType(promotionTypeEnum.name()); + searchParams.setPromotionId(promotionId); + searchParams.setSkuId(orderItem.getSkuId()); + PromotionGoods pGoods = promotionGoodsService.getPromotionsGoods(searchParams); + //记录需要更新的促销库存信息 + promotionKey.add( + PromotionGoodsService.getPromotionGoodsStockCacheKey( + promotionTypeEnum, + promotionId, orderItem.getSkuId()) + ); + if (pGoods != null) { + promotionGoods.add(pGoods); + } + } + }); + } + + + } + goodsSkus.add(goodsSku); + } + //循环订单 for (OrderItem orderItem : order.getOrderItems()) { skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); @@ -385,6 +449,16 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { for (int i = 0; i < skuStocks.size(); i++) { goodsSkus.get(i).setQuantity(Convert.toInt(skuStocks.get(i).toString())); } + //促销库存处理 + if (!promotionKey.isEmpty()) { + List promotionStocks = cache.multiGet(promotionKey); + for (int i = 0; i < promotionKey.size(); i++) { + promotionGoods.get(i).setQuantity(Convert.toInt(promotionStocks.get(i).toString())); + Integer num = promotionGoods.get(i).getNum(); + promotionGoods.get(i).setNum((num != null ? num : 0) + order.getOrder().getGoodsNum()); + } + promotionGoodsService.updatePromotionGoodsStock(promotionGoods); + } log.info("订单取消,库存还原:{}", goodsSkus); //批量修改商品库存 goodsSkuService.updateGoodsStock(goodsSkus);