Commit 2c1b33c4 by shuhu.hou@freemud.cn

购物车校验fixbug

parent 7516b168
......@@ -57,7 +57,7 @@ public class ShoppingCartAdapter {
}
ValidateShopProductType productType = new ValidateShopProductType();
productType.setSpuId(cartGoods.getSpuId());
productType.setSkuId(cartGoods.getSkuId());
productType.setSkuId(ObjectUtils.equals(GoodsTypeEnum.SKU_GOODS.getGoodsType(),cartGoods.getGoodsType())? cartGoods.getSkuId():cartGoods.getSpuId());
productType.setPrice(cartGoods.getOriginalPrice()==null?0:cartGoods.getOriginalPrice().intValue());
productType.setValidatePrice(productType.getPrice()==0?0:1);
productType.setValidateAttribute(1);
......@@ -245,6 +245,93 @@ public class ShoppingCartAdapter {
cartGoods.setWeightType(CommonsConstant.WEIGHT_PRODUCT.equals(productBean.getWeightType()));
}
/**
* 更新当前购物车商品行信息
*
* @param cartGoods 当前购物车商品行
* @param productBeans 购物车中所有的productId对应的商品详情
* @param cartGoodsStates 购物车状态
*/
public void updateCartGoodsInfoNew(CartGoods cartGoods, List<ProductBeanDTO> productBeans, CartGoodsStates cartGoodsStates, List<String> invalidGoodsIdList) {
Optional<ProductBeanDTO> firstProduct = productBeans.stream().filter(p -> ObjectUtils.equals(p.getPid(), cartGoods.getSpuId())).findFirst();
if (!firstProduct.isPresent()) {
return;
}
ProductBeanDTO spuProduct = firstProduct.get();
// 如果是sku普通商品,则商品属相取sku对应的spu的属性
List<ProductBeanDTO.ProductAttributeGroupListBean> productAttributeGroupList = spuProduct.getProductAttributeGroupList();
//是否是sku商品
boolean isSkuProduct=ObjectUtils.equals(GoodsTypeEnum.SKU_GOODS.getGoodsType(), cartGoods.getGoodsType());
// 如果是套餐商品,更新套餐内固定商品&可选商品的详细信息
boolean isSetMealProduct = ObjectUtils.equals(ProductType.SetMeal.getCode(), spuProduct.getType()) || ObjectUtils.equals(ProductType.IncreasedPackage.getCode(), spuProduct.getType());
ProductBeanDTO.SkuProductBean skuProduct = isSkuProduct ? spuProduct.getSkuList().stream().filter(p -> ObjectUtils.equals(cartGoods.getSkuId(), p.getSkuId())).findFirst().get() : null;
Map<String, String> attributes = getAttributes(cartGoods, cartGoods.getExtra(), productAttributeGroupList, invalidGoodsIdList);
cartGoods.setName(spuProduct.getName());
cartGoods.setSpuName(spuProduct.getName());
cartGoods.setSkuName(isSkuProduct?skuProduct.getProductName():spuProduct.getName());
cartGoods.setSpecProductId(attributes.get(ATTRIBUTEID));
cartGoods.setPic(spuProduct.getPicture());
cartGoods.setPackPrice(isSkuProduct?skuProduct.getPackPrice(): spuProduct.getPackPrice());
cartGoods.setStockLimit(isSkuProduct? ObjectUtils.equals(1, skuProduct.getStockLimit()):ObjectUtils.equals(1, spuProduct.getStockLimit()));
cartGoods.setCustomerCode(isSkuProduct?skuProduct.getCustomerCode(): spuProduct.getCustomerCode());
if (isSetMealProduct) {
if (CollectionUtils.isNotEmpty(cartGoods.getProductComboList())) {
for (CartGoods.ComboxGoods productCombo : cartGoods.getProductComboList()) {
if (!updateComboxGoodsInfo(cartGoods, productCombo, firstProduct.get(), productBeans, cartGoodsStates, invalidGoodsIdList)) {
return;
}
}
}
if (CollectionUtils.isNotEmpty(cartGoods.getProductGroupList())) {
List<String> productGroupIdList = new ArrayList<>();
spuProduct.getProductGroupList().stream().map(t -> t.getGroupDetail()).forEach(t -> t.stream().forEach(group -> productGroupIdList.add(group.getProductId())));
for (CartGoods.ComboxGoods productGroup : cartGoods.getProductGroupList()) {
//如果套餐内可选商品移除,默认移除当前商品行
boolean isExist = productGroupIdList.stream().anyMatch(p -> ObjectUtils.equals(productGroup.getGoodsId(), p));
if (!isExist) {
// 标记非法商品
invalidGoodsIdList.add(cartGoods.getCartGoodsUid());
return;
}
if (!updateComboxGoodsInfo(cartGoods, productGroup, firstProduct.get(), productBeans, cartGoodsStates, invalidGoodsIdList)) {
return;
}
}
}
}
//更新当前商品行价格,check价格是否变更
Long newOrigOriginalPrice = 0L;
if (isSetMealProduct) {
//如果是套餐,则当前商品行价格为:固定套餐价格* 数量+可选商品加价 价格
Map<String, Integer> productOriginalPrices = new HashMap<>();
Map<String, Integer> productMarkUpPrices = new HashMap<>();
spuProduct.getProductGroupList().stream().map(t -> t.getGroupDetail()).forEach(t -> productMarkUpPrices.putAll(t.stream().collect(Collectors.toMap(ProductBeanDTO.ProductGroupType.GroupDetailType::getProductId, ProductBeanDTO.ProductGroupType.GroupDetailType::getMarkUpPrice))));
spuProduct.getProductGroupList().stream().map(t -> t.getGroupDetail()).forEach(t -> productOriginalPrices.putAll(t.stream().collect(Collectors.toMap(ProductBeanDTO.ProductGroupType.GroupDetailType::getProductId, ProductBeanDTO.ProductGroupType.GroupDetailType::getProductFinalPrice))));
if (CollectionUtils.isNotEmpty(cartGoods.getProductGroupList())) {
for (CartGoods.ComboxGoods groupProduct : cartGoods.getProductGroupList()) {
Integer originalPrice = productOriginalPrices.get(groupProduct.getGoodsId()) == null ? 0 : productOriginalPrices.get(groupProduct.getGoodsId());
newOrigOriginalPrice += originalPrice * groupProduct.getQty();
}
}
newOrigOriginalPrice += spuProduct.getProductComboList().stream().mapToInt(t -> t.getQuantity() * t.getFinalPrice()).sum();
} else {
newOrigOriginalPrice = spuProduct.getFinalPrice();
}
Long oldOrigOriginalPrice = cartGoods.getOriginalPrice();
if (null != oldOrigOriginalPrice && !Objects.equals(newOrigOriginalPrice, oldOrigOriginalPrice)) {
cartGoodsStates.setPriceChanged(true);
}
cartGoods.setOriginalPrice(newOrigOriginalPrice);
cartGoods.setOriginalAmount(newOrigOriginalPrice*cartGoods.getQty());
cartGoods.setAmount(newOrigOriginalPrice*cartGoods.getQty());
//咨询商品服务,套餐售价取originalPrice
cartGoods.setFinalPrice(isSetMealProduct?spuProduct.getOriginalPrice(): isSkuProduct? skuProduct.getFinalPrice():spuProduct.getFinalPrice());
cartGoods.setUnit(spuProduct.getUnit());
cartGoods.setWeightType(CommonsConstant.WEIGHT_PRODUCT.equals(spuProduct.getWeightType()));
}
private boolean updateComboxGoodsInfo(CartGoods cartGoods, CartGoods.ComboxGoods comboxGoods, ProductBeanDTO parentProductBean, List<ProductBeanDTO> productBeans, CartGoodsStates cartGoodsStates, List<String> invalidGoodsIdList) {
// 可选商品详情
Optional<ProductBeanDTO> firstProduct = productBeans.stream().filter(p -> ObjectUtils.equals(p.getPid(), comboxGoods.getGoodsId())).findFirst();
......
......@@ -14,6 +14,8 @@
package com.freemud.sdk.api.assortment.shoppingcart.constant;
public class ShoppingCartConstant {
public final static String SHOPPING_CART_INVALIAD_GOODS="因商家变更了商品,导致选购失败,请刷新门店后重新尝试选购商品";
public final static String SHOPPING_CART_EMPTY_GOODS_LIST="因商品变更或其他原因,导致加购失效,无法结算,请重新尝试选购商品";
public final static String SHOPPING_CART_INVALID_GOODS_EXIST = "有商品不在售卖状态,请重新提交结算";
......
......@@ -66,7 +66,7 @@ public class ShoppingCartGoodsResponseVo {
/**
* 购物车中商品价格或有效性是否发生变化
*/
private Boolean changed;
private Boolean changed=false;
/**
* 可用优惠券列表
......
......@@ -185,8 +185,10 @@ public interface ShoppingCartBaseService {
if (CollectionUtils.isNotEmpty(valiadResult.getFailureList())){
setToastMsgIfNotExist(checkCartRequest.getShoppingCartGoodsResponseVo(), ShoppingCartConstant.SHOPPING_CART_GOODS_CHANGE);
for (CartGoods cartGoods :checkCartRequest.getCartGoodsList()) {
if (valiadResult.getFailureList().stream().anyMatch(f->cartGoods.getGoodsId().equals( f.getSkuId()))){
if (valiadResult.getFailureList().stream().anyMatch(f->cartGoods.getGoodsId().equals(f.getSkuId()))){
cartGoods.setCartGoodsUid(null);
checkCartRequest.getShoppingCartGoodsResponseVo().setChanged(true);
checkCartRequest.getShoppingCartGoodsResponseVo().setToastMsg(ShoppingCartConstant.SHOPPING_CART_INVALIAD_GOODS);
}
}
checkCartRequest.getCartGoodsList().removeIf(k -> StringUtils.isEmpty(k.getCartGoodsUid()));
......@@ -195,7 +197,16 @@ public interface ShoppingCartBaseService {
List<ProductBeanDTO> productList = valiadResult.getSuccessList().stream().map(ValiadShopProductResult::getProductType).collect(Collectors.toList());
CartGoodsStates cartGoodsStates = new CartGoodsStates();
//更新购物车详细信息
updateCartGoodsListInfoNew(checkCartRequest.getCartGoodsList(), productList, cartGoodsStates, checkCartRequest.getPartnerId(), checkCartRequest.getStoreId(), checkCartRequest.getTableNumber());
if (CollectionUtils.isEmpty(checkCartRequest.getCartGoodsList()) || CollectionUtils.isEmpty(productList)){
return CartResponseUtil.success(checkCartRequest);
}
for (CartGoods cartGoods : checkCartRequest.getCartGoodsList()) {
// 当goodsId为空或商品是商品券时直接跳过
if (StringUtils.isEmpty(cartGoods.getGoodsId()) || Objects.equals(cartGoods.getGoodsType(), GoodsTypeEnum.COUPON_GOODS.getGoodsType())) {
continue;
}
shoppingCartAdapter.updateCartGoodsInfoNew(cartGoods, productList, cartGoodsStates, new ArrayList<>());
}
//校验商品券是否有当前点餐方式
cartGoodsStates = updateSpqCartGoodsInfo(checkCartRequest.getCartGoodsList(), checkCartRequest.getOrderWay(), checkCartRequest.getPartnerId(), checkCartRequest.getTrackingNo(), cartGoodsStates);
......@@ -203,7 +214,6 @@ public interface ShoppingCartBaseService {
if (cartGoodsStates != null && cartGoodsStates.isOrderWayFlag()) {
setToastMsgIfNotExist(checkCartRequest.getShoppingCartGoodsResponseVo(), ShoppingCartConstant.ORDER_WAY_CHANGE);
}
checkCartRequest.getShoppingCartGoodsResponseVo().setCartGoodsStates(cartGoodsStates);
return CartResponseUtil.success(checkCartRequest);
} catch (Exception e) {
ErrorLog.printErrorLog("assortment-shoppingcart-sdk", checkCartRequest.getTrackingNo(), e.getMessage(), "checkAllCartGoods", checkCartRequest, e, Level.ERROR);
......
......@@ -116,7 +116,7 @@ public class ShoppingCartBaseServiceImpl implements ShoppingCartBaseService {
.filter(k -> StringUtils.isNotEmpty(k.getCartGoodsUid()))
.collect(Collectors.toMap(CartGoods::getCartGoodsUid, Function.identity(), (k1, k2) -> k1));
operations.putAll(cartGoodsMap);
return this.getCartGoodsList(cartParamDto, trackingNo);
return CartResponseUtil.success();
} catch (Exception e) {
ErrorLog.printErrorLog("assortment-shoppingcart-sdk", trackingNo, e.getMessage(), "setCartGoodsList", cartParamDto, e, Level.ERROR);
return null;
......
......@@ -15,6 +15,9 @@ package cn.freemud.constant;
public class ShoppingCartConstant {
public final static String SHOPPING_CART_INVALIAD_GOODS="因商家变更了商品,导致选购失败,请刷新门店后重新尝试选购商品";
public final static String SHOPPING_CART_EMPTY_GOODS_LIST="因商品变更或其他原因,导致加购失效,无法结算,请重新尝试选购商品";
public final static String SHOPPING_CART_INVALID_GOODS_EXIST = "有商品不在售卖状态,请重新提交结算";
public final static String SHOPPING_CART_ACTIVITY_CHANGE = "商品价格有变动,将按照最新活动价格计算哦";
......
......@@ -45,7 +45,9 @@ public class ShoppingCartInfoRequestVo {
@NotEmpty(message = "appId不能为空")
private String appId;
/**
* 是否查询用户优惠券 1-查询用户优惠券 flag=1 用户去结算
* 是否为结算页
* 1:结算页 0:点餐页
* 结算页会查询用户优惠券,点餐页不会查询用户优惠券
*/
private Integer flag;
/**
......
......@@ -18,9 +18,11 @@ import com.freemud.sdk.api.assortment.shoppingcart.request.CheckCartRequest;
import com.freemud.sdk.api.assortment.shoppingcart.request.GetProductInfoRequest;
import com.freemud.sdk.api.assortment.shoppingcart.service.ShoppingCartBaseService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.naming.Name;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -99,7 +101,7 @@ public class AssortmentSdkService {
// 根据不同点餐类型获取不同购物车实例
BaseResponse<List<com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods>> baseResponse = shoppingCartService.getCartGoodsList(cartParamDto, LogThreadLocal.getTrackingNo());
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode()) || CollectionUtils.isEmpty(baseResponse.getResult())) {
return null;
return new ArrayList<>();
}
return JSONArray.parseArray(JSONObject.toJSONString(baseResponse.getResult()), CartGoods.class);
......@@ -119,13 +121,16 @@ public class AssortmentSdkService {
cartParamDto.setTableNumber(tableNumber);
cartParamDto.setCartGoodsList(JSONArray.parseArray(JSONObject.toJSONString(cartGoodsList), com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods.class));
BaseResponse<List<com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods>> baseResponse = shoppingCartService.setCartGoodsList(cartParamDto, LogThreadLocal.getTrackingNo());
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode()) || CollectionUtils.isEmpty(baseResponse.getResult())) {
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
return null;
}
return JSONArray.parseArray(JSONObject.toJSONString(baseResponse.getResult()), CartGoods.class);
}
@Value("${shopping.cart.check.action}")
private String shoppingCartCheckAction;
/**
* 调用SDK校验购物车
*
......@@ -145,9 +150,12 @@ public class AssortmentSdkService {
checkCartRequest.setStoreId(storeId);
checkCartRequest.setTableNumber(tableNumber);
checkCartRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
long checkStartTime = System.currentTimeMillis();
BaseResponse<CheckCartRequest> baseResponse = shoppingCartService.checkAllCartGoods(checkCartRequest);
//LogUtil.info("shoppingCartBaseService checkAllCartGoods ", checkStartTime, JSON.toJSONString(checkCartRequest), JSON.toJSONString(baseResponse));
BaseResponse<CheckCartRequest> baseResponse ;
if ("checkAllCartGoodsNew".equals(shoppingCartCheckAction)){
baseResponse= shoppingCartService.checkAllCartGoodsNew(checkCartRequest);
}else {
baseResponse=shoppingCartService.checkAllCartGoods(checkCartRequest);
}
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
return null;
}
......
......@@ -71,6 +71,8 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.freemud.constant.ShoppingCartConstant.SHOPPING_CART_EMPTY_GOODS_LIST;
import static cn.freemud.constant.ShoppingCartConstant.SHOPPING_CART_INVALIAD_GOODS;
import static java.util.stream.Collectors.toList;
@Slf4j
......@@ -408,23 +410,16 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
String appId = shoppingCartInfoRequestVo.getAppId();
String couponCode = shoppingCartInfoRequestVo.getCouponCode();
String activityCode = shoppingCartInfoRequestVo.getActivityCode();
// Integer flag = shoppingCartInfoRequestVo.getFlag();
// List<ShoppingCartInfoRequestVo.SendGoods> sendGoodsList = shoppingCartInfoRequestVo.getSendGoods();
Integer flag = shoppingCartInfoRequestVo.getFlag();
// 获取购物车商品
List<CartGoods> cartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, userId, null, "", shoppingCartBaseService);
if (cartGoodsList == null) {
cartGoodsList = new ArrayList<>();
}
// check购物车中所有商品
CheckCartRequest checkCartRequest = assortmentSdkService.checkShoppingCartSdk(cartGoodsList, partnerId, storeId, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo.getOrderType(), "", shoppingCartBaseService);
if (checkCartRequest.getShoppingCartGoodsResponseVo() != null) {
shoppingCartGoodsResponseVo.setToastMsg(checkCartRequest.getShoppingCartGoodsResponseVo().getToastMsg());
}
cartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(checkCartRequest.getCartGoodsList()), CartGoods.class);
//1.5.4 多规格的sku商品计算包装费
//checkSkuOnVersion(cartGoodsList, partnerId, storeId, shoppingCartGoodsResponseVo);
// 重新存储最新购物车
assortmentSdkService.setShoppingCart(partnerId, storeId, userId, cartGoodsList, assortmentCustomerInfoVo.getSessionId(), "", this.shoppingCartBaseService);
......@@ -436,14 +431,10 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
coupon.setActivityCode(activityCode);
coupons.add(coupon);
}
/*if (CollectionUtils.isNotEmpty(sendGoodsList)) {
processSendGoods(sendGoodsList, partnerId, storeId);
}*/
// 获取优惠信息
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult = this.getActivityCalculationDiscountResponse(partnerId, storeId, userId, appId, shoppingCartInfoRequestVo.getOrderType(), cartGoodsList, coupons, null);
if (calculationDiscountResult == null) {
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
// return shoppingCartGoodsResponseVo;
}
ActivityQueryDto activityQueryDto = activityAdapter.getActivityQueryDto(partnerId, storeId, userId, appId, shoppingCartInfoRequestVo.getOrderType());
......@@ -1018,6 +1009,7 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
addShoppingCartGoodsRequestVo.getShopId(), shoppingCartGoodsResponseVo, addShoppingCartGoodsRequestVo.getOrderType(), "", shoppingCartBaseService);
if (checkCartRequest.getShoppingCartGoodsResponseVo() != null) {
shoppingCartGoodsResponseVo.setToastMsg(checkCartRequest.getShoppingCartGoodsResponseVo().getToastMsg());
shoppingCartGoodsResponseVo.setChanged(checkCartRequest.getShoppingCartGoodsResponseVo().getChanged());
}
List<CartGoods> allCartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(checkCartRequest.getCartGoodsList()), CartGoods.class);
......@@ -1164,10 +1156,10 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
*/
private void setAddAndUpdateResponse(ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo, ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult
, List<CartGoods> cartGoodsList, String toastMsg, String partnerId, String storeId, String userId, String opt, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo) {
//updateCartGoodsResponse(shoppingCartGoodsResponseVo, calculationDiscountResult);
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
shoppingCartGoodsResponseVo.setProductsCount(cartGoodsList.size());
if (StringUtils.isNotEmpty(toastMsg)) {
toastMsg=shoppingCartInfoRequestVo!=null && ObjectUtils.equals(1, shoppingCartInfoRequestVo.getFlag())?SHOPPING_CART_EMPTY_GOODS_LIST:SHOPPING_CART_INVALIAD_GOODS;
setToastMsgIfNotExist(shoppingCartGoodsResponseVo, toastMsg);
}
// 给前端展示
......@@ -1195,7 +1187,7 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
shoppingCartGoodsResponseVo.setOriginalTotalAmount(originalTotalAmount);
shoppingCartGoodsResponseVo.setTotalAmount(totalAmount);
}
shoppingCartGoodsResponseVo.setChanged(false);
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment