電商秒殺項目-交易模塊

首先創建交易模型,然後根據模型創建表,生成實體。然後創建service,寫創建訂單的方法。
創建訂單
1校驗下單狀態 商品存在?用戶合法?購買數量正確?

@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);
        return itemModel;
    }
 @Override
    public UserModel getUserById(Integer id) {
        userDO userDO = userDOMapper.selectByPrimaryKey(id);

        if (userDO == null){
            return null;
        }
        UserPasswordDO userPasswordDO = userPasswordDOMapper.selectByUserId(id);

        return converFronDataObject(userDO,userPasswordDO);
    }

2落單減庫存(下單就鎖庫存),支付減庫存(支付纔去減庫存)這裏使用落單減庫存
在itemservice中創建一個減庫存的方法decreaseStock,接收商品id和數量的參數。然後在庫存的mapper.xml中新增

 <update id="decreaseStock">
    update item_stock
    set stock = stock - #{amount}
    where item_id = #{itemId} and stock >= #{amount}
  </update>

ItemStockDOMapper.Java中

int decreaseStock(@Param("itemId") Integer itemId,@Param("amount") Integer amount);

然後在decreaseStock中調用itemStockDOMapper的decreaseStock,接收返回值,根據返回值來確定修改結果

@Override
    public boolean decreaseStock(Integer itemId,Integer amount) throws BusinessException {
        int affectedRow = itemStockDOMapper.decreaseStock(itemId,amount);
        if (affectedRow>0){
            return true;
        }else {
            return false;
        }
    }

3.生成交易流水號

自增序列:在數據庫中建一張表,包含name,currentValue,step。step是步長。在使用時每次都根據name來取對應的currentValue,並且取出來之後要更新currentValue,使它加上它的一個步長,這樣就可以保證每次的自增序列不會重複

根據name獲取tSequence:

 <select id="getSequenceByName" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from sequence_info
    where name = #{name,jdbcType=VARCHAR} for update
  </select>

生成流水號:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public String generateOderNo(){
    //訂單號16位
    StringBuilder stringBuilder = new StringBuilder();
    //前8位是年月日
    LocalDateTime now = LocalDateTime.now();
    String nowDate = now.format(DateTimeFormatter.ISO_DATE).replace("-","");
    stringBuilder.append(nowDate);

    //中間6位爲自增序列
    int sequence = 0;
    SequenceDO sequenceDO = sequenceDOMapper.getSequenceByName("order_info");
    sequence = sequenceDO.getCurrentValue();
    sequenceDO.setCurrentValue(sequenceDO.getCurrentValue()+sequenceDO.getStep());
    sequenceDOMapper.updateByPrimaryKeySelective(sequenceDO);
    String sequencestr = String.valueOf(sequence);
    for (int i=0;i<6-sequencestr.length();i++){
        stringBuilder.append(0);
    }
    stringBuilder.append(sequencestr);

    //最後2位爲分庫分表位 暫時寫死
    stringBuilder.append("00");

    return stringBuilder.toString();

}
private OrderInfoDO convertDOFromModel(orderModel orderModel){
        if (orderModel==null){
            return null;
        }
        OrderInfoDO orderInfoDO = new OrderInfoDO();

        orderInfoDO.setId(orderModel.getId());
        orderInfoDO.setAmount(orderModel.getAmount());
        orderInfoDO.setItemid(orderModel.getItemId());
        orderInfoDO.setItemprice(orderModel.getItemPrice().doubleValue());
        orderInfoDO.setOrderprice(orderModel.getOrderPrice().doubleValue());
        orderInfoDO.setUserid(orderModel.getUserId());
        return orderInfoDO;
    }

4訂單入庫
5加上商品銷量
在xml中增加一個方法然後在itemservice中調用

<update id="increaseSales" parameterType="com.miaosha3.dataobject.ItemDO">
    update item
    set sales = sales + #{amount},
    where id = #{id,jdbcType=INTEGER}
  </update>
@Override
    @Transactional
    public void increaseSales(Integer itemId, Integer amount) {
        itemDOMapper.increaseSales(itemId,amount);
    }

6返回前端

 @Override
    @Transactional
    public orderModel createOrder(Integer userId, 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,"數量信息不正確");
        }



        //落單減庫存(下單就鎖庫存),支付減庫存(支付纔去減庫存)這裏使用落單減庫存
        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.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;
    }

封裝下單請求

在控制器接收請求,在封裝請求調用service

 @RequestMapping(value = "/createorder",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType createOrder(@RequestParam(name = "itemId")Integer itemId,
                                        @RequestParam(name = "amount")Integer amount) throws BusinessException {
        //獲取用戶登錄信息
        Boolean isLogin = (Boolean) httpServletRequest.getSession().getAttribute("IS_LOGIN");//登錄成功保存的session
        if (isLogin == null || !isLogin.booleanValue()){
            throw new BusinessException(EmBusinessError.NOT_LOGIN);
        }
        UserModel userModel = (UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER");
        orderModel orderModel = orderService.createOrder(userModel.getId(),itemId,amount);

        return CommonReturnType.create(null);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章