Commit d402bdb7e09bbe15471918ac00e3b94f50676e6d

Authored by YunaiV
1 parent f9bf41d7

trade:优化售后取消订单的实现代码

yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
@@ -140,4 +140,5 @@ public class AppProductSpuController { @@ -140,4 +140,5 @@ public class AppProductSpuController {
140 return price - newPrice; 140 return price - newPrice;
141 } 141 }
142 142
  143 + // TODO 芋艿:商品的浏览记录;
143 } 144 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderOperateTypeEnum.java
@@ -24,7 +24,8 @@ public enum TradeOrderOperateTypeEnum { @@ -24,7 +24,8 @@ public enum TradeOrderOperateTypeEnum {
24 MEMBER_CANCEL(40, "取消订单"), 24 MEMBER_CANCEL(40, "取消订单"),
25 SYSTEM_CANCEL(41, "到期未支付,系统自动取消订单"), 25 SYSTEM_CANCEL(41, "到期未支付,系统自动取消订单"),
26 // 42 预留:管理员取消订单 26 // 42 预留:管理员取消订单
27 - MEMBER_DELETE(43, "删除订单"), 27 + ADMIN_CANCEL_AFTER_SALE(43, "订单全部售后,管理员自动取消订单"),
  28 + MEMBER_DELETE(49, "删除订单"),
28 ; 29 ;
29 30
30 /** 31 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -663,6 +663,27 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -663,6 +663,27 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
663 TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus()); 663 TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus());
664 } 664 }
665 665
  666 + /**
  667 + * 如果金额全部被退款,则取消订单
  668 + * 如果还有未被退款的金额,则无需取消订单
  669 + *
  670 + * @param order 订单
  671 + * @param refundPrice 退款金额
  672 + */
  673 + @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_CANCEL_AFTER_SALE)
  674 + public void cancelOrderByAfterSale(TradeOrderDO order, Integer refundPrice) {
  675 + // 1. 更新订单
  676 + if (refundPrice < order.getPayPrice()) {
  677 + return;
  678 + }
  679 + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
  680 + .setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
  681 + .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now()));
  682 +
  683 + // 2. 退还优惠券
  684 + couponApi.returnUsedCoupon(order.getCouponId());
  685 + }
  686 +
666 @Override 687 @Override
667 @Transactional(rollbackFor = Exception.class) 688 @Transactional(rollbackFor = Exception.class)
668 @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE) 689 @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE)
@@ -775,31 +796,35 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -775,31 +796,35 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
775 updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), 796 updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
776 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null); 797 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null);
777 798
778 - // 2. 计算总的退款金额、退回积分 799 + // 2.1 更新订单的退款金额、积分
779 TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id); 800 TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id);
780 TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId()); 801 TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId());
781 Integer orderRefundPrice = order.getRefundPrice() + refundPrice; 802 Integer orderRefundPrice = order.getRefundPrice() + refundPrice;
782 Integer orderRefundPoint = order.getRefundPoint() + orderItem.getUsePoint(); 803 Integer orderRefundPoint = order.getRefundPoint() + orderItem.getUsePoint();
783 - if (isAllOrderItemAfterSaleSuccess(order.getId())) { // 如果都售后成功,则需要取消订单  
784 - cancelOrderByAfterSale(order, orderRefundPrice, orderRefundPoint);  
785 - } else { // 如果部分售后,则更新退款金额  
786 - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())  
787 - .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus())  
788 - .setRefundPrice(orderRefundPrice).setRefundPoint(orderRefundPoint));  
789 - } 804 + Integer refundStatus = isAllOrderItemAfterSaleSuccess(order.getId()) ?
  805 + TradeOrderRefundStatusEnum.ALL.getStatus() // 如果都售后成功,则需要取消订单
  806 + : TradeOrderRefundStatusEnum.PART.getStatus();
  807 + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
  808 + .setRefundStatus(refundStatus)
  809 + .setRefundPrice(orderRefundPrice).setRefundPoint(orderRefundPoint));
  810 + // 2.2 如果全部退款,则进行取消订单
  811 + getSelf().cancelOrderByAfterSale(order, orderRefundPrice);
790 812
791 - // TODO 芋艿:这块扣减规则,需要在考虑下  
792 - // 3. 回滚数据:增加 SKU 库存 813 + // TODO @puhui999:活动相关的回滚
  814 +
  815 + // 3. 回滚库存
793 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem))); 816 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem)));
794 817
795 - // 4.1 回滚数据:扣减用户积分(赠送的) 818 + // 4.1 回滚积分:扣减用户积分(赠送的)
796 reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId()); 819 reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId());
797 - // 4.2 回滚数据:增加用户积分(返还抵扣) 820 + // 4.2 回滚积分:增加用户积分(返还抵扣)
798 addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId()); 821 addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId());
799 - // 4.3 回滚数据:扣减用户经验 822 +
  823 + // 5. 回滚经验:扣减用户经验
  824 + // TODO @疯狂:orderRefundPrice 是不是改成 refundPrice?应该只退这个售后对应的经验
800 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, orderItem.getAfterSaleId()); 825 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, orderItem.getAfterSaleId());
801 826
802 - // 5. 回滚数据:更新分佣记录为已失效 827 + // 6. 回滚佣金:更新分佣记录为已失效
803 getSelf().cancelBrokerageAsync(order.getUserId(), id); 828 getSelf().cancelBrokerageAsync(order.getUserId(), id);
804 } 829 }
805 830
@@ -819,17 +844,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -819,17 +844,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
819 } 844 }
820 } 845 }
821 846
822 - @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CANCEL)  
823 - private void cancelOrderByAfterSale(TradeOrderDO order, Integer orderRefundPrice, Integer refundPoint) {  
824 - // 1. 更新订单  
825 - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())  
826 - .setRefundStatus(TradeOrderRefundStatusEnum.ALL.getStatus())  
827 - .setRefundPrice(orderRefundPrice).setRefundPoint(refundPoint)  
828 - .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now()));  
829 - // 2. 退还优惠券  
830 - couponApi.returnUsedCoupon(order.getCouponId());  
831 - }  
832 -  
833 /** 847 /**
834 * 判断指定订单的所有订单项,是不是都售后成功 848 * 判断指定订单的所有订单项,是不是都售后成功
835 * 849 *