mitao
2024-05-31 fc13d832e58e42e241aa827e930651a28ca357e1
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -29,9 +29,11 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
@@ -217,7 +219,7 @@
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void returningStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS) {
    public void updGoodsStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS) {
        List<Long> goodsSkuIdList = goodsStockUpdDTOS.stream()
                .map(GoodsStockUpdDTO::getGoodsSkuId)
                .collect(Collectors.toList());
@@ -230,21 +232,28 @@
                .collect(Collectors.toMap(GoodsStockUpdDTO::getGoodsSkuId,
                        GoodsStockUpdDTO::getAuctionStock));
        for (GoodsSku skus : goodsSkus) {
            Integer auctionStock = stockMap.get(skus.getId());
            if (StringUtils.isNotNull(auctionStock) && auctionStock > 0) {
                // 更新商品库存,更新五次失败抛出异常
                boolean isUpdated = false;
                for (int i = 0; i < 5; i++) {
                    isUpdated = updateGoodsStock(skus, auctionStock);
                    if (isUpdated) {
                        break;
                    } else {
                        skus = this.getById(skus.getId());
            String goodsLock = "goods_lock:" + skus.getId();
            RLock redissonLock = redissonClient.getLock(goodsLock);
            try {
                redissonLock.lock(100, TimeUnit.SECONDS);
                Integer auctionStock = stockMap.get(skus.getId());
                if (StringUtils.isNotNull(auctionStock) && auctionStock > 0) {
                    // 更新商品库存,更新五次失败抛出异常
                    boolean isUpdated = false;
                    for (int i = 0; i < 5; i++) {
                        isUpdated = updateGoodsStock(skus, auctionStock);
                        if (isUpdated) {
                            break;
                        } else {
                            skus = this.getById(skus.getId());
                        }
                    }
                    if (!isUpdated) {
                        throw new ServiceException("商品库存回退失败");
                    }
                }
                if (!isUpdated) {
                    throw new ServiceException("商品库存回退失败");
                }
            } finally {
                redissonLock.unlock();
            }
        }