mall中购物车设计
...大约 3 分钟
mall中购物车设计
该篇文章主要参考mall官方文档,并结合自己的使用感受做的一些笔记
1. 简介
无论是直接购买还是从添加到购物车,都要先经过购物车
2. 购物车流程
2.1 添加到购物车
- 查询会员信息
- 根据会员id,商品id和规格获取购物车中商品
- 校验购物车中是否已存在该商品
- 不存在:直接新增
- 存在:在原有基础上新增数量
@Override
public int add(OmsCartItem cartItem) {
int count;
UmsMember currentMember =memberService.getCurrentMember();
cartItem.setMemberId(currentMember.getId());
cartItem.setMemberNickname(currentMember.getNickname());
cartItem.setDeleteStatus(0);
OmsCartItem existCartItem = getCartItem(cartItem);
if (existCartItem == null) {
cartItem.setCreateDate(new Date());
count = cartItemMapper.insert(cartItem);
} else {
cartItem.setModifyDate(new Date());
existCartItem.setQuantity(existCartItem.getQuantity() + cartItem.getQuantity());
count = cartItemMapper.updateByPrimaryKey(existCartItem);
}
return count;
}
/**
* 根据会员id,商品id和规格获取购物车中商品
*/
private OmsCartItem getCartItem(OmsCartItem cartItem) {
OmsCartItemExample example = new OmsCartItemExample();
OmsCartItemExample.Criteria criteria = example.createCriteria().andMemberIdEqualTo(cartItem.getMemberId())
.andProductIdEqualTo(cartItem.getProductId()).andDeleteStatusEqualTo(0);
if (!StringUtils.isEmpty(cartItem.getProductSkuId())) {
criteria.andProductSkuIdEqualTo(cartItem.getProductSkuId());
}
List<OmsCartItem> cartItemList = cartItemMapper.selectByExample(example);
if (!CollectionUtils.isEmpty(cartItemList)) {
return cartItemList.get(0);
}
return null;
}
2.2 查询购物车列表
2.2.1 普通购物车列表
@Override
public List<OmsCartItem> list(Long memberId) {
OmsCartItemExample example = new OmsCartItemExample();
example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(memberId);
return cartItemMapper.selectByExample(example);
}
2.2.2 包含促销的购物车列表
@Override
public List<CartPromotionItem> listPromotion(Long memberId, List<Long> cartIds) {
List<OmsCartItem> cartItemList = list(memberId);
if(CollUtil.isNotEmpty(cartIds)){
cartItemList = cartItemList.stream().filter(item->cartIds.contains(item.getId())).collect(Collectors.toList());
}
List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
if(!CollectionUtils.isEmpty(cartItemList)){
cartPromotionItemList = promotionService.calcCartPromotion(cartItemList);
}
return cartPromotionItemList;
}
计算购物车促销活动
@Override
public List<CartPromotionItem> calcCartPromotion(List<OmsCartItem> cartItemList) {
//1.先根据productId对CartItem进行分组,以spu为单位进行计算优惠
Map<Long, List<OmsCartItem>> productCartMap = groupCartItemBySpu(cartItemList);
//2.查询所有商品的优惠相关信息
List<PromotionProduct> promotionProductList = getPromotionProductList(cartItemList);
//3.根据商品促销类型计算商品促销优惠价格
List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
for (Map.Entry<Long, List<OmsCartItem>> entry : productCartMap.entrySet()) {
Long productId = entry.getKey();
PromotionProduct promotionProduct = getPromotionProductById(productId, promotionProductList);
List<OmsCartItem> itemList = entry.getValue();
Integer promotionType = promotionProduct.getPromotionType();
if (promotionType == 1) {
//单品促销
for (OmsCartItem item : itemList) {
CartPromotionItem cartPromotionItem = new CartPromotionItem();
BeanUtils.copyProperties(item,cartPromotionItem);
cartPromotionItem.setPromotionMessage("单品促销");
//商品原价-促销价
PmsSkuStock skuStock = getOriginalPrice(promotionProduct, item.getProductSkuId());
BigDecimal originalPrice = skuStock.getPrice();
//单品促销使用原价
cartPromotionItem.setPrice(originalPrice);
cartPromotionItem.setReduceAmount(originalPrice.subtract(skuStock.getPromotionPrice()));
cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
cartPromotionItemList.add(cartPromotionItem);
}
} else if (promotionType == 3) {
//打折优惠
int count = getCartItemCount(itemList);
PmsProductLadder ladder = getProductLadder(count, promotionProduct.getProductLadderList());
if(ladder!=null){
for (OmsCartItem item : itemList) {
CartPromotionItem cartPromotionItem = new CartPromotionItem();
BeanUtils.copyProperties(item,cartPromotionItem);
String message = getLadderPromotionMessage(ladder);
cartPromotionItem.setPromotionMessage(message);
//商品原价-折扣*商品原价
PmsSkuStock skuStock = getOriginalPrice(promotionProduct,item.getProductSkuId());
BigDecimal originalPrice = skuStock.getPrice();
BigDecimal reduceAmount = originalPrice.subtract(ladder.getDiscount().multiply(originalPrice));
cartPromotionItem.setReduceAmount(reduceAmount);
cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
cartPromotionItemList.add(cartPromotionItem);
}
}else{
handleNoReduce(cartPromotionItemList,itemList,promotionProduct);
}
} else if (promotionType == 4) {
//满减
BigDecimal totalAmount= getCartItemAmount(itemList,promotionProductList);
PmsProductFullReduction fullReduction = getProductFullReduction(totalAmount,promotionProduct.getProductFullReductionList());
if(fullReduction!=null){
for (OmsCartItem item : itemList) {
CartPromotionItem cartPromotionItem = new CartPromotionItem();
BeanUtils.copyProperties(item,cartPromotionItem);
String message = getFullReductionPromotionMessage(fullReduction);
cartPromotionItem.setPromotionMessage(message);
//(商品原价/总价)*满减金额
PmsSkuStock skuStock= getOriginalPrice(promotionProduct, item.getProductSkuId());
BigDecimal originalPrice = skuStock.getPrice();
BigDecimal reduceAmount = originalPrice.divide(totalAmount,RoundingMode.HALF_EVEN).multiply(fullReduction.getReducePrice());
cartPromotionItem.setReduceAmount(reduceAmount);
cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
cartPromotionItemList.add(cartPromotionItem);
}
}else{
handleNoReduce(cartPromotionItemList,itemList,promotionProduct);
}
} else {
//无优惠
handleNoReduce(cartPromotionItemList, itemList,promotionProduct);
}
}
return cartPromotionItemList;
}
2.3 更新购物车中商品的数量
@Override
public int updateQuantity(Long id, Long memberId, Integer quantity) {
OmsCartItem cartItem = new OmsCartItem();
cartItem.setQuantity(quantity);
OmsCartItemExample example = new OmsCartItemExample();
example.createCriteria().andDeleteStatusEqualTo(0)
.andIdEqualTo(id).andMemberIdEqualTo(memberId);
return cartItemMapper.updateByExampleSelective(cartItem, example);
}
2.4 删除和清空购物车
删除和清空都是逻辑删除,这些数据我们都是非常宝贵的
@Override
public int delete(Long memberId, List<Long> ids) {
OmsCartItem record = new OmsCartItem();
record.setDeleteStatus(1);
OmsCartItemExample example = new OmsCartItemExample();
example.createCriteria().andIdIn(ids).andMemberIdEqualTo(memberId);
return cartItemMapper.updateByExampleSelective(record, example);
}
@Override
public int clear(Long memberId) {
OmsCartItem record = new OmsCartItem();
record.setDeleteStatus(1);
OmsCartItemExample example = new OmsCartItemExample();
example.createCriteria().andMemberIdEqualTo(memberId);
return cartItemMapper.updateByExampleSelective(record,example);
}
赞助