1. 程式人生 > >springboot秒殺課程學習整理1-5

springboot秒殺課程學習整理1-5

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;
    private
Integer 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; } }
View Code

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