Commit 72a57bf1 by 缪晖

【ID1010972】多人拼单 处理冲突

parent 39f92567
...@@ -5,11 +5,12 @@ import cn.freemud.base.entity.BaseResponse; ...@@ -5,11 +5,12 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import com.freemud.application.sdk.api.couponcenter.online.service.FMActiveSdkService; import com.freemud.application.sdk.api.couponcenter.online.service.FMActiveSdkService;
import com.freemud.application.sdk.api.log.ErrorLog; import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.sdk.api.assortment.shoppingcart.adapter.CollageOrderSdkAdapter;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CartResponseConstant; import com.freemud.sdk.api.assortment.shoppingcart.constant.CartResponseConstant;
import com.freemud.sdk.api.assortment.shoppingcart.constant.RedisKeyConstant; import com.freemud.sdk.api.assortment.shoppingcart.constant.RedisKeyConstant;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartAddItem; import com.freemud.sdk.api.assortment.shoppingcart.constant.ShoppingCartConstant;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods; import com.freemud.sdk.api.assortment.shoppingcart.constant.VersionUtils;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto; import com.freemud.sdk.api.assortment.shoppingcart.domain.*;
import com.freemud.sdk.api.assortment.shoppingcart.exception.ServiceException; import com.freemud.sdk.api.assortment.shoppingcart.exception.ServiceException;
import com.freemud.sdk.api.assortment.shoppingcart.service.ShoppingCartBaseService; import com.freemud.sdk.api.assortment.shoppingcart.service.ShoppingCartBaseService;
import com.freemud.sdk.api.assortment.shoppingcart.util.CartResponseUtil; import com.freemud.sdk.api.assortment.shoppingcart.util.CartResponseUtil;
...@@ -18,12 +19,14 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -18,12 +19,14 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Comparator; import java.time.LocalDateTime;
import java.util.List; import java.time.ZoneOffset;
import java.util.Map; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -109,8 +112,16 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService { ...@@ -109,8 +112,16 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
@Override @Override
public BaseResponse clear(CartParamDto cartParamDto, String trackingNo) { public BaseResponse clear(CartParamDto cartParamDto, String trackingNo) {
try {
// 构建缓存key
String collageCartHashKey = genCollageCarHashKey(cartParamDto.getPartnerId(), cartParamDto.getStoreId(), cartParamDto.getUserId());
redisCache.delete(collageCartHashKey);
return new BaseResponse(VersionUtils.VER_1, CartResponseConstant.SUCCESS.getCode(), CartResponseConstant.SUCCESS.getMessage());
} catch (Exception e) {
ErrorLog.printErrorLog("assortment-shoppingcart-sdk", trackingNo, e.getMessage(), "setCartGoodsList", cartParamDto, e, Level.ERROR);
return null; return null;
} }
}
@Override @Override
public String getCouponAppId() { public String getCouponAppId() {
...@@ -124,13 +135,38 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService { ...@@ -124,13 +135,38 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
@Override @Override
public BaseResponse<CartGoods> getCartGoods(CartParamDto cartParamDto, String trackingNo) { public BaseResponse<CartGoods> getCartGoods(CartParamDto cartParamDto, String trackingNo) {
try {
String redisKey = genCollageCarHashKey(cartParamDto.getPartnerId(),cartParamDto.getStoreId(),cartParamDto.getUserId());
BoundHashOperations<String, String, CartGoods> operations = redisTemplate.boundHashOps(redisKey);
CartGoods cartGoods = operations.get(cartParamDto.getCartGoodsUid());
return CartResponseUtil.success(cartGoods);
} catch (Exception e) {
ErrorLog.printErrorLog("collageCartBaseServiceImpl", trackingNo, e.getMessage(), "getCartGoods", cartParamDto, e, Level.ERROR);
return null; return null;
} }
}
@Override @Override
public BaseResponse<List<CartGoods>> updateGoodsQty(CartParamDto cartParamDto, String trackingNo) { public BaseResponse<List<CartGoods>> updateGoodsQty(CartParamDto cartParamDto, String trackingNo) {
try {
String redisKey = genCollageCarHashKey(cartParamDto.getPartnerId(),cartParamDto.getStoreId(),cartParamDto.getUserId());
BoundHashOperations<String, String, CartGoods> operations = redisTemplate.boundHashOps(redisKey);
CartGoods cartGoods = operations.get(cartParamDto.getCartGoodsUid());
if (cartGoods != null) {
// 当数量为0时,移除
if (Objects.equals(cartParamDto.getQty(), 0)) {
operations.delete(cartParamDto.getCartGoodsUid());
} else {
cartGoods.setQty(cartParamDto.getQty());
operations.put(cartParamDto.getCartGoodsUid(), cartGoods);
}
}
return this.getCartGoodsList(cartParamDto, trackingNo);
} catch (Exception e) {
ErrorLog.printErrorLog("assortment-shoppingcart-sdk", trackingNo, e.getMessage(), "updateGoodsQty", cartParamDto, e, Level.ERROR);
return null; return null;
} }
}
/** /**
* 获取当前购物车版本 * 获取当前购物车版本
...@@ -249,6 +285,32 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService { ...@@ -249,6 +285,32 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
} }
/** /**
* 获取拼单人员缓存购物车行
* @param partnerId
* @param storeId
* @param crateUserId
* @param sessionId
* @return
*/
public List<String> getCollageCartGoodsUids(String partnerId,String storeId,String crateUserId,String sessionId){
try {
String collageMemberKey = genCollageMemberHashKey(partnerId, storeId, crateUserId);
BoundHashOperations<String, String, List<String>> operations = redisTemplate.boundHashOps(collageMemberKey);
List<String> goodsUids = operations.get(sessionId);
return goodsUids;
} catch (Exception e) {
Map<String,String> request = new HashMap<>();
request.put("partnerId",partnerId);
request.put("storeId",storeId);
request.put("crateUserId",crateUserId);
request.put("sessionId",crateUserId);
ErrorLog.printErrorLog("获取拼单人员缓存购物车行异常", "CollageCartBaseServiceImpl/getCollageCartGoodsUids", request, e);
return null;
}
}
/**
* 构建拼单购物车版本号缓存key * 构建拼单购物车版本号缓存key
* @param partnerId * @param partnerId
* @param storeId * @param storeId
...@@ -270,4 +332,51 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService { ...@@ -270,4 +332,51 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
public Integer incrementCartVersion(String partnerId, String storeId, String userId) { public Integer incrementCartVersion(String partnerId, String storeId, String userId) {
return redisCache.opsForValue().increment(genCollageCarVerKey(partnerId, storeId, userId), 1).intValue(); return redisCache.opsForValue().increment(genCollageCarVerKey(partnerId, storeId, userId), 1).intValue();
} }
public List<CartGoods> removeGoodsUids(String partnerId, String storeId, String userId,List<String> goodsUids) {
String redisKey = genCollageCarHashKey(partnerId,storeId,userId);
BoundHashOperations<String, String, CartGoods> operations = redisTemplate.boundHashOps(redisKey);
if(null != goodsUids && !goodsUids.isEmpty()){
operations.delete(goodsUids.toArray());
}
List<CartGoods> cartGoodsList = operations.values();
//对创建时间进行排序
cartGoodsList.sort(Comparator.comparingLong(CartGoods::getCreateTimeMili));
return cartGoodsList;
}
} }
...@@ -13,19 +13,23 @@ ...@@ -13,19 +13,23 @@
package cn.freemud.controller; package cn.freemud.controller;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.AddShoppingCartGoodsRequestVo; import cn.freemud.entities.vo.*;
import cn.freemud.enums.ResponseResult;
import cn.freemud.service.impl.ShoppingCartCollageServiceImpl; import cn.freemud.service.impl.ShoppingCartCollageServiceImpl;
import cn.freemud.utils.ResponseUtil;
import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare; import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare;
import com.freemud.application.sdk.api.log.ApiAnnotation; import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams; import com.freemud.application.sdk.api.log.LogParams;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping(value = "/shoppingCart/collage", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @RequestMapping(value = "/shoppingCart/collage", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
...@@ -40,4 +44,40 @@ public class ShoppingCartCollageController { ...@@ -40,4 +44,40 @@ public class ShoppingCartCollageController {
public BaseResponse addGoods(@Validated @LogParams @RequestBody AddShoppingCartGoodsRequestVo request) { public BaseResponse addGoods(@Validated @LogParams @RequestBody AddShoppingCartGoodsRequestVo request) {
return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).addGoods(request); return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).addGoods(request);
} }
/**
* 修改拼单购物车中商品数量
*/
@ApiAnnotation(logMessage = "updateGoodsQty")
@PostMapping(value = "/updateGoodsQty")
public BaseResponse updateGoodsQty(@Validated @LogParams @RequestBody UpdateShoppingCartGoodsQtyRequestVo request) {
return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).updateGoodsQty(request);
}
/**
* 查询购物车信息
*/
@ApiAnnotation(logMessage = "listCartGoods")
@PostMapping(value = "/listCartGoods")
public BaseResponse listCartGoods(@Validated @LogParams @RequestBody ShoppingCartInfoRequestVo request) {
return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).getGoodsList(request);
}
/**
* 清空自己的购物车
*/
@ApiAnnotation(logMessage = "clearPartCartGoods")
@PostMapping(value = "/clearPartCartGoods")
public BaseResponse clearPartCartGoods(@Validated @LogParams @RequestBody ShoppingCartCollageClearRequestVo request) {
return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).clearPartCarGoods(request);
}
/**
* 清空购物车
*/
@ApiAnnotation(logMessage = "clearCartGoods")
@PostMapping(value = "/clearCartGoods")
public BaseResponse clearCartGoods(@Validated @LogParams @RequestBody ShoppingCartClearRequestVo request) {
return SDKCommonBaseContextWare.getBean(ShoppingCartCollageServiceImpl.class).clear(request);
}
} }
...@@ -2,6 +2,7 @@ package cn.freemud.service.impl; ...@@ -2,6 +2,7 @@ package cn.freemud.service.impl;
import cn.freemud.adapter.ActivityAdapter; import cn.freemud.adapter.ActivityAdapter;
import cn.freemud.adapter.CollageOrderAdapter; import cn.freemud.adapter.CollageOrderAdapter;
import cn.freemud.adapter.CouponAdapter;
import cn.freemud.adapter.ShoppingCartConvertAdapter; import cn.freemud.adapter.ShoppingCartConvertAdapter;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
...@@ -31,14 +32,16 @@ import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO; ...@@ -31,14 +32,16 @@ import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO;
import com.freemud.card.sdk.log.ErrorLog; import com.freemud.card.sdk.log.ErrorLog;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant; import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
import com.freemud.sdk.api.assortment.shoppingcart.constant.RedisKeyConstant; import com.freemud.sdk.api.assortment.shoppingcart.constant.RedisKeyConstant;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CollageOrder;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CollageOrderDto;
import com.freemud.sdk.api.assortment.shoppingcart.request.CheckCartRequest; import com.freemud.sdk.api.assortment.shoppingcart.request.CheckCartRequest;
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.CollageCartBaseServiceImpl; import com.freemud.sdk.api.assortment.shoppingcart.service.impl.CollageCartBaseServiceImpl;
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl; import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -86,6 +89,80 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -86,6 +89,80 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Autowired @Autowired
private ActivityClient activityClient; private ActivityClient activityClient;
@Autowired
private CouponAdapter couponAdapter;
/**
* 查询拼单订单信息(拼单基础信息 拼单参与人列表)
* @param request(partnerId shopId userId)
* @return
*/
@Override
public BaseResponse queryCollageOrder(CollageOrderRequestVo request) {
CollageOrderDto collageOrderDto = this.collageOrderAdapter.convert2CollageOrderDto(request);
// 查询时需传入拼单创建人的userId,若上送字段为空时,默认查询当前登录人自己的拼单信息
if (StringUtils.isEmpty(request.getCreateCollageUserId())) {
CustomerInfoVo currentUserInfoVo = this.getCustomerInfoVo(request.getSessionId());
collageOrderDto.setCreateCollageUserId(currentUserInfoVo.getMemberId());
}
BaseResponse<CollageOrder> queryCollageOrderResponse = this.collageCartBaseService.queryCollageOrder(collageOrderDto);
CollageOrder collageOrder = queryCollageOrderResponse.getResult();
// 有个类引用冲突了,找不到,代码先注释了
/* if (ResponseResult.SUCCESS.getCode().equals(queryCollageOrderResponse.getCode()) && !ObjectUtils.isEmpty(collageOrder)) {
CollageOrderResponseVo collageOrderResponseVo = new CollageOrderResponseVo();
// 订单基础信息
collageOrderResponseVo.setOrder(collageOrder);
// TODO 订单参与人列表信息
return ResponseUtil.success(collageOrderResponseVo);
} else {
return ResponseUtil.error(ResponseResult.COLLAGE_NOT_EXIST);
}*/
return null;
}
/**
* 创建拼单订单基础信息
* @param request(partnerId shopId sessionId)
* @return
*/
@Override
public BaseResponse createCollageOrder(CollageOrderRequestVo request) {
CollageOrderDto collageOrderDto = this.collageOrderAdapter.convert2CollageOrderDto(request);
// 根据sessionId查询对应登录用户信息
CustomerInfoVo currentUserInfoVo = this.getCustomerInfoVo(request.getSessionId());
collageOrderDto.setCreateCollageUserId(currentUserInfoVo.getMemberId());
// 创建拼单订单基础缓存信息
BaseResponse<CollageOrder> createCollageOrderResponse = this.collageCartBaseService.createCollageOrder(collageOrderDto);
if (ResponseResult.SUCCESS.getCode().equals(createCollageOrderResponse.getCode())) {
CollageOrderResponseVo collageOrderResponseVo = new CollageOrderResponseVo();
collageOrderResponseVo.setOrder(createCollageOrderResponse.getResult());
return ResponseUtil.success(collageOrderResponseVo);
} else {
return ResponseUtil.error(ResponseResult.COLLAGE_ALREADY_EXIST);
}
}
/**
* 取消拼单订单,删除相关缓存信息
* @param request
* @return
*/
@Override
public BaseResponse cancelCollageOrder(CollageOrderRequestVo request) {
CollageOrderDto collageOrderDto = this.collageOrderAdapter.convert2CollageOrderDto(request);
// 根据sessionId查询对应登录用户信息
CustomerInfoVo currentUserInfoVo = this.getCustomerInfoVo(request.getSessionId());
collageOrderDto.setCreateCollageUserId(currentUserInfoVo.getMemberId());
return this.collageCartBaseService.cancelCollageOrder(collageOrderDto);
}
@Override @Override
public BaseResponse addGoodsByCard(AddGoodsByWeixinCardRequestVo request) { public BaseResponse addGoodsByCard(AddGoodsByWeixinCardRequestVo request) {
return null; return null;
...@@ -106,6 +183,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -106,6 +183,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(currentUserInfoVo); UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(currentUserInfoVo);
String currentUserId = currentUserInfoVo.getMemberId(); String currentUserId = currentUserInfoVo.getMemberId();
String currentSessionId = addShoppingCartGoodsRequestVo.getSessionId();
String partnerId = addShoppingCartGoodsRequestVo.getPartnerId(); String partnerId = addShoppingCartGoodsRequestVo.getPartnerId();
String storeId = addShoppingCartGoodsRequestVo.getShopId(); String storeId = addShoppingCartGoodsRequestVo.getShopId();
String appId = addShoppingCartGoodsRequestVo.getAppId(); String appId = addShoppingCartGoodsRequestVo.getAppId();
...@@ -119,10 +197,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -119,10 +197,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
String crateUserId = addShoppingCartGoodsRequestVo.getCreateCollageUserId(); String crateUserId = addShoppingCartGoodsRequestVo.getCreateCollageUserId();
// 拼单相关条件校验 // 拼单相关条件校验
check(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo); check(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getShopId(),spuId,addShoppingCartGoodsRequestVo.getCreateCollageUserId(),currentSessionId);
CartGoods cartGoods = ShoppingCartConvertAdapter.convent2CartGoods(addShoppingCartGoodsRequestVo); CartGoods cartGoods = ShoppingCartConvertAdapter.convent2CartGoods(addShoppingCartGoodsRequestVo);
cartGoods.setSessionId(addShoppingCartGoodsRequestVo.getSessionId()); cartGoods.setSessionId(currentSessionId);
cartGoods.setUserId(currentUserId); cartGoods.setUserId(currentUserId);
List<Long> productIds = new ArrayList<>(); List<Long> productIds = new ArrayList<>();
...@@ -132,13 +210,13 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -132,13 +210,13 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
List<ProductBeanDTO> productBeanListSpuClass = assortmentSdkService.getProductsInfoSdk(partnerId, storeId, Collections.singletonList(spuId),addShoppingCartGoodsRequestVo.getMenuType(), this.shoppingCartBaseService); List<ProductBeanDTO> productBeanListSpuClass = assortmentSdkService.getProductsInfoSdk(partnerId, storeId, Collections.singletonList(spuId),addShoppingCartGoodsRequestVo.getMenuType(), this.shoppingCartBaseService);
// 购物车版本加锁 // 购物车版本加锁
dolock(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo); dolock(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getCarVer());
List<CartGoods> allCartGoodsList = null; List<CartGoods> allCartGoodsList = null;
String productName = null; String productName = null;
try { try {
//缓存中获取购物车商品信息 //缓存中获取购物车商品信息
allCartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, crateUserId, addShoppingCartGoodsRequestVo.getSessionId(), null, collageCartBaseService); allCartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, crateUserId, currentSessionId, null, collageCartBaseService);
if (CollectionUtils.isEmpty(allCartGoodsList)) { if (CollectionUtils.isEmpty(allCartGoodsList)) {
allCartGoodsList = new ArrayList<>(); allCartGoodsList = new ArrayList<>();
} }
...@@ -152,8 +230,8 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -152,8 +230,8 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
List<CartGoods> cartGoodsRedisList= addNotProductCouponGoods(addShoppingCartGoodsRequestVo, cartGoods, goodsId, crateUserId, shoppingCartGoodsResponseVo, allCartGoodsList); List<CartGoods> cartGoodsRedisList= addNotProductCouponGoods(addShoppingCartGoodsRequestVo, cartGoods, goodsId, crateUserId, shoppingCartGoodsResponseVo, allCartGoodsList);
// 更新拼单购物车人员缓存中的的购物车行id集合 // 更新拼单购物车人员缓存中的的购物车行id集合
List<String> cartGoodsUids = cartGoodsRedisList.stream().map(CartGoods::getCartGoodsUid).collect(Collectors.toList()); List<String> cartGoodsUids = cartGoodsRedisList.stream().filter(cartGoods1 -> currentSessionId.equals(cartGoods1.getSessionId())).map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getSessionId()); collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,currentSessionId);
// 当商品数量被设为0时 // 当商品数量被设为0时
if (Objects.equals(cartGoods.getQty(), 0)) { if (Objects.equals(cartGoods.getQty(), 0)) {
...@@ -194,12 +272,194 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -194,12 +272,194 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Override @Override
public BaseResponse updateGoodsQty(UpdateShoppingCartGoodsQtyRequestVo updateShoppingCartGoodsQtyRequestVo) { public BaseResponse updateGoodsQty(UpdateShoppingCartGoodsQtyRequestVo updateShoppingCartGoodsQtyRequestVo) {
return null;
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = new ShoppingCartGoodsResponseVo();
CustomerInfoVo assortmentCustomerInfoVo = getCustomerInfoVo(updateShoppingCartGoodsQtyRequestVo.getSessionId());
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(assortmentCustomerInfoVo);
String currentSessionId = updateShoppingCartGoodsQtyRequestVo.getSessionId();
String currentUserId = userLoginInfoDto.getMemberId();
String partnerId = updateShoppingCartGoodsQtyRequestVo.getPartnerId();
String storeId = updateShoppingCartGoodsQtyRequestVo.getShopId();
String appId = updateShoppingCartGoodsQtyRequestVo.getAppId();
String cartGoodsUid = updateShoppingCartGoodsQtyRequestVo.getCartGoodsUid();
Integer qty = updateShoppingCartGoodsQtyRequestVo.getQty();
String menuType = updateShoppingCartGoodsQtyRequestVo.getMenuType();
Integer orderType=updateShoppingCartGoodsQtyRequestVo.getOrderType();
String receiveId = updateShoppingCartGoodsQtyRequestVo.getReceiveId();
// 获取拼单发起人id
String crateUserId = updateShoppingCartGoodsQtyRequestVo.getCreateCollageUserId();
// 拼单相关条件校验
check(partnerId, storeId, crateUserId,updateShoppingCartGoodsQtyRequestVo.getShopId(),null,crateUserId,currentSessionId);
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,updateShoppingCartGoodsQtyRequestVo.getCarVer());
List<CartGoods> cartGoodsList = null;
try {
// 先验证商品是否存在
CartGoods cartGoods = assortmentSdkService.getCartGoodsBySdk(partnerId, crateUserId, storeId, cartGoodsUid, "", collageCartBaseService);
if (cartGoods == null) {
throw new ServiceException(ResponseResult.SHOPPING_CART_UPDATE_ERROR);
}
// 检查购物车商品库存数量
checkUpdateStock(updateShoppingCartGoodsQtyRequestVo, cartGoods);
// 更新购物车中数量
cartGoodsList = assortmentSdkService.updateGoodsQtyBySdk(partnerId, crateUserId, storeId, cartGoodsUid, qty<0?0:qty, "", collageCartBaseService);
// check购物车中所有商品
CheckCartRequest checkCartRequest = assortmentSdkService.checkShoppingCartSdk(cartGoodsList, partnerId, storeId, shoppingCartGoodsResponseVo, updateShoppingCartGoodsQtyRequestVo.getOrderType(), "", updateShoppingCartGoodsQtyRequestVo.getMenuType(), shoppingCartBaseService);
if (checkCartRequest.getShoppingCartGoodsResponseVo() != null) {
shoppingCartGoodsResponseVo.setChanged(checkCartRequest.getShoppingCartGoodsResponseVo().getChanged());
shoppingCartGoodsResponseVo.setToastMsg(checkCartRequest.getShoppingCartGoodsResponseVo().getToastMsg());
}
cartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(checkCartRequest.getCartGoodsList()), CartGoods.class);
// 重新存储最新购物车
List<CartGoods> cartGoodsRedisList = assortmentSdkService.setShoppingCart(partnerId, storeId, crateUserId, cartGoodsList, currentSessionId, "", collageCartBaseService);
// 更新拼单购物车人员缓存中的的购物车行id集合
List<String> cartGoodsUids = cartGoodsRedisList.stream().filter(cartGoods1 -> currentSessionId.equals(cartGoods1.getSessionId())).map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,currentSessionId);
} catch (Exception e) {
ErrorLog.errorConvertJson(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "shoppingCartCollageServiceImpl updateGoodsQty:" + e.getMessage(), e);
return ResponseUtil.error(ResponseResult.SHOPPING_CART_VERSION_ERROR, "购物车商品有变动,请手动刷新再修改");
}finally {
// 购物车版本解锁
// 版本锁的粒度控制在检查购物车、刷新购物车、刷新车人员缓存行
// 当这些操作结束后,购物的更新操作,已经结束,其他的流程是针对已经添加到redis中的购物车做查询操作
// 所以只有上述的流程才加锁控制
doUnlock(partnerId, storeId, crateUserId);
}
Long deliveryAmount = calculateDeliveryAmount(receiveId, partnerId, storeId, userLoginInfoDto.getWxAppid(), shoppingCartGoodsResponseVo);
// 获取优惠信息
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult
=getCalculationDiscountResult(menuType,partnerId,storeId,crateUserId,appId,userLoginInfoDto.getWxAppid(),orderType,assortmentCustomerInfoVo.isMemberPaid(),cartGoodsList,new ArrayList(),new ArrayList<>(),null,deliveryAmount);
if (calculationDiscountResult == null) {
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
// return shoppingCartGoodsResponseVo;
}
ActivityQueryDto activityQueryDto = activityAdapter.getActivityQueryDto(partnerId, storeId, crateUserId, appId, updateShoppingCartGoodsQtyRequestVo.getOrderType());
// 促销活动的优惠金额计算
updateShoppingCartGoodsDiscount(null, activityQueryDto, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo, null, userLoginInfoDto, updateShoppingCartGoodsQtyRequestVo.getMenuType(), deliveryAmount);
clearMsg(shoppingCartGoodsResponseVo, cartGoodsUid);
//设置更新响应信息
setAddAndUpdateResponse(shoppingCartGoodsResponseVo, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo.getToastMsg(), partnerId, storeId, crateUserId, ShoppingCartConstant.ADD_AND_UPDATE, null);
// 设置购物车版本号
shoppingCartGoodsResponseVo.setCarVer(collageCartBaseService.incrementCartVersion(partnerId, storeId, crateUserId));
return ResponseUtil.success(shoppingCartGoodsResponseVo);
} }
@Override @Override
public BaseResponse getGoodsList(ShoppingCartInfoRequestVo shoppingCartInfoRequestVo) { public BaseResponse getGoodsList(ShoppingCartInfoRequestVo shoppingCartInfoRequestVo) {
return null;
if (StringUtils.isEmpty(shoppingCartInfoRequestVo.getShopId())){
throw new ServiceException(ResponseResult.SHOPPING_CART_SHOP_ID_NOT_EMPTY);
}
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = new ShoppingCartGoodsResponseVo();
// 获取用户信息
CustomerInfoVo assortmentCustomerInfoVo = getCustomerInfoVo(shoppingCartInfoRequestVo.getSessionId());
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(assortmentCustomerInfoVo);
String currentUserId = userLoginInfoDto.getMemberId();
String currentSessionId = shoppingCartInfoRequestVo.getSessionId();
String partnerId = shoppingCartInfoRequestVo.getPartnerId();
String storeId = shoppingCartInfoRequestVo.getShopId();
String appId = shoppingCartInfoRequestVo.getAppId();
String couponCode = shoppingCartInfoRequestVo.getCouponCode();
String activityCode = shoppingCartInfoRequestVo.getActivityCode();
String menuType = shoppingCartInfoRequestVo.getMenuType();
Integer orderType = shoppingCartInfoRequestVo.getOrderType();
String receiveId = shoppingCartInfoRequestVo.getReceiveId();
// 获取拼单发起人id
String crateUserId = shoppingCartInfoRequestVo.getCreateCollageUserId();
// 拼单发起人id不能为空
// 拼单购物相关的redis的key都需要拼单发起人id,所以这个值是不能为空的
if (StringUtils.isEmpty(crateUserId)){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
// 获取不到拼单的基础信息,抛出异常
// 拼单的有效时间为1小时,当获取不到拼单的基础信息时,认为这个拼单没有发起、已经失效、已经结束
Map<String, String> collageBase = collageCartBaseService.getCollageBase(partnerId,storeId,crateUserId);
if(collageBase == null || collageBase.isEmpty()){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,shoppingCartInfoRequestVo.getCarVer());
List<CartGoods> cartGoodsList = null;
try {
// 获取购物车商品
cartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, crateUserId, null, "", collageCartBaseService);
// 如果购物车商品不为空, 则check购物车中所有商品
if (CollectionUtils.isNotEmpty(cartGoodsList)){
CheckCartRequest checkCartRequest = assortmentSdkService.checkShoppingCartSdk(cartGoodsList, partnerId, storeId, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo.getOrderType(), "", shoppingCartInfoRequestVo.getMenuType() ,shoppingCartBaseService);
if (checkCartRequest.getShoppingCartGoodsResponseVo() != null) {
shoppingCartGoodsResponseVo.setChanged(checkCartRequest.getShoppingCartGoodsResponseVo().getChanged());
shoppingCartGoodsResponseVo.setToastMsg(checkCartRequest.getShoppingCartGoodsResponseVo().getToastMsg());
}
cartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(checkCartRequest.getCartGoodsList()), CartGoods.class);
// 重新存储最新购物车
List<CartGoods> cartGoodsRedisList = assortmentSdkService.setShoppingCart(partnerId, storeId, crateUserId, cartGoodsList, assortmentCustomerInfoVo.getSessionId(), "", this.collageCartBaseService);
// 更新拼单购物车人员缓存中的的购物车行id集合
List<String> cartGoodsUids = cartGoodsRedisList.stream().filter(cartGoods1 -> currentSessionId.equals(cartGoods1.getSessionId())).map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,currentSessionId);
}
} catch (Exception e) {
ErrorLog.errorConvertJson(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "shoppingCartCollageServiceImpl getGoodsList:" + e.getMessage(), e);
return ResponseUtil.error(ResponseResult.SHOPPING_CART_VERSION_ERROR, "购物车商品有变动,请手动刷新再修改");
}finally {
// 购物车版本解锁
// 版本锁的粒度控制在检查购物车、刷新购物车、刷新车人员缓存行
// 当这些操作结束后,购物的更新操作,已经结束,其他的流程是针对已经添加到redis中的购物车做查询操作
// 所以只有上述的流程才加锁控制
doUnlock(partnerId, storeId, crateUserId);
}
List<ActivityCalculationDiscountRequestDto.CalculationDiscountCoupon> coupons = new ArrayList<>();
// 当couponCode不为空时,需参与价格计算
if (StringUtils.isNotEmpty(couponCode)) {
ActivityCalculationDiscountRequestDto.CalculationDiscountCoupon coupon = new ActivityCalculationDiscountRequestDto.CalculationDiscountCoupon();
coupon.setCode(couponCode);
coupon.setActivityCode(activityCode);
coupons.add(coupon);
}
Long deliveryAmount = calculateDeliveryAmount(receiveId, partnerId, storeId, userLoginInfoDto.getWxAppid(), shoppingCartGoodsResponseVo);
// 获取优惠信息
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult = getCalculationDiscountResult(menuType,partnerId,storeId,crateUserId,appId,userLoginInfoDto.getWxAppid(),orderType,assortmentCustomerInfoVo.isMemberPaid(),cartGoodsList,coupons,null,shoppingCartInfoRequestVo.getReceiveId(),deliveryAmount);
if (calculationDiscountResult == null) {
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
}
ActivityQueryDto activityQueryDto = activityAdapter.getActivityQueryDto(partnerId, storeId, crateUserId, appId, shoppingCartInfoRequestVo.getOrderType());
CouponPromotionVO couponPromotionVO = couponAdapter.getCouponPromotionVO(shoppingCartInfoRequestVo, userLoginInfoDto);
// 促销活动的优惠金额计算
this.updateShoppingCartGoodsDiscount(couponPromotionVO, activityQueryDto, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo, userLoginInfoDto,shoppingCartInfoRequestVo.getMenuType(),deliveryAmount);
//设置更新响应信息
setAddAndUpdateResponse(shoppingCartGoodsResponseVo, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo.getToastMsg(), partnerId, storeId, crateUserId, ShoppingCartConstant.QUERY_INFO, shoppingCartInfoRequestVo);
// 在原价、现价、折扣价上增加第一次使用会员卡的费用
this.addNeedCardAmount(shoppingCartInfoRequestVo, shoppingCartGoodsResponseVo);
// 设置购物车版本号
shoppingCartGoodsResponseVo.setCarVer(collageCartBaseService.incrementCartVersion(partnerId, storeId, crateUserId));
return ResponseUtil.success(shoppingCartGoodsResponseVo);
} }
@Override @Override
...@@ -209,7 +469,29 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -209,7 +469,29 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Override @Override
public BaseResponse clear(ShoppingCartClearRequestVo request) { public BaseResponse clear(ShoppingCartClearRequestVo request) {
return null;
// 拼单发起人
String createCollageUserId = request.getCreateCollageUserId();
if (StringUtils.isBlank(createCollageUserId)) {
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
String partnerId = request.getPartnerId();
String storeId = request.getShopId();
if(StringUtils.isEmpty(partnerId) || StringUtils.isEmpty(storeId)){
throw new ServiceException(ResponseResult.PARAMETER_MISSING);
}
CustomerInfoVo userLoginInfoDto = getCustomerInfoVo(request.getSessionId());
if(null == userLoginInfoDto || StringUtils.isEmpty(userLoginInfoDto.getMemberId())){
throw new ServiceException(ResponseResult.NOT_LOGIN);
}
com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto cartParamDto = new com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto();
cartParamDto.setPartnerId(partnerId);
cartParamDto.setStoreId(storeId);
cartParamDto.setUserId(createCollageUserId);
collageCartBaseService.clear(cartParamDto, LogThreadLocal.getTrackingNo());
return ResponseUtil.success();
} }
@Override @Override
...@@ -379,22 +661,25 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -379,22 +661,25 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
* @param partnerId * @param partnerId
* @param storeId * @param storeId
* @param crateUserId * @param crateUserId
* @param addShoppingCartGoodsRequestVo * @param shopId
* @param spuId
* @param createCollageUserId
* @param currentSessionId
*/ */
public void check(String partnerId,String storeId,String crateUserId,AddShoppingCartGoodsRequestVo addShoppingCartGoodsRequestVo){ public void check(String partnerId,String storeId,String crateUserId,String shopId,String spuId,String createCollageUserId,String currentSessionId){
//店铺id不能为空 //店铺id不能为空
if (StringUtils.isEmpty(addShoppingCartGoodsRequestVo.getShopId())){ if (StringUtils.isEmpty(shopId)){
throw new ServiceException(ResponseResult.SHOPPING_CART_SHOP_ID_NOT_EMPTY); throw new ServiceException(ResponseResult.SHOPPING_CART_SHOP_ID_NOT_EMPTY);
} }
//拼单不支持用商品券、换购券 //拼单不支持用商品券、换购券
if (null != addShoppingCartGoodsRequestVo.getSpuId() && addShoppingCartGoodsRequestVo.getSpuId().startsWith(CommonsConstant.COUPON_PREFIX)){ if (null != spuId && spuId.startsWith(CommonsConstant.COUPON_PREFIX)){
throw new ServiceException(ResponseResult.COUPON_SHOP_NOTSUPPORT); throw new ServiceException(ResponseResult.COUPON_SHOP_NOTSUPPORT);
} }
// 拼单发起人id不能为空 // 拼单发起人id不能为空
// 拼单购物相关的redis的key都需要拼单发起人id,所以这个值是不能为空的 // 拼单购物相关的redis的key都需要拼单发起人id,所以这个值是不能为空的
if (StringUtils.isEmpty(addShoppingCartGoodsRequestVo.getCreateCollageUserId())){ if (StringUtils.isEmpty(createCollageUserId)){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST); throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
} }
...@@ -415,14 +700,14 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -415,14 +700,14 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
// 判单拼单的点餐位是否存在 // 判单拼单的点餐位是否存在
// 发起拼单、加入拼单,都会给用户创建点餐位,用来存储用户的购物车行id // 发起拼单、加入拼单,都会给用户创建点餐位,用来存储用户的购物车行id
// 并设置其相应的购物车行id为空集合,没有点餐位,则认为该用户是没有加入拼单 // 并设置其相应的购物车行id为空集合,没有点餐位,则认为该用户是没有加入拼单
List<String> cartGoodsUids = collageCartBaseService.getCollageMemberHashKey(partnerId, storeId,crateUserId ,addShoppingCartGoodsRequestVo.getSessionId()); List<String> cartGoodsUids = collageCartBaseService.getCollageMemberHashKey(partnerId, storeId,crateUserId ,currentSessionId);
if(cartGoodsUids == null){ if(cartGoodsUids == null){
throw new ServiceException(ResponseResult.COLLAGE_NOT_ADD); throw new ServiceException(ResponseResult.COLLAGE_NOT_ADD);
} }
// 校验用户选好了状态 // 校验用户选好了状态
// 只有用户不是选好了状态的时候才能更改购物车 // 只有用户不是选好了状态的时候才能更改购物车
Boolean memberState = collageCartBaseService.getCollageMemStateHashKey(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getSessionId()); Boolean memberState = collageCartBaseService.getCollageMemStateHashKey(partnerId, storeId, crateUserId,currentSessionId);
if(memberState != null && memberState){ if(memberState != null && memberState){
throw new ServiceException(ResponseResult.COLLAGE_ALREADY_CHOOSE); throw new ServiceException(ResponseResult.COLLAGE_ALREADY_CHOOSE);
} }
...@@ -434,11 +719,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -434,11 +719,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
* @param partnerId * @param partnerId
* @param storeId * @param storeId
* @param crateUserId * @param crateUserId
* @param addShoppingCartGoodsRequestVo * @param carVer
*/ */
private void dolock(String partnerId,String storeId,String crateUserId,AddShoppingCartGoodsRequestVo addShoppingCartGoodsRequestVo) { private void dolock(String partnerId,String storeId,String crateUserId,Integer carVer) {
// 设置版本锁控制购物车只能一个人进行操作 // 设置版本锁控制购物车只能一个人进行操作
Integer carVer = addShoppingCartGoodsRequestVo.getCarVer();
if (carVer == null || carVer < 1) { if (carVer == null || carVer < 1) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR); throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
} }
...@@ -573,4 +857,94 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp ...@@ -573,4 +857,94 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
calculationDiscountGoodsList.add(calculationDiscountGoods); calculationDiscountGoodsList.add(calculationDiscountGoods);
} }
} }
@Override
public BaseResponse clearPartCarGoods(ShoppingCartCollageClearRequestVo shoppingCartCollageClearRequestVo) {
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = new ShoppingCartGoodsResponseVo();
CustomerInfoVo assortmentCustomerInfoVo = getCustomerInfoVo(shoppingCartCollageClearRequestVo.getSessionId());
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(assortmentCustomerInfoVo);
String currentUserId = userLoginInfoDto.getMemberId();
String currentSessionId = shoppingCartCollageClearRequestVo.getSessionId();
String partnerId = shoppingCartCollageClearRequestVo.getPartnerId();
String storeId = shoppingCartCollageClearRequestVo.getShopId();
String appId = shoppingCartCollageClearRequestVo.getAppId();
String menuType = shoppingCartCollageClearRequestVo.getMenuType();
Integer orderType=shoppingCartCollageClearRequestVo.getOrderType();
String receiveId = shoppingCartCollageClearRequestVo.getReceiveId();
// 获取拼单发起人id
String crateUserId = shoppingCartCollageClearRequestVo.getCreateCollageUserId();
// 拼单发起人id不能为空
// 拼单购物相关的redis的key都需要拼单发起人id,所以这个值是不能为空的
if (StringUtils.isEmpty(crateUserId)){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
// 获取不到拼单的基础信息,抛出异常
// 拼单的有效时间为1小时,当获取不到拼单的基础信息时,认为这个拼单没有发起、已经失效、已经结束
Map<String, String> collageBase = collageCartBaseService.getCollageBase(partnerId,storeId,crateUserId);
if(collageBase == null || collageBase.isEmpty()){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,shoppingCartCollageClearRequestVo.getCarVer());
List<CartGoods> cartGoodsList = null;
try {
// 获取用户的购物车行id
List<String> goodsUids = collageCartBaseService.getCollageCartGoodsUids(partnerId, storeId, crateUserId,shoppingCartCollageClearRequestVo.getSessionId());
// 清除购物车中的购物车行信息
List<com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods> nowCartGoodsList = collageCartBaseService.removeGoodsUids(partnerId, storeId, crateUserId,goodsUids);
if(null != nowCartGoodsList && !nowCartGoodsList.isEmpty()){
cartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(nowCartGoodsList), CartGoods.class);
}
// check购物车中所有商品
CheckCartRequest checkCartRequest = assortmentSdkService.checkShoppingCartSdk(cartGoodsList, partnerId, storeId, shoppingCartGoodsResponseVo, shoppingCartCollageClearRequestVo.getOrderType(), "", shoppingCartCollageClearRequestVo.getMenuType(), shoppingCartBaseService);
if (checkCartRequest.getShoppingCartGoodsResponseVo() != null) {
shoppingCartGoodsResponseVo.setChanged(checkCartRequest.getShoppingCartGoodsResponseVo().getChanged());
shoppingCartGoodsResponseVo.setToastMsg(checkCartRequest.getShoppingCartGoodsResponseVo().getToastMsg());
}
cartGoodsList = JSONArray.parseArray(JSONObject.toJSONString(checkCartRequest.getCartGoodsList()), CartGoods.class);
// 重新存储最新购物车
List<CartGoods> cartGoodsRedisList = assortmentSdkService.setShoppingCart(partnerId, storeId, crateUserId, cartGoodsList, shoppingCartCollageClearRequestVo.getSessionId(), "", collageCartBaseService);
// 更新拼单购物车人员缓存中的的购物车行id集合
List<String> cartGoodsUids = cartGoodsRedisList.stream().filter(cartGoods1 -> currentSessionId.equals(cartGoods1.getSessionId())).map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,shoppingCartCollageClearRequestVo.getSessionId());
} catch (Exception e) {
ErrorLog.errorConvertJson(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "shoppingCartCollageServiceImpl updateGoodsQty:" + e.getMessage(), e);
return ResponseUtil.error(ResponseResult.SHOPPING_CART_VERSION_ERROR, "购物车商品有变动,请手动刷新再修改");
}finally {
// 购物车版本解锁
// 版本锁的粒度控制在检查购物车、刷新购物车、刷新车人员缓存行
// 当这些操作结束后,购物的更新操作,已经结束,其他的流程是针对已经添加到redis中的购物车做查询操作
// 所以只有上述的流程才加锁控制
doUnlock(partnerId, storeId, crateUserId);
}
Long deliveryAmount = calculateDeliveryAmount(receiveId, partnerId, storeId, userLoginInfoDto.getWxAppid(), shoppingCartGoodsResponseVo);
// 获取优惠信息
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult
=getCalculationDiscountResult(menuType,partnerId,storeId,crateUserId,appId,userLoginInfoDto.getWxAppid(),orderType,assortmentCustomerInfoVo.isMemberPaid(),cartGoodsList,new ArrayList(),new ArrayList<>(),null,deliveryAmount);
if (calculationDiscountResult == null) {
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
}
ActivityQueryDto activityQueryDto = activityAdapter.getActivityQueryDto(partnerId, storeId, crateUserId, appId, shoppingCartCollageClearRequestVo.getOrderType());
// 促销活动的优惠金额计算
updateShoppingCartGoodsDiscount(null, activityQueryDto, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo, null, userLoginInfoDto, shoppingCartCollageClearRequestVo.getMenuType(), deliveryAmount);
//设置更新响应信息
setAddAndUpdateResponse(shoppingCartGoodsResponseVo, calculationDiscountResult, cartGoodsList, shoppingCartGoodsResponseVo.getToastMsg(), partnerId, storeId, crateUserId, ShoppingCartConstant.ADD_AND_UPDATE, null);
// 设置购物车版本号
shoppingCartGoodsResponseVo.setCarVer(collageCartBaseService.incrementCartVersion(partnerId, storeId, crateUserId));
return ResponseUtil.success(shoppingCartGoodsResponseVo);
}
} }
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