1. 程式人生 > >Java之品優購課程講義_day19(6)

Java之品優購課程講義_day19(6)

品優購-秒殺下單  4.1 需求分析  商品詳細頁點選立即搶購實現秒殺下單,下單時扣減庫存。當庫存為 0 或不在活動期 範圍內時無法秒殺。  4.2 後端程式碼  4.2.1 服務介面層  修改 pinyougou-seckill-interface 的 SeckillOrderService.java

/**
  * 提交訂單 
  * @param seckillId 
  * @param userId 
  */
public void submitOrder(Long seckillId,String userId);

服務實現層 
Spring 配置檔案配置 IdWorker 
pinyougou-seckill-service 的 SeckillOrderServiceImpl.java 實現方法 

@Autowired 
 private RedisTemplate redisTemplate; 

 @Autowired 
 private IdWorker idWorker; 

 @Override 
 public void submitOrder(Long seckillId, String userId) {
  //從快取中查詢秒殺商品   
  TbSeckillGoods seckillGoods =(TbSeckillGoods)
redisTemplate.boundHashOps("seckillGoods").get(seckillId); 
  if(seckillGoods==null){
   throw new RuntimeException("商品不存在"); 
  }
  if(seckillGoods.getStockCount()<=0){
   throw new RuntimeException("商品已搶購一空"); 
  } 
  //扣減(redis)庫存   
  seckillGoods.setStockCount(seckillGoods.getStockCount()-1); 
redisTemplate.boundHashOps("seckillGoods").put(seckillId, seckillGoods);//放
回快取 
  if(seckillGoods.getStockCount()==0){//如果已經被秒光 
   seckillGoodsMapper.updateByPrimaryKey(seckillGoods);//同步到資料庫  
redisTemplate.boundHashOps("seckillGoods").delete(seckillId);   
  }
  //儲存(redis)訂單 
  long orderId = idWorker.nextId(); 
  TbSeckillOrder seckillOrder=new TbSeckillOrder(); 
  seckillOrder.setId(orderId); 
  seckillOrder.setCreateTime(new Date()); 
  seckillOrder.setMoney(seckillGoods.getCostPrice());//秒殺價格 
  seckillOrder.setSeckillId(seckillId); 
  seckillOrder.setSellerId(seckillGoods.getSellerId()); 
seckillOrder.setUserId(userId);//設定使用者 ID 
  seckillOrder.setStatus("0");//狀態 
  redisTemplate.boundHashOps("seckillOrder").put(userId, seckillOrder); 
 }

控制層 
修改 pinyougou-seckill-web 的 SeckillOrderController.java 

@RequestMapping("/submitOrder")
public Result submitOrder(Long seckillId){
  String userId =
SecurityContextHolder.getContext().getAuthentication().getName(); 
  if("anonymousUser".equals(userId)){//如果未登入 
   return new Result(false, "使用者未登入"); 
  }
  try {
   seckillOrderService.submitOrder(seckillId, userId); 
   return new Result(true, "提交成功"); 
  }catch (RuntimeException e) {
   e.printStackTrace(); 
   return new Result(false, e.getMessage()); 
  } catch (Exception e) {
   e.printStackTrace(); 
   return new Result(false, "提交失敗"); 
  }
}