PmsSkuServiceImpl.java 3.5 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
haoxr 已提交
5
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
H
hxrui 已提交
6 7
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.exception.BizException;
H
haoxr 已提交
8
import com.youlai.mall.pms.common.constant.PmsConstants;
H
haoxr 已提交
9 10
import com.youlai.mall.pms.mapper.PmsSkuMapper;
import com.youlai.mall.pms.pojo.domain.PmsSku;
H
haoxr 已提交
11
import com.youlai.mall.pms.pojo.dto.SkuDTO;
H
haoxr 已提交
12
import com.youlai.mall.pms.pojo.dto.InventoryDTO;
H
haoxr 已提交
13
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
haoxr 已提交
25
public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> implements IPmsSkuService {
H
hxrui 已提交
26

H
haoxr 已提交
27 28 29

    private RedisTemplate redisTemplate;

H
hxrui 已提交
30 31
    @Override
    @Transactional(rollbackFor = Exception.class)
H
haoxr 已提交
32
    public boolean lockInventory(List<InventoryDTO> inventories) {
H
haoxr 已提交
33 34 35
        log.info("锁定库存: {}", inventories);

        inventories.forEach(item -> {
H
haoxr 已提交
36
            boolean result = this.update(new LambdaUpdateWrapper<PmsSku>()
H
haoxr 已提交
37
                    .eq(PmsSku::getId, item.getSkuId())
H
haoxr 已提交
38 39 40 41
                    .apply("inventory >= locked_inventory + {0}", item.getNum())
                    .setSql("locked_inventory = locked_inventory + " + item.getNum())
            );
            if (!result) {
H
haoxr 已提交
42
                throw new BizException("锁定库存失败,库存ID:" + item.getSkuId() + ",数量:" + item.getNum());
H
hxrui 已提交
43
            }
H
haoxr 已提交
44 45
        });

H
hxrui 已提交
46 47 48 49
        return true;
    }

    @Override
H
haoxr 已提交
50
    public boolean unlockInventory(List<InventoryDTO> inventories) {
H
haoxr 已提交
51 52 53
        log.info("释放库存:{}", inventories);

        inventories.forEach(item -> {
H
haoxr 已提交
54
            boolean result = this.update(new LambdaUpdateWrapper<PmsSku>()
H
haoxr 已提交
55
                    .eq(PmsSku::getId, item.getSkuId())
H
haoxr 已提交
56 57 58
                    .setSql("locked_inventory = locked_inventory - " + item.getNum())
            );
            if (!result) {
H
haoxr 已提交
59
                throw new BizException("解锁库存失败,库存ID:" + item.getSkuId() + ",数量:" + item.getNum());
H
hxrui 已提交
60
            }
H
haoxr 已提交
61
        });
H
hxrui 已提交
62 63
        return true;
    }
H
haoxr 已提交
64 65 66 67 68 69


    /**
     * Cache-Aside pattern 缓存、数据库读写模式
     * 1. 读取数据,先读缓存,没有就去读数据库,然后将结果写入缓存
     * 2. 写入数据,先更新数据库,再删除缓存
H
haoxr 已提交
70
     *
H
haoxr 已提交
71
     * @param id 库存ID
H
haoxr 已提交
72 73 74
     * @return
     */
    @Override
H
haoxr 已提交
75
    public Integer getInventoryById(Long id) {
H
haoxr 已提交
76 77
        Integer inventory = 0;
        // 读->缓存
H
haoxr 已提交
78
        Object cacheVal = redisTemplate.opsForValue().get(PmsConstants.PRODUCT_INVENTORY_PREFIX + id);
H
haoxr 已提交
79 80 81 82 83 84
        if (cacheVal != null) {
            inventory = Convert.toInt(cacheVal);
            return inventory;
        }

        // 读->数据库
H
haoxr 已提交
85 86 87
        PmsSku pmsSku = this.getOne(new LambdaQueryWrapper<PmsSku>()
                .eq(PmsSku::getId, id)
                .select(PmsSku::getInventory));
H
haoxr 已提交
88

H
haoxr 已提交
89 90
        if (pmsSku != null) {
            inventory = pmsSku.getInventory();
H
haoxr 已提交
91
            // 写->缓存
H
haoxr 已提交
92
            redisTemplate.opsForValue().set(PmsConstants.PRODUCT_INVENTORY_PREFIX + id, inventory);
H
haoxr 已提交
93 94 95 96 97
        }

        return inventory;

    }
H
haoxr 已提交
98 99

    @Override
H
haoxr 已提交
100 101
    public List<SkuDTO> listBySkuIds(List<Long> ids) {
        return this.baseMapper.listBySkuIds(ids);
H
haoxr 已提交
102
    }
H
hxrui 已提交
103
}