Commit 3ce75ce1 by 周晓航

购物车新增 加价购支持虚拟商品 开发

Signed-off-by: 周晓航 <xiaohang.zhou@freemud.com>
parent 2d663d44
...@@ -150,6 +150,8 @@ public class ActivityAdapter { ...@@ -150,6 +150,8 @@ public class ActivityAdapter {
product.setOriginalPrice(sendGoods.getOriginalPrice()); product.setOriginalPrice(sendGoods.getOriginalPrice());
product.setNowPrice(sendGoods.getNowPrice()); product.setNowPrice(sendGoods.getNowPrice());
product.setNumber(sendGoods.getSendNumber()); product.setNumber(sendGoods.getSendNumber());
// 设置商品原始属性, 本次需求 为了得到虚拟商品类型 进行参数组装
product.setProductType(sendGoods.getProductType());
products.add(product); products.add(product);
}); });
break; break;
...@@ -293,57 +295,8 @@ public class ActivityAdapter { ...@@ -293,57 +295,8 @@ public class ActivityAdapter {
public PremiumExchangeResponseVo convert2PremiumExchangeSharing(ActivityCalculationDiscountResponseDto.CalculationDiscountResult discountResult) { public PremiumExchangeResponseVo convert2PremiumExchangeSharing(ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult) {
// 返回构造对象 return this.convert2PremiumExchange(calculationDiscountResult);
PremiumExchangeResponseVo premiumExchangeResponseVo = new PremiumExchangeResponseVo();
// 组装验证商品对象
List<PremiumExchangeResponseVo.PremiumExchangeProduct> products = new ArrayList<>();
premiumExchangeResponseVo.setResultCode(ActivityResultCodeEnum.NON_PARTICIPATE.getCode());
if (discountResult == null) {
return premiumExchangeResponseVo;
}
// 只取最新活动
if (discountResult != null && CollectionUtils.isNotEmpty(discountResult.getSendGoods())) {
if (CollectionUtils.isNotEmpty(discountResult.getDiscounts())) {
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Discount> discountList = discountResult.getDiscounts();
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.Discount discount : discountList) {
if (Objects.equals(discount.getType(), ActivityTypeEnum.TYPE_81.getCode())) {
Integer showType = discount.getIntegral() == null ? 0 : discount.getIntegral();
premiumExchangeResponseVo.setShowType(showType);
}
}
}
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.SendActivity sendActivity : discountResult.getSendGoods()) {
if (Objects.equals(sendActivity.getActivityType(), ActivityTypeEnum.TYPE_81.getCode())) {
// 判断加价购活动商品不存在直接跳出循环
if (CollectionUtils.isEmpty(sendActivity.getSendGoods())) {
break;
}
premiumExchangeResponseVo.setResultCode(ActivityResultCodeEnum.PARTICIPATE.getCode());
premiumExchangeResponseVo.setActivityCode(sendActivity.getActivityCode());
premiumExchangeResponseVo.setActivityName(sendActivity.getActivityName());
premiumExchangeResponseVo.setMaxNum(sendActivity.getMaxNum());
sendActivity.getSendGoods().forEach(sendGoods -> {
PremiumExchangeResponseVo.PremiumExchangeProduct product = new PremiumExchangeResponseVo.PremiumExchangeProduct();
product.setSpuId(sendGoods.getCategory());
product.setSkuId(sendGoods.getGoodsId());
product.setSkuName(sendGoods.getGoodsName());
product.setOriginalPrice(sendGoods.getOriginalPrice());
product.setNowPrice(sendGoods.getNowPrice());
product.setNumber(sendGoods.getSendNumber());
products.add(product);
});
break;
}
}
}
if(CollectionUtils.isEmpty(products)){
premiumExchangeResponseVo.setResultCode(ActivityResultCodeEnum.NO_ACTIVITY.getCode());
premiumExchangeResponseVo.setResultMsg(ActivityResultCodeEnum.NO_ACTIVITY.getDesc());
return premiumExchangeResponseVo;
}
premiumExchangeResponseVo.setProducts(products);
return premiumExchangeResponseVo;
} }
public CouponAvailableCartInfo convert2CouponAvailableCartInfoSharing(String partnerId, String storeId, ActivityCalculationDiscountResponseDto.CalculationDiscountResult discountResult, List<String> orgCodes) { public CouponAvailableCartInfo convert2CouponAvailableCartInfoSharing(String partnerId, String storeId, ActivityCalculationDiscountResponseDto.CalculationDiscountResult discountResult, List<String> orgCodes) {
......
...@@ -34,11 +34,13 @@ public class ValidateProductInfosDto { ...@@ -34,11 +34,13 @@ public class ValidateProductInfosDto {
private List<ProductData> failureList; private List<ProductData> failureList;
private List<ProductData> successList; private List<ProductData> successList;
} }
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public static class ProductData { public static class ProductData {
private ProductBean productType; private ProductBean productType;
} }
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public static class ProductBean { public static class ProductBean {
...@@ -118,15 +120,31 @@ public class ValidateProductInfosDto { ...@@ -118,15 +120,31 @@ public class ValidateProductInfosDto {
*/ */
private List<SellTime> sellTimeList; private List<SellTime> sellTimeList;
/**
* 虚拟商品 绑定的券信息
*/
private List<BindingCouponType> productBindingCouponTypes;
@Data @Data
public static class SellTime{ @NoArgsConstructor
public static class BindingCouponType {
private String activityCode;
private String cardId;
private Integer num;
private String virtualCouponCode;
}
@Data
public static class SellTime {
private Integer dateStatus; private Integer dateStatus;
private String startTime; private String startTime;
private String endTime; private String endTime;
} }
private List<SellTimeMonth> sellTimeMonthList; private List<SellTimeMonth> sellTimeMonthList;
@Data @Data
public static class SellTimeMonth{ public static class SellTimeMonth {
private Integer dayOfMonth; private Integer dayOfMonth;
private String endTime; private String endTime;
private String startTime; private String startTime;
...@@ -148,7 +166,7 @@ public class ValidateProductInfosDto { ...@@ -148,7 +166,7 @@ public class ValidateProductInfosDto {
private Integer stockLimit; private Integer stockLimit;
private Integer stockQty; private Integer stockQty;
//sku商品包装费 1.5.4新加 //sku商品包装费 1.5.4新加
private Long packPrice ; private Long packPrice;
private List<SkuSpecValue> skuSpecValues; private List<SkuSpecValue> skuSpecValues;
@NoArgsConstructor @NoArgsConstructor
...@@ -261,6 +279,7 @@ public class ValidateProductInfosDto { ...@@ -261,6 +279,7 @@ public class ValidateProductInfosDto {
private String type; private String type;
private String url; private String url;
} }
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public static class ProductComboListBean { public static class ProductComboListBean {
......
...@@ -524,6 +524,11 @@ public class ActivityCalculationDiscountResponseDto { ...@@ -524,6 +524,11 @@ public class ActivityCalculationDiscountResponseDto {
* 是否已选择寄杯 * 是否已选择寄杯
*/ */
private Boolean sendCoupon; private Boolean sendCoupon;
/**
* 商品类型:2、是加料商品,9、是虚拟商品,7、是套餐商品,1、是单品
*/
private Integer productType;
} }
} }
......
...@@ -20,12 +20,19 @@ import lombok.NoArgsConstructor; ...@@ -20,12 +20,19 @@ import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@Data @Data
public class CartGoods { public class CartGoods {
/**
* 如果加价购是虚拟券商品 这个集合会有券商品赠送的券信息
*/
private List<CouponMsg> couponData = new ArrayList<>();
/** /**
* 购物车一行的Id(后台生成) * 购物车一行的Id(后台生成)
*/ */
...@@ -704,5 +711,6 @@ public class CartGoods { ...@@ -704,5 +711,6 @@ public class CartGoods {
* 该字段,保持和商品服务的商品类型一致 * 该字段,保持和商品服务的商品类型一致
*/ */
private Integer originalProductType; private Integer originalProductType;
} }
} }
package cn.freemud.entities.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/10/23 下午2:34
* @description :
*/
@Data
public class CouponMsg {
/**
* 券名称
*/
@ApiModelProperty(value = "券名称")
private String name;
/**
* 券code
*/
@ApiModelProperty(value = "券code")
private String activityCode;
/**
* 券数量
*/
private Integer num;
}
...@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; ...@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
...@@ -247,6 +248,13 @@ public class PremiumExchangeResponseVo { ...@@ -247,6 +248,13 @@ public class PremiumExchangeResponseVo {
@ApiModelProperty(value = "活动商品描述") @ApiModelProperty(value = "活动商品描述")
private String goodsDesc; private String goodsDesc;
/**
* 如果加价购是虚拟券商品 这个集合会有券商品赠送的券信息
*/
private List<CouponMsg> couponData = new ArrayList<>();
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public static class ProductLabel { public static class ProductLabel {
......
...@@ -163,6 +163,11 @@ public class ShoppingCartInfoRequestVo extends BaseRequestVo { ...@@ -163,6 +163,11 @@ public class ShoppingCartInfoRequestVo extends BaseRequestVo {
private String activityCode; private String activityCode;
private List<Attribute> attributes; private List<Attribute> attributes;
/**
* 加价购 可能会涉及 虚拟商品 类型 = 9
*/
private Integer productType;
} }
@Data @Data
......
package cn.freemud.handle;
import cn.freemud.entities.dto.ValidateProductInfosDto;
import cn.freemud.entities.vo.CouponMsg;
import cn.freemud.entities.vo.PremiumExchangeResponseVo;
import cn.freemud.enums.ResponseResult;
import cn.freemud.redis.RedisCache;
import cn.freemud.utils.ResponseUtil;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare;
import com.freemud.application.sdk.api.couponcenter.online.domain.ActiveDetailVO;
import com.freemud.application.sdk.api.couponcenter.online.domain.AppKeyVO;
import com.freemud.application.sdk.api.couponcenter.online.request.ActiveBatchQueryRequest;
import com.freemud.application.sdk.api.couponcenter.online.request.PartnerRequest;
import com.freemud.application.sdk.api.couponcenter.online.service.FMActiveSdkService;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/10/22 下午7:54
* @description :
*/
@Component
public class GetActivityMsgHandle {
@Value("${coupon.app.id}")
private String appId;
/**
* fisherman 获取 虚拟商品 券数据
*
* @param productBindingCoupons
* @param partnerId
* @return
*/
public List<CouponMsg> getCouponData(List<ValidateProductInfosDto.ProductBean.BindingCouponType> productBindingCoupons, String partnerId) {
List<CouponMsg> retList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(productBindingCoupons)) {
// 处理 券数据 这里链路有问题 效率有点低, 后续需要优化
List<String> activityCodes = productBindingCoupons.stream()
.map(ValidateProductInfosDto.ProductBean.BindingCouponType::getActivityCode)
.collect(Collectors.toList());
List<ActiveDetailVO> activeDetailVOS = this.batchQueryActivityInfo(activityCodes, partnerId);
if (CollectionUtils.isNotEmpty(activeDetailVOS)) {
// 设置 券名称 数量
Map<String, ActiveDetailVO> collect = activeDetailVOS.stream().collect(Collectors.toMap(ActiveDetailVO::getActiveCode, a -> a, (k1, k2) -> k1));
productBindingCoupons.forEach(coupon -> {
CouponMsg msg = new CouponMsg();
ActiveDetailVO activeDetailVO = collect.get(coupon.getActivityCode());
msg.setActivityCode(coupon.getActivityCode());
msg.setNum(coupon.getNum());
msg.setName(activeDetailVO.getActiveName());
});
}
}
return retList;
}
private List<ActiveDetailVO> batchQueryActivityInfo(List<String> activityCodes, String partnerId) {
String trackingNo = LogThreadLocal.getTrackingNo();
String appKey = this.getAppKey(partnerId, trackingNo);
if (StringUtils.isEmpty(appKey)) {
return null;
}
ActiveBatchQueryRequest activeBatchQueryRequest = new ActiveBatchQueryRequest();
//去重
List<String> activeCodes = new ArrayList<>(new HashSet(activityCodes));
activeBatchQueryRequest.setActiveCode(activeCodes);
activeBatchQueryRequest.setAppSecret(appKey);
activeBatchQueryRequest.setPartnerId(Integer.parseInt(partnerId));
FMActiveSdkService fmActiveSdkService = SDKCommonBaseContextWare.getBean(FMActiveSdkService.class);
BaseResponse<List<ActiveDetailVO>> batchQueryResponse = fmActiveSdkService.batchQueryActivityInfo(activeBatchQueryRequest, trackingNo);
if (batchQueryResponse == null
|| !ResponseResult.SUCCESS.getCode().equals(batchQueryResponse.getCode())
|| CollectionUtils.isEmpty(batchQueryResponse.getData())) {
return null;
}
return batchQueryResponse.getData();
}
private String getAppKey(String partnerId, String trackingNo) {
RedisCache redisCache = SDKCommonBaseContextWare.getBean(RedisCache.class);
String key = "kgd:coupon:appKey:partner:";
String appKey = redisCache.getValue(key + partnerId);
if (StringUtils.isEmpty(appKey)) {
PartnerRequest partnerRequest = new PartnerRequest();
partnerRequest.setPartnerId(Integer.parseInt(partnerId));
partnerRequest.setAppId(appId);
FMActiveSdkService fmActiveSdkService = SDKCommonBaseContextWare.getBean(FMActiveSdkService.class);
com.freemud.application.sdk.api.base.BaseResponse<AppKeyVO> appKeyVOBaseResponse = fmActiveSdkService.getAppKey(partnerRequest, trackingNo);
if (appKeyVOBaseResponse == null || !"100".equals(appKeyVOBaseResponse.getCode())
|| appKeyVOBaseResponse.getData() == null || StringUtils.isEmpty(appKeyVOBaseResponse.getData().getAppKey())) {
return null;
}
appKey = appKeyVOBaseResponse.getData().getAppKey();
redisCache.save(key + partnerId, appKey);
}
return appKey;
}
}
...@@ -41,6 +41,7 @@ import cn.freemud.entities.vo.coupon.CouponAvailableCartInfo; ...@@ -41,6 +41,7 @@ import cn.freemud.entities.vo.coupon.CouponAvailableCartInfo;
import cn.freemud.entities.vo.coupon.CouponAvailableRequestVo; import cn.freemud.entities.vo.coupon.CouponAvailableRequestVo;
import cn.freemud.enums.*; import cn.freemud.enums.*;
import cn.freemud.handle.CommonFunctionHandle; import cn.freemud.handle.CommonFunctionHandle;
import cn.freemud.handle.GetActivityMsgHandle;
import cn.freemud.interceptor.BizServiceException; import cn.freemud.interceptor.BizServiceException;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
...@@ -68,6 +69,7 @@ import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddress ...@@ -68,6 +69,7 @@ import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddress
import com.freemud.application.sdk.api.membercenter.response.StatisticalScoreResponse; import com.freemud.application.sdk.api.membercenter.response.StatisticalScoreResponse;
import com.freemud.application.sdk.api.membercenter.service.MemberCenterService; import com.freemud.application.sdk.api.membercenter.service.MemberCenterService;
import com.freemud.application.sdk.api.membercenter.service.MemberPropertyService; import com.freemud.application.sdk.api.membercenter.service.MemberPropertyService;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO; import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest; import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse; import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
...@@ -77,7 +79,6 @@ import com.freemud.sdk.api.assortment.shoppingcart.enums.BusinessTypeEnum; ...@@ -77,7 +79,6 @@ import com.freemud.sdk.api.assortment.shoppingcart.enums.BusinessTypeEnum;
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.ShoppingCartBaseService; import com.freemud.sdk.api.assortment.shoppingcart.service.ShoppingCartBaseService;
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl; import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl;
import com.freemud.sdk.api.assortment.shoppingcart.util.ShoppingSdkLogUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import javafx.util.Pair; import javafx.util.Pair;
import ma.glasnost.orika.MapperFacade; import ma.glasnost.orika.MapperFacade;
...@@ -209,6 +210,9 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService { ...@@ -209,6 +210,9 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
@Autowired @Autowired
private CommonFunctionHandle commonFunctionHandle; private CommonFunctionHandle commonFunctionHandle;
@Autowired
private GetActivityMsgHandle getActivityMsgHandle;
/** /**
* 从微信卡券向购物车中添加商品 * 从微信卡券向购物车中添加商品
*/ */
...@@ -906,11 +910,15 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService { ...@@ -906,11 +910,15 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
cartGoods.setOriginalAmount(good.getOriginalPrice()); cartGoods.setOriginalAmount(good.getOriginalPrice());
cartGoods.setAmount(good.getNowPrice()); cartGoods.setAmount(good.getNowPrice());
cartGoods.setPhotoUrl(good.getPicture()); cartGoods.setPhotoUrl(good.getPicture());
// fisherman 设置虚拟券商品 属性
cartGoods.setGoodsType(good.getProductType());
cartGoods.setOriginalProductType(good.getProductType());
cartGoods.setGoodsId(good.getPid()); cartGoods.setGoodsId(good.getPid());
cartGoods.setName(good.getName()); cartGoods.setName(good.getName());
cartGoods.setSpuName(good.getSpuName()); cartGoods.setSpuName(good.getSpuName());
cartGoods.setQty(first == null ? 1 : first.getQty()); cartGoods.setQty(first.getQty());
cartGoods.setActivityCode(first.getActivityCode()); cartGoods.setActivityCode(first.getActivityCode());
cartGoods.setCouponData(good.getCouponData());
if (!CollectionUtils.isEmpty(first.getAttributes())) { if (!CollectionUtils.isEmpty(first.getAttributes())) {
List<CartGoods.CartGoodsExtra> extra = new ArrayList(); List<CartGoods.CartGoodsExtra> extra = new ArrayList();
first.getAttributes().forEach(attribute -> { first.getAttributes().forEach(attribute -> {
...@@ -3153,6 +3161,11 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService { ...@@ -3153,6 +3161,11 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
result.setOriginalPrice(productBean.getFinalPrice()); result.setOriginalPrice(productBean.getFinalPrice());
result.setNumber(premiumExchangeProduct.getNumber()); result.setNumber(premiumExchangeProduct.getNumber());
result.setArtNo(premiumExchangeProduct.getArtNo()); result.setArtNo(premiumExchangeProduct.getArtNo());
result.setProductType(premiumExchangeProduct.getProductType());
// fisherman 处理虚拟商品的 券名称获取
if (premiumExchangeProduct.getProductType().compareTo(ProductTypeEnum.VIRTUAL_PRODUCT.getCode()) == 0) {
result.setCouponData(getActivityMsgHandle.getCouponData(productBean.getProductBindingCouponTypes(), partnerId));
}
productResults.add(result); productResults.add(result);
} }
} }
...@@ -3165,6 +3178,7 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService { ...@@ -3165,6 +3178,7 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
return ResponseUtil.success(premiumExchangeResponseVo); return ResponseUtil.success(premiumExchangeResponseVo);
} }
private void removeByProductStock(List<PremiumExchangeResponseVo.PremiumExchangeProduct> products, List<ValidateProductInfosDto.ProductData> productDataList, String partnerId, String storeId, String channel) { private void removeByProductStock(List<PremiumExchangeResponseVo.PremiumExchangeProduct> products, List<ValidateProductInfosDto.ProductData> productDataList, String partnerId, String storeId, String channel) {
List<Long> limitSkuIds = new ArrayList<>(); List<Long> limitSkuIds = new ArrayList<>();
productDataList.stream().forEach(ProductData -> { productDataList.stream().forEach(ProductData -> {
......
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