getCartVoLimit 方法中的一个小bug 和一些思考

来源:9-3 加入购物车功能开发2

一切都是最好的安排丶

2018-01-20

    private CartVo getCartVoLimit(Integer userId){

        CartVo cartVo = new CartVo();

        List<Cart> cartList = cartMapper.selectCartByUserId(userId);

        List<CartProductVo> cartProductVoList = Lists.newArrayList();


        BigDecimal cartTotalPrice = new BigDecimal("0");


        if(CollectionUtils.isNotEmpty(cartList)){

            for(Cart cartItem : cartList){

                CartProductVo cartProductVo = new CartProductVo();

                cartProductVo.setId(cartItem.getId());

                cartProductVo.setUserId(userId);

                cartProductVo.setProductId(cartItem.getProductId());


                Product product = productMapper.selectByPrimaryKey(cartItem.getProductId());

                if(product != null){

                    cartProductVo.setProductMainImage(product.getMainImage());

                    cartProductVo.setProductName(product.getName());

                    cartProductVo.setProductSubtitle(product.getSubtitle());

                    cartProductVo.setProductStatus(product.getStatus());

                    cartProductVo.setProductPrice(product.getPrice());

                    cartProductVo.setProductStock(product.getStock());

                    //判断库存

                    int buyLimitCount = 0;

                    if(product.getStock() >= cartItem.getQuantity()){

                        //库存充足的时候

                        buyLimitCount = cartItem.getQuantity();

                        cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);

                    }else{

                        buyLimitCount = product.getStock();

                        cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);

                        //购物车中更新有效库存

                        Cart cartForQuantity = new Cart();

                        cartForQuantity.setId(cartItem.getId());

                        cartForQuantity.setQuantity(buyLimitCount);

                        cartMapper.updateByPrimaryKeySelective(cartForQuantity);

                    }

                    cartProductVo.setQuantity(buyLimitCount);

                    //计算总价

                    cartProductVo.setProductTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(),cartProductVo.getQuantity()));

                    cartProductVo.setProductChecked(cartItem.getChecked());

                }


                if(cartItem.getChecked() == Const.Cart.CHECKED){

                    //如果已经勾选,增加到整个的购物车总价中

                    cartTotalPrice = BigDecimalUtil.add(cartTotalPrice.doubleValue(),cartProductVo.getProductTotalPrice().doubleValue());

                }

                cartProductVoList.add(cartProductVo);

            }

        }

        cartVo.setCartTotalPrice(cartTotalPrice);

        cartVo.setCartProductVoList(cartProductVoList);

        cartVo.setAllChecked(this.getAllCheckedStatus(userId));

        cartVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix"));


        return cartVo;

    }


第一,在计算购物车中商品总计的时候,其一,如果product表中没有找到这个产品,就没有必要把它加到购物车商品总价里了,就应该把判断是否勾选的代码的放到上面的if里。其二,判断勾选的代码放在product !=null外面的话,如果product没有查到,当前商品的总价cartProductVo.productTotalPrice没有设值和初始化所以它为null,会报空指针异常。

第二,如果product表中没有这个商品的记录,是否就不要装载当前的cartProductVo到list中,或者设置status为下架,删除,ps(查询商品的时候也没有判断下架或删除)。

第三,课程中多处在for循环中调用dao中的方法,太浪费资源和时间了,应该可以直接写sql联表查询,不知道后面的章节或者二期里面有没有这方面的改造。。暂时只看到这里。


我是不是太严格了。。。哈哈哈哈哈哈


写回答

2回答

Geely

2018-01-20

你好,同学,首先赞一个你的思考以及落地改进!

第一个问题是因为购物车页面,不止勾选的要进行库存校验,价格上可以不加,但是库存也是要校验的。

cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);

cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);


所以有了这两个。

第二点是可以的。

第三点的确是的,在for循环里调用的方式没有你说的方式更好。一期注重更基础的知识,对大多数学员保持了平滑的曲线。这方面我是非常赞成的。第三点用你说的方案是更好的。


0
0

一切都是最好的安排丶

提问者

2018-01-20

private CartVo getCartVoLimit(Integer userId) {
   CartVo cartVo = new CartVo();
   List<Cart> cartList = cartMapper.selectCartByUserId(userId);
   List<CartProductVo> cartProductVoList = Lists.newArrayList();
   BigDecimal cartTotalPrice = new BigDecimal("0");
   if(CollectionUtils.isNotEmpty(cartList)){
       for(Cart cartItem : cartList){
           CartProductVo cartProductVo = new CartProductVo();
           cartProductVo.setId(cartItem.getId());
           cartProductVo.setUserId(cartItem.getUserId());
           cartProductVo.setProductId(cartItem.getProductId());
           cartProductVo.setProductChecked(cartItem.getChecked());

           Product product = productMapper.selectByPrimaryKey(cartItem.getProductId());
           if(product != null){
               cartProductVo.setProductMainImage(product.getMainImage());
               cartProductVo.setProductName(product.getName());
               cartProductVo.setProductSubtitle(product.getSubtitle());
               cartProductVo.setProductStatus(product.getStatus());
               cartProductVo.setProductPrice(product.getPrice());
               cartProductVo.setProductStock(product.getStock());

               //判断库存
               int butLimitCount = 0;
               if(product.getStock() >= cartItem.getQuantity()){
                   butLimitCount = cartItem.getQuantity();
                   cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);
               }else {
                   butLimitCount = product.getStock();
                   cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);
                   //购物车中更新有效库存
                   Cart cartForQuantity = new Cart();
                   cartForQuantity.setId(cartItem.getId());
                   cartForQuantity.setQuantity(butLimitCount);
                   cartMapper.updateByPrimaryKeySelective(cartForQuantity);
               }
               cartProductVo.setQuantity(butLimitCount);

               //计算当前产品的总价
               cartProductVo.setProductTotalPrice(BigDecimalUtil.mul(
                       product.getPrice().doubleValue(), cartProductVo.getQuantity().doubleValue()));

               //计算产品的总价
               if(cartItem.getChecked() == Const.Cart.CHECKED) {
                   cartTotalPrice = BigDecimalUtil.add(cartTotalPrice.doubleValue(),
                           cartProductVo.getProductTotalPrice().doubleValue());
               }
           }else{
               cartProductVo.setProductChecked(Const.Cart.UNCHECKED);
               cartProductVo.setProductStatus(Const.ProductStatusEnum.DELETED.getCode());
           }

           cartProductVoList.add(cartProductVo);
       }
   }
   cartVo.setCartProductVoList(cartProductVoList);
   cartVo.setCartTotalPrice(cartTotalPrice);
   cartVo.setAllChecked(this.getAllCheckedStatus(userId));
   cartVo.setImageHost(PropertiesUtil.getProperty(Const.FTP_SERVER_HTTP_PREFIX, Const.DEFAULT_FTP_SERVER_HTTP_PREFIX));
   return cartVo;
}

这样应该好一点吧。。

1
2
Geely
回复
慕哥1087574
的确是,这个是一个小伏笔大家要学会自己处理异常~~加油同学!
2018-01-25
共2条回复

从0开始 独立完成企业级Java电商网站服务端开发

前后端分离,数据库接口设计,架构设计,功能开发,上线运维

9476 学习 · 8804 问题

查看课程