PmsSkuServiceImpl.java 3.6 KB
Newer Older
H
hxrui 已提交
1 2
package com.youlai.mall.pms.service.impl;

H
haoxr 已提交
3 4
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
H
hxrui 已提交
5 6
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.exception.BizException;
H
haoxr 已提交
7
import com.youlai.mall.pms.common.RedisConstants;
H
hxrui 已提交
8
import com.youlai.mall.pms.mapper.PmsSkuMapper;
H
hxrui 已提交
9
import com.youlai.mall.pms.pojo.domain.PmsSku;
H
hxrui 已提交
10 11 12 13
import com.youlai.mall.pms.pojo.vo.SkuInfoVO;
import com.youlai.mall.pms.pojo.vo.SkuStockVO;
import com.youlai.mall.pms.pojo.vo.WareSkuStockVO;
import com.youlai.mall.pms.service.IPmsSkuService;
H
haoxr 已提交
14
import lombok.AllArgsConstructor;
H
hxrui 已提交
15
import lombok.extern.slf4j.Slf4j;
H
haoxr 已提交
16
import org.springframework.data.redis.core.RedisTemplate;
H
hxrui 已提交
17 18 19 20 21 22 23
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Slf4j
H
haoxr 已提交
24
@AllArgsConstructor
H
hxrui 已提交
25 26
public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> implements IPmsSkuService {

H
haoxr 已提交
27 28 29

    private RedisTemplate redisTemplate;

H
hxrui 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    @Override
    public List<SkuInfoVO> getSkuInfoByIds(List<String> skuIds) {
        log.info("批量获取商品详情,skuIds:{}", skuIds);
        return baseMapper.getSkuInfoByIds(skuIds);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean lockStock(WareSkuStockVO skuStockVO) {
        log.info("订单锁定商品库存,商品信息:{}", skuStockVO.getItems());
        for (SkuStockVO item : skuStockVO.getItems()) {
            Long result = baseMapper.lockStock(item.getSkuId(), item.getNumber());
            if (result == 0) {
                log.info("商品库存锁定失败,商品id:{},数量:{}", item.getSkuId(), item.getNumber());
                throw new BizException("商品库存锁定失败,商品id:" + item.getSkuId() + ",数量:" + item.getNumber());
            }
        }
        return true;
    }

    @Override
    public boolean releaseStock(WareSkuStockVO skuStockVO) {
        log.info("订单关闭释放商品库存,商品信息:{}", skuStockVO.getItems());
        for (SkuStockVO item : skuStockVO.getItems()) {
            Long result = baseMapper.releaseStock(item.getSkuId(), item.getNumber());
            if (result == 0) {
                log.info("商品库存释放失败,商品id:{},数量:{}", item.getSkuId(), item.getNumber());
                throw new BizException("商品库存释放失败,商品id:" + item.getSkuId() + ",数量:" + item.getNumber());
            }
        }
        return true;
    }
H
haoxr 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94


    /**
     * Cache-Aside pattern 缓存、数据库读写模式
     * 1. 读取数据,先读缓存,没有就去读数据库,然后将结果写入缓存
     * 2. 写入数据,先更新数据库,再删除缓存
     * @param skuId
     * @return
     */
    @Override
    public Integer getInventoryBySkuId(Long skuId) {
        Integer inventory = 0;
        // 读->缓存
        Object cacheVal = redisTemplate.opsForValue().get(RedisConstants.PRODUCT_INVENTORY_PREFIX + skuId);
        if (cacheVal != null) {
            inventory = Convert.toInt(cacheVal);
            return inventory;
        }

        // 读->数据库
        PmsSku pmsInventory = this.getOne(new LambdaQueryWrapper<PmsSku>()
                .eq(PmsSku::getId, skuId)
                .select(PmsSku::getStock));

        if (pmsInventory != null) {
            inventory = pmsInventory.getStock();
            // 写->缓存
            redisTemplate.opsForValue().set(RedisConstants.PRODUCT_INVENTORY_PREFIX + skuId, inventory);
        }

        return inventory;

    }
H
hxrui 已提交
95
}