Commit d95fdfe1 by shuhu.hou@freemud.cn

Merge branch 'feature/20191119_套餐特价'

parents 75ec00c5 36dc5151
...@@ -153,12 +153,16 @@ public class ShoppingCartConvertAdapter { ...@@ -153,12 +153,16 @@ public class ShoppingCartConvertAdapter {
* *
* @param apportionGoodsList 促销均摊列表 * @param apportionGoodsList 促销均摊列表
* @param cartGoodsDetailDto 当前商品行 * @param cartGoodsDetailDto 当前商品行
* @param duplicateGoodsMap 当前商品行 此map是为了促销除不尽时,拆商品行所用,例如,3份折扣10元
* key为:goodsId;value以逗号分割:0为goodsId分组对应的数量,value为已计算的折扣金额
*
*/ */
private void setTotalDiscountAndSalePrice(List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoodsList, ShoppingCartGoodsDto.CartGoodsDetailDto cartGoodsDetailDto, Map<String, String> duplicateGoodsMap) { private void setTotalDiscountAndSalePrice(List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoodsList, ShoppingCartGoodsDto.CartGoodsDetailDto cartGoodsDetailDto, Map<String, String> duplicateGoodsMap) {
Long originalPrice = cartGoodsDetailDto.getOriginalPrice(); Long originalPrice = cartGoodsDetailDto.getOriginalPrice();
Long discountPrice = 0L; Long discountPrice = 0L;
int goodsTotalQty = apportionGoodsList.stream().mapToInt(apportionGoods -> apportionGoods.getGoodsQuantity()).sum(); int goodsTotalQty = apportionGoodsList.stream().mapToInt(apportionGoods -> apportionGoods.getGoodsQuantity()).sum();
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods apportionGoods : apportionGoodsList) { for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods apportionGoods : apportionGoodsList) {
//折扣=所有折扣和*百分比(当前行商品数量/购物车总商品数量)
discountPrice += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType()) 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_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_2.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum() * cartGoodsDetailDto.getQty() / goodsTotalQty; ).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum() * cartGoodsDetailDto.getQty() / goodsTotalQty;
...@@ -166,17 +170,20 @@ public class ShoppingCartConvertAdapter { ...@@ -166,17 +170,20 @@ public class ShoppingCartConvertAdapter {
String currentGoodsIdMap = duplicateGoodsMap.get(cartGoodsDetailDto.getSkuId()); String currentGoodsIdMap = duplicateGoodsMap.get(cartGoodsDetailDto.getSkuId());
if (currentGoodsIdMap != null) { if (currentGoodsIdMap != null) {
String[] value = currentGoodsIdMap.split(","); String[] value = currentGoodsIdMap.split(",");
//不是最后一行商品,折扣为discountPrice
if (Integer.parseInt(value[0]) > 1) { if (Integer.parseInt(value[0]) > 1) {
int totalDiscountPrice = Integer.parseInt(value[1]) + discountPrice.intValue(); int totalDiscountPrice = Integer.parseInt(value[1]) + discountPrice.intValue();
int index = Integer.parseInt(value[0]) - 1; int index = Integer.parseInt(value[0]) - 1;
duplicateGoodsMap.put(cartGoodsDetailDto.getSkuId(), String.format("%s,%s", index, totalDiscountPrice)); duplicateGoodsMap.put(cartGoodsDetailDto.getSkuId(), String.format("%s,%s", index, totalDiscountPrice));
} else { } else {
//最后一行
Long totalDiscountAmount = 0L; Long totalDiscountAmount = 0L;
for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods apportionGoods : apportionGoodsList) { for (ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods apportionGoods : apportionGoodsList) {
totalDiscountAmount += apportionGoods.getApportionDetails().stream().filter(d -> ObjectUtils.notEqual(ActivityTypeEnum.TYPE_32.getCode(), d.getActivityType()) 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()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_104.getCode(), d.getActivityType()) && ObjectUtils.notEqual(ActivityTypeEnum.TYPE_2.getCode(), d.getActivityType())
).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum(); ).mapToLong(t -> t.getActivityApportionAmount() * apportionGoods.getGoodsQuantity()).sum();
} }
//折扣为:总折扣金额-已折扣金额
discountPrice = totalDiscountAmount - Integer.parseInt(value[1]); discountPrice = totalDiscountAmount - Integer.parseInt(value[1]);
} }
} }
......
...@@ -86,7 +86,12 @@ public class SetMealServiceImpl implements IPromotionService { ...@@ -86,7 +86,12 @@ public class SetMealServiceImpl implements IPromotionService {
List<ShoppingCartGoodsDto.CartGoodsDetailDto> cartGoodsDetailDtos = shoppingCartGoodsDto.getProducts(); List<ShoppingCartGoodsDto.CartGoodsDetailDto> cartGoodsDetailDtos = shoppingCartGoodsDto.getProducts();
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoods = calculationDiscountResult == null ? new ArrayList<>() List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoods = calculationDiscountResult == null ? new ArrayList<>()
: calculationDiscountResult.getApportionGoods(); : calculationDiscountResult.getApportionGoods();
// key为:goodsId;value以逗号分割:0为goodsId分组对应的数量,value为已计算的折扣金额
//此map是为了促销除不尽时,拆商品行所用,例如,3份折扣10元
Map<String, String> duplicateGoodsMap = new HashMap<>();
shoppingCartGoodsResponseVo.getProducts().stream().filter(product->ObjectUtils.equals(GoodsTypeEnum.SET_MEAL_GOODS.getGoodsType(), product.getGoodsType())).collect(Collectors.groupingBy(CartGoods::getGoodsId, Collectors.counting())).forEach((goodsId, count) -> {
duplicateGoodsMap.put(goodsId,String.format("%s,0", count));
});
// 套餐优惠明细 // 套餐优惠明细
for (CartGoods cartGoods : shoppingCartGoodsResponseVo.getProducts()) { for (CartGoods cartGoods : shoppingCartGoodsResponseVo.getProducts()) {
if (ObjectUtils.equals(GoodsTypeEnum.SET_MEAL_GOODS.getGoodsType(), cartGoods.getGoodsType())) { if (ObjectUtils.equals(GoodsTypeEnum.SET_MEAL_GOODS.getGoodsType(), cartGoods.getGoodsType())) {
...@@ -97,7 +102,7 @@ public class SetMealServiceImpl implements IPromotionService { ...@@ -97,7 +102,7 @@ public class SetMealServiceImpl implements IPromotionService {
int productGroupDiscountAmount = cartGoods.getProductGroupList().stream().mapToInt(t -> t.getFinalPrice().intValue() * t.getQty()).sum(); int productGroupDiscountAmount = cartGoods.getProductGroupList().stream().mapToInt(t -> t.getFinalPrice().intValue() * t.getQty()).sum();
totalDiscountAmount += discountAmount - productGroupDiscountAmount * cartGoods.getQty(); totalDiscountAmount += discountAmount - productGroupDiscountAmount * cartGoods.getQty();
// 添加套餐父商品 // 添加套餐父商品
ShoppingCartGoodsDto.CartGoodsDetailDto parentCartGoods = shoppingCartConvertAdapter.convertCartGoods2DetailGoods(cartGoods, apportionGoods,new HashMap<>()); ShoppingCartGoodsDto.CartGoodsDetailDto parentCartGoods = shoppingCartConvertAdapter.convertCartGoods2DetailGoods(cartGoods, apportionGoods,duplicateGoodsMap);
parentCartGoods.setTotalDiscountAmount(parentCartGoods.getTotalDiscountAmount()+ cartGoods.getOriginalAmount().intValue() - cartGoods.getAmount().intValue()); parentCartGoods.setTotalDiscountAmount(parentCartGoods.getTotalDiscountAmount()+ cartGoods.getOriginalAmount().intValue() - cartGoods.getAmount().intValue());
parentCartGoods.getActivityDiscountsDtos().add(getActivityDiscountsDto(discountAmount - productGroupDiscountAmount * cartGoods.getQty())); parentCartGoods.getActivityDiscountsDtos().add(getActivityDiscountsDto(discountAmount - productGroupDiscountAmount * cartGoods.getQty()));
// 添加套餐固定商品&可选商品: 做均摊 // 添加套餐固定商品&可选商品: 做均摊
......
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