优化秒杀活动用户下单能力业务

This commit is contained in:
2026-05-30 14:46:44 +08:00
parent dd889dd7a2
commit e511df0f8b
3 changed files with 38 additions and 23 deletions

View File

@@ -69,7 +69,7 @@ public class ShopFlashSaleActivity implements Serializable {
@Schema(description = "库存") @Schema(description = "库存")
private Integer stock; private Integer stock;
@Schema(description = "展示类型0普通用户1新用户") @Schema(description = "展示类型0普通用户1新用户 2老用户")
private Integer displayType; private Integer displayType;
@Schema(description = "备注") @Schema(description = "备注")

View File

@@ -100,13 +100,14 @@ public class ShopFlashSaleActivityServiceImpl extends ServiceImpl<ShopFlashSaleA
@Override @Override
public List<ShopFlashSaleActivityVO> getMyActive(Integer tenantId, Integer popFlag) { public List<ShopFlashSaleActivityVO> getMyActive(Integer tenantId, Integer popFlag) {
List<ShopFlashSaleActivityVO> resultVOList = new ArrayList<>(); List<ShopFlashSaleActivityVO> resultVOList = new ArrayList<>();
//1.判断当前登录用户
User loginUser = LoginUserUtil.getLoginUser(); User loginUser = LoginUserUtil.getLoginUser();
if(loginUser == null){ if(loginUser == null){
throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg()); throw new BusinessException(GlobalErrorCodeConstants.UNAUTHORIZED.getMsg());
} }
Boolean newUser = true; Boolean newUser = true;
//判断是否为新用户【只要未成功下单都判定为新用户】 //2.判断是否为新用户【只要未成功下单都判定为新用户】
LambdaQueryWrapper<ShopOrder> shopOrderLambdaQueryWrapper = new LambdaQueryWrapper<ShopOrder>().eq(ShopOrder::getUserId, loginUser.getUserId()).eq(ShopOrder::getPayStatus, 1) LambdaQueryWrapper<ShopOrder> shopOrderLambdaQueryWrapper = new LambdaQueryWrapper<ShopOrder>().eq(ShopOrder::getUserId, loginUser.getUserId()).eq(ShopOrder::getPayStatus, 1)
.in(ShopOrder::getOrderStatus, Arrays.asList(0, 1)); .in(ShopOrder::getOrderStatus, Arrays.asList(0, 1));
List<ShopOrder> shopOrderList = shopOrderMapper.selectList(shopOrderLambdaQueryWrapper); List<ShopOrder> shopOrderList = shopOrderMapper.selectList(shopOrderLambdaQueryWrapper);
@@ -114,32 +115,56 @@ public class ShopFlashSaleActivityServiceImpl extends ServiceImpl<ShopFlashSaleA
newUser = false; newUser = false;
} }
//查询满足条件的活动数据 //3.查询满足条件的活动数据
LambdaQueryChainWrapper<ShopFlashSaleActivity> activityWrapper = lambdaQuery().eq(ShopFlashSaleActivity::getStatus, 0).gt(ShopFlashSaleActivity::getStock, 0).eq(ShopFlashSaleActivity::getTenantId, tenantId) LambdaQueryChainWrapper<ShopFlashSaleActivity> activityWrapper = lambdaQuery().eq(ShopFlashSaleActivity::getStatus, 0).gt(ShopFlashSaleActivity::getStock, 0)
.apply("NOW() BETWEEN start_time AND end_time"); .eq(ShopFlashSaleActivity::getTenantId, tenantId).apply("NOW() BETWEEN start_time AND end_time");
if(popFlag != null){ if(popFlag != null){
activityWrapper.eq(ShopFlashSaleActivity::getPopFlag, popFlag); activityWrapper.eq(ShopFlashSaleActivity::getPopFlag, popFlag);
} }
activityWrapper.orderByAsc(ShopFlashSaleActivity::getSortNumber);
List<ShopFlashSaleActivity> activityList = activityWrapper.list();
//4.查询老用户已下单爆款活动订单数据
Map<Integer, Integer> activityMap = new HashMap<>(); Map<Integer, Integer> activityMap = new HashMap<>();
if(!newUser){ if(!newUser){
//查询当前用户是否有下过秒杀活动订单数据【判断下单数量是否超过限制】 //查询当前用户是否有下过秒杀活动订单数据【判断下单数量是否超过限制】
List<Integer> activityIdList = activityWrapper.list().stream().map(ShopFlashSaleActivity::getId).collect(Collectors.toList()); List<Integer> activityIdList = activityList.stream().map(ShopFlashSaleActivity::getId).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(activityIdList)){ if(CollectionUtils.isNotEmpty(activityIdList)){
LambdaQueryWrapper<ShopOrder> shopOrderWrapper = new LambdaQueryWrapper<ShopOrder>().select(ShopOrder::getOrderId, ShopOrder::getActivityId, ShopOrder::getTotalNum) LambdaQueryWrapper<ShopOrder> shopOrderWrapper = new LambdaQueryWrapper<ShopOrder>().select(ShopOrder::getOrderId, ShopOrder::getActivityId, ShopOrder::getTotalNum)
.eq(ShopOrder::getUserId, loginUser.getUserId()).in(ShopOrder::getActivityId, activityIdList).in(ShopOrder::getOrderStatus, Arrays.asList(0, 1)); .eq(ShopOrder::getUserId, loginUser.getUserId()).in(ShopOrder::getActivityId, activityIdList).in(ShopOrder::getOrderStatus, Arrays.asList(0, 1));
activityMap = shopOrderMapper.selectList(shopOrderWrapper).stream().collect(Collectors.groupingBy(ShopOrder::getActivityId, Collectors.summingInt(ShopOrder::getTotalNum))); activityMap = shopOrderMapper.selectList(shopOrderWrapper).stream().collect(Collectors.groupingBy(ShopOrder::getActivityId, Collectors.summingInt(ShopOrder::getTotalNum)));
} }
activityWrapper.eq(ShopFlashSaleActivity::getDisplayType, 0);
} }
activityWrapper.orderByAsc(ShopFlashSaleActivity::getSortNumber);
List<ShopFlashSaleActivity> activityList = activityWrapper.list();
//5.存在活动爆款,则判断用户购买能力
if(CollectionUtils.isNotEmpty(activityList)){ if(CollectionUtils.isNotEmpty(activityList)){
resultVOList = BeanUtil.copyToList(activityList, ShopFlashSaleActivityVO.class); resultVOList = BeanUtil.copyToList(activityList, ShopFlashSaleActivityVO.class);
List<Integer> goodsIdList = resultVOList.stream().map(ShopFlashSaleActivityVO::getGoodsId).distinct().collect(Collectors.toList()); List<Integer> goodsIdList = resultVOList.stream().map(ShopFlashSaleActivityVO::getGoodsId).distinct().collect(Collectors.toList());
List<ShopGoods> shopGoods = shopGoodsMapper.selectBatchIds(goodsIdList); List<ShopGoods> shopGoods = shopGoodsMapper.selectBatchIds(goodsIdList);
Map<Integer, Integer> finalActivityMap = activityMap;
Boolean finalNewUser = newUser;
resultVOList.forEach(activity -> { resultVOList.forEach(activity -> {
//5.1 判断新老用户商品购买能力、超买能力
if(finalNewUser){
if(activity.getDisplayType() == 2){
activity.setEnable(false);
}
}else {
if(activity.getDisplayType() == 1){
activity.setEnable(false);
}
if(activity.getEnable()){
//超下单数量活动不可选
Integer orderTotalNum = finalActivityMap.get(activity.getId());
if(orderTotalNum != null && orderTotalNum >= activity.getSaleLimit()){
activity.setEnable(false);
}
}
}
//5.2 回显商品信息
ShopGoods shopGood = shopGoods.stream().filter(goods -> activity.getGoodsId().equals(goods.getGoodsId())).findFirst().orElse(null); ShopGoods shopGood = shopGoods.stream().filter(goods -> activity.getGoodsId().equals(goods.getGoodsId())).findFirst().orElse(null);
if(shopGood != null){ if(shopGood != null){
activity.setGoodsPrice(shopGood.getPrice()); activity.setGoodsPrice(shopGood.getPrice());
@@ -150,19 +175,6 @@ public class ShopFlashSaleActivityServiceImpl extends ServiceImpl<ShopFlashSaleA
} }
}); });
} }
//过滤超下单数量活动
if(!activityMap.isEmpty()){
Iterator<ShopFlashSaleActivityVO> iterator = resultVOList.iterator();
while (iterator.hasNext()){
ShopFlashSaleActivityVO vo = iterator.next();
Integer orderTotalNum = activityMap.get(vo.getId());
if(orderTotalNum != null && orderTotalNum >= vo.getSaleLimit()){
iterator.remove();
}
}
}
return resultVOList; return resultVOList;
} }

View File

@@ -65,7 +65,7 @@ public class ShopFlashSaleActivityVO implements Serializable {
@Schema(description = "库存") @Schema(description = "库存")
private Integer stock; private Integer stock;
@Schema(description = "展示类型0普通用户1新用户") @Schema(description = "展示类型0普通用户1新用户 2:老用户")
private Integer displayType; private Integer displayType;
@Schema(description = "备注") @Schema(description = "备注")
@@ -80,6 +80,9 @@ public class ShopFlashSaleActivityVO implements Serializable {
@Schema(description = "租户id") @Schema(description = "租户id")
private Integer tenantId; private Integer tenantId;
@Schema(description = "是否可选")
private Boolean enable = true;
@Schema(description = "创建者") @Schema(description = "创建者")
private String creator; private String creator;