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 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 24 MEMBER_CANCEL(40, "取消订单"),
25 25 SYSTEM_CANCEL(41, "到期未支付,系统自动取消订单"),
26 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 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 687 @Override
667 688 @Transactional(rollbackFor = Exception.class)
668 689 @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE)
... ... @@ -775,31 +796,35 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
775 796 updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
776 797 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null);
777 798  
778   - // 2. 计算总的退款金额、退回积分
  799 + // 2.1 更新订单的退款金额、积分
779 800 TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id);
780 801 TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId());
781 802 Integer orderRefundPrice = order.getRefundPrice() + refundPrice;
782 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 816 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem)));
794 817  
795   - // 4.1 回滚数据:扣减用户积分(赠送的)
  818 + // 4.1 回滚积分:扣减用户积分(赠送的)
796 819 reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId());
797   - // 4.2 回滚数据:增加用户积分(返还抵扣)
  820 + // 4.2 回滚积分:增加用户积分(返还抵扣)
798 821 addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId());
799   - // 4.3 回滚数据:扣减用户经验
  822 +
  823 + // 5. 回滚经验:扣减用户经验
  824 + // TODO @疯狂:orderRefundPrice 是不是改成 refundPrice?应该只退这个售后对应的经验
800 825 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, orderItem.getAfterSaleId());
801 826  
802   - // 5. 回滚数据:更新分佣记录为已失效
  827 + // 6. 回滚佣金:更新分佣记录为已失效
803 828 getSelf().cancelBrokerageAsync(order.getUserId(), id);
804 829 }
805 830  
... ... @@ -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 *
... ...