Commit ab505bec by 刘鹏飞

拼单购物车添加购物车的锁的控制

parent c5cf201c
......@@ -116,4 +116,10 @@ public class RedisKeyConstant {
*/
public final static String COLLAGE_STORE_MEMBER_KEY = "kgd:collage:store:member:{0}:{1}";
/**
* kgd:collage:cart:lock:{partnerId}:{storeId}:{邀请用户ID}
* 拼单购物车版本号key
*/
public final static String COLLAGE_CART_LOCK_KEY = "kgd:collage:cart:lock:{0}:{1}:{2}";
}
......@@ -201,7 +201,7 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
/**
* 获取当前购物车版本
* 默认1
* 默认0
* @param key
* @return
*/
......@@ -214,7 +214,7 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
request.put("key",key);
ErrorLog.printErrorLog("获取当前购物车版本信息异常", "CollageCartBaseServiceImpl/getCartVersion", request, e);
}
return value == null ? 1 : value;
return value == null ? 0 : value;
}
/**
......@@ -397,11 +397,22 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
* @param userId
* @return
*/
private String genCollageCarVerKey(String partnerId, String storeId, String userId) {
public String genCollageCarVerKey(String partnerId, String storeId, String userId) {
return MessageFormat.format(RedisKeyConstant.COLLAGE_CART_VER_KEY, partnerId, storeId, userId);
}
/**
* 构建拼单购物车加锁使用的key
* @param partnerId
* @param storeId
* @param userId
* @return
*/
public String genCollageCarLockKey(String partnerId, String storeId, String userId) {
return MessageFormat.format(RedisKeyConstant.COLLAGE_CART_LOCK_KEY, partnerId, storeId, userId);
}
/**
* 增加购物车版本
*
* @param partnerId 商户号
......
package cn.freemud.service.impl;
import cn.freemud.adapter.ActivityAdapter;
import cn.freemud.adapter.CollageOrderAdapter;
import cn.freemud.adapter.CouponAdapter;
import cn.freemud.adapter.ShoppingCartConvertAdapter;
import cn.freemud.base.entity.BaseResponse;
......@@ -29,9 +28,7 @@ import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO;
import com.freemud.card.sdk.log.ErrorLog;
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.domain.CollageMemberState;
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.enums.BusinessTypeEnum;
import com.freemud.sdk.api.assortment.shoppingcart.request.CheckCartRequest;
......@@ -39,16 +36,12 @@ import com.freemud.sdk.api.assortment.shoppingcart.service.impl.CollageCartBaseS
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.CollageOrderBaseServiceImpl;
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.MessageFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
......@@ -152,7 +145,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
List<ProductBeanDTO> productBeanListSpuClass = assortmentSdkService.getProductsInfoSdk(partnerId, storeId, Collections.singletonList(spuId),addShoppingCartGoodsRequestVo.getMenuType(), this.shoppingCartBaseService);
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getCarVer());
dolock(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getCarVer(),true);
List<CartGoods> allCartGoodsList = null;
String productName = null;
......@@ -268,7 +261,6 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
throw new ServiceException(ResponseResult.NOT_LOGIN);
}
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(currentUserInfoVo);
//String currentSessionId = updateShoppingCartGoodsQtyRequestVo.getSessionId();
String currentUserId = userLoginInfoDto.getMemberId();
String partnerId = updateShoppingCartGoodsQtyRequestVo.getPartnerId();
String storeId = updateShoppingCartGoodsQtyRequestVo.getShopId();
......@@ -292,7 +284,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
}
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,updateShoppingCartGoodsQtyRequestVo.getCarVer());
dolock(partnerId, storeId, crateUserId,updateShoppingCartGoodsQtyRequestVo.getCarVer(),true);
List<CartGoods> cartGoodsList = null;
try {
......@@ -408,7 +400,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
}
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,shoppingCartInfoRequestVo.getCarVer());
dolock(partnerId, storeId, crateUserId,shoppingCartInfoRequestVo.getCarVer(),false);
List<CartGoods> cartGoodsList = null;
try {
......@@ -684,7 +676,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
System.out.println(JSON.toJSONString(activityCalculationDiscountRequestDto));
activityCalculationDiscountResponseDto = activityClient.calculationDiscount(activityCalculationDiscountRequestDto);
} catch (Exception ex) {
com.freemud.application.sdk.api.log.ErrorLog.printErrorLog("calculation_discount_error", "/calculation/discount", activityCalculationDiscountRequestDto, ex);
ErrorLog.errorConvertJson(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "shoppingCartCollageServiceImpl getActivityCalculationDiscountResponse:" + ex.getMessage(), ex);
throw new ServiceException(ResponseResult.OPERATE_TOO_OFTEN);
}
// 返回成功
......@@ -843,20 +835,23 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
* @param storeId
* @param crateUserId
* @param carVer
* @param flag
*/
private void dolock(String partnerId,String storeId,String crateUserId,Integer carVer) {
// 设置版本锁控制购物车只能一个人进行操作
if (carVer == null || carVer < 1) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
}
// 构建拼单购物车版本号缓存key
String collageCartVerKey = genCollageCarVerKey(partnerId, storeId, crateUserId);
Integer cartVersion = collageCartBaseService.getCartVersion(collageCartVerKey);
if (!carVer.equals(cartVersion)) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
private void dolock(String partnerId,String storeId,String crateUserId,Integer carVer,Boolean flag) {
if(flag){
// 设置版本锁控制购物车只能一个人进行操作
if (carVer == null || carVer < 1) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
}
// 构建拼单购物车版本号缓存key
String collageCartVerKey = collageCartBaseService.genCollageCarVerKey(partnerId, storeId, crateUserId);
Integer cartVersion = collageCartBaseService.getCartVersion(collageCartVerKey);
if (!carVer.equals(cartVersion)) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
}
}
boolean lock = RedisLock.getInstance(redisCache.getRedisTemplate()).lock(collageCartVerKey);
boolean lock = RedisLock.getInstance(redisCache.getRedisTemplate()).lock(collageCartBaseService.genCollageCarLockKey(partnerId, storeId, crateUserId));
if (!lock) {
//加锁失败
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
......@@ -871,23 +866,13 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
*/
private void doUnlock(String partnerId,String storeId,String crateUserId) {
try {
String collageCartVerKey = genCollageCarVerKey(partnerId, storeId, crateUserId);
RedisLock.getInstance(redisCache.getRedisTemplate()).unlock(collageCartVerKey);
String collageCartLockKey = collageCartBaseService.genCollageCarLockKey(partnerId, storeId, crateUserId);
RedisLock.getInstance(redisCache.getRedisTemplate()).unlock(collageCartLockKey);
} catch (Exception e) {
ErrorLog.errorConvertJson(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "购物车版本解锁解锁失败" , e);
}
}
/**
* 构建拼单购物车版本号缓存key
* @param partnerId
* @param storeId
* @param userId
* @return
*/
private String genCollageCarVerKey(String partnerId, String storeId, String userId) {
return MessageFormat.format(RedisKeyConstant.COLLAGE_CART_VER_KEY, partnerId, storeId, userId);
}
/**
* 构建 ActivityCalculationDiscountRequestDto
......@@ -1034,7 +1019,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
}
// 购物车版本加锁
dolock(partnerId, storeId, crateUserId,shoppingCartCollageClearRequestVo.getCarVer());
dolock(partnerId, storeId, crateUserId,shoppingCartCollageClearRequestVo.getCarVer(),true);
List<CartGoods> cartGoodsList = new ArrayList<>();
try {
......
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