Java之品優購課程講義_day19(6)
阿新 • • 發佈:2018-12-19
品優購-秒殺下單 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, "提交失敗"); } }