Commit 834b8079 by ping.wu

套餐优惠计算

parent 5b7daa2b
package cn.freemud.entities.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Objects;
......@@ -108,6 +109,30 @@ public class ActivityCalculationDiscountRequestDto {
*/
private Integer memberDiscount;
private List<Material> smallMaterial;
@Data
@NoArgsConstructor
static public class Material {
/**
* 加料商品ID
*/
private String goodsId;
/**
* 加料数量
*/
private Integer goodsQuantity;
/**
* 加料单价
*/
private Long originalPrice;
/**
* 1 :小料、2:可选搭配
*/
private int type;
}
@Override
public boolean equals(Object o) {
if (this == o)
......@@ -125,4 +150,5 @@ public class ActivityCalculationDiscountRequestDto {
return Objects.hash(super.hashCode(), goodsId, category, originalPrice);
}
}
}
......@@ -19,6 +19,7 @@ import cn.freemud.service.ActivityService;
import cn.freemud.service.impl.AssortmentSdkService;
import cn.freemud.service.impl.FullSubtractionActivityServiceImpl;
import cn.freemud.service.impl.mcoffee.calculation.CalculationServiceImpl;
import cn.freemud.service.impl.mcoffee.calculation.CouponDiscountCalculation;
import cn.freemud.service.thirdparty.CustomerApplicationClient;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONArray;
......@@ -27,7 +28,6 @@ import com.freemud.application.sdk.api.base.SDKCommonBaseContextWare;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.productcenter.domain.ProductBeanDTO;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
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.service.ShoppingCartBaseService;
import com.freemud.sdk.api.assortment.shoppingcart.service.impl.ShoppingCartBaseServiceImpl;
......@@ -75,6 +75,8 @@ public class ShoppingCartMCoffeeServiceImpl {
private CustomerApplicationClient customerApplicationClient;
@Autowired
private CalculationServiceImpl calculationService;
@Autowired
private CouponDiscountCalculation couponDiscountCalculation;
/**
* 添加商品
......@@ -269,7 +271,6 @@ public class ShoppingCartMCoffeeServiceImpl {
if (StringUtils.isEmpty(shoppingCartInfoRequestVo.getShopId())) {
throw new ServiceException(ResponseResult.SHOPPING_CART_SHOP_ID_NOT_EMPTY);
}
ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo = new ShoppingCartGoodsResponseVo();
ActivityClassifyCouponBean availableCoupon = new ActivityClassifyCouponBean();
// 获取用户信息
CustomerInfoVo assortmentCustomerInfoVo = getCustomerInfoVo(shoppingCartInfoRequestVo.getSessionId());
......@@ -277,6 +278,7 @@ public class ShoppingCartMCoffeeServiceImpl {
String partnerId = shoppingCartInfoRequestVo.getPartnerId();
String storeId = shoppingCartInfoRequestVo.getShopId();
String appId = shoppingCartInfoRequestVo.getAppId();
//非商品券券号
String couponCode = shoppingCartInfoRequestVo.getCouponCode();
String activityCode = shoppingCartInfoRequestVo.getActivityCode();
String menuType = shoppingCartInfoRequestVo.getMenuType();
......@@ -286,9 +288,8 @@ public class ShoppingCartMCoffeeServiceImpl {
// 获取购物车商品
List<CartGoods> cartGoodsList = assortmentSdkService.getShoppingCart(partnerId, storeId, userId, null, "", shoppingCartBaseService);
// 促销计算-查询用户券-券码校验可用券
availableCoupon = calculationService.availableCoupon(partnerId, storeId, userId, appId, orderType, assortmentCustomerInfoVo.isMemberPaid(), menuType, receiveId,null,
cartGoodsList, new ArrayList<>(), new ArrayList<>(), shoppingCartGoodsResponseVo);
// 获取购物车商品-查询用户券-券码校验可用券
availableCoupon = couponDiscountCalculation.availableCoupon(partnerId, storeId, userId, couponCode,orderType,cartGoodsList);
return ResponseUtil.success(availableCoupon);
}
......
......@@ -11,12 +11,10 @@ import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ActivityChannelEnum;
import cn.freemud.enums.ActivityTypeEnum;
import cn.freemud.enums.CouponFlag;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.CommonService;
import cn.freemud.service.thirdparty.ActivityClient;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.PropertyConvertUtil;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -27,7 +25,6 @@ import com.freemud.application.sdk.api.storecenter.request.QueryDeliveryRequest;
import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.sdk.api.assortment.shoppingcart.enums.BusinessTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -121,7 +118,7 @@ public class CalculationServiceImpl {
List<ActivityCalculationDiscountRequestDto.CalculationDiscountGoods> calculationDiscountGoodsList = new ArrayList<>();
for (CartGoods cartGoods : cartGoodsList) {
addCalculationDiscountGoods(calculationDiscountGoodsList, cartGoods.getCustomerCode(),cartGoods.getGoodsId(), cartGoods.getQty(), cartGoods.getFinalPrice(), cartGoods.getMemberDiscount());
addCalculationDiscountGoods(calculationDiscountGoodsList, cartGoods.getCustomerCode(),cartGoods.getGoodsId(), cartGoods.getQty(), cartGoods.getFinalPrice(), cartGoods.getMemberDiscount(),cartGoods);
}
if (BusinessTypeEnum.SAAS_DELIVERY.getCode().equals(menuType)) {
......@@ -130,7 +127,7 @@ public class CalculationServiceImpl {
// 当加价购商品不为空时
if (CollectionUtils.isNotEmpty(sendGoodsList)) {
for (ShoppingCartInfoRequestVo.SendGoods sendGoods : sendGoodsList) {
this.addCalculationDiscountGoods(calculationDiscountGoodsList, sendGoods.getGoodsId(), sendGoods.getGoodsId(), sendGoods.getQty(), sendGoods.getOriginalPrice(), 100);
this.addCalculationDiscountGoods(calculationDiscountGoodsList, sendGoods.getGoodsId(), sendGoods.getGoodsId(), sendGoods.getQty(), sendGoods.getOriginalPrice(), 100,null);
}
}
calculationDiscountGoodsList.removeIf(calculationDiscountGoods -> (calculationDiscountGoods.getGoodsQuantity().equals(0)));
......@@ -345,7 +342,7 @@ public class CalculationServiceImpl {
* @param originalPrice
*/
private void addCalculationDiscountGoods(List<ActivityCalculationDiscountRequestDto.CalculationDiscountGoods> calculationDiscountGoodsList,
String goodsCode,String goodsId, Integer goodsQuantity, Long originalPrice, Integer memberDiscount) {
String goodsCode,String goodsId, Integer goodsQuantity, Long originalPrice, Integer memberDiscount,CartGoods cartGoods) {
ActivityCalculationDiscountRequestDto.CalculationDiscountGoods calculationDiscountGoods = new ActivityCalculationDiscountRequestDto.CalculationDiscountGoods();
calculationDiscountGoods.setGoodsCode(goodsCode);
calculationDiscountGoods.setGoodsId(goodsId);
......@@ -353,6 +350,21 @@ public class CalculationServiceImpl {
calculationDiscountGoods.setOriginalPrice(originalPrice);
calculationDiscountGoods.setMemberDiscount(memberDiscount);
//可选搭配
if (cartGoods != null && CollectionUtils.isNotEmpty(cartGoods.getProductGroupList())) {
ArrayList<ActivityCalculationDiscountRequestDto.CalculationDiscountGoods.Material> materials = new ArrayList<>();
for (CartGoods.ComboxGoods materialGoods : cartGoods.getProductGroupList()) {
ActivityCalculationDiscountRequestDto.CalculationDiscountGoods.Material material = new ActivityCalculationDiscountRequestDto.CalculationDiscountGoods.Material();
material.setType(2);
material.setGoodsId(materialGoods.getGoodsId());
material.setGoodsQuantity(cartGoods.getQty());
material.setOriginalPrice(materialGoods.getFinalPrice());
materials.add(material);
}
calculationDiscountGoods.setSmallMaterial(materials);
}
//累加需加入计算的商品
int index;
// 当商品已存在时,需累加数量
......@@ -387,31 +399,4 @@ public class CalculationServiceImpl {
shoppingCartGoodsResponseVo.setTotalDiscountAmount(calculationDiscount == null ? 0L : calculationDiscount.getTotalDiscountAmount());
}
/**
* 可选优惠券
*/
public ActivityClassifyCouponBean availableCoupon(String partnerId, String storeId, String userId, String appId, Integer orderType,
boolean isMember, String menuType, String receiveId,String couponCode,
List<CartGoods> cartGoodsList, List<ActivityCalculationDiscountRequestDto.CalculationDiscountCoupon> coupons,
List<ShoppingCartInfoRequestVo.SendGoods> sendGoodsList, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo){
Long deliveryAmount = 0L;
QueryDeliverDetailResponse response = calculateDeliveryAmount(receiveId, partnerId, storeId, appId);
if(response != null){
shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(response.getDeliveryFeeZeroReason() != null ? response.getDeliveryFeeZeroReason() : 0);
deliveryAmount = response.getDeliveryAmount();
}
ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscount = getCalculationDiscount(partnerId, storeId, userId, appId, orderType, isMember,
menuType, deliveryAmount, cartGoodsList, coupons, sendGoodsList);
//优惠券
CouponPromotionVO couponPromotionVO = couponDiscountCalculation.getCouponPromotionVO(partnerId, storeId, userId, couponCode, orderType);
couponDiscountCalculation.updateShoppingCartGoodsDiscount(couponPromotionVO,calculationDiscount,cartGoodsList, shoppingCartGoodsResponseVo);
return shoppingCartGoodsResponseVo.getAvailableCoupon();
}
}
......@@ -19,9 +19,7 @@ import cn.freemud.service.thirdparty.CouponClient;
import cn.freemud.service.thirdparty.CustomerExtendClient;
import cn.freemud.utils.BarcodeUtil;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.RedisUtil;
import com.alibaba.fastjson.JSON;
import com.freemud.card.sdk.vo.coupon.CouponStateVo;
import com.freemud.sdk.api.assortment.shoppingcart.constant.CommonsConstant;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
......@@ -75,25 +73,7 @@ public class CouponDiscountCalculation {
* 优惠计算
*/
public void updateShoppingCartGoodsDiscount(CouponPromotionVO couponPromotionVO, ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult, List<CartGoods> cartGoodsList, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo) {
// 用户选择了查询优惠券信息
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 = availableCoupon(cartGoodsList, couponPromotionVO.getPartnerId()
, couponPromotionVO.getUserId(), couponPromotionVO.getStoreId(), couponPromotionVO.getCouponCode(), hasGoodssCoupon, couponPromotionVO.getOrderType());
if (Objects.equals(activityClassifyCouponBean, null)) {
// 构建一个空得订单券信息
activityClassifyCouponBean = new ActivityClassifyCouponBean();
activityClassifyCouponBean.setCouponNum(0);
activityClassifyCouponBean.setDisableCouponNum(0);
activityClassifyCouponBean.setUsableCouponNum(0);
activityClassifyCouponBean.setDisableCoupons(Lists.newArrayList());
activityClassifyCouponBean.setUsableCoupons(Lists.newArrayList());
}
shoppingCartGoodsResponseVo.setAvailableCoupon(activityClassifyCouponBean);
}
// 当couponCode不为空时,需计算优惠价格
long couponDiscount = 0;
......@@ -137,10 +117,38 @@ public class CouponDiscountCalculation {
}
public void getCoupon(CouponPromotionVO couponPromotionVO, ActivityCalculationDiscountResponseDto.CalculationDiscountResult calculationDiscountResult, List<CartGoods> cartGoodsList, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo){
// 用户选择了查询优惠券信息
if (couponPromotionVO != null && ObjectUtils.equals(CouponFlag.YES.getCode(), couponPromotionVO.getFlg())) {
// 构建可用不可用优惠券
ActivityClassifyCouponBean activityClassifyCouponBean = availableCoupon(couponPromotionVO.getPartnerId()
, couponPromotionVO.getUserId(), couponPromotionVO.getStoreId(), couponPromotionVO.getCouponCode(), couponPromotionVO.getOrderType(),cartGoodsList);
if (Objects.equals(activityClassifyCouponBean, null)) {
// 构建一个空得订单券信息
activityClassifyCouponBean = new ActivityClassifyCouponBean();
activityClassifyCouponBean.setCouponNum(0);
activityClassifyCouponBean.setDisableCouponNum(0);
activityClassifyCouponBean.setUsableCouponNum(0);
activityClassifyCouponBean.setDisableCoupons(Lists.newArrayList());
activityClassifyCouponBean.setUsableCoupons(Lists.newArrayList());
}
shoppingCartGoodsResponseVo.setAvailableCoupon(activityClassifyCouponBean);
}
}
public ActivityClassifyCouponBean availableCoupon(List<CartGoods> cartGoods, String partnerId, String userId
, String storeId, String couponCode, boolean hasGoodsCoupon, Integer orderType) {
/**
* 可选优惠券
*/
public ActivityClassifyCouponBean availableCoupon( String partnerId, String storeId,String userId
, String couponCode, Integer orderType,List<CartGoods> cartGoods) {
List<CartGoods> tmpCartGoods = cartGoods.parallelStream().filter(k -> k.getCartGoodsUid().startsWith(CommonsConstant.COUPON_PREFIX)).collect(Collectors.toList());
boolean hasGoodsCoupon = CollectionUtils.isNotEmpty(tmpCartGoods);
// 获取会员服务的优惠券列表
GetMemberCouponListRequestDto getMemberCouponListRequestDto = new GetMemberCouponListRequestDto(partnerId, userId);
getMemberCouponListRequestDto.setStatusFlags(Arrays.asList(CouponStatus.STATUS_0.getCode()));
getMemberCouponListRequestDto.setPageNum(1);
......@@ -382,79 +390,6 @@ public class CouponDiscountCalculation {
return availableCouponResponseVo;
}
private ActivityClassifyCouponBean returnAvailableCoupons(String couponCode,ActivityClassifyCouponBean availableCouponResponseVo, Map<String, GetMemberCouponListResponseDto.Result.MemberCoupon> memberCouponMap,
// List<CouponStateVo> couponStateList,
List<GetMemberCouponListResponseDto.Result.MemberCoupon> memberCoupons) {
int disableCouponNum = 0;
int usableCouponNum = 0;
// 可用优惠券信息
List<ActivityCouponBean> usableCoupons = Lists.newArrayList();
for (GetMemberCouponListResponseDto.Result.MemberCoupon couponStateVo : memberCoupons) {
// // 过滤0得代金券
// if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_1.getCode())
// && (couponStateVo.getOriginalPrice() == null
// || couponStateVo.getOriginalPrice() == 0)) {
// continue;
// }
//
// // 过滤折扣券为0折得
// if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_3.getCode())
// && (couponStateVo.getDiscount() == null
// || couponStateVo.getDiscount() == 0)) {
// continue;
// }
ActivityCouponBean activityCouponBean = new ActivityCouponBean();
activityCouponBean.setCouponCode(couponStateVo.getCouponCode());
GetMemberCouponListResponseDto.Result.MemberCoupon memberCoupon = memberCouponMap.get(couponStateVo.getCouponCode());
if (memberCoupon != null) {
activityCouponBean.setCouponName(memberCoupon.getCouponName());
activityCouponBean.setEndTime(memberCoupon.getEndTime());
if (Objects.equals(couponStateVo.getCouponType(), CouponTypeEnum.TYPE_1.getCode())) {
activityCouponBean.setDiscountAmount(couponStateVo.getOriginalPrice() + "");
}
activityCouponBean.setThresholdDesc("满" + formatAmount((couponStateVo.getMinAmount() == null ? 0 : couponStateVo.getMinAmount()) * 1.00 / 100) + "元可用");
activityCouponBean.setActivityDesc("不与其他活动优惠同时享受。");
activityCouponBean.setUnusedReason(couponStateVo.getRemark());
// 详情
GetMemberCouponListResponseVo.MemberCouponDetail detail = new GetMemberCouponListResponseVo.MemberCouponDetail();
detail.setActivityName(memberCoupon.getCouponName());
String startDate = DateUtil.convert2String(DateUtil.convert2Date(memberCoupon.getStartTime(), DateUtil.FORMAT_yyyyMMdd_date), DateUtil.FORMAT_yyyyMMdd_date).replace("-", ".");
String endDate = DateUtil.convert2String(DateUtil.convert2Date(memberCoupon.getEndTime(), DateUtil.FORMAT_yyyyMMdd_date), DateUtil.FORMAT_yyyyMMdd_date).replace("-", ".");
detail.setEndTime(endDate);
detail.setStartTime(startDate);
String remark = memberCoupon.getActiveDesc();
detail.setRemark(couponAdapter.getDescribeText(remark));
if (Objects.equals(couponStateVo.getCouponType(), CouponTypeEnum.TYPE_1.getCode())) {
detail.setAmountDesc("满" + formatAmount((couponStateVo.getMinAmount() == null ? 0 : couponStateVo.getMinAmount()) * 1.00 / 100) + "元减" + formatAmount((couponStateVo.getOriginalPrice() == null ? 0 : couponStateVo.getOriginalPrice()) * 1.00 / 100) + "元");
}
// 设置条形码
GetCouponBarCodeResponseVo responseVo = this.getCouponBarCode(couponStateVo.getCouponCode());
detail.setCouponBarCode(responseVo.getBase64Image());
activityCouponBean.setDetail(detail);
activityCouponBean.setActivityCode(memberCoupon.getActivityCode());
activityCouponBean.setCouponType(couponStateVo.getCouponType());
activityCouponBean.setDateDescribe(couponAdapter.getDateDescribe(memberCoupon.getStatus(), memberCoupon.getStartTime(), memberCoupon.getEndTime()));
// 券状态 0 可用 1 不可用 2 限制可用
if (Objects.equals(activityCouponBean.getCouponCode(), couponCode)) {
activityCouponBean.setSelected(YesOrNoEnum.YES.getCode());
} else {
activityCouponBean.setSelected(YesOrNoEnum.NO.getCode());
}
usableCoupons.add(activityCouponBean);
usableCouponNum = usableCouponNum + 1;
}
}
availableCouponResponseVo.setCouponNum(disableCouponNum + usableCouponNum);
availableCouponResponseVo.setDisableCouponNum(disableCouponNum);
availableCouponResponseVo.setUsableCouponNum(usableCouponNum);
availableCouponResponseVo.setDisableCoupons(null);
availableCouponResponseVo.setUsableCoupons(usableCoupons);
return availableCouponResponseVo;
}
public GetCouponBarCodeResponseVo getCouponBarCode(String couponCode) {
byte[] bytes = BarcodeUtil.generateBarCode128(couponCode, 6D, null, true, false);
String base64Image = Base64.getEncoder().encodeToString(bytes);
......
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