@Override
  public int stockOut(Map<Integer, Integer> outStocks, Date date, String bz, String uId, int shopId)
      throws Exception {
    int ret = 0;
    SqlSession sqlSession = null;

    try {
      sqlSession = SessionUtils.getSession();

      OutStockMapper outStockMapper = sqlSession.getMapper(OutStockMapper.class);
      OutStockDetailMapper outStockDetailMapper = sqlSession.getMapper(OutStockDetailMapper.class);
      StockMapper stockMapper = sqlSession.getMapper(StockMapper.class);

      OutStock outStock = new OutStock();
      outStock.setoBz(bz);
      outStock.setoDate(date);
      outStock.setsId(shopId);
      outStock.setuId(uId);

      outStockMapper.insert(outStock);

      Iterator<Integer> iterator = outStocks.keySet().iterator();
      List<Stock> stocks = stockMapper.selectAll();

      while (iterator.hasNext()) {
        OutStockDetail outStockDetail = new OutStockDetail();
        outStockDetail.setOutstockId(outStock.getoId());
        outStockDetail.setpId(iterator.next());
        outStockDetail.setoNum(outStocks.get(outStockDetail.getpId()));
        outStockDetailMapper.insert(outStockDetail);

        boolean shopFlag = false, warehouseFlag = false;
        for (Stock stock : stocks) {
          if (stock.getShopId() == shopId && stock.getpId() == outStockDetail.getpId()) {
            stock.setsNum(stock.getsNum() + outStockDetail.getoNum());
            stockMapper.updateByPrimaryKey(stock);
            shopFlag = true;
            if (shopFlag && warehouseFlag) break;
          } else if (stock.getShopId() == 1 && stock.getpId() == outStockDetail.getpId()) {
            if (stock.getsNum() >= outStockDetail.getoNum()) {
              stock.setsNum(stock.getsNum() - outStockDetail.getoNum());
              stockMapper.updateByPrimaryKey(stock);
              warehouseFlag = true;
              if (shopFlag && warehouseFlag) break;
            } else {
              throw new Exception();
            }
          }
        }
        if (!warehouseFlag) {
          throw new Exception();
        }
        if (!shopFlag) {
          Stock stock = new Stock();
          stock.setShopId(shopId);
          stock.setpId(outStockDetail.getpId());
          stock.setsMaxnum(Integer.MAX_VALUE);
          stock.setsMinnum(0);
          stock.setsNum(outStockDetail.getoNum());
          stockMapper.insert(stock);
        }
      }

      sqlSession.commit();
      ret = 1;
    } catch (Exception e) {
      sqlSession.rollback();
      throw e;
    } finally {
      SessionUtils.closeSession(sqlSession);
    }

    return ret;
  }