From c8a43573fdd7c2121ec20bbb4b90d823291ad5e1 Mon Sep 17 00:00:00 2001 From: lifenlong Date: Mon, 17 May 2021 09:04:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E4=BC=9A=E5=91=98=E4=B8=8B=E5=8D=95=E8=B5=A0?= =?UTF-8?q?=E9=80=81=E7=A7=AF=E5=88=86=EF=BC=88=E9=9D=9E=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=EF=BC=89=EF=BC=8C=E8=AE=A2=E5=8D=95=E5=94=AE?= =?UTF-8?q?=E5=90=8E=E6=89=A3=E9=99=A4=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/MemberPointExecute.java | 83 +++++++++++++++++-- .../cn/lili/common/utils/CurrencyUtil.java | 18 ++++ .../modules/order/order/entity/dos/Order.java | 21 +++-- .../order/entity/enums/OrderTypeEnum.java | 6 +- .../system/entity/dto/PointSetting.java | 2 +- 5 files changed, 115 insertions(+), 15 deletions(-) diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java index 4a424a04..7ec637ab 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -1,11 +1,21 @@ package cn.lili.event.impl; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.GoodsCommentCompleteEvent; import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.PointSetting; import cn.lili.modules.system.entity.enums.SettingEnum; @@ -17,12 +27,11 @@ import org.springframework.stereotype.Service; /** * 会员积分 * - * @author Chopper + * @author Bulbasaur * @date 2020-07-03 11:20 */ @Service - -public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent { +public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent, OrderStatusChangeEvent, AfterSaleStatusChangeEvent { //配置 @Autowired @@ -30,22 +39,80 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //会员 @Autowired private MemberService memberService; + //订单 + @Autowired + private OrderService orderService; + /** + * 会员注册赠送积分 + * @param member 会员 + */ @Override public void memberRegister(Member member) { //获取积分设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + PointSetting pointSetting=getPointSetting(); //赠送会员积分 memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), 1, member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); } + /** + * 会员评价赠送积分 + * @param memberEvaluation 会员评价 + */ @Override public void goodsComment(MemberEvaluation memberEvaluation) { - //获取签到积分赠送设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + //获取积分设置 + PointSetting pointSetting=getPointSetting(); //赠送会员积分 memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), 1, memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); } + + /** + * 非积分订单订单完成后赠送积分 + * @param orderMessage 订单消息 + */ + @Override + public void orderChange(OrderMessage orderMessage) { + + if(orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)){ + //根据订单编号获取订单数据,如果为积分订单则跳回 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + if(order.getOrderType().equals(OrderTypeEnum.POINT)){ + return; + } + //获取积分设置 + PointSetting pointSetting=getPointSetting(); + //计算赠送积分数量 + Double point=CurrencyUtil.mul(pointSetting.getMoney(),order.getFlowPrice(),0); + //赠送会员积分 + memberService.updateMemberPoint(point.longValue(), 1, order.getMemberId(), "会员下单,赠送积分" + point + "分"); + + } + } + + /** + * 提交售后后扣除积分 + * @param afterSale 售后 + */ + @Override + public void afterSaleStatusChange(AfterSale afterSale) { + if (afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) { + //获取积分设置 + PointSetting pointSetting=getPointSetting(); + //计算扣除积分数量 + Double point=CurrencyUtil.mul(pointSetting.getMoney(), afterSale.getActualRefundPrice(),0); + //扣除会员积分 + memberService.updateMemberPoint(point.longValue(), 1, afterSale.getMemberId(), "会员退款,扣除积分" + point + "分"); + + } + } + + /** + * 获取积分设置 + * @return 积分设置 + */ + private PointSetting getPointSetting(){ + Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); + return new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + } } diff --git a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java index d2e21cb5..290ba1b4 100644 --- a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java @@ -56,6 +56,24 @@ public final class CurrencyUtil { return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } + /** + * 提供精确的乘法运算。 + * + * @param v1 被乘数 + * @param v2 乘数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的积 + */ + public static Double mul(double v1, double v2, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + /** * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。 * diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java index e3dbb029..db18e6f8 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java @@ -201,35 +201,46 @@ public class Order extends BaseEntity { public Order(CartVO cartVO, TradeDTO tradeDTO) { String oldId = this.getId(); - if (tradeDTO.getMemberAddress() != null) { - BeanUtil.copyProperties(tradeDTO.getMemberAddress(), this); - } BeanUtil.copyProperties(tradeDTO, this); BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this); BeanUtil.copyProperties(cartVO, this); this.setId(oldId); - this.setOrderType(OrderTypeEnum.NORMAL.name()); + //循环购物车列表判断是否为促销订单 if (cartVO.getSkuList().get(0).getPromotions() != null) { + //判断是否为拼团订单 Optional pintuanId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); if (pintuanId.isPresent()) { - promotionId = pintuanId.get(); this.setOrderType(OrderTypeEnum.PINTUAN.name()); if (tradeDTO.getParentOrderSn() == null) { this.setParentOrderSn(""); } } + //判断是否为积分订单 + Optional pointGoodsId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.POINTS_GOODS.name())).map(PromotionGoods::getPromotionId).findFirst(); + if (pointGoodsId.isPresent()) { + this.setOrderType(OrderTypeEnum.POINT.name()); + if (tradeDTO.getParentOrderSn() == null) { + this.setParentOrderSn(""); + } + } + }else{ + this.setOrderType(OrderTypeEnum.NORMAL.name()); } + //设定订单默认状态 this.setOrderStatus(OrderStatusEnum.UNPAID.name()); this.setPayStatus(PayStatusEnum.UNPAID.name()); this.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); + //填充订单收件人信息 this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); this.setConsigneeName(tradeDTO.getMemberAddress().getName()); + //判断是否使用平台优惠券 if (tradeDTO.getPlatformCoupon() != null) { this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId()); } + //判断是否使用店铺优惠券 if (tradeDTO.getStoreCoupons() != null && !tradeDTO.getStoreCoupons().isEmpty()) { StringBuilder storeCouponIds = new StringBuilder(); for (String s : tradeDTO.getStoreCoupons().keySet()) { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java index 78a3b610..8b9d6e6b 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java @@ -25,6 +25,10 @@ public enum OrderTypeEnum { /** * 拼团订单 */ - PINTUAN + PINTUAN, + /** + * 积分订单 + */ + POINT } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java index 0e5d29dd..15d4c46b 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java @@ -20,7 +20,7 @@ public class PointSetting implements Serializable { @ApiModelProperty(value = "注册") private Integer register; - @ApiModelProperty(value = "1积分等于多少元") + @ApiModelProperty(value = "1元等级*积分") private Integer money; @ApiModelProperty(value = "每日签到积分")