Commit d402bdb7e09bbe15471918ac00e3b94f50676e6d
1 parent
f9bf41d7
trade:优化售后取消订单的实现代码
Showing
3 changed files
with
42 additions
and
26 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
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 | * |