@Override
 public int hashCode() {
   int result = 17;
   result = result * 31 + material.getId();
   result = result * 31 + dept.getId();
   return result;
 }
 @Override
 public boolean equals(Object obj) {
   if (obj == null || !(obj instanceof MaterialDept)) {
     return false;
   } else {
     return material.getId() == ((MaterialDept) obj).material.getId()
         && dept.getId() == ((MaterialDept) obj).dept.getId();
   }
 }
 @Override
 public String toString() {
   return "materialDept : materialId = "
       + material.getId()
       + " ,deptId = "
       + dept.getId()
       + " ,restaurantId"
       + restaurantId
       + " ,stock"
       + stock;
 }
  private void testInsert(InsertBuilder builder) throws SQLException, BusinessException {

    // 添加一张入库存单

    final int stockActionId = StockActionDao.insertStockAction(mStaff, builder);

    StockAction expected = builder.build();
    // 根据不同类型获取供应商或部门
    if (builder.getSubType() == SubType.STOCK_IN) {
      Department deptIn = DepartmentDao.getById(mStaff, builder.getDeptIn().getId());
      Supplier supplier =
          SupplierDao.getSupplierById(mStaff, builder.getSupplier().getSupplierId());
      expected.setDeptIn(deptIn);
      expected.setSupplier(supplier);
    } else if (builder.getSubType() == SubType.STOCK_OUT) {
      Department deptOut = DepartmentDao.getById(mStaff, builder.getDeptOut().getId());
      Supplier supplier =
          SupplierDao.getSupplierById(mStaff, builder.getSupplier().getSupplierId());
      expected.setDeptOut(deptOut);
      expected.setSupplier(supplier);
    } else if (builder.getSubType() == SubType.STOCK_IN_TRANSFER
        || builder.getSubType() == SubType.STOCK_OUT_TRANSFER) {
      Department deptIn = DepartmentDao.getById(mStaff, builder.getDeptIn().getId());
      Department deptOut = DepartmentDao.getById(mStaff, builder.getDeptOut().getId());
      expected.setDeptIn(deptIn);
      expected.setDeptOut(deptOut);
    } else {
      Department deptIn = DepartmentDao.getById(mStaff, builder.getDeptIn().getId());
      expected.setDeptIn(deptIn);
    }
    expected.setId(stockActionId);

    StockAction actual = StockActionDao.getStockAndDetailById(mStaff, stockActionId);
    compare(expected, actual, true);

    // TODO 要修改的话解注释
    /*		InsertBuilder updatebuilder = StockAction.InsertBuilder.newStockIn(mTerminal.restaurantID, DateUtil.parseDate("2013-09-29 12:12:12"))
    		   .setOriStockId("aaa12000")
    		   .setOperatorId((int) mTerminal.pin).setOperator(mTerminal.owner)
    		   .setComment("good hting")
    		   .setDeptIn(actual.getDeptIn().getId())
    		   .setCateType(CateType.GOOD)
    		   .setSupplierId(actual.getSupplier().getSupplierId())
    		   .addDetail(new StockActionDetail(2, 30f, 90))
    			.addDetail(new StockActionDetail(4, 30f, 30));
    StockActionDao.updateStockAction(mTerminal, actual.getId(), updatebuilder);*/

    // 在审核时先获取之前的数据以作对比
    //		Map<Object, Object> param = new HashMap<Object, Object>();
    //		param.put(SQLUtil.SQL_PARAMS_EXTRA, " AND M.restaurant_id = " + mStaff.getRestaurantId());
    List<Material> beforeMaterials = MaterialDao.getByCond(mStaff, null);

    List<MaterialDept> beforeMaterialDepts =
        MaterialDeptDao.getMaterialDepts(
            mStaff, " AND restaurant_id = " + mStaff.getRestaurantId(), null);
    // 审核库存
    expected = actual;
    AuditBuilder uBuilder =
        StockAction.AuditBuilder.newStockActionAudit(expected.getId())
            .setApprover("兰戈")
            .setApproverId(12);
    // 做对比数据之用
    expected.setApprover("兰戈");
    expected.setApproverId(12);
    expected.setStatus(Status.AUDIT);
    /*		expected.setOriStockId("aaa12000");
    expected.setComment("good hting");
    expected.setOriStockIdDate(DateUtil.parseDate("2013-09-29 12:12:12"));*/

    // 审核
    StockActionDao.auditStockAction(mStaff, uBuilder);

    actual = StockActionDao.getStockAndDetailById(mStaff, uBuilder.getId());
    // 对比审核后期望与真实值
    compare(expected, actual, false);

    // 审核完成,与部门库存,商品原料库存对接
    for (StockActionDetail actualStockActionDetail : actual.getStockDetails()) {

      // 获取变化数量
      float deltaStock = actualStockActionDetail.getAmount();
      int index;
      if (actual.getSubType() == SubType.STOCK_IN) {
        MaterialDept afterMaterialDept =
            MaterialDeptDao.getMaterialDepts(
                    mStaff,
                    " AND material_id = "
                        + actualStockActionDetail.getMaterialId()
                        + " AND dept_id = "
                        + actual.getDeptIn().getId(),
                    null)
                .get(0);
        index = beforeMaterialDepts.indexOf(afterMaterialDept);
        if (index >= 0) {
          float deltaMaterialDeptStock =
              Math.abs(afterMaterialDept.getStock() - beforeMaterialDepts.get(index).getStock());
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        } else {
          float deltaMaterialDeptStock = afterMaterialDept.getStock();
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        }
        // 对比原料表的变化
        Material afterMaterial =
            MaterialDao.getById(mStaff, actualStockActionDetail.getMaterialId());
        index = beforeMaterials.indexOf(afterMaterial);
        if (index >= 0) {
          float deltaMaterialStock =
              afterMaterial.getStock() - beforeMaterials.get(index).getStock();
          Assert.assertEquals("deltaMaterialStock", deltaStock, deltaMaterialStock, 0.0001);
        } else {
          throw new BusinessException(MaterialError.MATERIAL_NOT_EXIST);
        }
      } else if (actual.getSubType() == SubType.SPILL
          || actual.getSubType() == SubType.DAMAGE
          || actual.getSubType() == SubType.USE_UP) {
        MaterialDept afterMaterialDept =
            MaterialDeptDao.getMaterialDepts(
                    mStaff,
                    " AND material_id = "
                        + actualStockActionDetail.getMaterialId()
                        + " AND dept_id = "
                        + actual.getDeptIn().getId(),
                    null)
                .get(0);
        index = beforeMaterialDepts.indexOf(afterMaterialDept);
        if (index >= 0) {
          float deltaMaterialDeptStock =
              Math.abs(afterMaterialDept.getStock() - beforeMaterialDepts.get(index).getStock());
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        } else {
          throw new BusinessException(StockError.MATERIAL_DEPT_ADD);
        }
        // 对比材料表变化
        Material afterMaterial =
            MaterialDao.getById(mStaff, actualStockActionDetail.getMaterialId());
        index = beforeMaterials.indexOf(afterMaterial);
        if (index >= 0) {
          float deltaMaterialStock =
              Math.abs(afterMaterial.getStock() - beforeMaterials.get(index).getStock());
          Assert.assertEquals("deltaMaterialStock", deltaStock, deltaMaterialStock, 0.0001);
        } else {
          throw new BusinessException(MaterialError.MATERIAL_NOT_EXIST);
        }

      } else if (actual.getSubType() == SubType.STOCK_OUT) {
        MaterialDept afterMaterialDept =
            MaterialDeptDao.getMaterialDepts(
                    mStaff,
                    " AND material_id = "
                        + actualStockActionDetail.getMaterialId()
                        + " AND dept_id = "
                        + actual.getDeptOut().getId(),
                    null)
                .get(0);
        index = beforeMaterialDepts.indexOf(afterMaterialDept);
        if (index >= 0) {
          float deltaMaterialDeptStock =
              beforeMaterialDepts.get(index).getStock() - afterMaterialDept.getStock();
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        } else {
          throw new BusinessException(StockError.MATERIAL_DEPT_ADD);
        }
        // 对比原料表的变化
        //				Map<Object, Object> afterParam = new HashMap<Object, Object>();
        //				afterParam.put(SQLUtil.SQL_PARAMS_EXTRA, " AND M.restaurant_id = " +
        // mStaff.getRestaurantId() + " AND M.material_id = " +
        // actualStockActionDetail.getMaterialId());
        Material afterMaterial =
            MaterialDao.getByCond(
                    mStaff,
                    new MaterialDao.ExtraCond().setId(actualStockActionDetail.getMaterialId()))
                .get(0);
        index = beforeMaterials.indexOf(afterMaterial);
        if (index >= 0) {
          float deltaMaterialStock =
              Math.abs(afterMaterial.getStock() - beforeMaterials.get(index).getStock());
          Assert.assertEquals("deltaMaterialStock", deltaStock, deltaMaterialStock, 0.0001);
        } else {
          throw new BusinessException(MaterialError.MATERIAL_NOT_EXIST);
        }
      } else if (actual.getSubType() == SubType.STOCK_IN_TRANSFER
          || actual.getSubType() == SubType.STOCK_OUT_TRANSFER) {
        MaterialDept afterMaterialDeptIn =
            MaterialDeptDao.getMaterialDepts(
                    mStaff,
                    " AND material_id = "
                        + actualStockActionDetail.getMaterialId()
                        + " AND dept_id = "
                        + actual.getDeptIn().getId(),
                    null)
                .get(0);
        MaterialDept afterMaterialDeptOut =
            MaterialDeptDao.getMaterialDepts(
                    mStaff,
                    " AND material_id = "
                        + actualStockActionDetail.getMaterialId()
                        + " AND dept_id = "
                        + actual.getDeptOut().getId(),
                    null)
                .get(0);
        int indexOut = beforeMaterialDepts.indexOf(afterMaterialDeptOut);
        if (indexOut >= 0) {
          float deltaMaterialDeptStock =
              Math.abs(
                  afterMaterialDeptOut.getStock() - beforeMaterialDepts.get(indexOut).getStock());
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        } else {
          throw new BusinessException(StockError.MATERIAL_DEPT_ADD);
        }

        index = beforeMaterialDepts.indexOf(afterMaterialDeptIn);
        if (index >= 0) {
          float deltaMaterialDeptStock =
              Math.abs(afterMaterialDeptIn.getStock() - beforeMaterialDepts.get(index).getStock());
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        } else {
          float deltaMaterialDeptStock = afterMaterialDeptIn.getStock();
          Assert.assertEquals("deltaMaterialDeptStock", deltaStock, deltaMaterialDeptStock, 0.0001);
        }
      }
    }

    /*		StockActionDao.deleteStockActionById(mTerminal, StockActionId);

    try{
    	StockActionDao.getStockActionById(mTerminal, StockActionId);
    	Assert.assertTrue("delete stock in record(id = " + StockActionId + ") failed", false);
    }catch(BusinessException e){

    }*/
  }
 public int getMaterialId() {
   return material.getId();
 }
 public float totalCost() {
   float total = material.getPrice() * this.getStock();
   return (float) (Math.round(total * 100)) / 100;
 }