|
@@ -4170,6 +4170,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
|
|
|
// 查询商品表
|
|
// 查询商品表
|
|
List<GoodsEntity> goodsEntities = goodsService.queryGoodsStockByQueryGoodsVoList(goodsVos);
|
|
List<GoodsEntity> goodsEntities = goodsService.queryGoodsStockByQueryGoodsVoList(goodsVos);
|
|
|
|
+ Map<String, GoodsEntity> goodsMap = goodsEntities.stream().collect(Collectors.toMap(GoodsEntity::getSku, Function.identity(), (k1, k2) -> k2));
|
|
|
|
|
|
/*
|
|
/*
|
|
* 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
|
|
* 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
|
|
@@ -4209,7 +4210,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
|
|
|
List<Integer> brandIdList = goodsEntities.stream().map(GoodsEntity::getBrandId).collect(Collectors.toList());
|
|
List<Integer> brandIdList = goodsEntities.stream().map(GoodsEntity::getBrandId).collect(Collectors.toList());
|
|
List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
|
|
List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
|
|
- // 活动互斥标识
|
|
|
|
|
|
+ // 活动标识
|
|
AtomicBoolean activityFlag = new AtomicBoolean(true);
|
|
AtomicBoolean activityFlag = new AtomicBoolean(true);
|
|
// 限时特价活动标识
|
|
// 限时特价活动标识
|
|
AtomicBoolean promotionActivityFlag = new AtomicBoolean(false);
|
|
AtomicBoolean promotionActivityFlag = new AtomicBoolean(false);
|
|
@@ -4235,7 +4236,7 @@ public class OrderServiceImpl implements OrderService {
|
|
}
|
|
}
|
|
Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic.toUpperCase());
|
|
Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic.toUpperCase());
|
|
// 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
|
|
// 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
|
|
- if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX && activityFlag.get()) {
|
|
|
|
|
|
+ if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX) {
|
|
// 判断商品是否符合限时特价活动要求
|
|
// 判断商品是否符合限时特价活动要求
|
|
List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
|
|
List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
|
|
if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
|
|
if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
|
|
@@ -4252,26 +4253,23 @@ public class OrderServiceImpl implements OrderService {
|
|
if (!org.springframework.util.StringUtils.isEmpty(rejectScore) && Constants.PromotionActivityRejectEnum.REJECT.getCode().equals(rejectScore)) {
|
|
if (!org.springframework.util.StringUtils.isEmpty(rejectScore) && Constants.PromotionActivityRejectEnum.REJECT.getCode().equals(rejectScore)) {
|
|
promotionSkuList.add(entityGoodsSn);
|
|
promotionSkuList.add(entityGoodsSn);
|
|
}
|
|
}
|
|
- goodsEntities.forEach(goodsEntity -> {
|
|
|
|
- String sku = goodsEntity.getSku();
|
|
|
|
- String prodBarcode = goodsEntity.getProdBarcode();
|
|
|
|
- String storeId2 = String.valueOf(goodsEntity.getStoreId());
|
|
|
|
- BigDecimal retailPrice = goodsEntity.getRetailPrice();
|
|
|
|
- if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId2)) {
|
|
|
|
- GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
|
|
|
|
|
|
+ goodsDetailsDtos.forEach(goodsDetailsDto -> {
|
|
|
|
+ String sku = goodsDetailsDto.getSku();
|
|
|
|
+ String prodBarcode = goodsDetailsDto.getProdBarcode();
|
|
|
|
+ BigDecimal retailPrice = goodsDetailsDto.getRetailPrice();
|
|
|
|
+ if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId)) {
|
|
|
|
+ GoodsEntity goodsEntity = goodsMap.get(sku);
|
|
BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
|
|
BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
|
|
- BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
|
|
|
|
goodsDetailsDto.setActualPaymentAmount(activityPrice);
|
|
goodsDetailsDto.setActualPaymentAmount(activityPrice);
|
|
goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
|
|
goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
|
|
goodsDetailsDto.setActivity(Constants.ActivityTopicEnum.LSCX.getTopicName());
|
|
goodsDetailsDto.setActivity(Constants.ActivityTopicEnum.LSCX.getTopicName());
|
|
goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
|
|
goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
|
|
- goodsDetailsDtos.add(goodsDetailsDto);
|
|
|
|
activityFlag.set(false);
|
|
activityFlag.set(false);
|
|
promotionActivityFlag.set(true);
|
|
promotionActivityFlag.set(true);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
- } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ && activityFlag.get()) {
|
|
|
|
|
|
+ } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ) {
|
|
// 判断商品是否符合满赠活动要求
|
|
// 判断商品是否符合满赠活动要求
|
|
MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
|
|
MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
|
|
if (Objects.isNull(mkActivitiesFullGiftEntity)) {
|
|
if (Objects.isNull(mkActivitiesFullGiftEntity)) {
|
|
@@ -4350,7 +4348,7 @@ public class OrderServiceImpl implements OrderService {
|
|
throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
|
|
throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHQ && activityFlag.get()) {
|
|
|
|
|
|
+ } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHQ) {
|
|
// 判断商品是否符合优惠券活动要求
|
|
// 判断商品是否符合优惠券活动要求
|
|
List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryListByMkaIdAndStoreId(mkaId, storeId);
|
|
List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryListByMkaIdAndStoreId(mkaId, storeId);
|
|
if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
|
|
if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
|
|
@@ -4468,6 +4466,20 @@ public class OrderServiceImpl implements OrderService {
|
|
throw new ServiceException(String.format("未知的活动类型:【%s,%s】,请检查活动设置!!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
|
|
throw new ServiceException(String.format("未知的活动类型:【%s,%s】,请检查活动设置!!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+ orderTotalPrice = BigDecimal.ZERO;
|
|
|
|
+ for (GoodsDetailsDto good : goodsDetailsDtos) {
|
|
|
|
+ QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
|
|
|
|
+ BeanUtils.copyProperties(good, queryGoodsVo);
|
|
|
|
+ queryGoodsVo.setSku(good.getGoodsSn());
|
|
|
|
+ queryGoodsVo.setStoreId(Long.parseLong(storeId));
|
|
|
|
+ queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
|
|
|
|
+ queryGoodsVo.setTotalPrice(good.getActualPaymentAmount());
|
|
|
|
+ orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
|
|
|
|
+ goodsVos.add(queryGoodsVo);
|
|
|
|
+ }
|
|
|
|
+ calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
|
|
|
|
+ calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
|
|
|
|
+
|
|
|
|
|
|
// 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
|
|
// 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
|
|
if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
|
|
if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
|
|
@@ -4501,7 +4513,7 @@ public class OrderServiceImpl implements OrderService {
|
|
Integer score = memberInfoDTO.getScore();
|
|
Integer score = memberInfoDTO.getScore();
|
|
if (Objects.nonNull(score) && score > 0) {
|
|
if (Objects.nonNull(score) && score > 0) {
|
|
// 有积分
|
|
// 有积分
|
|
- afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList);
|
|
|
|
|
|
+ afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, activityFlag, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList);
|
|
LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
|
|
LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
|
|
calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
|
|
calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
|
|
calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
|
|
calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
|
|
@@ -4534,6 +4546,7 @@ public class OrderServiceImpl implements OrderService {
|
|
* @param score 积分
|
|
* @param score 积分
|
|
* @param memberCode 会员码
|
|
* @param memberCode 会员码
|
|
* @param goodsDetailsDtos 订单商品详情
|
|
* @param goodsDetailsDtos 订单商品详情
|
|
|
|
+ * @param activityFlag 是否参加过活动
|
|
* @param calculateOrderDiscountPriceResponseVO 响应数据
|
|
* @param calculateOrderDiscountPriceResponseVO 响应数据
|
|
* @param promotionSkuList 参与了限时特价活动并且与积分抵扣互斥的sku集合
|
|
* @param promotionSkuList 参与了限时特价活动并且与积分抵扣互斥的sku集合
|
|
*
|
|
*
|
|
@@ -4542,6 +4555,7 @@ public class OrderServiceImpl implements OrderService {
|
|
private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice,
|
|
private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice,
|
|
Integer score,
|
|
Integer score,
|
|
String memberCode,
|
|
String memberCode,
|
|
|
|
+ AtomicBoolean activityFlag,
|
|
CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO,
|
|
CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO,
|
|
List<GoodsDetailsDto> goodsDetailsDtos,
|
|
List<GoodsDetailsDto> goodsDetailsDtos,
|
|
List<String> promotionSkuList) {
|
|
List<String> promotionSkuList) {
|
|
@@ -4616,6 +4630,7 @@ public class OrderServiceImpl implements OrderService {
|
|
BigDecimal scoreLimitDecimal = skuScoreLimitMap.get(sku);
|
|
BigDecimal scoreLimitDecimal = skuScoreLimitMap.get(sku);
|
|
String prodBarcode = goodsDetailsDto.getProdBarcode();
|
|
String prodBarcode = goodsDetailsDto.getProdBarcode();
|
|
BigDecimal retailPrice = goodsDetailsDto.getRetailPrice();
|
|
BigDecimal retailPrice = goodsDetailsDto.getRetailPrice();
|
|
|
|
+ BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
|
|
// 计算抵扣,当商品不是最后一个商品
|
|
// 计算抵扣,当商品不是最后一个商品
|
|
if (i < index) {
|
|
if (i < index) {
|
|
// 商品总价
|
|
// 商品总价
|
|
@@ -4627,7 +4642,7 @@ public class OrderServiceImpl implements OrderService {
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
|
|
goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
|
|
- goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
|
|
|
|
|
|
+ goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
|
|
}
|
|
}
|
|
// 订单商品详情最后一个商品并且详情不止一个商品
|
|
// 订单商品详情最后一个商品并且详情不止一个商品
|
|
if (i == index && size > 1) {// 商品总价
|
|
if (i == index && size > 1) {// 商品总价
|
|
@@ -4637,13 +4652,13 @@ public class OrderServiceImpl implements OrderService {
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
|
|
goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
|
|
- goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
|
|
|
|
|
|
+ goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
|
|
}
|
|
}
|
|
// 订单商品详情只有一个商品的情况下
|
|
// 订单商品详情只有一个商品的情况下
|
|
if (size == 1) {
|
|
if (size == 1) {
|
|
shareScore = scoreIntegerDecimal;
|
|
shareScore = scoreIntegerDecimal;
|
|
// 3-1. 计算总价的50%,百分比可以进行设置,算出整数(向下取整)
|
|
// 3-1. 计算总价的50%,百分比可以进行设置,算出整数(向下取整)
|
|
- BigDecimal halfPrice = orderTotalPrice.multiply(scoreLimitDecimal).setScale(0, BigDecimal.ROUND_FLOOR);
|
|
|
|
|
|
+ BigDecimal halfPrice = orderTotalPrice.multiply(new BigDecimal("0.5")).setScale(0, BigDecimal.ROUND_FLOOR);
|
|
// 3-3. 计算积分抵扣后的价格
|
|
// 3-3. 计算积分抵扣后的价格
|
|
BigDecimal discountedPrice = scoreMayDeductionPriceDecimal;
|
|
BigDecimal discountedPrice = scoreMayDeductionPriceDecimal;
|
|
if (halfPrice.compareTo(discountedPrice) <= 0) {
|
|
if (halfPrice.compareTo(discountedPrice) <= 0) {
|
|
@@ -4653,7 +4668,7 @@ public class OrderServiceImpl implements OrderService {
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDiscountedPrice(discountedPrice);
|
|
goodsDetailsDto.setDeductionScore(shareScore.intValue());
|
|
goodsDetailsDto.setDeductionScore(shareScore.intValue());
|
|
- goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
|
|
|
|
|
|
+ goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
|
|
}
|
|
}
|
|
LOGGER.info("--------------------------------------------------------");
|
|
LOGGER.info("--------------------------------------------------------");
|
|
LOGGER.info("【计算优惠价】sku:【{}】,条码:【{}】积分抵扣{}元,抵扣积分{}分", sku, prodBarcode, goodsDetailsDto.getDiscountedPrice(), shareScore.intValue());
|
|
LOGGER.info("【计算优惠价】sku:【{}】,条码:【{}】积分抵扣{}元,抵扣积分{}分", sku, prodBarcode, goodsDetailsDto.getDiscountedPrice(), shareScore.intValue());
|