創建秒殺模型,包含秒殺活動的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;
}