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回答
-
你好,同学,首先赞一个你的思考以及落地改进!
第一个问题是因为购物车页面,不止勾选的要进行库存校验,价格上可以不加,但是库存也是要校验的。
cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_FAIL);
cartProductVo.setLimitQuantity(Const.Cart.LIMIT_NUM_SUCCESS);
所以有了这两个。
第二点是可以的。
第三点的确是的,在for循环里调用的方式没有你说的方式更好。一期注重更基础的知识,对大多数学员保持了平滑的曲线。这方面我是非常赞成的。第三点用你说的方案是更好的。
00 -
一切都是最好的安排丶
提问者
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;
}这样应该好一点吧。。
122018-01-25
相似问题