Commit b6d5a887 by xiaoer.li@freemud.com

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

# 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/SetMealServiceImpl.java
#	shopping-cart-application-service/src/main/java/cn/freemud/service/impl/ShoppingCartNewServiceImpl.java
parents f2328bea 1fcb6fce
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";
/**
* 渠道
*/
private String productChannel;
/**
* 是否展示活动列表 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 String couponCode;
/**
* 加料
*/
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
...@@ -134,4 +134,5 @@ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseV ...@@ -134,4 +134,5 @@ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseV
* 运费券 * 运费券
*/ */
private String freightCouponCode; private String freightCouponCode;
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.enums;
public enum CalculationGoodsType {
TYPE_0(0, "原来的购物车商品"),
TYPE_1(1, "赠品"),
TYPE_2(2, "加购商品");
Integer type;
String desc;
CalculationGoodsType(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
...@@ -19,8 +19,8 @@ public enum ProductType { ...@@ -19,8 +19,8 @@ public enum ProductType {
HAVESPEC(10, "有规格"), HAVESPEC(10, "有规格"),
WEIGHT_PRODUCT(11, "称重商品"), WEIGHT_PRODUCT(11, "称重商品"),
TABLEWARE_PRODUCT(12, "餐具商品"), TABLEWARE_PRODUCT(12, "餐具商品"),
SETMEAL(6,"套餐"); SETMEAL(6, "套餐"),
MATERIAL(88, "有加料的商品");
private int code; private int code;
private String desc; private String desc;
......
...@@ -80,7 +80,7 @@ public interface CouponService { ...@@ -80,7 +80,7 @@ public interface CouponService {
* @param cartGoods * @param cartGoods
* @return * @return
*/ */
ActivityClassifyCouponBean availableCoupon(List<CartGoods> cartGoods, String partnerId, String userId, String storeId, String couponCode, boolean hasGoodsCoupon, Integer orderType); ActivityClassifyCouponBean availableCoupon(List<CartGoods> cartGoods, String partnerId, String userId, String storeId, String couponCode, boolean hasGoodsCoupon, Integer orderType, int isNew);
/** /**
* 获取卡券服务商户密钥 * 获取卡券服务商户密钥
......
...@@ -52,7 +52,7 @@ public class CouponPromotionService implements IPromotionService { ...@@ -52,7 +52,7 @@ public class CouponPromotionService implements IPromotionService {
boolean hasGoodssCoupon = CollectionUtils.isNotEmpty(tmpCartGoods); boolean hasGoodssCoupon = CollectionUtils.isNotEmpty(tmpCartGoods);
// 构建可用不可用优惠券 // 构建可用不可用优惠券
ActivityClassifyCouponBean activityClassifyCouponBean = couponService.availableCoupon(cartGoodsList, couponPromotionVO.getPartnerId() ActivityClassifyCouponBean activityClassifyCouponBean = couponService.availableCoupon(cartGoodsList, couponPromotionVO.getPartnerId()
, couponPromotionVO.getUserId(), couponPromotionVO.getStoreId(), couponPromotionVO.getCouponCode(), hasGoodssCoupon, couponPromotionVO.getOrderType()); , couponPromotionVO.getUserId(), couponPromotionVO.getStoreId(), couponPromotionVO.getCouponCode(), hasGoodssCoupon, couponPromotionVO.getOrderType(), 0);
if (Objects.equals(activityClassifyCouponBean, null)) { if (Objects.equals(activityClassifyCouponBean, null)) {
// 构建一个空得订单券信息 // 构建一个空得订单券信息
activityClassifyCouponBean = createEmptyActivityCouponBean(); activityClassifyCouponBean = createEmptyActivityCouponBean();
......
...@@ -403,8 +403,14 @@ public class CouponServiceImpl implements CouponService { ...@@ -403,8 +403,14 @@ public class CouponServiceImpl implements CouponService {
} }
@Override @Override
public ActivityClassifyCouponBean availableCoupon(List<CartGoods> cartGoods, String partnerId, String userId public ActivityClassifyCouponBean availableCoupon(List<CartGoods> cartGoods
, String storeId, String couponCode, boolean hasGoodsCoupon, Integer orderType) { , String partnerId
, String userId
, String storeId
, String couponCode
, boolean hasGoodsCoupon
, Integer orderType
, int isNew) {
GetMemberCouponListRequestDto getMemberCouponListRequestDto = new GetMemberCouponListRequestDto(partnerId, userId); GetMemberCouponListRequestDto getMemberCouponListRequestDto = new GetMemberCouponListRequestDto(partnerId, userId);
getMemberCouponListRequestDto.setStatusFlags(Arrays.asList(CouponStatus.STATUS_0.getCode())); getMemberCouponListRequestDto.setStatusFlags(Arrays.asList(CouponStatus.STATUS_0.getCode()));
getMemberCouponListRequestDto.setPageNum(1); getMemberCouponListRequestDto.setPageNum(1);
...@@ -443,14 +449,14 @@ public class CouponServiceImpl implements CouponService { ...@@ -443,14 +449,14 @@ public class CouponServiceImpl implements CouponService {
} }
} }
}); });
List<CouponStateVo> couponStateList = buildAvailiableCoupons(cartGoods, partnerId, storeId, couponCodes); List<CouponStateVo> couponStateList = buildAvailiableCoupons(cartGoods, partnerId, storeId, couponCodes, isNew);
if (CollectionUtils.isNotEmpty(couponStateList)) { if (CollectionUtils.isNotEmpty(couponStateList)) {
return returnSuccessAvailiableCoupons(couponCode, hasGoodsCoupon, availableCouponResponseVo, usableCoupons, disableCoupons, memberCouponMap, couponStateList); return returnSuccessAvailiableCoupons(couponCode, hasGoodsCoupon, availableCouponResponseVo, usableCoupons, disableCoupons, memberCouponMap, couponStateList);
} }
return null; return null;
} }
private List<CouponStateVo> buildAvailiableCoupons(List<CartGoods> cartGoods, String partnerId, String storeId, List<String> couponCodes) { private List<CouponStateVo> buildAvailiableCoupons(List<CartGoods> cartGoods, String partnerId, String storeId, List<String> couponCodes, int isNew) {
String appSecret = getAppSecret(partnerId); String appSecret = getAppSecret(partnerId);
// 最大15一提交 // 最大15一提交
int maxNum = 15; int maxNum = 15;
...@@ -463,7 +469,7 @@ public class CouponServiceImpl implements CouponService { ...@@ -463,7 +469,7 @@ public class CouponServiceImpl implements CouponService {
List<Product> productList = Lists.newArrayList(); List<Product> productList = Lists.newArrayList();
// 优惠券优先级最高,根据商品原价做计算 // 优惠券优先级最高,根据商品原价做计算
// 订单金额 // 订单金额
Long totalAmount = createProductRequest(cartGoods, productList); Long totalAmount = createProductRequest(cartGoods, productList, isNew);
couponAvailableReqVo.setTotalAmount(Integer.valueOf(totalAmount + "")); couponAvailableReqVo.setTotalAmount(Integer.valueOf(totalAmount + ""));
couponAvailableReqVo.setProductList(productList); couponAvailableReqVo.setProductList(productList);
couponAvailableReqVo.setChannelCodeList(commonService.getOrgCodes(partnerId, storeId)); couponAvailableReqVo.setChannelCodeList(commonService.getOrgCodes(partnerId, storeId));
...@@ -573,37 +579,62 @@ public class CouponServiceImpl implements CouponService { ...@@ -573,37 +579,62 @@ public class CouponServiceImpl implements CouponService {
return availableCouponResponseVo; return availableCouponResponseVo;
} }
private Long createProductRequest(List<CartGoods> cartGoods, List<Product> productList) { private Long createProductRequest(List<CartGoods> cartGoods, List<Product> productList, int isNew) {
Long totalAmount = 0L; Long totalAmount = 0L;
for (CartGoods cartGood : cartGoods) {
// 剔除商品券得商品 if (isNew == 1) {
if (StringUtils.isEmpty(cartGood.getSkuId()) && StringUtils.isEmpty(cartGood.getSpuId())) { for (CartGoods cartGood : cartGoods) {
continue; // 剔除商品券得商品
} if (StringUtils.isEmpty(cartGood.getSkuId()) && StringUtils.isEmpty(cartGood.getSpuId())) {
Product product = new Product(); continue;
product.setProductId(StringUtils.isEmpty(cartGood.getSkuId()) ? cartGood.getSpuId() : cartGood.getSkuId()); }
// 普通商品价格 Product product = new Product();
product.setAmount(Integer.valueOf(cartGood.getOriginalPrice() + "")); product.setProductId(StringUtils.isEmpty(cartGood.getSkuId()) ? cartGood.getSpuId() : cartGood.getSkuId());
// 套餐价格为: 套餐价+可选商品总价格 // 普通商品价格
if (ObjectUtils.equals(GoodsTypeEnum.SET_MEAL_GOODS.getGoodsType(), cartGood.getGoodsType())) { product.setAmount(cartGood.getAmount().intValue());
Long finalPrice = cartGood.getFinalPrice(); totalAmount = totalAmount + cartGood.getAmount();
if (CollectionUtils.isNotEmpty(cartGood.getProductGroupList())) { // todo :小料价格累加到主商品上
finalPrice += cartGood.getProductGroupList().stream().mapToLong(group -> group.getFinalPrice() * group.getQty()).sum(); if (CollectionUtils.isNotEmpty(cartGood.getProductMaterialList())) {
for (CartGoods.MaterialGoods materialGoods : cartGood.getProductMaterialList()) {
product.setAmount(product.getAmount() + materialGoods.getAmount().intValue());
totalAmount = totalAmount + materialGoods.getAmount();
}
} }
product.setAmount(finalPrice.intValue()); // 数量
product.setQuantity(1);
productList.add(product);
} }
} else {
for (CartGoods cartGood : cartGoods) {
// 剔除商品券得商品
if (StringUtils.isEmpty(cartGood.getSkuId()) && StringUtils.isEmpty(cartGood.getSpuId())) {
continue;
}
Product product = new Product();
product.setProductId(StringUtils.isEmpty(cartGood.getSkuId()) ? cartGood.getSpuId() : cartGood.getSkuId());
// 普通商品价格
product.setAmount(Integer.valueOf(cartGood.getOriginalPrice() + ""));
// 套餐价格为: 套餐价+可选商品总价格
if (ObjectUtils.equals(GoodsTypeEnum.SET_MEAL_GOODS.getGoodsType(), cartGood.getGoodsType())) {
Long finalPrice = cartGood.getFinalPrice();
if (CollectionUtils.isNotEmpty(cartGood.getProductGroupList())) {
finalPrice += cartGood.getProductGroupList().stream().mapToLong(group -> group.getFinalPrice() * group.getQty()).sum();
}
product.setAmount(finalPrice.intValue());
}
totalAmount = totalAmount + product.getAmount() * cartGood.getQty(); totalAmount = totalAmount + product.getAmount() * cartGood.getQty();
// todo :小料价格累加到主商品上 // todo :小料价格累加到主商品上
if (CollectionUtils.isNotEmpty(cartGood.getProductMaterialList())) { if (CollectionUtils.isNotEmpty(cartGood.getProductMaterialList())) {
for (CartGoods.MaterialGoods materialGoods : cartGood.getProductMaterialList()) { for (CartGoods.MaterialGoods materialGoods : cartGood.getProductMaterialList()) {
product.setAmount(product.getAmount() + Integer.valueOf(materialGoods.getOriginalPrice() + "")); product.setAmount(product.getAmount() + Integer.valueOf(materialGoods.getOriginalPrice() + ""));
totalAmount = totalAmount + materialGoods.getOriginalPrice() * cartGood.getQty(); totalAmount = totalAmount + materialGoods.getOriginalPrice() * cartGood.getQty();
}
} }
// 数量
product.setQuantity(cartGood.getQty());
productList.add(product);
} }
// 数量
product.setQuantity(cartGood.getQty());
productList.add(product);
} }
return totalAmount; return totalAmount;
} }
......
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);
}
/**
* 特价类型超出部分提示
*/
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.QUERY_INFO);
calculationCommonService.addNeedCardAmount(shoppingCartInfoRequestVo, shoppingCartGoodsResponseVo);
}
}
}
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.shoppingCart.ShoppingCartGoodsDto;
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;
}
public void equally(ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo
, ShoppingCartGoodsDto shoppingCartGoodsDto) {
if (shoppingCartGoodsResponseVo.getCustomerScoreVo() != null) {
shoppingCartGoodsDto.setScoreReduceAmount(shoppingCartGoodsResponseVo.getCustomerScoreVo().getReduceAmount() == null ? 0 : shoppingCartGoodsResponseVo.getCustomerScoreVo().getReduceAmount().longValue());
shoppingCartGoodsDto.setReduceScore(shoppingCartGoodsResponseVo.getCustomerScoreVo().getUseScore() == null ? 0 : shoppingCartGoodsResponseVo.getCustomerScoreVo().getUseScore().longValue());
}
}
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);
}
...@@ -133,7 +133,7 @@ public class CouponServiceTest { ...@@ -133,7 +133,7 @@ public class CouponServiceTest {
List<CartGoods> cartGoods = Lists.newArrayList(); List<CartGoods> cartGoods = Lists.newArrayList();
CartGoods cartGood = new CartGoods(); CartGoods cartGood = new CartGoods();
cartGoods.add(cartGood); cartGoods.add(cartGood);
ActivityClassifyCouponBean activityClassifyCouponBean = couponService.availableCoupon(cartGoods, "1864", "122424124", "1011", "88123124", true, 1); ActivityClassifyCouponBean activityClassifyCouponBean = couponService.availableCoupon(cartGoods, "1864", "122424124", "1011", "88123124", true, 1, 1);
assertTrue(activityClassifyCouponBean.getCouponNum() >= 1); assertTrue(activityClassifyCouponBean.getCouponNum() >= 1);
} }
......
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