问题描述
假如在用户多次添加同一商品到购物车,第一次添加成功,然后商家修改了商品的订价,接下来用户第二次添加同一个商品,这时候对于购物画的实现就需要认真考虑,按照商家修改后的价格计算商品的价格,具体思路:先将购物画中之前加入的商品删除,然后再按照修改后的价格,将用户之前加入的和刚加入的商品,再次加入购物车。
代码实现
商品类
@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));
}