package cn.iocoder.yudao.module.trade.service.order.handler; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; import cn.iocoder.yudao.module.member.api.point.MemberPointApi; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO; 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.aftersale.AfterSaleService; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue; /** * 会员积分、等级的 {@link TradeOrderHandler} 实现类 * * @author owen */ @Component public class TradeMemberPointOrderHandler implements TradeOrderHandler { @Resource private MemberPointApi memberPointApi; @Resource private MemberLevelApi memberLevelApi; @Resource private AfterSaleService afterSaleService; @Override public void afterOrderCreate(TradeOrderDO order, List orderItems) { // 扣减用户积分(订单抵扣)。不在前置扣减的原因,是因为积分扣减时,需要记录关联业务 reducePoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE, order.getId()); } @Override public void afterPayOrder(TradeOrderDO order, List orderItems) { // 增加用户积分(订单赠送) addPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE, order.getId()); // 增加用户经验 memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(), MemberExperienceBizTypeEnum.ORDER_GIVE.getType(), String.valueOf(order.getId())); } @Override public void afterCancelOrder(TradeOrderDO order, List orderItems) { // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚 orderItems = filterOrderItemListByNoneAfterSale(orderItems); if (CollUtil.isEmpty(orderItems)) { return; } // 增加(回滚)用户积分(订单抵扣) Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum); addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_USE_CANCEL, order.getId()); // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程 if (!order.getPayStatus()) { return; } // 扣减(回滚)积分(订单赠送) Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum); reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_GIVE_CANCEL, order.getId()); // 扣减(回滚)用户经验 int payPrice = order.getPayPrice() - order.getRefundPrice(); memberLevelApi.addExperience(order.getUserId(), payPrice, MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL.getType(), String.valueOf(order.getId())); } @Override public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { // 增加(回滚)积分(订单抵扣) addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM, orderItem.getId()); // 扣减(回滚)积分(订单赠送) reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM, orderItem.getId()); // 扣减(回滚)用户经验 AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId()); memberLevelApi.reduceExperience(order.getUserId(), afterSale.getRefundPrice(), MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL_ITEM.getType(), String.valueOf(orderItem.getId())); } /** * 添加用户积分 *

* 目前是支付成功后,就会创建积分记录。 *

* 业内还有两种做法,可以根据自己的业务调整: * 1. 确认收货后,才创建积分记录 * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻 * * @param userId 用户编号 * @param point 增加积分数量 * @param bizType 业务编号 * @param bizId 业务编号 */ protected void addPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { if (point != null && point > 0) { memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId)); } } protected void reducePoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { if (point != null && point > 0) { memberPointApi.reducePoint(userId, point, bizType.getType(), String.valueOf(bizId)); } } }