Commit f52b99a4 by 刘鹏飞

拼单购物车相关

parent 62c9047a
......@@ -3,19 +3,15 @@ package com.freemud.sdk.api.assortment.shoppingcart.service.impl;
import ch.qos.logback.classic.Level;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.redis.RedisCache;
import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare;
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.LogThreadLocal;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CartResponseConstant;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
import com.freemud.sdk.api.assortment.shoppingcart.constant.MealClearOperationEnum;
import com.freemud.sdk.api.assortment.shoppingcart.constant.RedisKeyConstant;
import com.freemud.sdk.api.assortment.shoppingcart.constant.VersionUtils;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartAddItem;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto;
import com.freemud.sdk.api.assortment.shoppingcart.exception.ServiceException;
import com.freemud.sdk.api.assortment.shoppingcart.request.CheckCartRequest;
import com.freemud.sdk.api.assortment.shoppingcart.service.ShoppingCartBaseService;
import com.freemud.sdk.api.assortment.shoppingcart.util.CartResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -23,13 +19,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -115,8 +108,16 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
@Override
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;
}
}
@Override
public String getCouponAppId() {
......@@ -130,13 +131,38 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
@Override
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;
}
}
@Override
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;
}
}
/**
* 获取当前购物车版本
......@@ -255,6 +281,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
* @param partnerId
* @param storeId
......@@ -277,6 +329,20 @@ public class CollageCartBaseServiceImpl implements ShoppingCartBaseService {
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;
}
......
......@@ -14,12 +14,16 @@ package cn.freemud.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ResponseResult;
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.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import io.swagger.annotations.Api;
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.validation.annotation.Validated;
......@@ -42,4 +46,40 @@ public class ShoppingCartCollageController {
public BaseResponse addGoods(@Validated @LogParams @RequestBody AddShoppingCartGoodsRequestVo 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);
}
}
......@@ -31,4 +31,9 @@ public class ShoppingCartClearRequestVo extends BaseRequestVo {
private Integer operationType;
private String tableNumber;
/**
* 拼单发起人userId(拼单)
*/
private String createCollageUserId;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: ShoppingCartClearRequestVo
* @Package cn.freemud.entities.vo
* @Description:
* @author: ping.wu
* @date: 2018/5/22 11:16
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.vo;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class ShoppingCartCollageClearRequestVo extends BaseRequestVo {
@NotEmpty(message = "sessionId不能为空")
private String sessionId;
private String version;
/**
* 购物车版本号(围餐,拼单)
*/
private Integer carVer;
/**
* 拼单发起人userId(拼单)
*/
private String createCollageUserId;
@NotEmpty(message = "appId不能为空")
private String appId;
/**
* 是否为结算页
* 1:结算页 0:点餐页
* 结算页会查询用户优惠券,点餐页不会查询用户优惠券
*/
private Integer flag;
/**
* 优惠券code
*/
private String couponCode;
/**
* 优惠券对应的活动号
*/
private String activityCode;
/**
* 到店类型 orderType 传1的时候 如果reachStoreTyp为空转成订单类型4 如果不为空存储4(打包带走)和5(店内就餐)
*/
private Integer reachStoreType;
/**
* 加价购商品
*/
private List<ShoppingCartInfoRequestVo.SendGoods> sendGoods;
/**
* 是否使用用户积分
* 1=不显示积分
* 2=显示积分但不扣减
* 3=显示积分且扣减
*/
private Integer useCustomerScore;
/**
* svc 卡支付使用
*/
private String cardCode;
/**
* 收货地址ID、svc卡支付外卖订单必传
*/
private String receiveId;
/**
* 会员卡信息
*/
private ShoppingCartInfoRequestVo.BuyMemberCard buyMemberCard;
/**
* 业务类型: 0 : 自提 1:外卖 2:微商城
*/
private String menuType ;
@Data
public final static class SendGoods {
/**
* 商品Id
*/
@NotNull
private String goodsId;
private Long originalPrice;
/**
* 商品数量
*/
@NotNull
private Integer qty;
}
@Data
public final static class BuyMemberCard {
/**
* 付费会员卡ID
*/
private String paidId;
/**
* 规则ID
*/
private String ruleId;
}
}
\ No newline at end of file
......@@ -32,10 +32,15 @@ public class ShoppingCartInfoRequestVo extends BaseRequestVo {
private String version;
/**
* 购物车版本号(围餐)
* 购物车版本号(围餐,拼单
*/
private Integer carVer;
/**
* 拼单发起人userId(拼单)
*/
private String createCollageUserId;
@NotEmpty(message = "appId不能为空")
private String appId;
/**
......
......@@ -32,6 +32,11 @@ public class UpdateShoppingCartGoodsQtyRequestVo extends BaseRequestVo {
private String cartGoodsUid;
/**
* 拼单发起人userId(拼单)
*/
private String createCollageUserId;
/**
* 更新后商品数量
*/
@NotNull(message = "qty不能为空")
......@@ -39,7 +44,7 @@ public class UpdateShoppingCartGoodsQtyRequestVo extends BaseRequestVo {
private String version;
/**
* 购物车版本号(围餐)
* 购物车版本号(围餐、拼单
*/
private Integer carVer;
......
package cn.freemud.factory;
import cn.freemud.adapter.ActivityAdapter;
import cn.freemud.adapter.ShoppingCartConvertAdapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.ShoppingCartConstant;
......@@ -14,6 +15,7 @@ import cn.freemud.interceptor.BizServiceException;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.ActivityService;
import cn.freemud.service.BuriedPointService;
import cn.freemud.service.ItemService;
import cn.freemud.service.ShoppingCartNewService;
import cn.freemud.service.impl.*;
import cn.freemud.service.thirdparty.CustomerApplicationClient;
......@@ -88,6 +90,9 @@ public abstract class AbstractShoppingCartImpl implements ShoppingCartNewService
@Autowired
private BuriedPointService buriedPointService;
@Autowired
private ItemService itemService;
// 配送费逻辑是否使用旧的
@Value("${store.delivery.use.old:true}")
private boolean storeDeliveryUseOld;
......@@ -582,4 +587,83 @@ public abstract class AbstractShoppingCartImpl implements ShoppingCartNewService
buriedPointService.buriedPointAddShoppingCart(productVos, shoppingCartRequestDto);
}
/**
* 检查购物车商品库存数量
*
* @param updateShoppingCartGoodsQtyRequestVo
* @param cartGoods
*/
public void checkUpdateStock(UpdateShoppingCartGoodsQtyRequestVo updateShoppingCartGoodsQtyRequestVo, CartGoods cartGoods) {
Integer qty = updateShoppingCartGoodsQtyRequestVo.getQty();
// 购物车商品数量减少
if (cartGoods.getQty() > qty) {
return;
}
String partnerId = updateShoppingCartGoodsQtyRequestVo.getPartnerId();
String storeId = updateShoppingCartGoodsQtyRequestVo.getShopId();
//查询商品信息
List<String> pids = new ArrayList<>();
pids.add(cartGoods.getGoodsId());
Map<String, GetProductsVo> products = itemService.getProducts(pids, partnerId, storeId, BusinessTypeEnum.getByType(updateShoppingCartGoodsQtyRequestVo.getMenuType()).getCode());
GetProductsVo getProductsVo = products.get(cartGoods.getGoodsId());
// 商品没有库存限制
if (getProductsVo == null || getProductsVo.getStockLimit() != 1) {
return;
}
ShoppingCartConvertAdapter.setClassification(cartGoods, getProductsVo);
GetProductStockRequestDto requestDto = new GetProductStockRequestDto();
requestDto.setChannel(BusinessTypeEnum.getByType(updateShoppingCartGoodsQtyRequestVo.getMenuType()).getCode());
requestDto.setPartnerId(partnerId);
requestDto.setStoreId(storeId);
requestDto.setProductIds(Collections.singletonList(Long.parseLong(cartGoods.getGoodsId())));
GetProductStockResponseDto availableStocks = stockClient.getAvailableStocks(requestDto);
if ((availableStocks != null) && (ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(availableStocks.getCode()))) {
if ((CollectionUtils.isEmpty(availableStocks.getResult())) || (availableStocks.getResult().get(0).getQty() != null &&
qty > availableStocks.getResult().get(0).getQty())) {
Integer stock = 0;
if (!CollectionUtils.isEmpty(availableStocks.getResult()) && (stock = availableStocks.getResult().get(0).getQty()) > 0) {
throw new BizServiceException(ResponseResult.SHOPPING_CART_STOCK_NOT_HAVE, "仅剩" + stock + "件库存了");
}
throw new ServiceException(ResponseResult.SHOPPING_CART_STOCK_NOT_HAVE);
}
}
}
/**
* 在原价、现价、折扣价上增加第一次使用会员卡的费用
*
* @param shoppingCartInfoRequestVo
* @param shoppingCartGoodsResponseVo
*/
public void addNeedCardAmount(ShoppingCartInfoRequestVo shoppingCartInfoRequestVo, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo) {
ShoppingCartInfoRequestVo.BuyMemberCard buyMemberCard = shoppingCartInfoRequestVo.getBuyMemberCard();
if (shoppingCartInfoRequestVo.getBuyMemberCard() == null || StringUtils.isEmpty(buyMemberCard.getPaidId()) || StringUtils.isEmpty(buyMemberCard.getRuleId())) {
return;
}
GetPaidRuleRequestDto getPaidRuleRequestDto = new GetPaidRuleRequestDto();
getPaidRuleRequestDto.setPartnerId(shoppingCartInfoRequestVo.getPartnerId());
getPaidRuleRequestDto.setPaidId(buyMemberCard.getPaidId());
getPaidRuleRequestDto.setRuleId(buyMemberCard.getRuleId());
BaseResponse<GetPaidRuleResponseDto> baseResponse = customerApplicationClient.getPaidRule(getPaidRuleRequestDto);
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode()) || baseResponse.getResult() == null
|| baseResponse.getResult().getActivityPrice() == null) {
return;
}
// 购买会员卡的金额
Integer activityPrice = baseResponse.getResult().getActivityPrice();
// 首次使用会员卡享受的折扣金额
Integer firstCouponAmount = baseResponse.getResult().getFirstCouponAmount() == null ? 0 : baseResponse.getResult().getFirstCouponAmount();
Long originalTotalAmount = shoppingCartGoodsResponseVo.getOriginalTotalAmount() + activityPrice;
Long totalAmount = shoppingCartGoodsResponseVo.getTotalAmount() + (activityPrice - firstCouponAmount);
Long totalDiscountAmount = shoppingCartGoodsResponseVo.getTotalDiscountAmount() + firstCouponAmount;
shoppingCartGoodsResponseVo.setOriginalTotalAmount(originalTotalAmount);
shoppingCartGoodsResponseVo.setTotalAmount(totalAmount);
shoppingCartGoodsResponseVo.setTotalDiscountAmount(totalDiscountAmount);
shoppingCartGoodsResponseVo.setCardOriginalAmount(activityPrice);
shoppingCartGoodsResponseVo.setCardDiscountAmount(firstCouponAmount);
}
}
package cn.freemud.service;
import cn.freemud.adapter.ActivityAdapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.constant.ShoppingCartConstant;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.activity.ActivityQueryDto;
import cn.freemud.entities.dto.activity.ActivityQueryResponseDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ActivityTypeEnum;
import cn.freemud.enums.GoodsTypeEnum;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException;
import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare;
import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title:
* @Package cn.freemud.service
* @Description:
* @author: pengfei.liu
* @date: 2020/9/28
* @Copyright: 2020 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
public interface ShoppingCartCollageService {
/**
* 清空用户自己的购物车
*
* @param request
* @return
*/
BaseResponse clearPartCarGoods(ShoppingCartCollageClearRequestVo request);
}
......@@ -54,6 +54,7 @@ public class AssortmentSdkService {
com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto cartParamDto = getCartParamDto(partnerId, storeId, userId);
cartParamDto.setCartGoodsUid(cartGoodsUid);
cartParamDto.setTableNumber(tableNumber);
cartParamDto.setUserId(userId);
BaseResponse<com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods> baseResponse = shoppingCartService.getCartGoods(cartParamDto, LogThreadLocal.getTrackingNo());
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode()) || baseResponse.getResult() == null) {
ErrorLog.printLog(SDKCommonBaseContextWare.getAppName(), LogThreadLocal.getTrackingNo(), getClass(), "getCartGoods:" + JSONObject.toJSONString(baseResponse), cartParamDto, Level.ERROR);
......@@ -78,6 +79,7 @@ public class AssortmentSdkService {
cartParamDto.setCartGoodsUid(cartGoodsUid);
cartParamDto.setQty(qty);
cartParamDto.setTableNumber(tableNumber);
cartParamDto.setUserId(userId);
BaseResponse<List<com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoods>> baseResponse = shoppingCartService.updateGoodsQty(cartParamDto, LogThreadLocal.getTrackingNo());
if (baseResponse == null || !ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
return null;
......@@ -98,6 +100,7 @@ public class AssortmentSdkService {
com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto cartParamDto = getCartParamDto(partnerId, storeId, useId);
cartParamDto.setSessionId(sessionId);
cartParamDto.setTableNumber(tableNumber);
cartParamDto.setUserId(useId);
// 根据不同点餐类型获取不同购物车实例
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())) {
......@@ -119,6 +122,7 @@ public class AssortmentSdkService {
com.freemud.sdk.api.assortment.shoppingcart.domain.CartParamDto cartParamDto = getCartParamDto(partnerId, storeId, useId);
cartParamDto.setSessionId(sessionId);
cartParamDto.setTableNumber(tableNumber);
cartParamDto.setUserId(useId);
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())) {
......
package cn.freemud.service.impl;
import cn.freemud.adapter.ActivityAdapter;
import cn.freemud.adapter.CouponAdapter;
import cn.freemud.adapter.ShoppingCartConvertAdapter;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.constant.ResponseCodeConstant;
......@@ -11,12 +12,14 @@ import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.dto.user.GetSessionUserInfoDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ActivityChannelEnum;
import cn.freemud.enums.OperationTypeEnum;
import cn.freemud.enums.ResponseResult;
import cn.freemud.factory.AbstractShoppingCartImpl;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.CommonService;
import cn.freemud.service.CouponService;
import cn.freemud.service.ShoppingCartCollageService;
import cn.freemud.service.ShoppingCartNewService;
import cn.freemud.service.thirdparty.ActivityClient;
import cn.freemud.service.thirdparty.CustomerApplicationClient;
......@@ -38,6 +41,7 @@ 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.ShoppingCartBaseServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -60,7 +64,7 @@ import java.util.stream.Collectors;
*/
@Service
public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl implements ShoppingCartNewService {
public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl implements ShoppingCartNewService, ShoppingCartCollageService {
@Autowired
private AssortmentSdkService assortmentSdkService;
......@@ -86,6 +90,9 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Autowired
private ActivityClient activityClient;
@Autowired
private CouponAdapter couponAdapter;
@Override
public BaseResponse addGoodsByCard(AddGoodsByWeixinCardRequestVo request) {
return null;
......@@ -106,6 +113,7 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
UserLoginInfoDto userLoginInfoDto = convert2UserLoginInfoDto(currentUserInfoVo);
String currentUserId = currentUserInfoVo.getMemberId();
String currentSessionId = addShoppingCartGoodsRequestVo.getSessionId();
String partnerId = addShoppingCartGoodsRequestVo.getPartnerId();
String storeId = addShoppingCartGoodsRequestVo.getShopId();
String appId = addShoppingCartGoodsRequestVo.getAppId();
......@@ -119,10 +127,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
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.setSessionId(addShoppingCartGoodsRequestVo.getSessionId());
cartGoods.setSessionId(currentSessionId);
cartGoods.setUserId(currentUserId);
List<Long> productIds = new ArrayList<>();
......@@ -132,13 +140,13 @@ 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);
dolock(partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getCarVer());
List<CartGoods> allCartGoodsList = null;
String productName = null;
try {
//缓存中获取购物车商品信息
allCartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, crateUserId, addShoppingCartGoodsRequestVo.getSessionId(), null, collageCartBaseService);
allCartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, crateUserId, currentSessionId, null, collageCartBaseService);
if (CollectionUtils.isEmpty(allCartGoodsList)) {
allCartGoodsList = new ArrayList<>();
}
......@@ -152,8 +160,8 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
List<CartGoods> cartGoodsRedisList= addNotProductCouponGoods(addShoppingCartGoodsRequestVo, cartGoods, goodsId, crateUserId, shoppingCartGoodsResponseVo, allCartGoodsList);
// 更新拼单购物车人员缓存中的的购物车行id集合
List<String> cartGoodsUids = cartGoodsRedisList.stream().map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,addShoppingCartGoodsRequestVo.getSessionId());
List<String> cartGoodsUids = cartGoodsRedisList.stream().filter(cartGoods1 -> currentSessionId.equals(cartGoods1.getSessionId())).map(CartGoods::getCartGoodsUid).collect(Collectors.toList());
collageCartBaseService.updateCollageCartGoodsUids(cartGoodsUids,partnerId, storeId, crateUserId,currentSessionId);
// 当商品数量被设为0时
if (Objects.equals(cartGoods.getQty(), 0)) {
......@@ -194,12 +202,194 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Override
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
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
......@@ -209,7 +399,29 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
@Override
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
......@@ -379,22 +591,25 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
* @param partnerId
* @param storeId
* @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不能为空
if (StringUtils.isEmpty(addShoppingCartGoodsRequestVo.getShopId())){
if (StringUtils.isEmpty(shopId)){
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);
}
// 拼单发起人id不能为空
// 拼单购物相关的redis的key都需要拼单发起人id,所以这个值是不能为空的
if (StringUtils.isEmpty(addShoppingCartGoodsRequestVo.getCreateCollageUserId())){
if (StringUtils.isEmpty(createCollageUserId)){
throw new ServiceException(ResponseResult.COLLAGE_NOT_EXIST);
}
......@@ -415,14 +630,14 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
// 判单拼单的点餐位是否存在
// 发起拼单、加入拼单,都会给用户创建点餐位,用来存储用户的购物车行id
// 并设置其相应的购物车行id为空集合,没有点餐位,则认为该用户是没有加入拼单
List<String> cartGoodsUids = collageCartBaseService.getCollageMemberHashKey(partnerId, storeId,crateUserId ,addShoppingCartGoodsRequestVo.getSessionId());
List<String> cartGoodsUids = collageCartBaseService.getCollageMemberHashKey(partnerId, storeId,crateUserId ,currentSessionId);
if(cartGoodsUids == null){
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){
throw new ServiceException(ResponseResult.COLLAGE_ALREADY_CHOOSE);
}
......@@ -434,11 +649,10 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
* @param partnerId
* @param storeId
* @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) {
throw new ServiceException(ResponseResult.SHOPPING_CART_VERSION_ERROR);
}
......@@ -574,4 +788,93 @@ public class ShoppingCartCollageServiceImpl extends AbstractShoppingCartImpl imp
}
}
@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