You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现将Wishlist商品批量添加至购物车并正确更新数量?

问题:心愿单商品批量添加至购物车时的更新逻辑错误

需求概述

  • 接收Wishlist ID,将心愿单所有商品添加至购物车
  • 若商品已在购物车,更新数量为两者之和
  • 操作后保留原心愿单

当前问题

采用嵌套循环实现时,空购物车场景可正常添加商品,但重复调用API时仅一个商品数量更新成功,其余会被addToCart()方法覆盖。例如购物车和心愿单均包含商品A、B时,嵌套循环会产生以下操作流程:

序号 购物车商品 心愿单商品 操作
1     A          A       更新
2     A          B        添加
3     B          A        添加
4     B          B       更新

其中第1步更新后的商品A,会被第2步的addToCart()操作覆盖,导致数量回退。

当前实现代码

public void addAllToCart(String wishListId) 
{
    // 通过ID获取心愿单,赋值给wishlist(WishListModel类型)
    // 获取会话购物车,赋值给cart(CartModel类型)
    if (CollectionUtils.isNotEmpty(wishlist.getEntries())) 
    {
        for (WishListEntryModel wishListEntry : wishlist.getEntries()) 
        {
            checkInCartEntry(wishListEntry, cart.getEntries());
        }
    }
}

private void checkInCartEntry(WishListEntryModel wishListEntry, List<AbstractOrderEntryModel> cartEntries)
{
    if (CollectionUtils.isEmpty(cartEntries))
    {
        addToCart(wishListEntry);
    }
    else
    {
        for (AbstractOrderEntryModel cartEntry : cartEntries) 
        {
            if (wishListEntry.getProduct().getCode().equalsIgnoreCase(cartEntry.getProduct().getCode())) 
            {
                updateCartEntry(cartEntry.getEntryNumber, wishlist.getQuantity+cartEntry.getQuantity);
            } 
            else 
            {
                addToCart(wishListEntry);
            }
        }
    }
}

约束:无法修改addToCart()或updateCartEntry()等已有方法。


问题根源

checkInCartEntry方法逻辑错误:遍历购物车条目时,只要遇到不匹配的商品就执行addToCart(),导致同一个心愿单商品会被多次触发添加操作,直接覆盖之前的更新结果。例如心愿单的商品A在遍历购物车的商品B时,会误触发addToCart(),把已经更新过数量的A重新添加一次。

修复方案

修改checkInCartEntry方法,先标记商品是否在购物车中找到匹配项,遍历完所有购物车条目后,再决定执行更新还是添加操作:

public void addAllToCart(String wishListId) 
{
    // 通过ID获取心愿单,赋值给wishlist(WishListModel类型)
    // 获取会话购物车,赋值给cart(CartModel类型)
    if (CollectionUtils.isNotEmpty(wishlist.getEntries())) 
    {
        for (WishListEntryModel wishListEntry : wishlist.getEntries()) 
        {
            checkInCartEntry(wishListEntry, cart.getEntries());
        }
    }
}

private void checkInCartEntry(WishListEntryModel wishListEntry, List<AbstractOrderEntryModel> cartEntries)
{
    boolean productFoundInCart = false;
    
    if (CollectionUtils.isNotEmpty(cartEntries))
    {
        for (AbstractOrderEntryModel cartEntry : cartEntries) 
        {
            if (wishListEntry.getProduct().getCode().equalsIgnoreCase(cartEntry.getProduct().getCode())) 
            {
                updateCartEntry(cartEntry.getEntryNumber(), wishListEntry.getQuantity() + cartEntry.getQuantity());
                productFoundInCart = true;
                break; // 找到匹配项后立即退出循环,避免重复操作
            }
        }
    }
    
    // 遍历完购物车后,未找到匹配项才执行添加
    if (!productFoundInCart)
    {
        addToCart(wishListEntry);
    }
}

优化思路(替代实现)

为降低嵌套循环的O(n*m)复杂度,可先将购物车商品按产品编码构建映射,实现O(1)时间复杂度的查找:

public void addAllToCart(String wishListId) 
{
    // 通过ID获取心愿单,赋值给wishlist(WishListModel类型)
    // 获取会话购物车,赋值给cart(CartModel类型)
    
    // 将购物车条目按产品编码分组,便于快速查找
    Map<String, AbstractOrderEntryModel> cartProductMap = new HashMap<>();
    if (CollectionUtils.isNotEmpty(cart.getEntries()))
    {
        for (AbstractOrderEntryModel entry : cart.getEntries())
        {
            cartProductMap.put(entry.getProduct().getCode().toLowerCase(), entry);
        }
    }
    
    if (CollectionUtils.isNotEmpty(wishlist.getEntries())) 
    {
        for (WishListEntryModel wishListEntry : wishlist.getEntries()) 
        {
            String productCode = wishListEntry.getProduct().getCode().toLowerCase();
            AbstractOrderEntryModel existingEntry = cartProductMap.get(productCode);
            
            if (existingEntry != null)
            {
                updateCartEntry(existingEntry.getEntryNumber(), wishListEntry.getQuantity() + existingEntry.getQuantity());
                // 更新映射中的条目数量,避免后续操作使用旧数据
                existingEntry.setQuantity(wishListEntry.getQuantity() + existingEntry.getQuantity());
            }
            else
            {
                addToCart(wishListEntry);
                // 若addToCart执行后购物车条目立即更新,可同步将新条目放入映射
            }
        }
    }
}

说明

  • 用HashMap关联购物车商品编码与条目,整体复杂度从O(n*m)降至O(n+m),适合购物车或心愿单条目较多的场景。
  • 若addToCart()执行后会立即更新购物车列表,可同步将新添加的条目放入映射,确保后续操作的准确性。

内容的提问来源于stack exchange,提问作者DEBAGNIK KAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:58:18