电商秒杀项目-秒杀模块

创建秒杀模型,包含秒杀活动的id,时间,商品id,价格,秒杀状态,活动名称等
然后根据模型创建表,生成mapper
1应该在每次查询商品详情的时候都调接口去查询一下有没有秒杀活动,秒杀活动的状态,如果有未结束的活动,应该把秒杀活动信息和商品信息一起返回。
在商品model中/使用聚合模型,如果promomodel不为空 则表示其拥有还未结束的秒杀活动。如果查询到有活动则把信息保存到model的聚合模型中一起返回。
对应地修改前端的页面,根据秒杀状态来显示不同信息。

itemmodel中添加一个

private promoModel promoModel;

并创建get set方法。

修改getItemById方法

@Override
    public ItemModel getItemById(Integer id) {
        ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
        if (itemDO==null){
            return null;
        }
        ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());

        ItemModel itemModel = convertItemModelFromItemDO(itemDO,itemStockDO);

        //获取活动商品信息
        promoModel promoModel = promoService.getPromoModelByItemId(itemModel.getId());

        if (promoModel != null && promoModel.getStatus().intValue() !=3){
            itemModel.setPromoModel(promoModel);
        }
        return itemModel;
    }
private ItemModel convertItemModelFromItemDO(ItemDO itemDO,ItemStockDO itemStockDO){
        if (itemDO==null){
            return null;
        }
        ItemModel itemModel = new ItemModel();
        BeanUtils.copyProperties(itemDO,itemModel);
        itemModel.setPrice(BigDecimal.valueOf(itemDO.getPrice()));
        itemModel.setStock(itemStockDO.getStock());
        return itemModel;
    }
@Override
    public promoModel getPromoModelByItemId(Integer itemId) {
        //获取秒杀活动id
        PromoDO promoDO = promoDOMapper.selectByItemId(itemId);

        //do-model
        promoModel promoModel = convertModelFromDO(promoDO);
        if (promoModel == null){
            return null;
        }
        //判断秒杀活动开始或者结束
        Date now = new Date();
        if (promoModel.getStartDate().compareTo(now)>0){
            //if 开始时间大于现在的时间 未开始
            promoModel.setStatus(1);
        } else if (promoModel.getEndDate().compareTo(now)<=0){
            //结束时间小于或等于现在的时间 已经结束
            promoModel.setStatus(3);
        } else {
            //正在
            promoModel.setStatus(2);
        }
        return promoModel;
    }
private promoModel convertModelFromDO(PromoDO promoDO){
        if (promoDO == null){
            return null;
        }
        promoModel promoModel = new promoModel();

        BeanUtils.copyProperties(promoDO,promoModel);
        promoModel.setPromoItemPrice(new BigDecimal(promoDO.getPromoItemPrice()));
        return promoModel;
    }

2 修改下单操作,每次下单时通过前端url上传过来秒杀活动id 然后下单接口内校验对应id是否属于对应商品且活动已经开始,直接在下单接口内判断对应的商品是否存在秒杀活动,若存在进行中的活动则以秒杀价格下单。所以要在下单接口中增加一段校验活动信息的代码,并且要根据活动状态来确定订单的价格取秒杀价格还是正常价格。
而且要在订单信息的数据库中加一个秒杀活动id的字段。手动增加字段并更改mapper。

 @Override
    @Transactional
    public orderModel createOrder(Integer userId,Integer promoId, Integer itemId, Integer amount) throws BusinessException {
        //校验下单状态 商品存在?用户合法?购买数量正确?
        ItemModel itemModel = itemService.getItemById(itemId);
        if (itemModel==null){
            throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"商品信息不合法");
        }
        if (itemModel.getStock()<amount){
            throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"商品数量不足");
        }
        UserModel userModel = userService.getUserById(userId);
        if (userModel==null){
            throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"用户信息不存在");
        }
        if (amount <= 0 ||amount > 99){
            throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"数量信息不正确");
        }


        //校验活动信息
        if (promoId != null){
            //校验对应活动是否存在
            if (promoId.intValue() != itemModel.getPromoModel().getId()){
                throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"秒杀活动异常");
            }else if (itemModel.getPromoModel().getStatus() != 2){
                //校验是否在活动时间内
                throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,"活动还未开始");
            }
        }



        //落单减库存(下单就锁库存),支付减库存(支付才去减库存)这里使用落单减库存
        boolean result = itemService.decreaseStock(itemId,amount);
        if (!result){
            throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH);

        }


        //订单入库
        orderModel orderModel = new orderModel();
        orderModel.setUserId(userId);
        orderModel.setItemId(itemId);
        orderModel.setAmount(amount);
        orderModel.setPromoId(promoId);
        if (promoId !=null){
            orderModel.setItemPrice(itemModel.getPromoModel().getPromoItemPrice());
        }else{
            orderModel.setItemPrice(itemModel.getPrice());
        }
        orderModel.setOrderPrice(orderModel.getItemPrice().multiply(
                new BigDecimal(amount)
        ));

        //生成交易流水号
        orderModel.setId(generateOderNo());
        OrderInfoDO orderInfoDO = convertDOFromModel(orderModel);
        orderInfoDOMapper.insertSelective(orderInfoDO);


        //加上商品销量
        itemService.increaseSales(itemId,amount);


        //返回前端


        return null;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章