【代码优化】积分商城

This commit is contained in:
puhui999 2025-01-23 10:49:08 +08:00
parent 2725376b91
commit d3352308d4
6 changed files with 37 additions and 20 deletions

View File

@ -100,7 +100,7 @@ public class PointActivityServiceImpl implements PointActivityService {
}
pointActivityMapper.updateById(updateObj);
// 2.2 更新商品
updateSeckillProduct(updateObj, updateReqVO.getProducts());
updatePointProduct(updateObj, updateReqVO.getProducts());
}
@Override
@ -157,12 +157,12 @@ public class PointActivityServiceImpl implements PointActivityService {
}
/**
* 更新秒杀商品
* 更新积分商品
*
* @param activity 秒杀活动
* @param activity 积分活动
* @param products 该活动的最新商品配置
*/
private void updateSeckillProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
private void updatePointProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
// 第一步对比新老数据获得添加修改删除的列表
List<PointProductDO> newList = buildPointProductDO(activity, products);
List<PointProductDO> oldList = pointProductMapper.selectListByActivityId(activity.getId());
@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService {
}
/**
* 校验秒杀商品是否都存在
* 校验积分商品是否都存在
*
* @param spuId 商品 SPU 编号
* @param products 秒杀商品
* @param products 积分商品
*/
private void validateProductExists(Long spuId, List<PointProductSaveReqVO> products) {
// 1. 校验商品 spu 是否存在

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
.eq(TradeOrderDO::getCommentStatus, commentStatus));
}
default List<TradeOrderDO> selectListByUserIdAndSeckillActivityId(Long userId, Long seckillActivityId) {
return selectList(new LambdaUpdateWrapper<>(TradeOrderDO.class)
.eq(TradeOrderDO::getUserId, userId)
.eq(TradeOrderDO::getSeckillActivityId, seckillActivityId));
default List<TradeOrderDO> selectListByUserIdAndActivityId(Long userId, Long activityId, TradeOrderTypeEnum type) {
LambdaQueryWrapperX<TradeOrderDO> queryWrapperX = new LambdaQueryWrapperX<>();
queryWrapperX.eq(TradeOrderDO::getUserId, userId);
if (TradeOrderTypeEnum.isSeckill(type.getType())) {
queryWrapperX.eq(TradeOrderDO::getSeckillActivityId, activityId);
}
if (TradeOrderTypeEnum.isBargain(type.getType())) {
queryWrapperX.eq(TradeOrderDO::getBargainActivityId, activityId);
}
if (TradeOrderTypeEnum.isCombination(type.getType())) {
queryWrapperX.eq(TradeOrderDO::getCombinationActivityId, activityId);
}
if (TradeOrderTypeEnum.isPoint(type.getType())) {
queryWrapperX.eq(TradeOrderDO::getPointActivityId, activityId);
}
return selectList(queryWrapperX);
}
default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) {

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummary
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
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.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
import java.util.Collection;
@ -110,13 +111,14 @@ public interface TradeOrderQueryService {
List<ExpressTrackRespDTO> getExpressTrackList(Long id);
/**
* 会员在指定秒杀活动下用户购买的商品数量
* 会员在指定活动下用户购买的商品数量
*
* @param userId 用户编号
* @param activityId 活动编号
* @return 秒杀商品数量
* @param type 订单类型
* @return 活动商品数量
*/
int getSeckillProductCount(Long userId, Long activityId);
int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type);
// =================== Order Item ===================

View File

@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
}
@Override
public int getSeckillProductCount(Long userId, Long activityId) {
public int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type) {
// 获得订单列表
List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndSeckillActivityId(userId, activityId);
List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndActivityId(userId, activityId, type);
orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉已取消的订单
if (CollUtil.isEmpty(orders)) {
return 0;

View File

@ -56,7 +56,7 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品");
// 2. 校验是否可以参与积分商城活动
TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
PointValidateJoinRespDTO activity = validateJoinSeckill(
PointValidateJoinRespDTO activity = validateJoinPointActivity(
param.getUserId(), param.getPointActivityId(),
orderItem.getSkuId(), orderItem.getCount());
@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
TradePriceCalculatorHelper.recountAllPrice(result);
}
private PointValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) {
private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) {
// 1. 校验是否可以参与积分商城活动
PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count);
// 2. 校验总限购数量目前只有 trade 有具体下单的数据需要交给 trade 价格计算使用
int activityProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
if (activityProductCount + count > pointValidateJoinRespDTO.getCount()) {
int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT);
if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) {
throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT);
}
return pointValidateJoinRespDTO;

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator
// 1. 校验是否可以参与秒杀
SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count);
// 2. 校验总限购数量目前只有 trade 有具体下单的数据需要交给 trade 价格计算使用
int seckillProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL);
if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) {
throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT);
}