Commit 85b64ab9 by huiyang.chen

满减和优化券优化分摊

parent 47abaae0
......@@ -32,16 +32,23 @@ import java.util.stream.Collectors;
*/
public class PromotionAdapter {
public static ShoppingCartGoodsResponse.CartGoodsDetailDto convertCartGoods2DetailGoods(OrderBeanRequest.ProductBean orderProductBean, int originalDiscountAmount, List<CalculationApportionGoodsDto> apportionGoodsList, Map<String, String> duplicateGoodsMap) {
public static ShoppingCartGoodsResponse.CartGoodsDetailDto convertCartGoods2DetailGoods(OrderBeanRequest.ProductBean orderProductBean, int originalDiscountAmount, List<CalculationApportionGoodsDto> apportionGoodsList, Map<String, String> duplicateGoodsMap,Boolean isApportion) {
Integer totalDiscount = originalDiscountAmount;
List<CalculationApportionGoodsDto> apportionGoodsByGoodsId = apportionGoodsList.stream().filter(a -> ObjectUtils.equals(orderProductBean.getProductId(), a.getGoodsId())).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(apportionGoodsByGoodsId)) {
Long discountPrice = 0L;
int goodsTotalQty = apportionGoodsList.stream().mapToInt(CalculationApportionGoodsDto::getGoodsQuantity).sum();
for(CalculationApportionGoodsDto apportionGoods : apportionGoodsByGoodsId) {
if (isApportion) {
discountPrice += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_2.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum() * orderProductBean.getNumber() / goodsTotalQty;
}else {
discountPrice += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_2.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_12.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_3.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum() * orderProductBean.getNumber() / goodsTotalQty;
}
}
String currentGoodsIdMap = duplicateGoodsMap.get(orderProductBean.getProductId());
if(currentGoodsIdMap != null) {
......@@ -54,9 +61,16 @@ public class PromotionAdapter {
//最后一行
Long totalDiscountAmount = 0L;
for (CalculationApportionGoodsDto apportionGoods : apportionGoodsByGoodsId) {
if (isApportion) {
totalDiscountAmount += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_2.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum();
}else {
totalDiscountAmount += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_12.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_3.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum();
}
}
//折扣为:总折扣金额-已折扣金额
discountPrice = totalDiscountAmount - Integer.parseInt(value[1]);
......@@ -64,7 +78,7 @@ public class PromotionAdapter {
}
totalDiscount += discountPrice.intValue();
}
return convertCartGoods2DetailGoodsCommon(orderProductBean, totalDiscount, apportionGoodsByGoodsId);
return convertCartGoods2DetailGoodsCommon(orderProductBean, totalDiscount, apportionGoodsByGoodsId, isApportion);
}
public static List<ShoppingCartGoodsResponse.CartGoodsDetailDto> convertCartGoods2DetailGoods(List<OrderBeanRequest.ProductBean> comboFixedProductList, Long totalDiscountAmount) {
......@@ -84,20 +98,20 @@ public class PromotionAdapter {
for (OrderBeanRequest.ProductBean comboProduct : comboFixedProductList) {
//获取当前套餐可选或固定商品的均摊价格
if (size-- == 1) {
result.add(convertCartGoods2DetailGoodsCommon(comboProduct, totalDiscountAmount.intValue() - tempDiscount, null));
result.add(convertCartGoods2DetailGoodsCommon(comboProduct, totalDiscountAmount.intValue() - tempDiscount, null,true));
} else {
Long currentDiscountAmount = (comboProduct.getNumber() * comboProduct.getPrice() * totalDiscountAmount) / totalOriginalPrice;
if(Objects.equals(comboProduct.getProductType(), ProductTypeEnum.WEIGHT_PRODUCT.getCode())) {
currentDiscountAmount = new BigDecimal(comboProduct.getPrice()+"").multiply(comboProduct.getWeight()).longValue() * totalDiscountAmount / totalOriginalPrice;
}
tempDiscount += currentDiscountAmount.intValue();
result.add(convertCartGoods2DetailGoodsCommon(comboProduct, currentDiscountAmount.intValue(), null));
result.add(convertCartGoods2DetailGoodsCommon(comboProduct, currentDiscountAmount.intValue(), null,true));
}
}
return result;
}
public static ShoppingCartGoodsResponse.CartGoodsDetailDto convertCartGoods2DetailGoodsCommon(OrderBeanRequest.ProductBean orderProductBean, Integer totalDiscountAmount, List<CalculationApportionGoodsDto> apportionGoodsList) {
public static ShoppingCartGoodsResponse.CartGoodsDetailDto convertCartGoods2DetailGoodsCommon(OrderBeanRequest.ProductBean orderProductBean, Integer totalDiscountAmount, List<CalculationApportionGoodsDto> apportionGoodsList,Boolean isApportion) {
ShoppingCartGoodsResponse.CartGoodsDetailDto cartGoodsDetailDto = new ShoppingCartGoodsResponse.CartGoodsDetailDto();
cartGoodsDetailDto.setProductId(orderProductBean.getProductId());
cartGoodsDetailDto.setOriginalPrice(orderProductBean.getPrice());
......@@ -120,7 +134,7 @@ public class PromotionAdapter {
}
if(CollectionUtils.isNotEmpty(apportionGoodsList)) {
List<CalculationApportionGoodsDto> apportionGoodsByGoodsId = apportionGoodsList.stream().filter(a -> ObjectUtils.equals(orderProductBean.getProductId(), a.getGoodsId())).collect(Collectors.toList());
setActivityDiscounts(apportionGoodsByGoodsId, cartGoodsDetailDto);
setActivityDiscounts(apportionGoodsByGoodsId, cartGoodsDetailDto,isApportion);
}
return cartGoodsDetailDto;
}
......@@ -135,7 +149,7 @@ public class PromotionAdapter {
}
}
private static void setActivityDiscounts(List<CalculationApportionGoodsDto> apportionGoodsList, ShoppingCartGoodsResponse.CartGoodsDetailDto cartGoodsDetailDto) {
private static void setActivityDiscounts(List<CalculationApportionGoodsDto> apportionGoodsList, ShoppingCartGoodsResponse.CartGoodsDetailDto cartGoodsDetailDto, Boolean isApportion) {
if(CollectionUtils.isEmpty(apportionGoodsList)) {
return;
}
......@@ -146,8 +160,15 @@ public class PromotionAdapter {
* 1. 商品券:cartGoodsDetailDto.couponCode非空,保留ApportionGoods#ApportionDetails#apportionType中32的
* 2. 普通商品:cartGoodsDetailDto.couponCode空,去掉32的
*/
List<CalculationApportionDetailDto> apportionDetails = apportionGoods.getApportionDetails().stream().filter(detail -> !detail.getActivityType().equals(ActivityTypeEnum.TYPE_32.getCode())
List<CalculationApportionDetailDto> apportionDetails =new ArrayList<>();
if (isApportion) {
apportionDetails = apportionGoods.getApportionDetails().stream().filter(detail -> !detail.getActivityType().equals(ActivityTypeEnum.TYPE_32.getCode())
&& !detail.getActivityType().equals(ActivityTypeEnum.TYPE_104.getCode()) && !detail.getActivityType().equals(ActivityTypeEnum.TYPE_2.getCode())).collect(Collectors.toList());
}else {
apportionDetails = apportionGoods.getApportionDetails().stream().filter(detail -> !detail.getActivityType().equals(ActivityTypeEnum.TYPE_32.getCode())
&& !detail.getActivityType().equals(ActivityTypeEnum.TYPE_104.getCode()) && !detail.getActivityType().equals(ActivityTypeEnum.TYPE_2.getCode())
&& ObjectUtils.notEqual(ActivityTypeEnum.TYPE_12.getCode(), detail.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_3.getCode(), detail.getActivityType())).collect(Collectors.toList());
}
for (CalculationApportionDetailDto detail : apportionDetails) {
List<ActivityDiscountsDto> currentDiscount = activityDiscountsDtoList.stream().filter(discount -> ObjectUtils.equals(discount.getActivityCode(), detail.getActivityCode())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(currentDiscount)) {
......
......@@ -23,5 +23,5 @@ public interface IPromotionService {
/**
* 优惠计算和均摊
*/
void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto);
void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto, Boolean isApportion);
}
......@@ -66,7 +66,7 @@ public class ActivityCalculationDiscountService {
private CustomerScoreService customerScoreService;
public ShoppingCartGoodsResponse updateDiscountApportion(OrderBeanRequest request, CouponPromotionDto couponPromotionDto) {
public ShoppingCartGoodsResponse updateDiscountApportion(OrderBeanRequest request, CouponPromotionDto couponPromotionDto,Boolean isApportion) {
ShoppingCartGoodsResponse shoppingCartGoodsResponse = new ShoppingCartGoodsResponse();
List<CalculationCouponDto> coupons = new ArrayList<>();
......@@ -87,17 +87,17 @@ public class ActivityCalculationDiscountService {
CalculationDiscountResultDto calculationDiscountResultDto = getCalculationResult(request, coupons);
// 默认计算
defaultPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
defaultPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
// 套餐计算
setMealPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
setMealPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
// 优惠券计算
couponPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
couponPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
// 满减
fullPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
fullPromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
// 限时特价
timeSalePromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
timeSalePromotionService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
// 积分抵扣
customerScoreService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto);
customerScoreService.updateDiscountApportion(shoppingCartGoodsResponse, request, calculationDiscountResultDto, couponPromotionDto, activityQueryDto, isApportion);
return shoppingCartGoodsResponse;
}
......
......@@ -25,7 +25,7 @@ public class CouponPromotionService implements IPromotionService {
@Autowired
private CouponService couponService;
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto,Boolean isApportion) {
// 用户选择了查询优惠券信息
if (couponPromotionDto != null && ObjectUtils.equals(CouponFlag.YES.getCode(), couponPromotionDto.getFlg())) {
// 是否存在商品券
......
......@@ -37,7 +37,7 @@ public class CustomerScoreService implements IPromotionService {
private CustomScoreClient customScoreClient;
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto,Boolean isApportion) {
if (request == null || request.getUseCustomerScore() == null || request.getUseCustomerScore() == null || request.getUseCustomerScore().equals(CustomerScoreConstant.NO_DISPLAY.getValue())) {
return;
}
......
......@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
public class DefaultPromotionService implements IPromotionService {
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto,Boolean isApportion) {
// 总原价
Long originalTotalAmount = 0L;
// 总折扣
......@@ -76,7 +76,7 @@ public class DefaultPromotionService implements IPromotionService {
if (Objects.equals(productBean.getProductType(), ProductTypeEnum.WEIGHT_PRODUCT.getCode())) {
originalDiscountAmount = new BigDecimal(productBean.getPrice()+"").multiply(productBean.getWeight()).longValue() - productBean.getSettlementPrice();
}
cartGoodsDetailDtoList.add(PromotionAdapter.convertCartGoods2DetailGoods(productBean, originalDiscountAmount.intValue(), apportionGoodsList, duplicateGoodsMap));
cartGoodsDetailDtoList.add(PromotionAdapter.convertCartGoods2DetailGoods(productBean, originalDiscountAmount.intValue(), apportionGoodsList, duplicateGoodsMap,isApportion));
}
}
......
......@@ -382,7 +382,8 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
payIsArouseStatus = 0;
OrderBeanRequest orderBeanRequest = orderAdapter.conventOrderBeanRequest(queryOrderByIdResponse.getData(), assortmentCustomerInfoVo,createReserveOrderVo);
CouponPromotionDto couponPromotionDto = couponAdapter.getCouponPromotionDto(orderBeanRequest, createReserveOrderVo.getCouponCode(), createReserveOrderVo.getActivityCode(), CouponFlag.YES.getCode());
ShoppingCartGoodsResponse shoppingCartGoodsResponse = calculationDiscountService.updateDiscountApportion(orderBeanRequest, couponPromotionDto);
//新增是否需要分摊计算优化金额,满减和优化券不进行优惠分摊
ShoppingCartGoodsResponse shoppingCartGoodsResponse = calculationDiscountService.updateDiscountApportion(orderBeanRequest, couponPromotionDto,false);
calculationDiscountService.updatePreviewOrderInfoVo(previewOrderInfoVo, shoppingCartGoodsResponse);
}
//是否唤起支付
......@@ -445,7 +446,7 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
if (!prePayLock) {
OrderBeanRequest orderBeanRequest = orderAdapter.conventOrderBeanRequest(queryOrderByIdResponse.getData(), assortmentCustomerInfoVo,createReserveOrderVo);
CouponPromotionDto couponPromotionDto = couponAdapter.getCouponPromotionDto(orderBeanRequest, createReserveOrderVo.getCouponCode(), createReserveOrderVo.getActivityCode(), CouponFlag.YES.getCode());
shoppingCartGoodsResponse = calculationDiscountService.updateDiscountApportion(orderBeanRequest, couponPromotionDto);
shoppingCartGoodsResponse = calculationDiscountService.updateDiscountApportion(orderBeanRequest, couponPromotionDto,true);
}
boolean isUpdateAccounts = CollectionUtils.isEmpty(queryOrderByIdResponse.getData().getAccountList());
AssortmentSdkUpdateOrderProductInfoRequest request = orderAdapter.conventShoppingPromotionInfo(shoppingCartGoodsResponse, queryOrderByIdResponse, assortmentCustomerInfoVo, isUpdateAccounts,createReserveOrderVo);
......
......@@ -27,7 +27,7 @@ public class FullPromotionService implements IPromotionService {
private ActivityService activityService;
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto,Boolean isApportion) {
this.buildActivityTip(shoppingCartGoodsResponse, calculationDiscountResult, activityQueryDto);
List<CalculationGoodsActivityDto> discountList = (calculationDiscountResult == null || calculationDiscountResult.getDiscounts() == null) ? new ArrayList<>() : calculationDiscountResult.getDiscounts();
......
......@@ -34,7 +34,7 @@ import java.util.stream.Collectors;
@Service
public class SetMealPromotionService implements IPromotionService {
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto ,Boolean isApportion) {
// 套餐商品
List<OrderBeanRequest.ProductBean> setMealProducts = request.getProductList().stream()
.filter(productBean -> {
......@@ -69,7 +69,7 @@ public class SetMealPromotionService implements IPromotionService {
Long productGroupDiscountAmount = productBean.getComboProduct().stream().filter(t -> !t.getIsFixedProduct()).mapToLong(t -> t.getPrice() * t.getNumber() - t.getSettlementPrice()).sum();
totalDiscountAmount += discountAmount - productGroupDiscountAmount;
// 设置套餐主商品
ShoppingCartGoodsResponse.CartGoodsDetailDto cartGoodsDetailDto = PromotionAdapter.convertCartGoods2DetailGoods(productBean, discountAmount.intValue(), apportionGoodsList, duplicateGoodsMap);
ShoppingCartGoodsResponse.CartGoodsDetailDto cartGoodsDetailDto = PromotionAdapter.convertCartGoods2DetailGoods(productBean, discountAmount.intValue(), apportionGoodsList, duplicateGoodsMap,true);
cartGoodsDetailDto.getActivityDiscountsDtos().add(getActivityDiscountsDto(discountAmount.intValue() - productGroupDiscountAmount.intValue()));
long apportionAmount = cartGoodsDetailDto.getTotalDiscountAmount() - discountAmount;
Long comboFixedProductTotalDiscountAmount = discountAmount - productGroupDiscountAmount + apportionAmount;
......
......@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
public class TimeSalePromotionService implements IPromotionService {
@Override
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto) {
public void updateDiscountApportion(ShoppingCartGoodsResponse shoppingCartGoodsResponse, OrderBeanRequest request, CalculationDiscountResultDto calculationDiscountResult, CouponPromotionDto couponPromotionDto, ActivityQueryDto activityQueryDto,Boolean isApportion) {
if (calculationDiscountResult == null || CollectionUtils.isEmpty(calculationDiscountResult.getDiscounts())
|| CollectionUtils.isEmpty(shoppingCartGoodsResponse.getProducts())
|| !calculationDiscountResult.getDiscounts().stream().anyMatch(discount -> ActivityTypeEnum.TYPE_2.getCode().equals(discount.getType()))) {
......@@ -58,7 +58,10 @@ public class TimeSalePromotionService implements IPromotionService {
if ((goods = goodsMap.get(product.getProductId())) == null) {
continue;
}
CalculationGoodsActivityDto goodsDiscount = getGoodsDiscount(goods.getDiscounts(), ActivityTypeEnum.TYPE_2);
CalculationGoodsActivityDto goodsDiscount =null;
if (isApportion){
goodsDiscount = getGoodsDiscount(goods.getDiscounts(), ActivityTypeEnum.TYPE_2);
}
if (goodsDiscount == null) {
continue;
}
......
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