Commit fbc07d05 by xiaoer.li@freemud.com

Merge remote-tracking branch 'remotes/origin/feature/促销算价基于最新master的分支' into qa

# Conflicts:
#	shopping-cart-application-service/src/main/java/cn/freemud/entities/vo/ShoppingCartGoodsResponseVo.java
#	shopping-cart-application-service/src/main/java/cn/freemud/service/impl/ShoppingCartNewServiceImpl.java
parents a82c6632 b67dfaa3
package cn.freemud.entities.dto.calculate;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Objects;
@Data
public class CalculationSharingDiscountRequestDto {
/**
* 区域
*/
private String area;
/**
* 可用渠道
*/
private String channel;
/**
* 绑定的小程序id
*/
private String appId;
/**
* i应用传isaas,快中台传fast
*/
private String application = "isaas";
/**
* 是否展示活动列表 0:默认,不展示 1:展示
*/
private Integer isShowActivities;
/**
* 是否显示商品的活动信息 0:默认,不展示 1:展示
*/
private Integer isShowGoodsActivity;
/**
* 商户
*/
private String partnerCode;
/**
* 门店
*/
private String storeId;
/**
* 门店的组织机构树
*/
private List<String> orgIds;
/**
* 用户id(有优惠券时,该字段必传)
*/
private String userId;
/**
* 版本号
*/
private Integer ver;
/**
* 优惠券集合
*/
private List<CalculationDiscountCoupon> coupons;
/**
* 商品集合
*/
private List<CalculationDiscountGoods> goods;
/**
* 已选换购活动集合
*/
private List<CalculationActivityReqVO> selectActivityList;
private Long distributionFee;
/**
* 是否是会员
*/
private Boolean isMember;
@Data
public static class CalculationDiscountCoupon {
/**
* 优惠券码
*/
private String code;
/**
* 活动号
*/
private String activityCode;
}
@Data
public static class CalculationDiscountGoods {
/**
* 商品ID
*/
private String goodsId;
/**
* 购物车行uid
*/
private String cartGoodsUid;
/**
* 商品品类
*/
private String category;
/**
* 商品数量
*/
private Integer goodsQuantity;
/**
* 原价(分)
*/
private Long originalPrice;
/**
* 折扣比例
* 例如8折为80
*/
private Integer memberDiscount;
/**
* 加料
*/
private List<Material> smallMaterial;
private String spuId;
/**
* 套餐固定商品组
*/
private List<GroupCombox> groupCombox;
/**
* 是否计算套餐
*/
private boolean meal = false;
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
CalculationDiscountGoods that = (CalculationDiscountGoods) o;
return Objects.equals(goodsId, that.goodsId) &&
Objects.equals(category, that.category) &&
Objects.equals(cartGoodsUid, that.cartGoodsUid) &&
Objects.equals(originalPrice, that.originalPrice);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), goodsId, category, originalPrice);
}
@Data
@NoArgsConstructor
/**
* 商品小料
*/
static public class Material {
/**
* 加料商品ID
*/
private String goodsId;
/**
* 加料数量
*/
private Integer goodsQuantity;
/**
* 加料单价
*/
private Long originalPrice;
/**
* 1 :小料、2:可选搭配
*/
private int type;
}
/**
* 套餐固定商品组
*/
@Data
@NoArgsConstructor
static public class GroupCombox {
/**
* 商品Id
*/
private String goodsId;
/**
* 商品数量
*/
private Integer goodsQuantity;
/**
* 商品原价
*/
private Integer originalPrice;
}
}
@Data
@NoArgsConstructor
public static class CalculationActivityReqVO {
private String activityCode;
private Integer activityType = 81;
private List<CalculationSendGoodsReqVO> sendGoods;
}
@Data
@NoArgsConstructor
public static class CalculationSendGoodsReqVO {
private String goodsId;
private Integer goodsQuantity;
private Integer originalPrice;
private Integer nowPrice;
}
}
\ No newline at end of file
...@@ -124,6 +124,7 @@ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseV ...@@ -124,6 +124,7 @@ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseV
* 配送费为零的原因:0:正常,1:超出配送范围 * 配送费为零的原因:0:正常,1:超出配送范围
*/ */
private Integer deliveryFeeZeroReason; private Integer deliveryFeeZeroReason;
private Integer version;
/** /**
* 代金券 * 代金券
......
...@@ -101,6 +101,7 @@ public class ShoppingCartInfoRequestVo extends BaseRequestVo { ...@@ -101,6 +101,7 @@ public class ShoppingCartInfoRequestVo extends BaseRequestVo {
*/ */
@NotNull @NotNull
private Integer qty; private Integer qty;
private String activityCode;
} }
@Data @Data
......
package cn.freemud.service.impl.calculate;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate CalculateCenter
* @Description: TDO 描述....
* @author: family
* @date: 2020/9/22
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class CalculateCenter {
/**
* 1 增量,2,全量
*/
private Integer type;
/**
* 商户
*/
private String partnerId;
/**
* 门店
*/
private String storeId;
/**
* 是否启用新的算价中心
*/
private Boolean enable;
}
package cn.freemud.service.impl.calculate;
import cn.freemud.constant.ShoppingCartConstant;
import cn.freemud.entities.dto.UserLoginInfoDto;
import cn.freemud.entities.dto.activity.ActivityQueryDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import cn.freemud.entities.vo.CartGoods;
import cn.freemud.entities.vo.CouponPromotionVO;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
import cn.freemud.entities.vo.ShoppingCartInfoRequestVo;
import cn.freemud.service.impl.calculate.promotion.*;
import com.freemud.sdk.api.assortment.shoppingcart.enums.BusinessTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate CalculationSharingCartService
* @Description: TDO 描述....
* @author: family
* @date: 2020/9/7
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
@Slf4j
public class CalculationSharingCartService {
@Autowired
private CouponSharingService promotionSharingService;
@Autowired
private FullSharingService fullSharingService;
@Autowired
private ScoreSharingService scoreSharingService;
@Autowired
private DeliverySharingService deliverySharingService;
@Autowired
private GiftSharingService giftSharingService;
@Autowired
private AdditionSharingService additionSharingService;
@Autowired
private CalculationCommonService calculationCommonService;
/**
* 响应购物车价格计算依赖促销
*/
public void distribute(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, List<CartGoods> cartGoodsList
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo
, UserLoginInfoDto userLoginInfoDto
, CouponPromotionVO couponPromotionVO
, ActivityQueryDto activityQueryDto
, String menuType
, Long deliveryAmount
, String opt) {
/**
* 用促销价格初始化购物车行记录成交价
*/
calculationCommonService.initShoppingCart(discountResult, cartGoodsList, shoppingCartGoodsResponseVo);
/**
* 可用券及券折扣
*/
promotionSharingService.updateShoppingCartGoodsDiscount(discountResult, cartGoodsList, shoppingCartGoodsResponseVo, couponPromotionVO);
/**
* 满减处理
*/
fullSharingService.fullResponse(discountResult,cartGoodsList,shoppingCartGoodsResponseVo,activityQueryDto);
/**
* 买赠
*/
giftSharingService.giftResponse(discountResult, cartGoodsList, shoppingCartInfoRequestVo, activityQueryDto);
/**
* 加价购
*/
additionSharingService.additionResponse(discountResult,cartGoodsList,shoppingCartGoodsResponseVo,shoppingCartInfoRequestVo);
/**
* 积分抵扣
*/
scoreSharingService.scoreResponse(discountResult, shoppingCartGoodsResponseVo, userLoginInfoDto, shoppingCartInfoRequestVo);
if (BusinessTypeEnum.SAAS_DELIVERY.getCode().equals(menuType)) {
deliverySharingService.deliveryResponse(discountResult, activityQueryDto, shoppingCartGoodsResponseVo, deliveryAmount);
}
/**
* 可选搭配的价格累加到套餐的成交价上
*/
this.combineGroupRowAmount(cartGoodsList);
/**
* 特价类型超出部分提示
*/
calculationCommonService.drawSurpassDiscountInfo(discountResult, shoppingCartGoodsResponseVo);
if (ShoppingCartConstant.ADD_AND_UPDATE.equals(opt)) {
calculationCommonService.setAddAndUpdateResponse(cartGoodsList, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo, ShoppingCartConstant.ADD_AND_UPDATE);
} else if (ShoppingCartConstant.QUERY_INFO.equals(opt)) {
calculationCommonService.setAddAndUpdateResponse(cartGoodsList, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo, ShoppingCartConstant.ADD_AND_UPDATE);
calculationCommonService.addNeedCardAmount(shoppingCartInfoRequestVo, shoppingCartGoodsResponseVo);
}
}
/**
* 初始化价格
*/
private void initShoppingCart(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, List<CartGoods> cartGoodsList
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo) {
/**
* 使用促销算价赋值行记录
*/
List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods> goods = discountResult.getGoods();
long totalOriginalAmount = 0L,totalAmount = 0L,totalPackageAmount = 0L;
long originalAmount = 0L,amount = 0L,packageAmount =0L;
for (CartGoods cartGoods : cartGoodsList) {
originalAmount = 0L;
amount = 0L;
packageAmount =0L;
CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods find = goods.stream().filter((k) -> k.getCartGoodsUid().equals(cartGoods.getCartGoodsUid())).findFirst().get();
if (find==null) continue;
//成交价行记录
amount += find.getRealAmount()*cartGoods.getQty();
cartGoods.setAmount(amount);
totalAmount += amount;
//原价行记录
originalAmount = cartGoods.getOriginalPrice() * cartGoods.getQty();
cartGoods.setOriginalAmount(originalAmount);
totalOriginalAmount += originalAmount;
//包装费行记录
packageAmount = cartGoods.getPackPrice() * cartGoods.getQty();
cartGoods.setPackPrice(packageAmount);
totalPackageAmount += packageAmount;
}
shoppingCartGoodsResponseVo.setOriginalTotalAmount(discountResult == null ? totalOriginalAmount : discountResult.getOriginalTotalAmount());
shoppingCartGoodsResponseVo.setTotalAmount(discountResult == null ? totalAmount : discountResult.getTotalAmount());
shoppingCartGoodsResponseVo.setNewPackAmount(totalPackageAmount);
shoppingCartGoodsResponseVo.setTotalDiscountAmount(discountResult == null ? 0L : discountResult.getTotalDiscountAmount());
}
/**
* 套餐\可选搭配\小料成交价
* productGroupList->可选搭配
* productComboList->固定套餐搭配
*/
public void buildCombination(CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods goods, CartGoods cartGoods) {
/*小料
if (cartGoods.getProductMaterialList().size()>0 && goods.getSmallMaterial().size()>0) {
for (CartGoods.MaterialGoods mg : cartGoods.getProductMaterialList()) {
for (CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods.SmallMaterial mt : goods.getSmallMaterial()) {
if (1==mt.getType() && mg.getSpuId().equals(mt.getGoodsId())) {
mg.setAmount(mt.getRealAmount().longValue());
break;
}
}
}
}
*/
// 将可选搭配的价格还原到主行记录
if (cartGoods.getProductGroupList().size()>0 && goods.getSmallMaterial().size()>0) {
long a = 0L;
for (CartGoods.ComboxGoods comBox : cartGoods.getProductGroupList()) {
for (CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods.SmallMaterial mt : goods.getSmallMaterial()) {
if (2==mt.getType() && comBox.getGoodsId().equals(mt.getGoodsId())) {
//mt
}
}
}
}
}
/**
* 可选搭配的成交价合并到主商品上
* @param cartGoodsList
*/
private void combineGroupRowAmount(List<CartGoods> cartGoodsList) {
if (CollectionUtils.isEmpty(cartGoodsList)) return;
for (CartGoods cartGoods : cartGoodsList) {
long row = 0L;
if (CollectionUtils.isEmpty(cartGoods.getProductGroupList())) continue;
for (CartGoods.ComboxGoods com : cartGoods.getProductGroupList()) {
row += com.getAmount();
}
cartGoods.setAmount(cartGoods.getAmount()+row);
}
}
}
package cn.freemud.service.impl.calculate;
import cn.freemud.constant.ShoppingCartConstant;
import cn.freemud.entities.dto.UserLoginInfoDto;
import cn.freemud.entities.dto.activity.ActivityDiscountsDto;
import cn.freemud.entities.dto.activity.ActivityQueryDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ActivityTypeEnum;
import cn.freemud.service.impl.calculate.promotion.GiftSharingService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate CalculationSharingEquallyService
* @Description: TDO 描述....
* @author: family
* @date: 2020/9/14
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
public class CalculationSharingEquallyService {
@Autowired
private CalculationCommonService calculationCommonService;
@Autowired
private GiftSharingService giftSharingService;
/**
* 均摊服务
* @param discountResult
* @param cartGoodsList
* @param shoppingCartGoodsResponseVo
* @param shoppingCartInfoRequestVo
* @param userLoginInfoDto
* @param couponPromotionVO
* @param activityQueryDto
* @param menuType
* @param deliveryAmount
* @param shoppingCartGoodsDto
* @param premiumExchangeActivity
*/
public void equally(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, List<CartGoods> cartGoodsList
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo
, UserLoginInfoDto userLoginInfoDto
, CouponPromotionVO couponPromotionVO
, ActivityQueryDto activityQueryDto
, String menuType
, Long deliveryAmount
, ShoppingCartGoodsDto shoppingCartGoodsDto
, CreateOrderVo.PremiumExchangeActivity premiumExchangeActivity) {
calculationCommonService.initShoppingCart(discountResult, cartGoodsList, shoppingCartGoodsResponseVo);
List<ShoppingCartGoodsDto.CartGoodsDetailDto> cartGoodsDetailDtoList = CollectionUtils.isEmpty(shoppingCartGoodsDto.getProducts()) ? new ArrayList<>() : shoppingCartGoodsDto.getProducts();
shoppingCartGoodsDto.setProducts(cartGoodsDetailDtoList);
this.setShoppingCartGoodsDtoActivityDiscounts(discountResult, shoppingCartGoodsDto);
//过滤出加价购
List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount> addMoneyDiscounts = discountResult.getDiscounts()
.stream()
.filter(discount -> ActivityTypeEnum.TYPE_81.getCode().equals(discount.getType())).collect(Collectors.toList());
if (null != discountResult) {
//处理加价购
List<SubtractStockVO> stocks = filterSendGoodsStocks(discountResult.getStocks(), shoppingCartInfoRequestVo, addMoneyDiscounts);
if (CollectionUtils.isNotEmpty(stocks)) shoppingCartGoodsDto.setStocks(stocks);
}
//总计价
shoppingCartGoodsDto.setPackageAmount(shoppingCartGoodsResponseVo.getNewPackAmount());
shoppingCartGoodsDto.setOriginalTotalAmount(shoppingCartGoodsResponseVo.getOriginalTotalAmount());
shoppingCartGoodsDto.setTotalAmount(shoppingCartGoodsResponseVo.getTotalAmount());
shoppingCartGoodsDto.setTotalDiscountAmount(shoppingCartGoodsResponseVo.getTotalDiscountAmount());
shoppingCartGoodsResponseVo.setProducts(cartGoodsList);
List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods> goods = discountResult.getGoods();
/**
* 利用促销赋值totalDiscountAmount
*/
for (CartGoods product : shoppingCartGoodsResponseVo.getProducts()) {
CalculationSharingDiscountResponseDto.CalculationDiscountResult.Goods find = goods.stream().filter((k) -> k.getCartGoodsUid().equals(product.getCartGoodsUid())).findFirst().get();
ShoppingCartGoodsDto.CartGoodsDetailDto cartGoodsDetailDto = calculationCommonService.convertCartGoods2DetailGoodsList(find, product);
cartGoodsDetailDtoList.add(cartGoodsDetailDto);
}
/**
* 赠品
*/
giftSharingService.equally(discountResult, cartGoodsDetailDtoList, activityQueryDto, menuType);
calculationCommonService.setAddAndUpdateResponse(cartGoodsList, shoppingCartGoodsResponseVo, shoppingCartInfoRequestVo, ShoppingCartConstant.QUERY_INFO);
calculationCommonService.addNeedCardAmount(shoppingCartInfoRequestVo, shoppingCartGoodsResponseVo);
}
/**
* 设置购物车整体享受的活动集合
*
* @param discountResult
* @param shoppingCartGoodsDto
*/
private void setShoppingCartGoodsDtoActivityDiscounts(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, ShoppingCartGoodsDto shoppingCartGoodsDto) {
List<ActivityDiscountsDto> activityDiscountsDtos = new ArrayList<>();
shoppingCartGoodsDto.setActivityDiscountsDtos(activityDiscountsDtos);
if (discountResult == null) return;
List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount> discounts = discountResult.getDiscounts();
for (CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount discount : discounts) {
int discountAmount = (discount.getDiscount() == null) ? 0 : discount.getDiscount();
Integer discountType = discount.getType();
if (discountType != null && discountAmount > 0) {
ActivityDiscountsDto activityDiscountsDto = new ActivityDiscountsDto();
activityDiscountsDto.setActivityCode(discount.getActivityCode());
activityDiscountsDto.setActivityName(discount.getActivityName());
activityDiscountsDto.setActivityType(discountType);
activityDiscountsDto.setDiscountAmount(0 - discountAmount);
activityDiscountsDtos.add(activityDiscountsDto);
}
}
shoppingCartGoodsDto.setActivityDiscountsDtos(activityDiscountsDtos);
}
/**
* 库存扣减加价购商品 要过滤掉没有换购的商品
*
* @param stocks 扣减库存
* @param shoppingCartInfoRequestVo 购物车请求信息
* @param addMoneyDiscounts 加价购活动
* @return 返回应该扣减的加价购商品库存
*/
private List<SubtractStockVO> filterSendGoodsStocks(List<SubtractStockVO> stocks
, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo
, List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount> addMoneyDiscounts) {
if (CollectionUtils.isEmpty(stocks) || CollectionUtils.isEmpty(addMoneyDiscounts)) {
return stocks;
}
List<SubtractStockVO> subtractStockVOs = stocks.stream().filter(subtractStockVO -> ActivityTypeEnum.TYPE_81.getCode().equals(subtractStockVO.getActivityType())).collect(Collectors.toList());
List<SubtractStockVO.SubtractStockGoodsVO> goodsStock = null;
if (CollectionUtils.isNotEmpty(subtractStockVOs)) {
SubtractStockVO subtractStockVO = subtractStockVOs.get(0);
goodsStock = subtractStockVO.getGoodsStock();
}
if (null == goodsStock) {
return stocks;
}
Map<String, SubtractStockVO.SubtractStockGoodsVO> mapSubstractStocks = new HashMap<>();
if (CollectionUtils.isNotEmpty(goodsStock)) {
mapSubstractStocks = goodsStock.stream().collect(Collectors.toMap(SubtractStockVO.SubtractStockGoodsVO::getGoodsId, Function.identity(), (k1, k2) -> k1));
}
//获取加价购商品
List<ShoppingCartInfoRequestVo.SendGoods> sendGoods = shoppingCartInfoRequestVo.getSendGoods();
if (CollectionUtils.isNotEmpty(sendGoods)) {
List<String> needSendGoodsId = sendGoods.stream().map(ShoppingCartInfoRequestVo.SendGoods::getGoodsId).collect(Collectors.toList());
goodsStock.clear();
for (String goodId : needSendGoodsId) {
SubtractStockVO.SubtractStockGoodsVO subtractStockGoodsVO = mapSubstractStocks.get(goodId);
if (null != mapSubstractStocks.get(goodId)) {
goodsStock.add(subtractStockGoodsVO);
}
}
} else {
return stocks.stream().filter(subtractStockVO -> !ActivityTypeEnum.TYPE_81.getCode().equals(subtractStockVO.getActivityType())).collect(Collectors.toList());
}
return stocks;
}
}
package cn.freemud.service.impl.calculate.promotion;
import cn.freemud.entities.dto.ActivityCalculationDiscountResponseDto;
import cn.freemud.entities.dto.CheckSpqInfoResponseDto;
import cn.freemud.entities.dto.activity.ActivityDiscountsDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.CouponFlag;
import cn.freemud.service.CouponService;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate.coupon PromotionService
* @Description: TDO 描述....
* @author: family
* @date: 2020/9/8
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
public class CouponSharingService {
@Autowired
private CouponService couponService;
public void updateShoppingCartGoodsDiscount(CalculationSharingDiscountResponseDto.CalculationDiscountResult calculationDiscountResult
, List<CartGoods> cartGoodsList
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, CouponPromotionVO couponPromotionVO) {
// 用户选择了查询优惠券信息
if (couponPromotionVO != null && ObjectUtils.equals(CouponFlag.YES.getCode(), couponPromotionVO.getFlg())) {
List<CartGoods> tmpCartGoods = cartGoodsList.parallelStream().filter(k -> k.getCartGoodsUid()
.startsWith(CommonsConstant.COUPON_PREFIX)).collect(Collectors.toList());
// 是否存在商品券
boolean hasGoodssCoupon = CollectionUtils.isNotEmpty(tmpCartGoods);
// 构建可用不可用优惠券
ActivityClassifyCouponBean activityClassifyCouponBean = couponService.availableCoupon(cartGoodsList, couponPromotionVO.getPartnerId()
, couponPromotionVO.getUserId(), couponPromotionVO.getStoreId(), couponPromotionVO.getCouponCode(), hasGoodssCoupon, couponPromotionVO.getOrderType());
if (Objects.equals(activityClassifyCouponBean, null)) {
// 构建一个空得订单券信息
activityClassifyCouponBean = createEmptyActivityCouponBean();
}
shoppingCartGoodsResponseVo.setAvailableCoupon(activityClassifyCouponBean);
} else {
// 构建一个空得订单券信息
ActivityClassifyCouponBean activityClassifyCouponBean = createEmptyActivityCouponBean();
shoppingCartGoodsResponseVo.setAvailableCoupon(activityClassifyCouponBean);
}
// 当couponCode不为空时,需计算优惠价格
long couponDiscount = 0;
if (couponPromotionVO != null && StringUtils.isNotEmpty(couponPromotionVO.getCouponCode())
&& calculationDiscountResult != null) {
List<CalculationSharingDiscountResponseDto.CalculationDiscountResult.CouponResults> couponResultsList = calculationDiscountResult.getCouponDiscounts();
if (CollectionUtils.isNotEmpty(couponResultsList)) {
for (CalculationSharingDiscountResponseDto.CalculationDiscountResult.CouponResults couponResults : couponResultsList) {
couponDiscount = couponDiscount + (couponResults.getDiscountAmount() == null ? 0 : couponResults.getDiscountAmount());
}
}
}
shoppingCartGoodsResponseVo.setCouponDiscount(couponDiscount);
//循环购物车商品券
for (CartGoods cartGoods : cartGoodsList) {
if (cartGoods.getCartGoodsUid().startsWith(CommonsConstant.COUPON_PREFIX)) {
String spqId = cartGoods.getCartGoodsUid().substring(CommonsConstant.COUPON_PREFIX.length());
// 计算优惠信息时,已将券校验过,放在map中
Map<String, CheckSpqInfoResponseDto> validCouponMap = calculationDiscountResult == null ? new HashMap<>() : calculationDiscountResult.getValidCouponMap();
if (MapUtils.isNotEmpty(validCouponMap)) {
CheckSpqInfoResponseDto checkSpqInfoResponseDto = validCouponMap.get(spqId);
if (checkSpqInfoResponseDto != null) {
cartGoods.setOriginalPrice(checkSpqInfoResponseDto.getPrice());
cartGoods.setSpuId(checkSpqInfoResponseDto.getSpuId());
cartGoods.setSkuId(StringUtils.isEmpty(checkSpqInfoResponseDto.getSkuId()) ? checkSpqInfoResponseDto.getSpuId() : checkSpqInfoResponseDto.getSkuId());
cartGoods.setQty(1);
cartGoods.setCouponCode(checkSpqInfoResponseDto.getCouponCode());
cartGoods.setSpuName(checkSpqInfoResponseDto.getSpuName());
}
}
}
}
}
public void updateShoppingCartGoodsApportion(ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo, ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult, ShoppingCartGoodsDto shoppingCartGoodsDto, CreateOrderVo.PremiumExchangeActivity premiumExchangeActivity, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo) {
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults> couponDiscounts = calculationDiscountResult == null ? new ArrayList<>() : calculationDiscountResult.getCouponDiscounts();
List<ActivityDiscountsDto> activityDiscountsDtos = shoppingCartGoodsDto.getActivityDiscountsDtos() == null ? new ArrayList<>() : shoppingCartGoodsDto.getActivityDiscountsDtos();
for (ShoppingCartGoodsDto.CartGoodsDetailDto cartGoods : shoppingCartGoodsDto.getProducts()) {
if (StringUtils.isNotEmpty(cartGoods.getCouponCode())) {
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults couponDiscount : couponDiscounts) {
ActivityDiscountsDto activityDiscountsDto = getActivityDiscountDto(calculationDiscountResult.getApportionGoods(), couponDiscount);
if (activityDiscountsDto != null) {
ActivityDiscountsDto activityDiscountsDto1 = new ActivityDiscountsDto();
BeanUtils.copyProperties(activityDiscountsDto, activityDiscountsDto1);
activityDiscountsDto1.setDiscountAmount(-activityDiscountsDto.getDiscountAmount());
cartGoods.setTotalDiscountAmount(-activityDiscountsDto.getDiscountAmount());
cartGoods.setSalePrice(0L);
cartGoods.setActivityDiscountsDtos(Arrays.asList(activityDiscountsDto1));
}
}
}
}
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults couponDiscount : couponDiscounts) {
ActivityDiscountsDto activityDiscountsDto = getActivityDiscountDto(calculationDiscountResult.getApportionGoods(), couponDiscount);
if (activityDiscountsDto != null) {
activityDiscountsDtos.add(activityDiscountsDto);
}
}
shoppingCartGoodsDto.setActivityDiscountsDtos(activityDiscountsDtos);
}
private ActivityDiscountsDto getActivityDiscountDto(List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoods, ActivityCalculationDiscountResponseDto.CalculationDiscountResult.CouponResults couponDiscount) {
String couponCode = couponDiscount.getCouponCode();
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods apportionGood : apportionGoods) {
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods.ApportionDetails> list = apportionGood.getApportionDetails().stream().filter(detail -> ObjectUtils.equals(couponCode, detail.getActivityCode())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(list)) {
ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods.ApportionDetails apportionDetails = list.get(0);
ActivityDiscountsDto activityDiscountsDto = new ActivityDiscountsDto();
activityDiscountsDto.setActivityCode(apportionDetails.getActivityCode());
activityDiscountsDto.setActivityName(apportionDetails.getActivityName());
activityDiscountsDto.setActivityType(apportionDetails.getActivityType());
activityDiscountsDto.setDiscountAmount(0 - couponDiscount.getDiscountAmount());
return activityDiscountsDto;
}
}
return null;
}
public ActivityClassifyCouponBean createEmptyActivityCouponBean() {
ActivityClassifyCouponBean activityClassifyCouponBean = new ActivityClassifyCouponBean();
activityClassifyCouponBean.setCouponNum(0);
activityClassifyCouponBean.setDisableCouponNum(0);
activityClassifyCouponBean.setUsableCouponNum(0);
activityClassifyCouponBean.setDisableCoupons(Lists.newArrayList());
activityClassifyCouponBean.setUsableCoupons(Lists.newArrayList());
return activityClassifyCouponBean;
}
}
package cn.freemud.service.impl.calculate.promotion;
import cn.freemud.entities.dto.ActivityResponseDto;
import cn.freemud.entities.dto.BenefitBeanDto;
import cn.freemud.entities.dto.activity.ActivityQueryDto;
import cn.freemud.entities.dto.activity.ActivityQueryResponseDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
import cn.freemud.enums.ActivityTypeEnum;
import cn.freemud.service.ActivityService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import static cn.freemud.constant.ApplicationConstant.*;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate.promotion DelivierySharingService
* @Description: 满额减配送费用
* @author: family
* @date: 2020/9/9
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
public class DeliverySharingService {
@Autowired
private ActivityService activityService;
public void deliveryResponse(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, ActivityQueryDto activityQueryDto
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, Long deliveryAmount) {
DecimalFormat df = new DecimalFormat("###.##");
List<ActivityTypeEnum> activityTypeEnums = new LinkedList<>();
activityTypeEnums.add(ActivityTypeEnum.TYPE_14);
ActivityQueryResponseDto activityQueryResponseDto = activityService.queryActivityByType(activityQueryDto, activityTypeEnums, null);
ActivityResponseDto activityResponse =null;
BenefitBeanDto beanDto=null;
if (activityQueryResponseDto != null &&activityQueryResponseDto.getResult()!=null && activityQueryResponseDto.getResult().size()>0) {
activityResponse = activityQueryResponseDto.getResult().get(0);
shoppingCartGoodsResponseVo.setDiscountDeliveryActivityCode(activityResponse.getActivityCode());
beanDto=activityResponse.getBenefits().get(0);
}
CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount discount=null;
if (discountResult != null && CollectionUtils.isNotEmpty(discountResult.getDiscounts())) {
discount = discountResult.getDiscounts().stream().filter((d) -> ActivityTypeEnum.TYPE_14.getCode().equals(d.getType())).findFirst().orElse(null);
}
if(discount!=null) {
if(beanDto.getBenefitType() == 1) {
String desc = DELIVERY_DISCOUNT_DESC2;
shoppingCartGoodsResponseVo.setDeliveryDiscountDesc(String.format(desc, df.format(beanDto.getThresholdAmount().doubleValue() /100) ));
}
else {
String desc = DELIVERY_DISCOUNT_DESC1;
shoppingCartGoodsResponseVo.setDeliveryDiscountDesc(String.format(desc, df.format(beanDto.getThresholdAmount().doubleValue() /100) ,df.format(beanDto.getDiscountAmount().doubleValue() / 100)));
}
shoppingCartGoodsResponseVo.setDeliveryAmount(discountResult.getDeliveryAmount());
shoppingCartGoodsResponseVo.setDiscountDeliveryAmount(discountResult.getDistributionFee());
shoppingCartGoodsResponseVo.setThresholdAmount(discount.getThresholdAmount());
shoppingCartGoodsResponseVo.setIsDiscountDelivery(true);
}
else {
if (activityResponse!=null) {
if(beanDto.getBenefitType() == 1) {
String desc = DELIVERY_DISCOUNT_DESC2;
shoppingCartGoodsResponseVo.setDeliveryDiscountDesc(String.format(desc, df.format(beanDto.getThresholdAmount().doubleValue() /100) ));
}
else {
String desc = DELIVERY_DISCOUNT_DESC1;
shoppingCartGoodsResponseVo.setDeliveryDiscountDesc(String.format(desc, df.format(beanDto.getThresholdAmount().doubleValue() /100 ),df.format(beanDto.getDiscountAmount().doubleValue() / 100)));
}
shoppingCartGoodsResponseVo.setDeliveryAmount(deliveryAmount);
shoppingCartGoodsResponseVo.setDiscountDeliveryAmount(deliveryAmount);
shoppingCartGoodsResponseVo.setIsDiscountDelivery(false);
} else {
String desc = DELIVERY_DISCOUNT_DESC3;
shoppingCartGoodsResponseVo.setDeliveryDiscountDesc(String.format(desc, df.format(deliveryAmount.doubleValue() / 100)));
shoppingCartGoodsResponseVo.setDeliveryAmount(deliveryAmount);
shoppingCartGoodsResponseVo.setDiscountDeliveryAmount(deliveryAmount);
shoppingCartGoodsResponseVo.setIsDiscountDelivery(false);
}
}
}
}
package cn.freemud.service.impl.calculate.promotion;
import cn.freemud.constant.CustomerScoreConstant;
import cn.freemud.entities.dto.UserLoginInfoDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import cn.freemud.entities.dto.user.GetUserScoreUseDetailRequest;
import cn.freemud.entities.dto.user.GetUserScoreUserDetailResponse;
import cn.freemud.entities.vo.ShoppingCartCustomerScoreVo;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
import cn.freemud.entities.vo.ShoppingCartInfoRequestVo;
import cn.freemud.enums.ActivityTypeEnum;
import cn.freemud.service.thirdparty.CustomScoreClient;
import cn.freemud.utils.LogUtil;
import com.freemud.application.sdk.api.constant.FMStatusCode;
import com.freemud.application.sdk.api.log.ErrorLog;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: cn.freemud.service.impl.calculate.promotion ScoreSharingService
* @Description: 积分抵扣
* @author: family
* @date: 2020/9/9
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
public class ScoreSharingService {
@Autowired
private CustomScoreClient customScoreClient;
public void scoreResponse(CalculationSharingDiscountResponseDto.CalculationDiscountResult discountResult
, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, UserLoginInfoDto userLoginInfoDto
, ShoppingCartInfoRequestVo shoppingCartInfoRequestVo) {
if (shoppingCartInfoRequestVo == null || shoppingCartInfoRequestVo.getUseCustomerScore() == null
|| shoppingCartInfoRequestVo.getUseCustomerScore() == null
|| shoppingCartInfoRequestVo.getUseCustomerScore().equals(CustomerScoreConstant.NO_DISPLAY.getValue())) {
return;
}
GetUserScoreUseDetailRequest request = new GetUserScoreUseDetailRequest();
request.setMemberId(userLoginInfoDto.getMemberId());
request.setPaidAmount(getValue(shoppingCartGoodsResponseVo.getTotalAmount()));
request.setPartnerId(userLoginInfoDto.getPartnerId());
GetUserScoreUserDetailResponse userScoreUseDetail = null;
try {
// 加入try catch是为了custom服务挂掉,购物车服务可以也可以正常
userScoreUseDetail = customScoreClient.getUserScoreUseDetail(request);
} catch (Exception ex) {
ErrorLog.printErrorLog("getUserScoreUseDetailError", "/user/scoreUseDetail", request, ex);
}
if (userScoreUseDetail != null && userScoreUseDetail.getCode().equals(FMStatusCode.SUCCESS.getCode()) && userScoreUseDetail.getResult() != null) {
Integer discountAmount = 0;
if (CustomerScoreConstant.SUBSTRACT.getValue().equals(shoppingCartInfoRequestVo.getUseCustomerScore())) {
//设置 购物车总金额=购物车总价-积分扣减金额
discountAmount = getValue(userScoreUseDetail.getResult().getReduceAmount());
}
//设置 积分抵扣VO
ShoppingCartCustomerScoreVo customerScoreVo = new ShoppingCartCustomerScoreVo();
customerScoreVo.setCurrentScore(getValue(userScoreUseDetail.getResult().getCurrentScore()));
customerScoreVo.setReduceAmount(getValue(userScoreUseDetail.getResult().getReduceAmount()));
customerScoreVo.setReducePriceLimit(getValue(userScoreUseDetail.getResult().getReducePriceLimit()));
customerScoreVo.setOverlayOffers(userScoreUseDetail.getResult().getOverlayOffers());
customerScoreVo.setScoreReduceState(getValue(userScoreUseDetail.getResult().getScoreState()));
// 是否可优惠同享{0所有订单均可抵扣,1仅限原价订单才可抵扣(享受了促销活动、或使用了优惠券,不能进行积分抵扣
if (getValue(userScoreUseDetail.getResult().getOverlayOffers()) == 0) {
customerScoreVo.setScoreReduceState(getValue(userScoreUseDetail.getResult().getScoreState()));
} else {
if (StringUtils.isNotBlank(shoppingCartInfoRequestVo.getCouponCode()) || (discountResult != null && discountResult.getTotalDiscountAmount().intValue() > 0)
|| (discountResult != null && !CollectionUtils.isEmpty(discountResult.getDiscounts()))) {
//是否有换购
int type81 = 0;
for (CalculationSharingDiscountResponseDto.CalculationDiscountResult.Discount discount : discountResult.getDiscounts()) {
if (ActivityTypeEnum.TYPE_81.getCode().equals(discount.getType())) {
type81 = 1;
break;
}
}
//集点
long discountCount = discountResult.getDiscounts().stream().filter(discount -> !ActivityTypeEnum.TYPE_221.getCode().equals(discount.getType())).count();
//积分抵扣开关禁用 有换购活动 且选中了换购商品
// - 有换购且选中了换购商品
// - 有换购且没有选中换购商品 且除集点以外还有其他促销
if ((type81 == 0 && discountCount >= 1)
|| (type81 == 1 && !CollectionUtils.isEmpty(shoppingCartInfoRequestVo.getSendGoods()))
|| (type81 == 1 && discountCount > 1)) {
customerScoreVo.setScoreReduceState(5);
userScoreUseDetail.getResult().setScoreState(5);
discountAmount = 0;
customerScoreVo.setReduceAmount(0);
}
}
}
customerScoreVo.setUseScore(getValue(userScoreUseDetail.getResult().getUseScore()));
String msg = "";
// 积分抵扣状态 1积分可用 2积分不足 3 积分抵扣开关禁用 4、订单金额不满足开启积分抵现要求
switch (userScoreUseDetail.getResult().getScoreState()) {
case 1:
msg = String.format("共%s积分,可用%s积分抵¥%s", getValue(userScoreUseDetail.getResult().getCurrentScore()), getValue(userScoreUseDetail.getResult().getUseScore()), ((double) userScoreUseDetail.getResult().getReduceAmount()) / 100);
break;
case 2:
String[] split = userScoreUseDetail.getResult().getScoreReduceRate().split(":");
msg = String.format("共%s积分,每%s积分可抵¥%s", getValue(userScoreUseDetail.getResult().getCurrentScore()), split[0], split[1]);
break;
case 5:
msg = "已享受优惠,无法再参与积分抵扣";
break;
case 4:
msg = String.format("共%s积分,订单满¥%s可开启积分抵现", getValue(userScoreUseDetail.getResult().getCurrentScore()), ((double) userScoreUseDetail.getResult().getReducePriceLimit()) / 100);
break;
default:
break;
}
customerScoreVo.setCustomerScorePrompt(msg);
shoppingCartGoodsResponseVo.setCustomerScoreVo(customerScoreVo);
shoppingCartGoodsResponseVo.setTotalDiscountAmount(shoppingCartGoodsResponseVo.getTotalDiscountAmount() + discountAmount);
shoppingCartGoodsResponseVo.setTotalAmount(shoppingCartGoodsResponseVo.getTotalAmount() - discountAmount);
}
return;
}
private Integer getValue(Object object) {
Integer result = 0;
try {
if (object != null) {
if (object instanceof Integer) {
result = (Integer) object;
}
else if (object instanceof String) {
result = Integer.parseInt((String) object);
}
else if (object instanceof Double) {
result = (int) ((double) object);
}
else if (object instanceof Float) {
result = (int) ((float) object);
}
else if (object instanceof BigDecimal) {
result = ((BigDecimal) object).intValue();
}
else if (object instanceof Long) {
result = ((Long) object).intValue();
}
}
} catch (Exception ex) {
LogUtil.error("getScoreValueFail", "", "", ex);
}
return result;
}
}
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountRequestDto;
import cn.freemud.entities.dto.calculate.CalculationSharingDiscountResponseDto;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "promotion-service", url = "${saas.activityclient.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface CalculationClient {
/**
* 促销新的算价对接
*/
@PostMapping("/promotioncenter/calculateservice/discount/sharing")
CalculationSharingDiscountResponseDto calculationSharingDiscount(CalculationSharingDiscountRequestDto shareDiscountRequestDto);
}
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