From 5051fc7b0be6db94e476d38ced132ba53ef98881 Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 21 Jan 2022 15:39:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=A0=E5=93=81=E8=AE=A2=E5=8D=95=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=A0=B8=E9=94=80=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/FullDiscountExecute.java | 71 +++++++++++++++---- .../order/entity/enums/OrderTypeEnum.java | 7 +- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java b/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java index a1bb9847..a3507d83 100644 --- a/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java @@ -10,6 +10,7 @@ import cn.lili.common.utils.SnowFlake; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.TradeEvent; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; @@ -34,6 +35,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * 订单状态处理类 @@ -90,6 +92,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent { @Override public void orderChange(OrderMessage orderMessage) { + //如果订单已支付 if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) { log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()); renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage); @@ -142,49 +145,89 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent { * @param originOrder 赠品原订单信息 */ private void generatorGiftOrder(List skuIds, Order originOrder) { + //获取赠品列表 + List goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds); + + //赠品判定 + if (goodsSkus == null || goodsSkus.isEmpty()) { + log.error("赠品不存在:{}", skuIds); + return; + } + + //赠品分类,分为实体商品/虚拟商品/电子卡券 + List physicalSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.PHYSICAL_GOODS.name())).collect(Collectors.toList()); + List virtualSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.VIRTUAL_GOODS.name())).collect(Collectors.toList()); + List eCouponSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.E_COUPON.name())).collect(Collectors.toList()); + + //如果赠品不为空,则生成对应的赠品订单 + if (!physicalSkus.isEmpty()) { + giftOrderHandler(physicalSkus, originOrder, OrderTypeEnum.NORMAL); + } + if (!virtualSkus.isEmpty()) { + giftOrderHandler(virtualSkus, originOrder, OrderTypeEnum.VIRTUAL); + } + if (!eCouponSkus.isEmpty()) { + giftOrderHandler(eCouponSkus, originOrder, OrderTypeEnum.E_COUPON); + } + } + + /** + * 赠品订单处理 + * + * @param skuList 赠品列表 + * @param originOrder 原始订单 + * @param orderTypeEnum 订单类型 + */ + private void giftOrderHandler(List skuList, Order originOrder, OrderTypeEnum orderTypeEnum) { + //初始化订单对象/订单日志/自订单 + Order order = new Order(); List orderItems = new ArrayList<>(); List orderLogs = new ArrayList<>(); - Order order = new Order(); + //初始化价格详情 PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); + //复制通用属性 BeanUtil.copyProperties(originOrder, order, "id"); BeanUtil.copyProperties(priceDetailDTO, order, "id"); + //生成订单参数 order.setSn(SnowFlake.createStr("G")); - order.setOrderType(OrderPromotionTypeEnum.GIFT.name()); + order.setOrderPromotionType(OrderPromotionTypeEnum.GIFT.name()); order.setOrderStatus(OrderStatusEnum.UNPAID.name()); order.setPayStatus(PayStatusEnum.PAID.name()); - order.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); + order.setOrderType(orderTypeEnum.name()); order.setNeedReceipt(false); order.setPriceDetailDTO(priceDetailDTO); order.setClientType(originOrder.getClientType()); + //订单日志 String message = "赠品订单[" + order.getSn() + "]创建"; orderLogs.add(new OrderLog(order.getSn(), originOrder.getMemberId(), UserEnums.MEMBER.name(), originOrder.getMemberName(), message)); - for (String skuId : skuIds) { - GoodsSku goodsSkuByIdFromCache = goodsSkuService.getGoodsSkuByIdFromCache(skuId); + //生成子订单 + for (GoodsSku goodsSku : skuList) { OrderItem orderItem = new OrderItem(); - BeanUtil.copyProperties(goodsSkuByIdFromCache, orderItem, "id"); + BeanUtil.copyProperties(goodsSku, orderItem, "id"); BeanUtil.copyProperties(priceDetailDTO, orderItem, "id"); orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); orderItem.setCommentStatus(CommentStatusEnum.NEW.name()); orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name()); orderItem.setNum(1); orderItem.setOrderSn(order.getSn()); - orderItem.setImage(goodsSkuByIdFromCache.getThumbnail()); - orderItem.setGoodsName(goodsSkuByIdFromCache.getGoodsName()); - orderItem.setSkuId(goodsSkuByIdFromCache.getId()); - orderItem.setCategoryId(goodsSkuByIdFromCache.getCategoryPath().substring( - goodsSkuByIdFromCache.getCategoryPath().lastIndexOf(",") + 1 + orderItem.setImage(goodsSku.getThumbnail()); + orderItem.setGoodsName(goodsSku.getGoodsName()); + orderItem.setSkuId(goodsSku.getId()); + orderItem.setCategoryId(goodsSku.getCategoryPath().substring( + goodsSku.getCategoryPath().lastIndexOf(",") + 1 )); - orderItem.setGoodsPrice(goodsSkuByIdFromCache.getPrice()); + orderItem.setGoodsPrice(goodsSku.getPrice()); orderItem.setPriceDetailDTO(priceDetailDTO); orderItems.add(orderItem); } + //保存订单 orderService.save(order); orderItemService.saveBatch(orderItems); orderLogService.saveBatch(orderLogs); - //发送订单已付款消息 + //发送订单已付款消息(PS:不在这里处理逻辑是因为期望加交给消费者统一处理库存等等问题) OrderMessage orderMessage = new OrderMessage(); orderMessage.setOrderSn(order.getSn()); orderMessage.setPaymentMethod(order.getPaymentMethod()); @@ -193,7 +236,5 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent { String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); //发送订单变更mq消息 rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); - - } } 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 6cd2b9b3..129dce04 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 @@ -16,5 +16,10 @@ public enum OrderTypeEnum { /** * 虚拟订单 */ - VIRTUAL + VIRTUAL, + + /** + * 虚拟订单 + */ + E_COUPON, }