package cn.iocoder.yudao.module.trade.service.order.handler; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.util.List; /** * 优惠劵的 {@link TradeOrderHandler} 实现类 * * @author 芋道源码 */ @Component @Slf4j public class TradeCouponOrderHandler implements TradeOrderHandler { @Resource @Lazy // 延迟加载,避免循环依赖 private TradeOrderUpdateService orderUpdateService; @Resource private TradeOrderQueryService orderQueryService; @Resource private CouponApi couponApi; @Override public void afterOrderCreate(TradeOrderDO order, List orderItems) { if (order.getCouponId() == null || order.getCouponId() <= 0) { return; } // 不在前置扣减的原因,是因为优惠劵要记录使用的订单号 couponApi.useCoupon(new CouponUseReqDTO().setId(order.getCouponId()).setUserId(order.getUserId()) .setOrderId(order.getId())); } @Override public void afterPayOrder(TradeOrderDO order, List orderItems) { if (CollUtil.isEmpty(order.getGiveCouponTemplateCounts())) { return; } // 赠送优惠券 try { List couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId()); if (CollUtil.isEmpty(couponIds)) { return; } orderUpdateService.updateOrderGiveCouponIds(order.getUserId(), order.getId(), couponIds); } catch (Exception e) { log.error("[afterPayOrder][order({}) 赠送优惠券({})失败,需要手工补偿]", order.getId(), order.getGiveCouponTemplateCounts(), e); } } @Override public void afterCancelOrder(TradeOrderDO order, List orderItems) { // 情况一:退还订单使用的优惠券 if (order.getCouponId() != null && order.getCouponId() > 0) { // 退回优惠劵 couponApi.returnUsedCoupon(order.getCouponId()); } // 情况二:收回赠送的优惠券 if (CollUtil.isEmpty(order.getGiveCouponIds())) { return; } couponApi.invalidateCouponsByAdmin(order.getGiveCouponIds(), order.getUserId()); } }