赠品订单无法核销问题处理

This commit is contained in:
Chopper 2022-01-21 15:39:18 +08:00
parent 7164036d4c
commit 5051fc7b0b
2 changed files with 62 additions and 16 deletions

View File

@ -10,6 +10,7 @@ import cn.lili.common.utils.SnowFlake;
import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.OrderStatusChangeEvent;
import cn.lili.event.TradeEvent; import cn.lili.event.TradeEvent;
import cn.lili.modules.goods.entity.dos.GoodsSku; 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.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
@ -34,6 +35,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 订单状态处理类 * 订单状态处理类
@ -90,6 +92,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
@Override @Override
public void orderChange(OrderMessage orderMessage) { public void orderChange(OrderMessage orderMessage) {
//如果订单已支付
if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) { if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) {
log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()); log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn());
renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage); 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 赠品原订单信息 * @param originOrder 赠品原订单信息
*/ */
private void generatorGiftOrder(List<String> skuIds, Order originOrder) { private void generatorGiftOrder(List<String> skuIds, Order originOrder) {
//获取赠品列表
List<GoodsSku> goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds);
//赠品判定
if (goodsSkus == null || goodsSkus.isEmpty()) {
log.error("赠品不存在:{}", skuIds);
return;
}
//赠品分类分为实体商品/虚拟商品/电子卡券
List<GoodsSku> physicalSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.PHYSICAL_GOODS.name())).collect(Collectors.toList());
List<GoodsSku> virtualSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.VIRTUAL_GOODS.name())).collect(Collectors.toList());
List<GoodsSku> 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<GoodsSku> skuList, Order originOrder, OrderTypeEnum orderTypeEnum) {
//初始化订单对象/订单日志/自订单
Order order = new Order();
List<OrderItem> orderItems = new ArrayList<>(); List<OrderItem> orderItems = new ArrayList<>();
List<OrderLog> orderLogs = new ArrayList<>(); List<OrderLog> orderLogs = new ArrayList<>();
Order order = new Order(); //初始化价格详情
PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); PriceDetailDTO priceDetailDTO = new PriceDetailDTO();
//复制通用属性
BeanUtil.copyProperties(originOrder, order, "id"); BeanUtil.copyProperties(originOrder, order, "id");
BeanUtil.copyProperties(priceDetailDTO, order, "id"); BeanUtil.copyProperties(priceDetailDTO, order, "id");
//生成订单参数
order.setSn(SnowFlake.createStr("G")); order.setSn(SnowFlake.createStr("G"));
order.setOrderType(OrderPromotionTypeEnum.GIFT.name()); order.setOrderPromotionType(OrderPromotionTypeEnum.GIFT.name());
order.setOrderStatus(OrderStatusEnum.UNPAID.name()); order.setOrderStatus(OrderStatusEnum.UNPAID.name());
order.setPayStatus(PayStatusEnum.PAID.name()); order.setPayStatus(PayStatusEnum.PAID.name());
order.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); order.setOrderType(orderTypeEnum.name());
order.setNeedReceipt(false); order.setNeedReceipt(false);
order.setPriceDetailDTO(priceDetailDTO); order.setPriceDetailDTO(priceDetailDTO);
order.setClientType(originOrder.getClientType()); order.setClientType(originOrder.getClientType());
//订单日志
String message = "赠品订单[" + order.getSn() + "]创建"; String message = "赠品订单[" + order.getSn() + "]创建";
orderLogs.add(new OrderLog(order.getSn(), originOrder.getMemberId(), UserEnums.MEMBER.name(), originOrder.getMemberName(), message)); 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(); OrderItem orderItem = new OrderItem();
BeanUtil.copyProperties(goodsSkuByIdFromCache, orderItem, "id"); BeanUtil.copyProperties(goodsSku, orderItem, "id");
BeanUtil.copyProperties(priceDetailDTO, orderItem, "id"); BeanUtil.copyProperties(priceDetailDTO, orderItem, "id");
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name());
orderItem.setCommentStatus(CommentStatusEnum.NEW.name()); orderItem.setCommentStatus(CommentStatusEnum.NEW.name());
orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name()); orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name());
orderItem.setNum(1); orderItem.setNum(1);
orderItem.setOrderSn(order.getSn()); orderItem.setOrderSn(order.getSn());
orderItem.setImage(goodsSkuByIdFromCache.getThumbnail()); orderItem.setImage(goodsSku.getThumbnail());
orderItem.setGoodsName(goodsSkuByIdFromCache.getGoodsName()); orderItem.setGoodsName(goodsSku.getGoodsName());
orderItem.setSkuId(goodsSkuByIdFromCache.getId()); orderItem.setSkuId(goodsSku.getId());
orderItem.setCategoryId(goodsSkuByIdFromCache.getCategoryPath().substring( orderItem.setCategoryId(goodsSku.getCategoryPath().substring(
goodsSkuByIdFromCache.getCategoryPath().lastIndexOf(",") + 1 goodsSku.getCategoryPath().lastIndexOf(",") + 1
)); ));
orderItem.setGoodsPrice(goodsSkuByIdFromCache.getPrice()); orderItem.setGoodsPrice(goodsSku.getPrice());
orderItem.setPriceDetailDTO(priceDetailDTO); orderItem.setPriceDetailDTO(priceDetailDTO);
orderItems.add(orderItem); orderItems.add(orderItem);
} }
//保存订单
orderService.save(order); orderService.save(order);
orderItemService.saveBatch(orderItems); orderItemService.saveBatch(orderItems);
orderLogService.saveBatch(orderLogs); orderLogService.saveBatch(orderLogs);
//发送订单已付款消息 //发送订单已付款消息PS:不在这里处理逻辑是因为期望加交给消费者统一处理库存等等问题
OrderMessage orderMessage = new OrderMessage(); OrderMessage orderMessage = new OrderMessage();
orderMessage.setOrderSn(order.getSn()); orderMessage.setOrderSn(order.getSn());
orderMessage.setPaymentMethod(order.getPaymentMethod()); orderMessage.setPaymentMethod(order.getPaymentMethod());
@ -193,7 +236,5 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name();
//发送订单变更mq消息 //发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
} }
} }

View File

@ -16,5 +16,10 @@ public enum OrderTypeEnum {
/** /**
* 虚拟订单 * 虚拟订单
*/ */
VIRTUAL VIRTUAL,
/**
* 虚拟订单
*/
E_COUPON,
} }