springboot秒殺課程學習整理1-5
阿新 • • 發佈:2019-04-21
factory return 需要 ESS 新增 not cal getc pla
1)交易模型設計
交易模型(用戶下單的交易模型)OrderModel
id(String 交易單號使用String), userId,itemId,amount(數量),orderAmount(總金額), itemPrice(購買時的價格)
創建表order_info
id,userId,item_id,item_price,amount,order_amount
2)使用mybatis-generator生成對應的文件
3)生成訂單的流程
1)校驗商品是否存在,用戶是否合法,購買數量是否正確
2)落單減庫存(需要在ItemServiceImpl裏添加方法用戶更新庫存數量,這裏需要添加sql語句更新庫存)
3) 生成訂單(訂單有一定的規則:這裏是16位,由時間,自增序列,分庫分表組成)
4)訂單入庫
5)添加銷量(需要在itemServiceImpl裏添加方法更新銷量,並且需要新增sql語句)
OrderModel
package com.miaoshaproject.service.model; import java.math.BigDecimal; public class OrderModel { private String id; private Integer userId; privateView CodeInteger itemId; private Integer amount; private BigDecimal orderAmount; private BigDecimal itemPrice; public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getUserId() { return userId; }public void setUserId(Integer userId) { this.userId = userId; } public Integer getItemId() { return itemId; } public void setItemId(Integer itemId) { this.itemId = itemId; } public Integer getAmount() { return amount; } public void setAmount(Integer amount) { this.amount = amount; } public BigDecimal getOrderAmount() { return orderAmount; } public void setOrderAmount(BigDecimal orderAmount) { this.orderAmount = orderAmount; } public BigDecimal getItemPrice() { return itemPrice; } public void setItemPrice(BigDecimal itemPrice) { this.itemPrice = itemPrice; } }
OrderService
package com.miaoshaproject.service; import com.miaoshaproject.error.BusinessException; import com.miaoshaproject.service.model.OrderModel; public interface OrderService { OrderModel createModel(Integer userId, Integer itemId, Integer amount) throws BusinessException; }View Code
OrderServiceIpml
package com.miaoshaproject.service.impl; import com.miaoshaproject.dao.ItemDOMapper; import com.miaoshaproject.dao.OrderDOMapper; import com.miaoshaproject.dao.SequenceDOMapper; import com.miaoshaproject.dao.UserDOMapper; import com.miaoshaproject.dataobject.ItemDO; import com.miaoshaproject.dataobject.OrderDO; import com.miaoshaproject.dataobject.SequenceDO; import com.miaoshaproject.dataobject.UserDO; import com.miaoshaproject.error.BusinessException; import com.miaoshaproject.error.EmBusinessError; import com.miaoshaproject.service.OrderService; import com.miaoshaproject.service.model.ItemModel; import com.miaoshaproject.service.model.OrderModel; import com.miaoshaproject.service.model.UserModel; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; @Service public class OrderServiceImpl implements OrderService { @Autowired private ItemServiceImpl itemService; @Autowired private UserServiceImpl userService; @Autowired private ItemDOMapper itemDOMapper; @Autowired private UserDOMapper userDOMapper; @Autowired private OrderDOMapper orderDOMapper; @Autowired private SequenceDOMapper sequenceDOMapper; @Override @Transactional //保證訂單是在同一事務當中? public OrderModel createModel(Integer userId, Integer itemId, Integer amount) throws BusinessException { //1校驗下單狀態,下單的商品是否存在,用戶是否合法,購買數量是否正確 ItemModel itemModel = itemService.getItemById(itemId); if(itemModel == null){ throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"商品信息不存在"); } UserModel userModel =userService.getUserById(userId); if(userModel == null){ throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"用戶不存在"); } if(amount<=0 || amount>99){ throw new BusinessException(EmBusinessError.PARAMTER_VALIDATION_ERROR,"商品數量不正確"); } //2.落單減庫存 boolean result =itemService.decreaseStock(itemId,amount); if(!result){ throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH); } //3.訂單入庫 OrderModel orderModel = new OrderModel(); orderModel.setUserId(userId); orderModel.setItemId(itemId); orderModel.setAmount(amount); orderModel.setItemPrice(itemModel.getPrice()); orderModel.setOrderAmount(itemModel.getPrice().multiply(new BigDecimal(amount))); //生成訂單號 orderModel.setId(generatorOrderNo()); OrderDO orderDO=this.convertOrderDOFromOrderModel(orderModel); orderDOMapper.insertSelective(orderDO); //加上銷售額 itemService.increaseSales(itemId,amount); //返回前端 return orderModel; } public OrderDO convertOrderDOFromOrderModel(OrderModel orderModel){ OrderDO orderDO = new OrderDO(); if(orderModel == null){ return null; } BeanUtils.copyProperties(orderModel,orderDO); orderDO.setItemPrice(orderModel.getItemPrice().doubleValue()); orderDO.setOrderAmount(orderModel.getOrderAmount().doubleValue()); return orderDO; } @Transactional(propagation = Propagation.REQUIRES_NEW) public String generatorOrderNo(){ //訂單號有16 StringBuilder stringBuilder = new StringBuilder(); // 前8位是時間年月日 LocalDateTime now = LocalDateTime.now(); String nowDate = now.format(DateTimeFormatter.ISO_DATE).replace("-",""); stringBuilder.append(nowDate); //中間6位是自增序列, // 創建sequence_info表有字段name current_value step //每次加step,然後更新表,不夠6位用0補上 int sequence = 0; SequenceDO sequenceDO = sequenceDOMapper.getSequenceByName("order_info"); sequence = sequenceDO.getCurrentValue(); sequenceDO.setCurrentValue(sequenceDO.getCurrentValue()+sequenceDO.getStep()); sequenceDOMapper.updateByPrimaryKey(sequenceDO); String sequenceStr = String.valueOf(sequence); for(int i=0;i<6 - sequenceStr.length(); i++){ //這裏需要考慮的一點是如果大於6的 // 時候怎麽處理 stringBuilder.append(0); } stringBuilder.append(sequenceStr); //最後兩位是分庫分表位,這裏而寫死 stringBuilder.append("00"); return stringBuilder.toString(); } }View Code
OrderController
package com.miaoshaproject.controller; import com.miaoshaproject.error.BusinessException; import com.miaoshaproject.error.EmBusinessError; import com.miaoshaproject.response.CommonReturnType; import com.miaoshaproject.service.impl.OrderServiceImpl; import com.miaoshaproject.service.model.OrderModel; import com.miaoshaproject.service.model.UserModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/order") @CrossOrigin(allowCredentials = "true",allowedHeaders = "*") public class OrderController extends BaseController{ @Autowired private HttpServletRequest httpServletRequest; @Autowired private OrderServiceImpl orderService; @RequestMapping(value="create",method = RequestMethod.POST,consumes = {CONTENT_TYPE_FORMED}) public CommonReturnType createOrder (@RequestParam(name="itemId")Integer itemId, @RequestParam(name="amount")Integer amount ) throws BusinessException { Boolean isLogin = (Boolean)httpServletRequest.getSession().getAttribute("IS_LOGIN"); if(isLogin == null||!isLogin.booleanValue()){ throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用戶還未登入不能下單"); } UserModel userModel=(UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER"); //進行下單操作 OrderModel orderModel=orderService.createModel(userModel.getId(),itemId,amount); return CommonReturnType.create(null); } }View Code
springboot秒殺課程學習整理1-5