mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-25 08:25:07 +08:00
重构:将订单的分支流程,抽到 TradeOrderHandler 实现类中(补全各种排重逻辑)
This commit is contained in:
@ -41,7 +41,7 @@ public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> {
|
||||
Assert.isTrue(count > 0);
|
||||
return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
|
||||
.eq(SeckillProductDO::getId, id)
|
||||
.gt(SeckillProductDO::getStock, count)
|
||||
.ge(SeckillProductDO::getStock, count)
|
||||
.setSql("stock = stock - " + count));
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.trade.service.order.handler;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
|
||||
import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
|
||||
@ -50,16 +51,28 @@ public class TradeBargainOrderHandler implements TradeOrderHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
if (TradeOrderTypeEnum.isBargain(order.getType())) {
|
||||
public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
if (!TradeOrderTypeEnum.isBargain(order.getType())) {
|
||||
return;
|
||||
}
|
||||
// 明确校验一下
|
||||
Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");
|
||||
|
||||
// 恢复砍价活动的库存
|
||||
bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(),
|
||||
orderItems.get(0).getCount());
|
||||
// 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
|
||||
orderItems = filterOrderItemListByNoneAfterSale(orderItems);
|
||||
if (CollUtil.isEmpty(orderItems)) {
|
||||
return;
|
||||
}
|
||||
afterCancelOrderItem(order, orderItems.get(0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
|
||||
if (!TradeOrderTypeEnum.isBargain(order.getType())) {
|
||||
return;
|
||||
}
|
||||
// 恢复(增加)砍价活动的库存
|
||||
bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(), orderItem.getCount());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.iocoder.yudao.framework.common.core.KeyValue;
|
||||
import cn.iocoder.yudao.framework.common.core.KeyValue;
|
||||
import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
|
||||
import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
||||
@ -17,11 +16,9 @@ import org.springframework.stereotype.Component;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_EXIST_UNPAID;
|
||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;
|
||||
|
||||
/**
|
||||
* 拼团订单的 {@link TradeOrderHandler} 实现类
|
||||
@ -50,11 +47,11 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
|
||||
}
|
||||
Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
|
||||
|
||||
// 校验是否满足拼团活动相关限制
|
||||
// 1. 校验是否满足拼团活动相关限制
|
||||
TradeOrderItemDO item = orderItems.get(0);
|
||||
combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),
|
||||
order.getCombinationHeadId(), item.getSkuId(), item.getCount());
|
||||
// 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
|
||||
// 2. 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
|
||||
TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus(
|
||||
order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
|
||||
if (activityOrder != null) {
|
||||
@ -65,17 +62,18 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
|
||||
@Override
|
||||
public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
// 1.如果不是拼团订单则结束
|
||||
if (TradeOrderTypeEnum.isCombination(order.getType())) {
|
||||
if (!TradeOrderTypeEnum.isCombination(order.getType())) {
|
||||
return;
|
||||
}
|
||||
Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
|
||||
|
||||
// 2.获取商品信息
|
||||
// 2. 创建拼团记录
|
||||
TradeOrderItemDO item = orderItems.get(0);
|
||||
// 2.1.创建拼团记录
|
||||
KeyValue<Long, Long> recordIdAndHeadId = combinationRecordApi.createCombinationRecord(
|
||||
TradeOrderConvert.INSTANCE.convert(order, item));
|
||||
// 3.更新拼团相关信息到订单
|
||||
|
||||
// 3. 更新拼团相关信息到订单
|
||||
// TODO 芋艿,只需要更新 record
|
||||
orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),
|
||||
recordIdAndHeadId.getKey(), recordIdAndHeadId.getValue());
|
||||
}
|
||||
|
@ -45,8 +45,8 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
|
||||
order.getId());
|
||||
|
||||
// 增加用户经验
|
||||
memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(), MemberExperienceBizTypeEnum.ORDER.getType(),
|
||||
String.valueOf(order.getId()));
|
||||
memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(),
|
||||
MemberExperienceBizTypeEnum.ORDER_GIVE.getType(), String.valueOf(order.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -59,36 +59,36 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
|
||||
|
||||
// 增加(回滚)用户积分(订单抵扣)
|
||||
Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum);
|
||||
addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_CANCEL,
|
||||
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_CANCEL,
|
||||
reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_GIVE_CANCEL,
|
||||
order.getId());
|
||||
// 扣减(回滚)用户经验
|
||||
int payPrice = order.getPayPrice() - order.getRefundPrice();
|
||||
// TODO @疯狂:这里的 bizId 和 afterCancelOrderItem 不一致了,有什么建议的处理方案?
|
||||
memberLevelApi.addExperience(order.getUserId(), -payPrice, MemberExperienceBizTypeEnum.REFUND.getType(),
|
||||
String.valueOf(order.getId()));
|
||||
memberLevelApi.addExperience(order.getUserId(), payPrice,
|
||||
MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL.getType(), String.valueOf(order.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
|
||||
// 扣减(回滚)积分(订单赠送)
|
||||
reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE,
|
||||
orderItem.getAfterSaleId());
|
||||
reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM,
|
||||
orderItem.getId());
|
||||
// 增加(回滚)积分(订单抵扣)
|
||||
addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED,
|
||||
orderItem.getAfterSaleId());
|
||||
addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM,
|
||||
orderItem.getId());
|
||||
|
||||
// 扣减(回滚)用户经验
|
||||
AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId());
|
||||
memberLevelApi.addExperience(order.getUserId(), -afterSale.getRefundPrice(), MemberExperienceBizTypeEnum.REFUND.getType(),
|
||||
String.valueOf(orderItem.getAfterSaleId()));
|
||||
memberLevelApi.reduceExperience(order.getUserId(), afterSale.getRefundPrice(),
|
||||
MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL_ITEM.getType(), String.valueOf(orderItem.getId()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
package cn.iocoder.yudao.module.trade.service.order.handler;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
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.enums.order.TradeOrderItemAfterSaleStatusEnum;
|
||||
@ -71,8 +71,8 @@ public interface TradeOrderHandler {
|
||||
* @return 过滤后的订单项列表
|
||||
*/
|
||||
default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {
|
||||
CollUtil.filterNew(orderItems, item -> !TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
|
||||
return orderItems;
|
||||
return CollectionUtils.filterList(orderItems,
|
||||
item -> TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.trade.service.order.handler;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
||||
@ -35,16 +36,29 @@ public class TradeSeckillOrderHandler implements TradeOrderHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
if (TradeOrderTypeEnum.isSeckill(order.getType())) {
|
||||
public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
||||
if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
|
||||
return;
|
||||
}
|
||||
// 明确校验一下
|
||||
Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");
|
||||
|
||||
// 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
|
||||
orderItems = filterOrderItemListByNoneAfterSale(orderItems);
|
||||
if (CollUtil.isEmpty(orderItems)) {
|
||||
return;
|
||||
}
|
||||
afterCancelOrderItem(order, orderItems.get(0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
|
||||
if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
|
||||
return;
|
||||
}
|
||||
// 恢复秒杀活动的库存
|
||||
seckillActivityApi.updateSeckillStockIncr(order.getSeckillActivityId(),
|
||||
orderItems.get(0).getSkuId(), orderItems.get(0).getCount());
|
||||
orderItem.getSkuId(), orderItem.getCount());
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user