订单:介入 TradeOrderHandler#cancelOrder

This commit is contained in:
puhui999 2023-10-07 16:58:40 +08:00
parent c485c6e04d
commit 89b240c1f9
6 changed files with 57 additions and 15 deletions

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.trade.enums.order; package cn.iocoder.yudao.module.trade.enums.order;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -37,4 +38,20 @@ public enum TradeOrderTypeEnum implements IntArrayValuable {
return ARRAYS; return ARRAYS;
} }
public static boolean isNormal(Integer type) {
return ObjectUtil.equal(type, NORMAL.getType());
}
public static boolean isSeckill(Integer type) {
return ObjectUtil.equal(type, SECKILL.getType());
}
public static boolean isBargain(Integer type) {
return ObjectUtil.equal(type, BARGAIN.getType());
}
public static boolean isCombination(Integer type) {
return ObjectUtil.equal(type, COMBINATION.getType());
}
} }

View File

@ -625,12 +625,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID); throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
} }
// 2. TODO 活动相关库存回滚需要活动 id活动 id 怎么获取app 端能否传过来回复从订单里拿呀
tradeOrderHandlers.forEach(handler -> handler.cancelOrder());
// 3. 回滚库存
List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id); List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
// 3. 回滚库存
productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
// 3.1 活动相关的回滚
tradeOrderHandlers.forEach(handler -> handler.cancelOrder(order, orderItems));
// 4. 回滚优惠券 // 4. 回滚优惠券
if (order.getCouponId() != null && order.getCouponId() > 0) { if (order.getCouponId() != null && order.getCouponId() > 0) {
@ -807,10 +806,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// 2.2 如果全部退款则进行取消订单 // 2.2 如果全部退款则进行取消订单
getSelf().cancelOrderByAfterSale(order, orderRefundPrice); getSelf().cancelOrderByAfterSale(order, orderRefundPrice);
// TODO @puhui999活动相关的回滚
// 3. 回滚库存 // 3. 回滚库存
productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem))); productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem)));
// 3.1 活动相关的回滚
tradeOrderHandlers.forEach(handler -> handler.cancelOrder(order, Collections.singletonList(orderItem)));
// 4.1 回滚积分扣减用户积分赠送的 // 4.1 回滚积分扣减用户积分赠送的
reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId()); reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId());

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.trade.service.order.handler; package cn.iocoder.yudao.module.trade.service.order.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi; import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi; import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@ -26,9 +25,10 @@ public class TradeBargainHandler implements TradeOrderHandler {
@Override @Override
public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) { if (TradeOrderTypeEnum.isBargain(order.getType())) {
return; return;
} }
// 扣减砍价活动的库存 // 扣减砍价活动的库存
bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(), bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(),
-orderItems.get(0).getCount()); -orderItems.get(0).getCount());
@ -36,13 +36,20 @@ public class TradeBargainHandler implements TradeOrderHandler {
@Override @Override
public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) { if (TradeOrderTypeEnum.isBargain(order.getType())) {
return; return;
} }
// 记录砍价记录对应的订单编号 // 记录砍价记录对应的订单编号
bargainRecordApi.updateBargainRecordOrderId(order.getBargainRecordId(), order.getId()); bargainRecordApi.updateBargainRecordOrderId(order.getBargainRecordId(), order.getId());
} }
@Override
public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (TradeOrderTypeEnum.isBargain(order.getType())) {
return;
}
// TODO 芋艿取消订单时需要增加库存 // TODO 芋艿取消订单时需要增加库存
}
} }

View File

@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.trade.service.order.handler; package cn.iocoder.yudao.module.trade.service.order.handler;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@ -26,7 +25,7 @@ public class TradeCombinationHandler implements TradeOrderHandler {
@Override @Override
public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
// 如果不是拼团订单则结束 // 如果不是拼团订单则结束
if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { if (TradeOrderTypeEnum.isCombination(order.getType())) {
return; return;
} }
Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
@ -41,7 +40,7 @@ public class TradeCombinationHandler implements TradeOrderHandler {
@Override @Override
public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
// 如果不是拼团订单则结束 // 如果不是拼团订单则结束
if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { if (TradeOrderTypeEnum.isCombination(order.getType())) {
return; return;
} }
@ -53,4 +52,11 @@ public class TradeCombinationHandler implements TradeOrderHandler {
combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, item)); combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, item));
} }
@Override
public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (TradeOrderTypeEnum.isCombination(order.getType())) {
return;
}
}
} }

View File

@ -40,7 +40,11 @@ public interface TradeOrderHandler {
/** /**
* 订单取消 * 订单取消
*
* @param order 订单
* @param orderItems 订单项
*/ */
default void cancelOrder() {} default void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
}
} }

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.trade.service.order.handler; package cn.iocoder.yudao.module.trade.service.order.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi; import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 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.dal.dataobject.order.TradeOrderItemDO;
@ -23,12 +22,21 @@ public class TradeSeckillHandler implements TradeOrderHandler {
@Override @Override
public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (ObjectUtil.notEqual(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) { if (TradeOrderTypeEnum.isSeckill(order.getType())) {
return; return;
} }
// 扣减秒杀活动的库存 // 扣减秒杀活动的库存
seckillActivityApi.updateSeckillStock(order.getSeckillActivityId(), seckillActivityApi.updateSeckillStock(order.getSeckillActivityId(),
orderItems.get(0).getSkuId(), orderItems.get(0).getCount()); orderItems.get(0).getSkuId(), orderItems.get(0).getCount());
} }
@Override
public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
if (TradeOrderTypeEnum.isSeckill(order.getType())) {
return;
}
}
} }