CartServiceImpl.java 5.1 KB
Newer Older
H
haoxr 已提交
1 2 3 4
package com.youlai.mall.oms.service.impl;

import com.youlai.common.result.Result;
import com.youlai.common.web.util.RequestUtils;
H
haoxr 已提交
5
import com.youlai.mall.pms.api.app.InventoryFeignService;
H
haoxr 已提交
6
import com.youlai.mall.pms.pojo.dto.SkuDTO;
H
haoxr 已提交
7 8
import com.youlai.mall.oms.pojo.vo.CartItemVO;
import com.youlai.mall.oms.pojo.vo.CartVO;
H
haoxr 已提交
9 10
import com.youlai.mall.oms.service.CartService;
import lombok.AllArgsConstructor;
H
haoxr 已提交
11
import lombok.SneakyThrows;
H
haoxr 已提交
12 13 14 15 16 17 18 19
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.CompletableFuture;

H
haoxr 已提交
20
import static com.youlai.mall.oms.common.RedisConstants.CART_KEY;
H
haoxr 已提交
21

H
haoxr 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

/**
 * 购物车模块搭建步骤
 * 1、用户登录后才能操作购物车
 * *********添加购物车*************
 * 1、获取当前登录用户
 * 2、添加商品到购物车
 * 2.1、如果购物车中已经有该商品的相关数据
 * 2.1.1、修改购物车商品数量
 * 2.2、如果购物车中没有该商品,新增该商品
 * 2.2.1、调用商品服务查询商品sku详情
 * 2.2.2、封装CartItem实体类
 * *********修改购物车*************
 * *********删除购物车*************
 * *********查询购物车*************
 */

@Service
@Slf4j
@AllArgsConstructor
public class CartServiceImpl implements CartService {

    private RedisTemplate redisTemplate;

H
haoxr 已提交
46
    private InventoryFeignService inventoryFeignService;
H
haoxr 已提交
47 48

    @Override
H
haoxr 已提交
49 50 51 52 53 54 55 56 57
    @SneakyThrows
    public void addCartItem(Long skuId) {
        BoundHashOperations cartHashOpts = getCartHashOpts();
        String hKey = skuId.toString(); // redis 的 hash key
        if (cartHashOpts.get(hKey) != null) {
            CartItemVO cartItem = (CartItemVO) cartHashOpts.get(hKey);
            cartItem.setNum(cartItem.getNum() + 1);
            cartItem.setSubtotal(cartItem.getPrice() * cartItem.getNum());
            cartHashOpts.put(hKey, cartItem);
H
haoxr 已提交
58 59
            return;
        }
H
haoxr 已提交
60
        CartItemVO cartItem = new CartItemVO();
H
haoxr 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            // 远程查询商品详情
            Result<SkuDTO> result = inventoryFeignService.getSkuById(skuId);
            SkuDTO sku = result.getData();

            cartItem.setSkuId(skuId)
                    .setChecked(true)
                    .setSkuName(sku.getName())
                    .setSkuPic(sku.getPic())
                    .setNum(1)
                    .setPrice(sku.getPrice())
                    .setInventory(sku.getInventory())
                    .setSubtotal(1 * sku.getPrice());
H
haoxr 已提交
74
        });
H
haoxr 已提交
75
        CompletableFuture<Void> allOf = CompletableFuture.allOf(future);
H
haoxr 已提交
76
        allOf.get();
H
haoxr 已提交
77
        cartHashOpts.put(hKey, cartItem);
H
haoxr 已提交
78 79 80
    }

    @Override
H
haoxr 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93
    public void updateCartItem(Long skuId, Integer num, Boolean checked) {
        BoundHashOperations cartHashOpts = getCartHashOpts();
        String hKey = skuId + "";
        CartItemVO cartItem = (CartItemVO) cartHashOpts.get(hKey);
        if (cartItem != null) {
            if (num != null) {
                cartItem.setNum(num);
                cartItem.setSubtotal(num * cartItem.getPrice());
            }
            if (checked != null) {
                cartItem.setChecked(checked);
            }
            cartHashOpts.put(hKey, cartItem);
H
haoxr 已提交
94 95 96 97
        }
    }

    @Override
H
haoxr 已提交
98 99 100
    public void checkAll(Boolean checked) {
        BoundHashOperations cartHashOpts = getCartHashOpts();
        for (Object value : cartHashOpts.values()) {
H
haoxr 已提交
101
            CartItemVO cartItem = (CartItemVO) value;
H
haoxr 已提交
102 103 104
            cartItem.setChecked(checked);
            String hKey = cartItem.getSkuId() + "";
            cartHashOpts.put(hKey, cartItem);
H
haoxr 已提交
105 106 107 108
        }
    }

    @Override
H
haoxr 已提交
109 110 111 112
    public void deleteCartItem(Long skuId) {
        BoundHashOperations cartHashOpts = getCartHashOpts();
        String hKey = skuId.toString();
        cartHashOpts.delete(hKey);
H
haoxr 已提交
113 114 115
    }

    @Override
H
haoxr 已提交
116 117 118
    public CartVO getCart() {
        BoundHashOperations cartHashOpts = getCartHashOpts();
        List<CartItemVO> items = cartHashOpts.values();
H
haoxr 已提交
119
        CartVO cartVo = new CartVO();
H
haoxr 已提交
120 121 122 123 124
        cartVo.setItems(items);
        return cartVo;
    }

    @Override
H
haoxr 已提交
125
    public void deleteCart() {
H
haoxr 已提交
126
        Long userId = RequestUtils.getUserId();
H
haoxr 已提交
127 128
        String key = CART_KEY + userId;
        redisTemplate.delete(key);
H
haoxr 已提交
129 130 131 132 133
    }

    @Override
    public void cleanSelected() {
        log.info("清空购物车中已选择商品");
H
haoxr 已提交
134 135
        BoundHashOperations cartHashOpts = getCartHashOpts();
        for (Object value : cartHashOpts.values()) {
H
haoxr 已提交
136
            CartItemVO cartItem = (CartItemVO) value;
H
haoxr 已提交
137 138
            if (cartItem.isChecked()) {
                log.info("清空购物车中商品,商品id:{} | 名称:{}", cartItem.getSkuId(), cartItem.getSkuName());
H
haoxr 已提交
139
                cartHashOpts.delete(cartItem.getSkuId().toString());
H
haoxr 已提交
140 141 142 143
            }
        }
    }

H
haoxr 已提交
144
    private BoundHashOperations getCartHashOpts() {
H
haoxr 已提交
145
        Long userId = RequestUtils.getUserId();
H
haoxr 已提交
146
        String cartKey = CART_KEY + userId;
H
haoxr 已提交
147 148 149 150
        BoundHashOperations operations = redisTemplate.boundHashOps(cartKey);
        return operations;
    }
}