diff --git a/xdclass-product-service/src/main/java/net/jieyuu/controller/CartController.java b/xdclass-product-service/src/main/java/net/jieyuu/controller/CartController.java index 642d092..e8371bc 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/controller/CartController.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/controller/CartController.java @@ -8,6 +8,7 @@ import net.jieyuu.request.CartItemRequest; import net.jieyuu.service.CartService; import net.jieyuu.service.ProductService; import net.jieyuu.utils.JsonData; +import net.jieyuu.vo.CartVO; import net.jieyuu.vo.ProductVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -34,7 +35,7 @@ public class CartController { @ApiOperation("添加到购物车") - @PostMapping("add") + @PostMapping("/add") public JsonData addToCart(@ApiParam("购物项") @RequestBody CartItemRequest cartItemRequest) { cartService.addToCart(cartItemRequest); return JsonData.buildSuccess(); @@ -42,10 +43,16 @@ public class CartController { @ApiOperation("清空购物车") - @DeleteMapping("clear") + @DeleteMapping("/clear") public JsonData clearMyCart() { cartService.clear(); return JsonData.buildSuccess(); } + @ApiOperation("查找购物车") + @GetMapping("/mycart") + public JsonData findMyCart() { + CartVO cartVO = cartService.getMyCart(); + return JsonData.buildSuccess(cartVO); + } } \ No newline at end of file diff --git a/xdclass-product-service/src/main/java/net/jieyuu/service/CartService.java b/xdclass-product-service/src/main/java/net/jieyuu/service/CartService.java index 4f60185..0445c34 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/service/CartService.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/service/CartService.java @@ -1,10 +1,12 @@ package net.jieyuu.service; import net.jieyuu.request.CartItemRequest; +import net.jieyuu.vo.CartVO; public interface CartService { /** * 添加商品到购物车 + * * @param cartItemRequest */ public void addToCart(CartItemRequest cartItemRequest); @@ -13,4 +15,11 @@ public interface CartService { * 清空购物车 */ void clear(); + + /** + * 查看购物车 + * + * @return + */ + CartVO getMyCart(); } diff --git a/xdclass-product-service/src/main/java/net/jieyuu/service/ProductService.java b/xdclass-product-service/src/main/java/net/jieyuu/service/ProductService.java index 69b63ba..a068096 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/service/ProductService.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/service/ProductService.java @@ -4,30 +4,41 @@ import net.jieyuu.model.ProductDO; import com.baomidou.mybatisplus.extension.service.IService; import net.jieyuu.vo.ProductVO; +import java.util.List; import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author jieyuu * @since 2024-08-07 */ -public interface ProductService { +public interface ProductService { /** * 分页查询商品列表 + * * @param page * @param size * @return */ - Map page(int page,int size); + Map page(int page, int size); /** * 根据id查找商品详情 + * * @param productId * @return */ ProductVO findDetailById(long productId); + + /** + * 根据id批量查询商品 + * + * @param productIdList + * @return + */ + List findProductByIdBatch(List productIdList); } diff --git a/xdclass-product-service/src/main/java/net/jieyuu/service/impl/CartServiceImpl.java b/xdclass-product-service/src/main/java/net/jieyuu/service/impl/CartServiceImpl.java index 9aa739f..fe0baec 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/service/impl/CartServiceImpl.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/service/impl/CartServiceImpl.java @@ -8,10 +8,12 @@ import net.jieyuu.enums.BizCodeEnum; import net.jieyuu.exception.BizException; import net.jieyuu.interceptor.LoginInterceptor; import net.jieyuu.model.LoginUser; +import net.jieyuu.model.ProductDO; import net.jieyuu.request.CartItemRequest; import net.jieyuu.service.CartService; import net.jieyuu.service.ProductService; import net.jieyuu.vo.CartItemVO; +import net.jieyuu.vo.CartVO; import net.jieyuu.vo.ProductVO; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +21,12 @@ import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + @Service @Slf4j public class CartServiceImpl implements CartService { @@ -77,6 +85,67 @@ public class CartServiceImpl implements CartService { redisTemplate.delete(cartKey); } + @Override + public CartVO getMyCart() { + // 获取全部cart + List cartItemVOList = buildCartItem(false); + //拼装cartVO + CartVO cartVO = new CartVO(); + cartVO.setCartItems(cartItemVOList); + return cartVO; + } + + /** + * 获取最新购物项 + * + * @param latestPrice + * @return + */ + private List buildCartItem(boolean latestPrice) { + BoundHashOperations myCartOps = getMyCartOps(); + + List itemList = myCartOps.values(); + + List cartItemVOList = new ArrayList<>(); + //拼接id列表查询 + List productIdList = new ArrayList<>(); + for (Object object : itemList) { + CartItemVO cartItemVO = JSON.parseObject((String) object, CartItemVO.class); + cartItemVOList.add(cartItemVO); + + productIdList.add(cartItemVO.getProductId()); + } + + // 查询最新价格 + // 假如用户 查看购物车 不需要最新价格 + // 当下单结算时,才查看最新价格 + if (latestPrice) { + setProductLatestPrice(cartItemVOList, productIdList); + } + return cartItemVOList; + } + + /** + * 设置商品最新价格 + * + * @param cartItemVOList + * @param productIdList + */ + private void setProductLatestPrice(List cartItemVOList, List productIdList) { + //批量查询商品最新数据 + List productVOList = productService.findProductByIdBatch(productIdList); + //根据id进行分组 + Map maps = productVOList.stream().collect(Collectors.toMap(ProductVO::getId, Function.identity())); + cartItemVOList.stream().forEach(item -> { + // 拿到最新的数据 + ProductVO productVO = maps.get(item.getProductId()); + // 遍历更新item + item.setProductTitle(productVO.getTitle()); + item.setProductImg(productVO.getCoverImg()); + item.setAmount(productVO.getAmount()); + }); + } + /** * 抽取购物车 通用方法 * diff --git a/xdclass-product-service/src/main/java/net/jieyuu/service/impl/ProductServiceImpl.java b/xdclass-product-service/src/main/java/net/jieyuu/service/impl/ProductServiceImpl.java index 9458d45..cc257d4 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/service/impl/ProductServiceImpl.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/service/impl/ProductServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -53,6 +54,13 @@ public class ProductServiceImpl extends ServiceImpl im return beanProcess(productDO); } + @Override + public List findProductByIdBatch(List productIdList) { + List productDOList = productMapper.selectList(new QueryWrapper().in("id", productIdList)); + List productVOList = productDOList.stream().map(obj -> beanProcess(obj)).collect(Collectors.toList()); + return productVOList; + } + private ProductVO beanProcess(ProductDO obj) { ProductVO productVO = new ProductVO(); BeanUtils.copyProperties(obj, productVO); diff --git a/xdclass-product-service/src/main/java/net/jieyuu/vo/CartVO.java b/xdclass-product-service/src/main/java/net/jieyuu/vo/CartVO.java index 6ad3158..6aa4207 100644 --- a/xdclass-product-service/src/main/java/net/jieyuu/vo/CartVO.java +++ b/xdclass-product-service/src/main/java/net/jieyuu/vo/CartVO.java @@ -60,7 +60,7 @@ public class CartVO { BigDecimal amount = new BigDecimal("0"); if (this.cartItems != null) { for (CartItemVO cartItem : cartItems) { - BigDecimal itemTotalAmount = cartItem.getAmount(); + BigDecimal itemTotalAmount = cartItem.getTotalAmount(); amount = amount.add(itemTotalAmount); } }