Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r13123 -r13454 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 13123) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 13454) @@ -7,6 +7,7 @@ import org.apache.commons.collections4.CollectionUtils; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; @@ -46,16 +47,51 @@ throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); } if(goodsStockTemp.getTousseDefinitionId() != null && goodsStockTemp.getTousseDefinitionId() != 0){ - sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); - //判断库存数量是否大于退/出库数量 - goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); - if(goodsStock == null){ - throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的库存数据,不能出库或退库"); - } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ - throw new RuntimeException(goodsStockTemp.getName() + "的库存数量小于出库或退库数量,不能出库或退库"); - } else { - goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); - objectDao.saveOrUpdate(goodsStock); + TousseDefinition td = + (TousseDefinition)objectDao.getBySql(TousseDefinition.class.getSimpleName(), "where id=" + goodsStockTemp.getTousseDefinitionId()); + //如果包定义为消毒物品、外来器械、自定义器械包等,则按器械包名称查询库存并进行扣减 + if(td != null){ + if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(td.getTousseType()) + || TousseDefinition.PACKAGE_TYPE_FOREIGN.equals(td.getTousseType()) + || TousseDefinition.PACKAGE_TYPE_CUSTOM.equals(td.getTousseType())){ + //先按器械包名称查询库存是否足够 + int amount = + objectDao.countBySql("select count(0) from " + GoodsStock.class.getSimpleName() + " and name = '" + goodsStockTemp.getName() + "' and amount > 0"); + if(amount < goodsStockTemp.getAmount()){ + throw new RuntimeException(goodsStockTemp.getName() + "的库存数量小于出库或退库数量,不能出库或退库"); + } else { + sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and name = '" + goodsStockTemp.getName() + "' and amount > 0"; + List list = objectDao.findBySql(GoodsStock.class.getSimpleName(), sql); + int needOutAmount = goodsStockTemp.getAmount(); + for(GoodsStock stock : list){ + //如果能够扣完,则跳出 + if(stock.getAmount() >= needOutAmount){ + stock.setAmount(stock.getAmount() - needOutAmount); + objectDao.saveOrUpdate(stock); + break; + } + //否则当前库存扣完,直至扣至需要扣完的为止 + needOutAmount -= stock.getAmount(); + stock.setAmount(0); + objectDao.saveOrUpdate(stock); + } + } + }else{ + //如果为器械包、敷料包时则按包定义id查询并扣减库存 + sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); + //判断库存数量是否大于退/出库数量 + goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock == null){ + throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的库存数据,不能出库或退库"); + } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ + throw new RuntimeException(goodsStockTemp.getName() + "的库存数量小于出库或退库数量,不能出库或退库"); + } else { + goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); + objectDao.saveOrUpdate(goodsStock); + } + } + }else{ + throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的器械包定义"); } }else if(goodsStockTemp.getMaterialDefinitionId() != null && goodsStockTemp.getMaterialDefinitionId() != 0){ //先判断该材料所有库存总和是否大于需扣减的数量