限时折扣 互斥
This commit is contained in:
@@ -15,7 +15,7 @@ import com.czg.market.entity.MkDiscountActivity;
|
|||||||
public interface MkDiscountActivityService extends IService<MkDiscountActivity> {
|
public interface MkDiscountActivityService extends IService<MkDiscountActivity> {
|
||||||
Page<MkDiscountActivityDTO> getActivityPage(TimeQueryParam param, Long shopId);
|
Page<MkDiscountActivityDTO> getActivityPage(TimeQueryParam param, Long shopId);
|
||||||
|
|
||||||
MkDiscountActivityDTO checkDiscountAct(Long shopId, boolean couponShare, boolean vipShare, boolean pointsShare);
|
MkDiscountActivityDTO checkDiscountAct(Long shopId, boolean couponShare, boolean vipShare, boolean limitRateShare, boolean pointsShare);
|
||||||
|
|
||||||
MkDiscountActivityDTO getActivityByShopId(Long shopId);
|
MkDiscountActivityDTO getActivityByShopId(Long shopId);
|
||||||
|
|
||||||
|
|||||||
@@ -62,13 +62,18 @@ public class MkDiscountActivityServiceImpl extends ServiceImpl<MkDiscountActivit
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MkDiscountActivityDTO checkDiscountAct(Long shopId, boolean couponShare, boolean vipShare, boolean pointsShare) {
|
public MkDiscountActivityDTO checkDiscountAct(Long shopId, boolean couponShare, boolean vipShare, boolean limitRateShare, boolean pointsShare) {
|
||||||
MkDiscountActivityDTO activityDTO = getActivityByShopId(shopId);
|
MkDiscountActivityDTO activityDTO = getActivityByShopId(shopId);
|
||||||
AssertUtil.isNull(activityDTO, "店铺未配置满减活动");
|
AssertUtil.isNull(activityDTO, "店铺未配置满减活动");
|
||||||
//检查是否开启了优惠券抵扣
|
//检查是否开启了优惠券抵扣
|
||||||
if (couponShare && activityDTO.getCouponShare() == 0) {
|
if (couponShare && activityDTO.getCouponShare() == 0) {
|
||||||
throw new CzgException("满减活动与优惠券不可共用");
|
throw new CzgException("满减活动与优惠券不可共用");
|
||||||
}
|
}
|
||||||
|
//检查是否开启了限时折扣
|
||||||
|
if (limitRateShare && activityDTO.getDiscountShare() == 0) {
|
||||||
|
throw new CzgException("满减活动与限时折扣不可共用");
|
||||||
|
|
||||||
|
}
|
||||||
//检查是否开启了会员抵扣
|
//检查是否开启了会员抵扣
|
||||||
if (vipShare && activityDTO.getVipPriceShare() == 0) {
|
if (vipShare && activityDTO.getVipPriceShare() == 0) {
|
||||||
throw new CzgException("满减活动与会员价不可共用");
|
throw new CzgException("满减活动与会员价不可共用");
|
||||||
@@ -87,7 +92,7 @@ public class MkDiscountActivityServiceImpl extends ServiceImpl<MkDiscountActivit
|
|||||||
if (shopInfo.getIsEnableDiscount() == null || shopInfo.getIsEnableDiscount() == 0) {
|
if (shopInfo.getIsEnableDiscount() == null || shopInfo.getIsEnableDiscount() == 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
MkDiscountActivity activity = mapper.selectOneByShopId(shopId,CzgStrUtils.getStrWeek());
|
MkDiscountActivity activity = mapper.selectOneByShopId(shopId, CzgStrUtils.getStrWeek());
|
||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
if (!param.isFreeDine() && param.getDiscountActAmount().compareTo(BigDecimal.ZERO) > 0) {
|
if (!param.isFreeDine() && param.getDiscountActAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
//检查满减活动是否开启
|
//检查满减活动是否开启
|
||||||
discountAct = discountActService.checkDiscountAct(orderInfo.getShopId(),
|
discountAct = discountActService.checkDiscountAct(orderInfo.getShopId(),
|
||||||
CollUtil.isNotEmpty(param.getCouponList()), param.isVipPrice(),
|
CollUtil.isNotEmpty(param.getCouponList()), param.isVipPrice(), param.getLimitRate() != null,
|
||||||
param.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0);
|
param.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0);
|
||||||
}
|
}
|
||||||
orderInfo.setSeatNum(param.getSeatNum());
|
orderInfo.setSeatNum(param.getSeatNum());
|
||||||
@@ -425,10 +425,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
Map<Integer, MkShopCouponRecord> couponRecordMap = list.stream().collect(Collectors.toMap(MkShopCouponRecord::getType, t -> t));
|
Map<Integer, MkShopCouponRecord> couponRecordMap = list.stream().collect(Collectors.toMap(MkShopCouponRecord::getType, t -> t));
|
||||||
AtomicBoolean otherCouponShare = new AtomicBoolean(true);
|
AtomicBoolean otherCouponShare = new AtomicBoolean(true);
|
||||||
couponRecordMap.forEach((type, record) -> {
|
couponRecordMap.forEach((type, record) -> {
|
||||||
|
ShopCoupon coupon = checkCoupon(record, param.isVipPrice());
|
||||||
|
boolean isTimeDiscountShare = coupon.getDiscountShare() == 1;
|
||||||
//1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券, 6-买一送一券,
|
//1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券, 6-买一送一券,
|
||||||
// 7-固定价格券,8-免配送费券 暂时没有
|
// 7-固定价格券,8-免配送费券 暂时没有
|
||||||
if (type == 2) {//商品券z
|
if (type == 2) {//商品券z
|
||||||
ShopCoupon coupon = checkCoupon(record, param.isVipPrice());
|
|
||||||
if (coupon.getOtherCouponShare() != 1) {
|
if (coupon.getOtherCouponShare() != 1) {
|
||||||
otherCouponShare.set(false);
|
otherCouponShare.set(false);
|
||||||
}
|
}
|
||||||
@@ -443,12 +444,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
isAllFoods = false;
|
isAllFoods = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foodsCalculate(orderDetails, isAllFoods, couponFoodIds, coupon.getDiscountNum(), "price_asc".equals(coupon.getUseRule()), prodCouponAmount);
|
foodsCalculate(orderDetails, isAllFoods, couponFoodIds, coupon.getDiscountNum(),
|
||||||
|
isTimeDiscountShare, "price_asc".equals(coupon.getUseRule()), prodCouponAmount);
|
||||||
} else if (type == 4 || type == 6) {//4-第二件半价券, 6-买一送一券
|
} else if (type == 4 || type == 6) {//4-第二件半价券, 6-买一送一券
|
||||||
if (!otherCouponShare.get()) {
|
if (!otherCouponShare.get()) {
|
||||||
throw new ValidateException("生成支付订单失败,商品券与其它券不可共用");
|
throw new ValidateException("生成支付订单失败,商品券与其它券不可共用");
|
||||||
}
|
}
|
||||||
ShopCoupon coupon = checkCoupon(record, param.isVipPrice());
|
|
||||||
boolean isAllFoods = true;
|
boolean isAllFoods = true;
|
||||||
List<Long> couponFoodIds = new ArrayList<>();
|
List<Long> couponFoodIds = new ArrayList<>();
|
||||||
if (StrUtil.isNotBlank(coupon.getFoods()) && !",".equals(coupon.getFoods())) {
|
if (StrUtil.isNotBlank(coupon.getFoods()) && !",".equals(coupon.getFoods())) {
|
||||||
@@ -458,15 +459,14 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type == 6) {
|
if (type == 6) {
|
||||||
oneGiftCalculate(orderDetails, isAllFoods, couponFoodIds, "price_asc".equals(coupon.getUseRule()), oneGiftAmount);
|
oneGiftCalculate(orderDetails, isAllFoods, couponFoodIds, isTimeDiscountShare, "price_asc".equals(coupon.getUseRule()), oneGiftAmount);
|
||||||
} else {
|
} else {
|
||||||
twoHalfCalculate(orderDetails, isAllFoods, couponFoodIds, "price_asc".equals(coupon.getUseRule()), twoHalfAmount);
|
twoHalfCalculate(orderDetails, isAllFoods, couponFoodIds, isTimeDiscountShare, "price_asc".equals(coupon.getUseRule()), twoHalfAmount);
|
||||||
}
|
}
|
||||||
} else if (type == 1 || type == 3) {//1-满减券 3-折扣券
|
} else if (type == 1 || type == 3) {//1-满减券 3-折扣券
|
||||||
if (!otherCouponShare.get()) {
|
if (!otherCouponShare.get()) {
|
||||||
throw new ValidateException("生成支付订单失败,商品券与其它券不可共用");
|
throw new ValidateException("生成支付订单失败,商品券与其它券不可共用");
|
||||||
}
|
}
|
||||||
ShopCoupon coupon = checkCoupon(record, param.isVipPrice());
|
|
||||||
//计算门槛
|
//计算门槛
|
||||||
boolean isAllFoods = true;
|
boolean isAllFoods = true;
|
||||||
List<Long> couponFoodIds = new ArrayList<>();
|
List<Long> couponFoodIds = new ArrayList<>();
|
||||||
@@ -690,13 +690,17 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
/**
|
/**
|
||||||
* 商品优惠券计算
|
* 商品优惠券计算
|
||||||
*/
|
*/
|
||||||
private void foodsCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds, int discountNum, boolean isAsc, BigDecimalDTO prodCouponAmount) {
|
private void foodsCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds, int discountNum,
|
||||||
|
boolean isTimeDiscountShare, boolean isAsc, BigDecimalDTO prodCouponAmount) {
|
||||||
orderDetails = getDetailsSort(orderDetails, isAsc);
|
orderDetails = getDetailsSort(orderDetails, isAsc);
|
||||||
// log.info("商品券 计算 orderDetails:{}", orderDetails);
|
// log.info("商品券 计算 orderDetails:{}", orderDetails);
|
||||||
BigDecimal remaining = new BigDecimal(discountNum);
|
BigDecimal remaining = new BigDecimal(discountNum);
|
||||||
for (OrderDetail detail : orderDetails) {
|
for (OrderDetail detail : orderDetails) {
|
||||||
if (detail.getIsTemporary() != 1 && (isAllFoods || couponFoodIds.contains(detail.getProductId())) && detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0) {
|
if (detail.getIsTemporary() != 1 && (isAllFoods || couponFoodIds.contains(detail.getProductId())) && detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
if (remaining.compareTo(BigDecimal.ZERO) > 0) {
|
if (remaining.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
if (isTimeDiscountShare && detail.getIsTimeDiscount() == 1) {
|
||||||
|
throw new ValidateException("生成支付订单失败,商品:" + detail.getProductName() + " 抵扣券与限时折扣不可共用。");
|
||||||
|
}
|
||||||
if (remaining.compareTo(detail.getNum().subtract(detail.getReturnNum())) >= 0) {
|
if (remaining.compareTo(detail.getNum().subtract(detail.getReturnNum())) >= 0) {
|
||||||
detail.setCouponNum(detail.getNum().subtract(detail.getReturnNum()).setScale(2, RoundingMode.CEILING));
|
detail.setCouponNum(detail.getNum().subtract(detail.getReturnNum()).setScale(2, RoundingMode.CEILING));
|
||||||
detail.setDiscountAmount(detail.getPayAmount());
|
detail.setDiscountAmount(detail.getPayAmount());
|
||||||
@@ -721,12 +725,16 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
/**
|
/**
|
||||||
* 买一送一优惠券计算
|
* 买一送一优惠券计算
|
||||||
*/
|
*/
|
||||||
private void oneGiftCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds, boolean isAsc, BigDecimalDTO oneGiftAmount) {
|
private void oneGiftCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds,
|
||||||
|
boolean isTimeDiscountShare, boolean isAsc, BigDecimalDTO oneGiftAmount) {
|
||||||
orderDetails = getDetailsSort(orderDetails, isAsc);
|
orderDetails = getDetailsSort(orderDetails, isAsc);
|
||||||
for (OrderDetail detail : orderDetails) {
|
for (OrderDetail detail : orderDetails) {
|
||||||
if ((isAllFoods || couponFoodIds.contains(detail.getProductId()))
|
if ((isAllFoods || couponFoodIds.contains(detail.getProductId()))
|
||||||
&& detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0
|
&& detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0
|
||||||
&& detail.getNum().subtract(detail.getReturnNum()).subtract(detail.getCouponNum()).compareTo(BigDecimal.TWO) >= 0) {
|
&& detail.getNum().subtract(detail.getReturnNum()).subtract(detail.getCouponNum()).compareTo(BigDecimal.TWO) >= 0) {
|
||||||
|
if (isTimeDiscountShare && detail.getIsTimeDiscount() == 1) {
|
||||||
|
throw new ValidateException("生成支付订单失败,商品:" + detail.getProductName() + " 买一送一券与限时折扣不可共用。");
|
||||||
|
}
|
||||||
detail.setCouponNum(detail.getCouponNum().add(BigDecimal.ONE));
|
detail.setCouponNum(detail.getCouponNum().add(BigDecimal.ONE));
|
||||||
detail.setDiscountAmount(detail.getDiscountAmount().add(detail.getUnitPrice()));
|
detail.setDiscountAmount(detail.getDiscountAmount().add(detail.getUnitPrice()));
|
||||||
detail.setPayAmount(detail.getPayAmount().subtract(detail.getUnitPrice()));
|
detail.setPayAmount(detail.getPayAmount().subtract(detail.getUnitPrice()));
|
||||||
@@ -739,12 +747,16 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
/**
|
/**
|
||||||
* 第二件半价优惠券计算
|
* 第二件半价优惠券计算
|
||||||
*/
|
*/
|
||||||
private void twoHalfCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds, boolean isAsc, BigDecimalDTO oneGiftAmount) {
|
private void twoHalfCalculate(List<OrderDetail> orderDetails, boolean isAllFoods, List<Long> couponFoodIds,
|
||||||
|
boolean isTimeDiscountShare, boolean isAsc, BigDecimalDTO oneGiftAmount) {
|
||||||
orderDetails = getDetailsSort(orderDetails, isAsc);
|
orderDetails = getDetailsSort(orderDetails, isAsc);
|
||||||
for (OrderDetail detail : orderDetails) {
|
for (OrderDetail detail : orderDetails) {
|
||||||
if ((isAllFoods || couponFoodIds.contains(detail.getProductId()))
|
if ((isAllFoods || couponFoodIds.contains(detail.getProductId()))
|
||||||
&& detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0
|
&& detail.getUnitPrice().compareTo(BigDecimal.ZERO) > 0
|
||||||
&& detail.getNum().subtract(detail.getReturnNum()).subtract(detail.getCouponNum()).compareTo(BigDecimal.TWO) >= 0) {
|
&& detail.getNum().subtract(detail.getReturnNum()).subtract(detail.getCouponNum()).compareTo(BigDecimal.TWO) >= 0) {
|
||||||
|
if (isTimeDiscountShare && detail.getIsTimeDiscount() == 1) {
|
||||||
|
throw new ValidateException("生成支付订单失败,商品:" + detail.getProductName() + " 抵扣券与限时折扣不可共用。");
|
||||||
|
}
|
||||||
detail.setHalfPriceCouponNum(BigDecimal.ONE);
|
detail.setHalfPriceCouponNum(BigDecimal.ONE);
|
||||||
BigDecimal halfPrice = detail.getUnitPrice().divide(new BigDecimal("2")).setScale(2, RoundingMode.FLOOR);
|
BigDecimal halfPrice = detail.getUnitPrice().divide(new BigDecimal("2")).setScale(2, RoundingMode.FLOOR);
|
||||||
detail.setDiscountAmount(detail.getDiscountAmount().add(halfPrice));
|
detail.setDiscountAmount(detail.getDiscountAmount().add(halfPrice));
|
||||||
|
|||||||
Reference in New Issue
Block a user