有关购物车的深入探讨
  J0tQqlYbt0QD 2023年11月02日 25 0

问题描述

假如在用户多次添加同一商品到购物车,第一次添加成功,然后商家修改了商品的订价,接下来用户第二次添加同一个商品,这时候对于购物画的实现就需要认真考虑,按照商家修改后的价格计算商品的价格,具体思路:先将购物画中之前加入的商品删除,然后再按照修改后的价格,将用户之前加入的和刚加入的商品,再次加入购物车。

代码实现

商品类

@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GoodsCartItemVO {
    /**
     * 编号
     */
    private Long id;

    /**
     * 商品名
     */
    private String name;

    /**
     * 主图
     */
    private String pic;

    /**
     * 购买价格
     */
    private BigDecimal price;

    /**
     * 单位
     */
    private String unit;

    /**
     * 库存
     */
    private Integer storage;

    /**
     * 卖点
     */
    private String salePoint;
}

购物项类

@Getter
@Setter
@ToString
@NoArgsConstructor
public class CartItemDTO {
    /**
     * 商品
     */
    private GoodsCartItemVO goods;

    /**
     * 个数
     */
    private Integer amount;

    /**
     * 每一项的总金额
     */
    private BigDecimal money;

    public CartItemDTO(GoodsCartItemVO goods, Integer amount) {
        this.goods = goods;
        this.amount = amount;
        this.money = goods.getPrice().multiply(new BigDecimal(amount));
    }
}

购物车类

@ToString
public class CartDTO {
    /**
     * 购物车:商品编号,商品
     */
    @Getter
    private Map<Long, CartItemDTO> cart = new HashMap<>();

    /**
     * 个数
     */
    @Setter
    @Getter
    private Integer totalAmount;

    /**
     * 每一项的总金额
     */
    @Setter
    @Getter
    private BigDecimal totalMoney;

    /**
     * 添加购物项
     * @param cartItem
     */
    public void addGoods2Cart(CartItemDTO cartItem) {
        GoodsCartItemVO goods = cartItem.getGoods();
        Long goodsId = goods.getId();
        if (cart.containsKey(goodsId)) {
            //购物车中,已经购买的同一商品的数量
            CartItemDTO goods0 = cart.get(goodsId);
            Integer amount0 = goods0.getAmount();
            //移除原来同一个商品的总金额,保证商家修改了价格后,以最后的价格为准
            totalMoney = totalMoney.subtract(goods0.getMoney());
            //将当前商品的按新价格计算出来的总金额添加到购物车总金额中
            totalMoney = goods.getPrice()
                    .multiply(new BigDecimal(amount0 + cartItem.getAmount()))
                    .add(totalMoney == null ? new BigDecimal(0) : totalMoney);
            //购物车中商品的总数量
            totalAmount += cartItem.getAmount();

            //购物项的总数量
            cartItem.setAmount(amount0 + cartItem.getAmount());
            //购物项的总金额
            cartItem.setMoney(goods.getPrice().multiply(new BigDecimal(cartItem.getAmount())));

            cart.put(goodsId, cartItem);
        } else {//未包含
            cart.put(goodsId, cartItem);
            totalAmount = cartItem.getAmount() + (totalAmount == null ? 0 : totalAmount);
            totalMoney = cartItem.getMoney().add(totalMoney == null ? new BigDecimal(0) : totalMoney);
        }
    }
}

测试代码

public static void main(String[] args) {
    CartDTO cart = new CartDTO();

    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1001L,"apple","apple.jpg",new BigDecimal(100),"个",32,"好的很"), 1));
    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1001L,"apple","apple.jpg",new BigDecimal(400),"个",32,"好的很"), 2));
    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1002L,"apple","apple.jpg",new BigDecimal(200),"个",32,"好的很"), 4));
    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1003L,"apple","apple.jpg",new BigDecimal(100),"个",32,"好的很"), 3));
    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1003L,"apple","apple.jpg",new BigDecimal(200),"个",32,"好的很"), 2));
    cart.addGoods2Cart(new CartItemDTO(new GoodsCartItemVO(1001L,"apple","apple.jpg",new BigDecimal(100),"个",32,"好的很"), 5));

    System.out.println(JsonUtil.obj2String(cart));
}

结果:

在这里插入图片描述

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   51   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   104   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
J0tQqlYbt0QD