diff --git a/shoptnt-core/src/main/java/cn/shoptnt/message/consumer/orderbill/OrderBillConsumer.java b/shoptnt-core/src/main/java/cn/shoptnt/message/consumer/orderbill/OrderBillConsumer.java index aa96f580807ceda80fed9d3980280f26ac85aee5..9ed4c078396950d6327bd78483680813caa95a73 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/message/consumer/orderbill/OrderBillConsumer.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/message/consumer/orderbill/OrderBillConsumer.java @@ -5,7 +5,12 @@ */ package cn.shoptnt.message.consumer.orderbill; +import cn.shoptnt.client.promotion.CouponClient; import cn.shoptnt.client.trade.AfterSaleClient; +import cn.shoptnt.client.trade.BillClient; +import cn.shoptnt.client.trade.OrderClient; +import cn.shoptnt.framework.util.CurrencyUtil; +import cn.shoptnt.framework.util.DateUtil; import cn.shoptnt.message.event.ASNewOrderEvent; import cn.shoptnt.message.event.AfterSaleChangeEvent; import cn.shoptnt.message.event.OrderStatusChangeEvent; @@ -15,17 +20,16 @@ import cn.shoptnt.model.aftersale.enums.ServiceTypeEnum; import cn.shoptnt.model.base.message.AfterSaleChangeMessage; import cn.shoptnt.model.base.message.AsOrderStatusChangeMsg; import cn.shoptnt.model.base.message.OrderStatusChangeMsg; -import cn.shoptnt.client.trade.BillClient; -import cn.shoptnt.client.promotion.CouponClient; +import cn.shoptnt.model.member.dos.Member; +import cn.shoptnt.model.member.dos.MemberLevel; import cn.shoptnt.model.orderbill.dos.BillItem; import cn.shoptnt.model.orderbill.enums.BillType; import cn.shoptnt.model.promotion.coupon.dos.CouponDO; import cn.shoptnt.model.promotion.coupon.vo.GoodsCouponPrice; -import cn.shoptnt.model.trade.order.enums.OrderStatusEnum; -import cn.shoptnt.client.trade.OrderClient; import cn.shoptnt.model.trade.order.dto.OrderDetailDTO; -import cn.shoptnt.framework.util.CurrencyUtil; -import cn.shoptnt.framework.util.DateUtil; +import cn.shoptnt.model.trade.order.enums.OrderStatusEnum; +import cn.shoptnt.service.member.MemberLevelManager; +import cn.shoptnt.service.member.MemberManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -49,6 +53,10 @@ public class OrderBillConsumer implements OrderStatusChangeEvent, ASNewOrderEven private CouponClient couponClient; @Autowired private AfterSaleClient afterSaleClient; + @Autowired + private MemberManager memberManager; + @Autowired + private MemberLevelManager memberLevelManager; /** * 订单收货生成一条结算单 @@ -70,6 +78,7 @@ public class OrderBillConsumer implements OrderStatusChangeEvent, ASNewOrderEven /** * 退货售后服务审核通过后生成一条结算单 + * * @param afterSaleChangeMessage */ @Override @@ -113,22 +122,25 @@ public class OrderBillConsumer implements OrderStatusChangeEvent, ASNewOrderEven Double couponCommission = 0D; CouponDO coupon = null; - if(goodsCouponPrices != null && goodsCouponPrices.size() != 0){ + if (goodsCouponPrices != null && goodsCouponPrices.size() != 0) { for (GoodsCouponPrice goodsCouponPrice : goodsCouponPrices) { - if(coupon == null){ + if (coupon == null) { coupon = couponClient.getModel(goodsCouponPrice.getCouponId()); } - if(coupon.getSellerId()!=0){ + if (coupon.getSellerId() != 0) { //非站点优惠券 break; } siteCouponPrice = CurrencyUtil.add(siteCouponPrice, goodsCouponPrice.getCouponPrice()); - couponCommission = CurrencyUtil.div(coupon.getShopCommission(),100); + couponCommission = CurrencyUtil.div(coupon.getShopCommission(), 100); } } + // 平台承担的会员等级折扣的优惠 + double platformMemberLevelPrice = getPlatformMemberLevelPrice(orderDetail); + BillItem item = new BillItem(); item.setAddTime(DateUtil.getDateline()); item.setItemType(billType.name()); @@ -145,9 +157,18 @@ public class OrderBillConsumer implements OrderStatusChangeEvent, ASNewOrderEven item.setShipName(orderDetail.getShipName()); item.setCouponCommission(couponCommission); item.setSiteCouponPrice(siteCouponPrice); + item.setPlatformMemberLevelPrice(platformMemberLevelPrice); return item; } + private double getPlatformMemberLevelPrice(OrderDetailDTO orderDetailDTO) { + Member member = memberManager.getModel(orderDetailDTO.getMemberId()); + MemberLevel memberLevel = memberLevelManager.getById(member.getLevelId()); + // 平台承担比例 + double platformRatio = CurrencyUtil.div(CurrencyUtil.sub(100, memberLevel.getAllocationRatio()), 100); + return CurrencyUtil.mul(orderDetailDTO.getMemberLevelDiscountPrice(), platformRatio); + } + @Override public void orderChange(AsOrderStatusChangeMsg orderMessage) { //付款后生成结算单项 diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/Bill.java b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/Bill.java index 1879930c5b5205fc6e6a1bb9ae21f22e36840c3f..60a3603fafe679546714a85043c50e72526c71f1 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/Bill.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/Bill.java @@ -191,6 +191,9 @@ public class Bill implements Serializable { @Schema(name = "refund_total_price", description = "结算周期内订单退款总金额") private Double refundTotalPrice; + @Schema(name = "platform_member_level_price", description = "平台承担会员等级优惠金额") + private Double platformMemberLevelPrice; + @PrimaryKeyField public Long getBillId() { return billId; @@ -429,6 +432,14 @@ public class Bill implements Serializable { this.refundTotalPrice = refundTotalPrice; } + public Double getPlatformMemberLevelPrice() { + return platformMemberLevelPrice; + } + + public void setPlatformMemberLevelPrice(Double platformMemberLevelPrice) { + this.platformMemberLevelPrice = platformMemberLevelPrice; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/BillItem.java b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/BillItem.java index 3108a59be30b97e9f7baa1c445a8da7128395cd1..3b29cff9e33c8d43bcfd0f106232c2d2dcd4023d 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/BillItem.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/dos/BillItem.java @@ -131,6 +131,12 @@ public class BillItem implements Serializable { @Schema(name = "coupon_commission", description = "站点优惠券佣金比例") private Double couponCommission; + /** + * 平台承担会员等级优惠的金额 + */ + @Schema(name = "platform_member_level_price", description = "平台承担会员等级优惠金额") + private Double platformMemberLevelPrice; + @PrimaryKeyField public Long getId() { @@ -277,6 +283,14 @@ public class BillItem implements Serializable { this.couponCommission = couponCommission; } + public Double getPlatformMemberLevelPrice() { + return platformMemberLevelPrice; + } + + public void setPlatformMemberLevelPrice(Double platformMemberLevelPrice) { + this.platformMemberLevelPrice = platformMemberLevelPrice; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/vo/BillResult.java b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/vo/BillResult.java index 35ff959d16ecb5bd83420b1dcf267d491f77d549..1f467b0517627c0af9a1942afd974c2f579ef648 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/vo/BillResult.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/orderbill/vo/BillResult.java @@ -37,14 +37,18 @@ public class BillResult implements Serializable { @Schema(name = "site_coupon_commi", description = "站点优惠券佣金") private Double siteCouponCommi; + @Schema(name = "platform_member_level_price", description = "平台承担会员等级优惠金额") + private Double platformMemberLevelPrice; - public BillResult(Double onlinePrice, Double onlineRefundPrice, Double codPrice, Double codRefundPrice, Long sellerId,Double siteCouponCommi) { + + public BillResult(Double onlinePrice, Double onlineRefundPrice, Double codPrice, Double codRefundPrice, Long sellerId,Double siteCouponCommi, Double platformMemberLevelPrice) { this.onlinePrice = onlinePrice; this.onlineRefundPrice = onlineRefundPrice; this.codPrice = codPrice; this.codRefundPrice = codRefundPrice; this.sellerId = sellerId; this.siteCouponCommi = siteCouponCommi; + this.platformMemberLevelPrice = platformMemberLevelPrice; } public BillResult() { @@ -97,4 +101,12 @@ public class BillResult implements Serializable { public void setSiteCouponCommi(Double siteCouponCommi) { this.siteCouponCommi = siteCouponCommi; } + + public Double getPlatformMemberLevelPrice() { + return platformMemberLevelPrice; + } + + public void setPlatformMemberLevelPrice(Double platformMemberLevelPrice) { + this.platformMemberLevelPrice = platformMemberLevelPrice; + } } diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/CartSkuVO.java b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/CartSkuVO.java index 7a80d5603b6a7cf3d60c5297ecfb86d51b14bf4c..c6e077fde1ad47d0f94b4f70ad6299bffee63748 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/CartSkuVO.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/CartSkuVO.java @@ -160,6 +160,8 @@ public class CartSkuVO implements Serializable { private Double actualPrice; @Schema(description = "实际支付总价") private Double actualPayTotal; + @Schema(description = "会员等级优惠") + private Double memberLevelDiscountPrice; public Integer getPurchaseNum() { return purchaseNum; @@ -467,6 +469,14 @@ public class CartSkuVO implements Serializable { this.giveGift = giveGift; } + public Double getMemberLevelDiscountPrice() { + return memberLevelDiscountPrice; + } + + public void setMemberLevelDiscountPrice(Double memberLevelDiscountPrice) { + this.memberLevelDiscountPrice = memberLevelDiscountPrice; + } + @Override public String toString() { return "CartSkuVO{" + diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/PriceDetailVO.java b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/PriceDetailVO.java index 7fea49ebcade5ac0eb868ee9d5718e0fa6bcb1e9..b55ea1e1350d8c54b5fbaaedbc1b703e66cd6733 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/PriceDetailVO.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/PriceDetailVO.java @@ -74,6 +74,9 @@ public class PriceDetailVO implements Serializable { @Schema(description = "使用的积分") private Long exchangePoint; + @Schema(description = "会员等级折扣优惠金额") + private Double memberLevelDiscountPrice; + /** * 构造器,初始化默认值 */ @@ -88,6 +91,7 @@ public class PriceDetailVO implements Serializable { this.cashBack = 0D; this.originalPrice = 0D; fullMinus = 0d; + memberLevelDiscountPrice = 0d; } @@ -106,6 +110,7 @@ public class PriceDetailVO implements Serializable { this.originalPrice = 0D; this.couponPrice = 0D; fullMinus = 0d; + memberLevelDiscountPrice = 0D; } /** @@ -124,6 +129,7 @@ public class PriceDetailVO implements Serializable { double couponPrice = CurrencyUtil.add(this.couponPrice, price.getCouponPrice()); double cashBack = CurrencyUtil.add(this.cashBack, price.getCashBack()); double fullMinus = CurrencyUtil.add(this.cashBack, price.getFullMinus()); + double memberLevelDiscountPrice = CurrencyUtil.add(this.memberLevelDiscountPrice, price.getMemberLevelDiscountPrice()); Long point = this.exchangePoint + price.getExchangePoint(); PriceDetailVO newPrice = new PriceDetailVO(); @@ -138,6 +144,7 @@ public class PriceDetailVO implements Serializable { newPrice.setOriginalPrice(original); newPrice.setFullMinus(fullMinus); newPrice.setMinusPrice(this.minusPrice); + newPrice.setMemberLevelDiscountPrice(memberLevelDiscountPrice); return newPrice; } @@ -267,6 +274,14 @@ public class PriceDetailVO implements Serializable { this.couponPrice = couponPrice; } + public Double getMemberLevelDiscountPrice() { + return memberLevelDiscountPrice; + } + + public void setMemberLevelDiscountPrice(Double memberLevelDiscountPrice) { + this.memberLevelDiscountPrice = memberLevelDiscountPrice; + } + @Override public String toString() { return "PriceDetailVO{" + diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/ScriptSkuVO.java b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/ScriptSkuVO.java index b28cd0a72e7ff5e3a7a210580bcd841199985635..bba446e86d6889c657e25066cc370c2b4bc08061 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/ScriptSkuVO.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/cart/vo/ScriptSkuVO.java @@ -42,7 +42,7 @@ public class ScriptSkuVO implements Serializable { public ScriptSkuVO(CartSkuVO cartSkuVO) { this.$skuId = cartSkuVO.getSkuId(); this.$num = cartSkuVO.getNum(); - this.$price = cartSkuVO.getOriginalPrice(); + this.$price = cartSkuVO.getPurchasePrice(); this.$totalPrice = CurrencyUtil.mul(this.$price,this.$num); } diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dos/OrderDO.java b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dos/OrderDO.java index 923a8a987cf1d0d08dbfc8a16700e94740feb4df..536b1fd14add5d4ea208f02b2c2a8c8286ddd228 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dos/OrderDO.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dos/OrderDO.java @@ -444,6 +444,9 @@ public class OrderDO implements Serializable { @Column(name = "balance") private Double balance; + @Schema(description = "会员等级折扣优惠金额") + private Double memberLevelDiscountPrice; + @JsonIgnore protected String scanRounds; @@ -992,6 +995,13 @@ public class OrderDO implements Serializable { this.paymentMethodId = paymentMethodId; } + public Double getMemberLevelDiscountPrice() { + return memberLevelDiscountPrice; + } + + public void setMemberLevelDiscountPrice(Double memberLevelDiscountPrice) { + this.memberLevelDiscountPrice = memberLevelDiscountPrice; + } @Override public String toString() { @@ -1261,6 +1271,7 @@ public class OrderDO implements Serializable { this.weight = orderDTO.getWeight(); this.shippingId = orderDTO.getShippingId(); this.balance = 0D; + this.memberLevelDiscountPrice = priceDetail.getMemberLevelDiscountPrice(); // 卖家 this.sellerId = orderDTO.getSellerId(); diff --git a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dto/OrderDetailDTO.java b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dto/OrderDetailDTO.java index a8241fd22ff802c3894e38b857e68d7af8658c17..f0bccf1b66b0a1936b1d8690db23de8af70df59f 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dto/OrderDetailDTO.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/model/trade/order/dto/OrderDetailDTO.java @@ -388,6 +388,9 @@ public class OrderDetailDTO { @Schema(description = "订单类型") private String orderType; + @Schema(description = "会员等级折扣优惠金额") + private Double memberLevelDiscountPrice; + public Integer getOrderId() { return orderId; } @@ -940,6 +943,14 @@ public class OrderDetailDTO { this.paymentName = paymentName; } + public Double getMemberLevelDiscountPrice() { + return memberLevelDiscountPrice; + } + + public void setMemberLevelDiscountPrice(Double memberLevelDiscountPrice) { + this.memberLevelDiscountPrice = memberLevelDiscountPrice; + } + public List getOrderSkuList() { if(orderSkuList==null && itemsJson!=null){ diff --git a/shoptnt-core/src/main/java/cn/shoptnt/service/orderbill/impl/BillManagerImpl.java b/shoptnt-core/src/main/java/cn/shoptnt/service/orderbill/impl/BillManagerImpl.java index a9704824b223e244fba98eb6bebdf404cffa1d96..20e8f0b88917e5791de6ecd3b28d395c7f401fc7 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/service/orderbill/impl/BillManagerImpl.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/service/orderbill/impl/BillManagerImpl.java @@ -191,7 +191,7 @@ public class BillManagerImpl implements BillManager { BillResult billRes = billMap.get(sellerId); //为空说明上个结算周期没有响应没有订单记录 if (billRes == null) { - billRes = new BillResult(0.00, 0.00, 0.00, 0.00, sellerId,0.00); + billRes = new BillResult(0.00, 0.00, 0.00, 0.00, sellerId,0.00, 0.0); } //创建结算单号 String billSn = this.createBillSn(); @@ -209,6 +209,8 @@ public class BillManagerImpl implements BillManager { Double commissionPrice = CurrencyUtil.mul(CurrencyUtil.add(onlinePrice, codPrice), commissionRate); //退还佣金 总退款金额 * 佣金比例 Double refundCommissionPrice = CurrencyUtil.mul(CurrencyUtil.add(onlineRefundPrice, codRefundPrice), commissionRate); + // 平台承担会员等级折扣优惠金额 + Double platformMemberLevelPrice = billRes.getPlatformMemberLevelPrice(); //分销商品返现 Double distributionGoodsRebate = 0d; @@ -243,6 +245,9 @@ public class BillManagerImpl implements BillManager { //最终结算金额 = 商家结算 - 分销结算 billPrice = CurrencyUtil.sub(billPrice, distributionBillPrice); + //最终结算金额需要再加上会员等级折扣优惠平台承担金额 + billPrice = CurrencyUtil.add(billPrice, platformMemberLevelPrice); + Bill bill = new Bill(); bill.setStartTime(startTime); bill.setEndTime(endTime); @@ -275,6 +280,7 @@ public class BillManagerImpl implements BillManager { bill.setDistributionReturnRebate(distributionReturnRebate); bill.setOrderTotalPrice(orderTotal); bill.setRefundTotalPrice(refundTotal); + bill.setPlatformMemberLevelPrice(platformMemberLevelPrice); this.add(bill); //更新结算项 this.billItemManager.updateBillItem(sellerId, bill.getBillId(), String.valueOf(startTime), lastTime); diff --git a/shoptnt-core/src/main/java/cn/shoptnt/service/trade/cart/cartbuilder/impl/CartPriceCalculatorImpl.java b/shoptnt-core/src/main/java/cn/shoptnt/service/trade/cart/cartbuilder/impl/CartPriceCalculatorImpl.java index 71ce8125542a83bd7ac1d45e01a0888e16e987dd..b7d56a528d4258bd3ada223f4fb5e5fa9cc6d631 100644 --- a/shoptnt-core/src/main/java/cn/shoptnt/service/trade/cart/cartbuilder/impl/CartPriceCalculatorImpl.java +++ b/shoptnt-core/src/main/java/cn/shoptnt/service/trade/cart/cartbuilder/impl/CartPriceCalculatorImpl.java @@ -5,13 +5,19 @@ */ package cn.shoptnt.service.trade.cart.cartbuilder.impl; +import cn.shoptnt.framework.context.user.UserContext; import cn.shoptnt.framework.util.CurrencyUtil; import cn.shoptnt.framework.util.JsonUtil; import cn.shoptnt.framework.util.StringUtil; +import cn.shoptnt.model.member.dos.Member; +import cn.shoptnt.model.member.dos.MemberLevelBenefit; +import cn.shoptnt.model.member.enums.MemberLevelBenefits; import cn.shoptnt.model.promotion.tool.enums.PromotionTypeEnum; import cn.shoptnt.model.promotion.tool.vo.GiveGiftVO; import cn.shoptnt.model.trade.cart.enums.CartType; import cn.shoptnt.model.trade.cart.vo.*; +import cn.shoptnt.service.member.MemberLevelBenefitManager; +import cn.shoptnt.service.member.MemberManager; import cn.shoptnt.service.trade.cart.CartPromotionManager; import cn.shoptnt.service.trade.cart.cartbuilder.CartPriceCalculator; import cn.shoptnt.service.trade.cart.cartbuilder.ScriptProcess; @@ -46,6 +52,12 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { @Autowired private ScriptProcess scriptProcess; + @Autowired + private MemberManager memberManager; + + @Autowired + private MemberLevelBenefitManager memberLevelBenefitManager; + @Override public PriceDetailVO countPrice(List cartList, Boolean includeCoupon) { @@ -80,6 +92,8 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { Map> singlePromotionMap = selectedPromotionVo.getSinglePromotionMap(); //用户选择使用的优惠券 Map couponMap = selectedPromotionVo.getCouponMap(); + // 查询会员等级的折扣优惠 + MemberLevelBenefit memberLevelDiscount = getMemberLevelDiscount(); for (CartVO cart : cartList) { //未选中的购物车不参与计算 @@ -99,6 +113,8 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { if (cartSku.getChecked() == 0) { continue; } + //计算会员等级折扣优惠 + this.calculatorMemberLevelDiscount(cartSku, memberLevelDiscount); //计算单品活动促销优惠 this.calculatorSingleScript(cart, singlePromotions, cartPrice, cartSku); if (cartSku.getGroupList().contains(groupPromotion)) { @@ -140,13 +156,38 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { calculatorCoupon(price, couponVO); } - logger.debug("计算完优惠后购物车数据为:",cartList); + logger.debug("计算完优惠后购物车数据为:", cartList); - logger.debug("价格为:",price); + logger.debug("价格为:", price); return price; } + private void calculatorMemberLevelDiscount(CartSkuVO cartSku, MemberLevelBenefit memberLevelDiscount) { + cartSku.setMemberLevelDiscountPrice(0.0); + if (memberLevelDiscount == null) { + return; + } + + // 折扣比例 + double discountRatio = CurrencyUtil.div(memberLevelDiscount.getBenefitValue(), 100); + // 成交价格 + double purchaseTotalPrice = CurrencyUtil.mul(cartSku.getSubtotal(), discountRatio); + // 会员等级优惠的价格 + double discountPrice = CurrencyUtil.sub(cartSku.getSubtotal(), purchaseTotalPrice); + + cartSku.setSubtotal(purchaseTotalPrice); + cartSku.setMemberLevelDiscountPrice(discountPrice); + cartSku.setPurchasePrice(CurrencyUtil.div(purchaseTotalPrice, cartSku.getNum())); + cartSku.setActualPrice(cartSku.getPurchasePrice()); + } + + private MemberLevelBenefit getMemberLevelDiscount() { + Member member = memberManager.getModel(UserContext.getBuyer().getUid()); + List benefitList = memberLevelBenefitManager.getByLevel(member.getLevelId()); + return benefitList.stream().filter(memberLevelBenefit -> memberLevelBenefit.getBenefitType() == MemberLevelBenefits.DISCOUNT).findFirst().orElse(null); + } + /** * 计算组合活动优惠 * @@ -171,32 +212,32 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { //优惠后总金额 cost = scriptProcess.countPrice(groupPromotion.getPromotionScript(), param); - Double surplusFmPrice=0D; + Double surplusFmPrice = 0D; //优惠金额 Double diff = CurrencyUtil.sub(sum, cost); for (int i = 0; i < collect.size(); i++) { - CartSkuVO cartSku =collect.get(i); + CartSkuVO cartSku = collect.get(i); if (i != collect.size() - 1) { //优惠的金额 公式为S1 = X A m / (A m + B n)。此时注意是先优惠金额乘SKU的金额,再除以SKU总金额。 - Double discount = CurrencyUtil.div(CurrencyUtil.mul(cartSku.getSubtotal(), diff),sum); + Double discount = CurrencyUtil.div(CurrencyUtil.mul(cartSku.getSubtotal(), diff), sum); //实际总额 double total = CurrencyUtil.sub(cartSku.getSubtotal(), discount); //商品实际支付单价 - cartSku.setActualPrice( CurrencyUtil.div(total, cartSku.getNum())); + cartSku.setActualPrice(CurrencyUtil.div(total, cartSku.getNum())); cartSku.setActualPayTotal(total); //已使用优惠金额 surplusFmPrice = CurrencyUtil.add(surplusFmPrice, discount); - }else { + } else { //剩余优惠总额 Double surplus = CurrencyUtil.sub(diff, surplusFmPrice); //实际总额 double actualPay = CurrencyUtil.sub(cartSku.getSubtotal(), surplus); cartSku.setActualPayTotal(actualPay); - cartSku.setActualPrice( CurrencyUtil.div(actualPay, cartSku.getNum())); + cartSku.setActualPrice(CurrencyUtil.div(actualPay, cartSku.getNum())); } } - + //获取赠品信息 giftJson = scriptProcess.giveGift(groupPromotion.getPromotionScript(), param); //设置购物车赠品信息 @@ -263,7 +304,7 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { cartSku.setPoint(point); cartSku.setSubtotal(cost); - cartSku.setActualPrice( CurrencyUtil.div(cost, cartSku.getNum())); + cartSku.setActualPrice(CurrencyUtil.div(cost, cartSku.getNum())); // 如果是单品立减,需要计算该活动减去了多少,并记录在 PriceDetailVO cartPrice中 if (promotionVo.getPromotionType().equals(PromotionTypeEnum.MINUS.name())) { cartPrice.setMinusPrice(CurrencyUtil.sub(skuVO.get$totalPrice(), cost)); @@ -281,8 +322,12 @@ public class CartPriceCalculatorImpl implements CartPriceCalculator { //购物车所有小计合 cartPrice.setGoodsPrice(CurrencyUtil.add(cartPrice.getGoodsPrice(), cartSku.getSubtotal())); + //会员等级优惠累计 + cartPrice.setMemberLevelDiscountPrice(CurrencyUtil.add(cartPrice.getMemberLevelDiscountPrice(), cartSku.getMemberLevelDiscountPrice())); + //购物车返现合 cartPrice.setCashBack(CurrencyUtil.add(cartPrice.getCashBack(), CurrencyUtil.sub(CurrencyUtil.mul(cartSku.getOriginalPrice(), cartSku.getNum()), cartSku.getSubtotal()))); + cartPrice.setCashBack(CurrencyUtil.sub(cartPrice.getCashBack(), cartPrice.getMemberLevelDiscountPrice())); //购物车使用积分 cartPrice.setExchangePoint(cartPrice.getExchangePoint() + cartSku.getPoint()); diff --git a/shoptnt-core/src/main/resources/mapper/trade/BillItemMapper.xml b/shoptnt-core/src/main/resources/mapper/trade/BillItemMapper.xml index 6adb0ba7d6f9479ea5c7c9b19b8909049dacf373..2e4b039e1d043576f4c25f55e1c8e5eec67c59d3 100644 --- a/shoptnt-core/src/main/resources/mapper/trade/BillItemMapper.xml +++ b/shoptnt-core/src/main/resources/mapper/trade/BillItemMapper.xml @@ -18,7 +18,8 @@ sum(case when payment_type = 'online' and item_type = 'REFUND' then price else 0 end ) online_refund_price , sum(case when payment_type = 'cod' and item_type = 'PAYMENT' then price else 0 end ) cod_price, sum(case when payment_type = 'cod' and item_type = 'REFUND' then price else 0 end ) cod_refund_price,seller_id, - sum(case when item_type = 'PAYMENT' then site_coupon_price*coupon_commission else 0 end ) as site_coupon_commi + sum(case when item_type = 'PAYMENT' then site_coupon_price*coupon_commission else 0 end ) as site_coupon_commi, + sum(case when item_type = 'PAYMENT' then platform_member_level_price else 0 end ) as platform_member_level_price from es_bill_item where `status` = 0 and (add_time < #{lastTime} and add_time >= #{startTime}) and bill_id is null group by seller_id diff --git a/sql/database.sql b/sql/database.sql index ab10791e1d44fe543f19d945ffd64284fd528292..e5561f365d61662674b92804aea02c93e5f7a262 100644 --- a/sql/database.sql +++ b/sql/database.sql @@ -372,6 +372,7 @@ CREATE TABLE `es_bill` ( `site_coupon_commi` decimal(20,2) DEFAULT '0.00' COMMENT '平台优惠券佣金', `order_total_price` decimal(20,2) DEFAULT '0.00' COMMENT '结算周期内订单付款总金额', `refund_total_price` decimal(20,2) DEFAULT '0.00' COMMENT '结算周期内订单退款总金额', + `platform_member_level_price` decimal(20,2) DEFAULT '0.00' COMMENT '平台承担会员等级优惠金额', PRIMARY KEY (`bill_id`) USING BTREE, KEY `index_bill` (`bill_id`,`bill_sn`,`status`,`bill_type`,`seller_id`,`sn`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='结算单(es_bill)'; @@ -401,6 +402,7 @@ CREATE TABLE `es_bill_item` ( `refund_time` bigint(20) DEFAULT NULL COMMENT '退货时间', `site_coupon_price` decimal(10,2) DEFAULT '0.00' COMMENT '使用平台优惠券金额', `coupon_commission` decimal(10,2) DEFAULT '0.00' COMMENT '优惠券佣金比例', + `platform_member_level_price` decimal(20,2) DEFAULT '0.00' COMMENT '平台承担会员等级优惠金额', PRIMARY KEY (`id`) USING BTREE, KEY `index_bill_item` (`id`,`order_sn`,`bill_id`,`member_id`,`status`,`seller_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='结算单项表(es_bill_item)'; @@ -2938,6 +2940,7 @@ CREATE TABLE `es_order` ( `sign` varchar(255) DEFAULT NULL, `sign_result` int(1) DEFAULT '0', `scan_rounds` varchar(50) DEFAULT NULL, + `member_level_discount_price` decimal(20,2) DEFAULT '0.00' COMMENT '会员等级优惠金额', PRIMARY KEY (`order_id`) USING BTREE, KEY `ind_order_sn` (`sn`) USING BTREE, KEY `ind_order_state` (`order_status`,`pay_status`,`ship_status`) USING BTREE,