diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java index aeffd014..62904412 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java @@ -7,6 +7,7 @@ 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.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dto.OrderMessage; @@ -54,7 +55,7 @@ public class MemberExperienceExecute implements MemberRegisterEvent, GoodsCommen //获取经验值设置 ExperienceSetting experienceSetting = getExperienceSetting(); //赠送会员经验值 - memberService.updateMemberExperience(Long.valueOf(experienceSetting.getRegister().longValue()), true, member.getId(), "会员注册,赠送经验值" + experienceSetting.getRegister()); + memberService.updateMemberPoint(Long.valueOf(experienceSetting.getRegister().longValue()), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送经验值" + experienceSetting.getRegister()); } /** @@ -67,7 +68,7 @@ public class MemberExperienceExecute implements MemberRegisterEvent, GoodsCommen //获取经验值设置 ExperienceSetting experienceSetting = getExperienceSetting(); //赠送会员经验值 - memberService.updateMemberExperience(Long.valueOf(experienceSetting.getComment().longValue()), true, memberEvaluation.getMemberId(), "会员评价,赠送经验值" + experienceSetting.getComment()); + memberService.updateMemberPoint(Long.valueOf(experienceSetting.getComment().longValue()), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送经验值" + experienceSetting.getComment()); } /** @@ -85,7 +86,7 @@ public class MemberExperienceExecute implements MemberRegisterEvent, GoodsCommen //计算赠送经验值数量 Double point = CurrencyUtil.mul(experienceSetting.getMoney(), order.getFlowPrice(), 0); //赠送会员经验值 - memberService.updateMemberExperience(point.longValue(), true, order.getMemberId(), "会员下单,赠送经验值" + point + "分"); + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送经验值" + point + "分"); } } 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 3451b1ee..5d3a7d33 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -10,6 +10,7 @@ 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.entity.enums.PointTypeEnum; 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; @@ -61,7 +62,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //获取积分设置 PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), true, member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); + memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); } /** @@ -74,7 +75,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //获取积分设置 PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), true, memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); } /** @@ -96,13 +97,13 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //计算赠送积分数量 Double point = CurrencyUtil.mul(pointSetting.getMoney(), order.getFlowPrice(), 0); //赠送会员积分 - memberService.updateMemberPoint(point.longValue(), true, order.getMemberId(), "会员下单,赠送积分" + point + "分"); + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + "分"); //取消订单恢复积分 } else if (orderMessage.getNewStatus().equals(OrderStatusEnum.CANCELLED)) { //根据订单编号获取订单数据,如果为积分订单则跳回 Order order = orderService.getBySn(orderMessage.getOrderSn()); if (order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name()) && order.getPriceDetailDTO().getPayPoint() != null) { - memberService.updateMemberPoint(Convert.toLong(order.getPriceDetailDTO().getPayPoint()), true, order.getMemberId(), "订单取消,恢复积分:" + order.getPriceDetailDTO().getPayPoint() + "分"); + memberService.updateMemberPoint(Convert.toLong(order.getPriceDetailDTO().getPayPoint()), PointTypeEnum.INCREASE.name(), order.getMemberId(), "订单取消,恢复积分:" + order.getPriceDetailDTO().getPayPoint() + "分"); } } } @@ -120,7 +121,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //计算扣除积分数量 Double point = CurrencyUtil.mul(pointSetting.getMoney(), afterSale.getActualRefundPrice(), 0); //扣除会员积分 - memberService.updateMemberPoint(point.longValue(), false, afterSale.getMemberId(), "会员退款,扣除积分" + point + "分"); + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.REDUCE.name(), afterSale.getMemberId(), "会员退款,回退积分" + point + "分"); } } diff --git a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java index 4858a260..81d120d2 100644 --- a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java @@ -4,6 +4,7 @@ import cn.lili.event.*; import cn.lili.modules.member.entity.dto.MemberPointMessage; import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage; import cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.entity.enums.WithdrawStatusEnum; import cn.lili.modules.message.entity.dto.NoticeMessageDTO; import cn.lili.modules.message.entity.enums.NoticeMessageNodeEnum; @@ -160,7 +161,7 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); noticeMessageDTO.setMemberId(memberPointMessage.getMemberId()); Map params = new HashMap<>(2); - if (memberPointMessage.getType()) { + if (memberPointMessage.getType().equals(PointTypeEnum.INCREASE.name())) { params.put("expenditure_points", "0"); params.put("income_points", memberPointMessage.getPoint().toString()); } else { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java b/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java index a99731f5..b378e1c3 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java @@ -41,9 +41,9 @@ public class PointLogInterceptor { point = Long.valueOf(obj[0].toString()); } //变动类型 - Boolean type = false; + String type = PointTypeEnum.INCREASE.name(); if (obj[1] != null) { - type = Boolean.valueOf(obj[1].toString()); + type = obj[1].toString(); } //会员ID String memberId = ""; @@ -56,10 +56,15 @@ public class PointLogInterceptor { MemberPointsHistory memberPointsHistory = new MemberPointsHistory(); memberPointsHistory.setMemberId(member.getId()); memberPointsHistory.setMemberName(member.getUsername()); - memberPointsHistory.setPointType(type ? PointTypeEnum.INCREASE.name() : PointTypeEnum.REDUCE.name()); + memberPointsHistory.setPointType(type); memberPointsHistory.setVariablePoint(point); - memberPointsHistory.setBeforePoint(type ? member.getPoint() - point : member.getPoint() + point); + if (type.equals(PointTypeEnum.INCREASE.name())) { + memberPointsHistory.setBeforePoint(member.getPoint() - point); + } else { + memberPointsHistory.setBeforePoint(member.getPoint() + point); + } + memberPointsHistory.setPoint(member.getPoint()); memberPointsHistory.setContent(obj[3] == null ? "" : obj[3].toString()); memberPointsHistory.setCreateBy("系统"); diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java index d78d1189..06d2c01a 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java @@ -46,7 +46,7 @@ public class Member extends BaseEntity { private Integer sex; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "会员生日") private Date birthday; @@ -64,6 +64,10 @@ public class Member extends BaseEntity { @ApiModelProperty(value = "积分数量") private Long point; + @Min(message = "必须为数字", value = 0) + @ApiModelProperty(value = "积分总数量") + private Long totalPoint; + @ApiModelProperty(value = "会员头像") private String face; @@ -103,6 +107,7 @@ public class Member extends BaseEntity { this.haveStore = false; this.sex = 0; this.point = 0L; + this.totalPoint = 0L; this.lastLoginDate = new Date(); } @@ -116,6 +121,7 @@ public class Member extends BaseEntity { this.face = face; this.sex = 0; this.point = 0L; + this.totalPoint = 0L; this.lastLoginDate = new Date(); } @@ -129,6 +135,7 @@ public class Member extends BaseEntity { this.face = face; this.sex = sex; this.point = 0L; + this.totalPoint = 0L; this.lastLoginDate = new Date(); } } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java index 97519e06..481f1add 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java @@ -67,7 +67,7 @@ public class MemberPointsHistory { @ApiModelProperty(value = "消费之前积分") private Long beforePoint; - @ApiModelProperty(value = "消费积分") + @ApiModelProperty(value = "变动积分") private Long variablePoint; @ApiModelProperty(value = "content") @@ -76,7 +76,7 @@ public class MemberPointsHistory { /** * @see cn.lili.modules.member.entity.enums.PointTypeEnum */ - @ApiModelProperty(value = "消费积分类型") + @ApiModelProperty(value = "积分类型") private String pointType; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java index 02eccd08..b0d5847b 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java @@ -16,7 +16,7 @@ public class MemberPointMessage { private Long point; @ApiModelProperty(value = "是否增加积分") - private Boolean type; + private String type; @ApiModelProperty(value = "会员id") private String memberId; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java index d5272b2a..61b79bf1 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java @@ -12,11 +12,15 @@ import lombok.Data; @Data public class MemberPointsHistoryVO { - @ApiModelProperty(value = "积分总数") + @ApiModelProperty(value = "当前会员积分") private Long point; - @ApiModelProperty(value = "未使用积分总数") - private Long variablePoint; + @ApiModelProperty(value = "累计获得积分") + private Long totalPoint; + public MemberPointsHistoryVO(){ + this.point = 0L; + this.totalPoint = 0L; + } } diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java index fb73b153..fac60794 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java @@ -178,23 +178,13 @@ public interface MemberService extends IService { * 会员积分变动 * * @param point 变动积分 - * @param type 是否增加积分 true 增加积分,反之扣减积分 + * @param type 是否增加积分 INCREASE 增加 REDUCE 扣减 * @param memberId 会员id * @param content 变动日志 * @return 操作结果 */ - Boolean updateMemberPoint(Long point, Boolean type, String memberId, String content); + Boolean updateMemberPoint(Long point, String type, String memberId, String content); - /** - * 会员积分变动 - * - * @param experience 变动经验值 - * @param type 是否增加经验值 - * @param memberId 会员id - * @param content 变动详细 - * @return 操作结果 - */ - Boolean updateMemberExperience(Long experience, Boolean type, String memberId, String content); /** * 修改会员状态 diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java index 12128316..1920c783 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java @@ -1,7 +1,9 @@ package cn.lili.modules.member.serviceimpl; +import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.enums.PointTypeEnum; +import cn.lili.modules.member.service.MemberService; import cn.lili.mybatis.util.PageUtil; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; @@ -12,6 +14,7 @@ import cn.lili.modules.member.service.MemberPointsHistoryService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -24,25 +27,20 @@ import org.springframework.stereotype.Service; public class MemberPointsHistoryServiceImpl extends ServiceImpl implements MemberPointsHistoryService { + @Autowired + private MemberService memberService; @Override public MemberPointsHistoryVO getMemberPointsHistoryVO(String memberId) { + //获取会员积分历史 + Member member = memberService.getById(memberId); MemberPointsHistoryVO memberPointsHistoryVO = new MemberPointsHistoryVO(); - Long point = 0L; - Long variablePoint = 0L; - - if (StringUtils.isNotEmpty(memberId)) { - point = this.baseMapper.getMemberPointsHistoryVO(PointTypeEnum.INCREASE.name(), memberId); - variablePoint = this.baseMapper.getMemberPointsHistoryVO(PointTypeEnum.REDUCE.name(), memberId); - - } else { - point = this.baseMapper.getALLMemberPointsHistoryVO(PointTypeEnum.REDUCE.name()); - variablePoint = this.baseMapper.getALLMemberPointsHistoryVO(PointTypeEnum.INCREASE.name()); + if (member != null) { + memberPointsHistoryVO.setPoint(member.getPoint()); + memberPointsHistoryVO.setTotalPoint(member.getTotalPoint()); + return memberPointsHistoryVO; } - memberPointsHistoryVO.setPoint(point == null ? 0 : point); - memberPointsHistoryVO.setVariablePoint(variablePoint == null ? 0 : variablePoint); - memberPointsHistoryVO.setVariablePoint(memberPointsHistoryVO.getPoint() - memberPointsHistoryVO.getVariablePoint()); - return memberPointsHistoryVO; + return new MemberPointsHistoryVO(); } @Override diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 64676fe9..a52ef85a 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -7,6 +7,7 @@ import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.SwitchEnum; import cn.lili.common.exception.ServiceException; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.mybatis.util.PageUtil; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MemberTagsEnum; @@ -376,21 +377,26 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override @PointLogPoint - public Boolean updateMemberPoint(Long point, Boolean type, String memberId, String content) { + public Boolean updateMemberPoint(Long point, String type, String memberId, String content) { //获取当前会员信息 Member member = this.getById(memberId); if (member != null) { //积分变动后的会员积分 long currentPoint; + //会员总获得积分 + long totalPoint = member.getTotalPoint(); //如果增加积分 - if (type) { + if (type.equals(PointTypeEnum.INCREASE.name())) { currentPoint = member.getPoint() + point; + //如果是增加积分 需要增加总获得积分 + totalPoint = totalPoint + point; } //否则扣除积分 else { currentPoint = member.getPoint() - point < 0 ? 0 : member.getPoint() - point; } member.setPoint(currentPoint); + member.setTotalPoint(totalPoint); Boolean result = this.updateById(member); if (result) { //发送会员消息 @@ -408,26 +414,6 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_NOT_EXIST); } - @Override - public Boolean updateMemberExperience(Long experience, Boolean type, String memberId, String content) { - //获取当前会员信息 - Member member = this.getById(memberId); - if (member != null) { - //积分变动后的会员积分 - long currentExperience; - if (type) { - currentExperience = CurrencyUtil.add(member.getPoint(), experience).longValue(); - } else { - currentExperience = CurrencyUtil.sub(member.getPoint(), experience) < 0 ? 0 : new Double(CurrencyUtil.sub(member.getExperience(), experience)).longValue(); - } - member.setExperience(currentExperience); - - return this.updateById(member); - } - throw new ServiceException(ResultCode.USER_NOT_EXIST); - } - - @Override public Boolean updateMemberStatus(List memberIds, Boolean status) { UpdateWrapper updateWrapper = Wrappers.update(); diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java index ce1ec547..bc4e073a 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java @@ -2,6 +2,7 @@ package cn.lili.modules.member.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MemberTagsEnum; import cn.lili.common.security.AuthUser; @@ -66,8 +67,8 @@ public class MemberSignServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("member_id",authUser.getId()); - queryWrapper.between("create_time",new Date(DateUtil.startOfTodDay()*1000),DateUtil.getCurrentDayEndTime()); + queryWrapper.eq("member_id", authUser.getId()); + queryWrapper.between("create_time", new Date(DateUtil.startOfTodDay() * 1000), DateUtil.getCurrentDayEndTime()); //校验今天是否已经签到 List todaySigns = this.baseMapper.getTodayMemberSign(queryWrapper); if (todaySigns.size() > 0) { @@ -139,10 +140,10 @@ public class MemberSignServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint((0 - tradeDTO.getPriceDetailDTO().getPayPoint().longValue()), false, tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } } \ No newline at end of file +package cn.lili.modules.order.order.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MqOrderTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional(rollbackFor = Exception.class) public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint((0 - tradeDTO.getPriceDetailDTO().getPayPoint().longValue()), PointTypeEnum.REDUCE.name(), tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } } \ No newline at end of file diff --git a/update-sql/version4.2to4.3.sql b/update-sql/version4.2to4.3.sql index d03fec3b..623d6754 100644 --- a/update-sql/version4.2to4.3.sql +++ b/update-sql/version4.2to4.3.sql @@ -156,3 +156,6 @@ INSERT INTO `li_menu` VALUES (1410862675914764290, 'admin', '2021-07-02 15:27:29 INSERT INTO `li_menu` VALUES (1419926569920536578, 'admin', '2021-07-27 15:44:10', b'0', 'admin', '2021-07-27 16:07:10', NULL, 'customWords/index', NULL, 2, 'customWords', '1367050250249830400', 'customWords', 4.00, 'ES分词', NULL, '/manager/manager/custom-words*'); COMMIT; SET FOREIGN_KEY_CHECKS = 1; + +/** 新增会员获的总积分 **/ +ALTER TABLE li_member ADD total_point bigint ( 20 ) DEFAULT 0 COMMENT '积分总数量'; \ No newline at end of file