Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r17149 -r17203 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 17149) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 17203) @@ -2974,7 +2974,7 @@ //发货仓库减库存列表 List allSourceStocks = new LinkedList(); //收货仓库加库存列表 - List allTargetStocks = new LinkedList(); +// List allTargetStocks = new LinkedList(); //获取发货单中所有临床科室对应的默认仓库 Map targetWareHouseMap = wareHouseManager.getDefaultWareHouse( updateStockInfo.keySet().stream().map( @@ -2983,14 +2983,14 @@ for (Map.Entry> entry : updateStockInfo.entrySet()) { WareHouse targetWareHouse = targetWareHouseMap.get(entry.getKey().getDepartCoding()); // List sourcestocks = TousseInstanceUtils.newGoodsStockList(entry.getValue(), wareHouse); - goodsStockManager.addToList(allSourceStocks, entry.getValue(), wareHouse); - goodsStockManager.addToList(allTargetStocks, entry.getValue(), targetWareHouse); + goodsStockManager.addToList(allSourceStocks, entry.getValue(), wareHouse,GoodsStockManager.MODE_OUTSTOCK); + goodsStockManager.addToList(allSourceStocks, entry.getValue(), targetWareHouse,GoodsStockManager.MODE_INSTOCK); // List targetstocks = TousseInstanceUtils.newGoodsStockList(entry.getValue(), targetWareHouse); // allSourceStocks.addAll(sourcestocks); // allTargetStocks.addAll(targetstocks); //将器械包的仓库设置为目标仓库 - tousseInstanceManager.setToDefaultWareHouse(entry.getValue(), entry.getKey().getDepartCoding()); + tousseInstanceManager.setToWarehouse(entry.getValue(), targetWareHouse); Invoice invoice = entry.getKey(); JSONObject invoiceObj = new JSONObject(); @@ -3012,11 +3012,11 @@ appLogManager.saveLog(AcegiHelper.getLoginUser(), "发货", "发货单明细", jsonInvoiceArray.toString()); try { if(CollectionUtils.isNotEmpty(allSourceStocks)){ - goodsStockManager.saveOrUpdateGoodsStock(allSourceStocks, GoodsStockManager.MODE_OUTSTOCK); + goodsStockManager.saveOrUpdateGoodsStockForInvoice(allSourceStocks); } - if(CollectionUtils.isNotEmpty(allTargetStocks)){ - goodsStockManager.saveOrUpdateGoodsStock(allTargetStocks, GoodsStockManager.MODE_INSTOCK); - } +// if(CollectionUtils.isNotEmpty(allTargetStocks)){ +// goodsStockManager.saveOrUpdateGoodsStock(allTargetStocks, GoodsStockManager.MODE_INSTOCK); +// } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r17162 -r17203 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 17162) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 17203) @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang3.StringUtils; @@ -69,6 +70,9 @@ } @SuppressWarnings("unchecked") public List getGoodsStock(Collection wareHouseIds,Collection goodsDefId,boolean toussedefIdOrMaterialDefId){ + if(CollectionUtils.isEmpty(goodsDefId) || CollectionUtils.isEmpty(wareHouseIds)){ + return ListUtils.emptyIfNull(null); + } String wareHouseIdPredicate = SqlUtils.getNonStringFieldInCollectionsPredicate("wareHouseId", wareHouseIds); String goodsDefIdPredicate = ""; String amountPredicate = " 1=1 "; @@ -78,8 +82,8 @@ goodsDefIdPredicate = SqlUtils.getNonStringFieldInCollectionsPredicate("materialDefinitionId", goodsDefId); } //为了材料扣库存的时候,写测试用例进行判断,添加按id排序,效果是先入库的先扣 - String sql = " where 1=1 and " + wareHouseIdPredicate + " and " + goodsDefIdPredicate + " and " + amountPredicate + " order by id asc"; - return objectDao.findBySql_ForUpdate(GoodsStock.class.getSimpleName(), sql); + String sql = " where 1=1 and " + wareHouseIdPredicate + " and " + goodsDefIdPredicate + " and " + amountPredicate; + return objectDao.getBySql_ForUpdate2(GoodsStock.class.getSimpleName(), sql); } public List saveOrUpdateGoodsStock(List goodsStockList, String mode){ @@ -101,14 +105,55 @@ } return retInfo; } + /** + * 发货时调用的扣减库存方法 + * @param goodsStockList + */ + public void saveOrUpdateGoodsStockForInvoice(List goodsStockList){ + if(CollectionUtils.isEmpty(goodsStockList)){ + return; + } + List outStockInfo = new ArrayList<>(); + + Map idTousseDefinitionMap = getIDTousseDefinitionMap(goodsStockList); + + List toussedefGoodsStockListInDb = new ArrayList<>(); + List materialDefGoodsStockListInDb = null; + + getGoodsStockSynchronized(goodsStockList,toussedefGoodsStockListInDb,materialDefGoodsStockListInDb); + + List toUpdateGoodsStock = new ArrayList(); //需要更新库存数量的库存记录 + for(GoodsStock goodsStockTemp : goodsStockList){ + if(isOutStock(goodsStockTemp)){ + doOutStock(outStockInfo, idTousseDefinitionMap, + toussedefGoodsStockListInDb, materialDefGoodsStockListInDb, + toUpdateGoodsStock, goodsStockTemp); + }else if(isInstock(goodsStockTemp)){ + doInStock(toussedefGoodsStockListInDb, goodsStockTemp); + } + + } + //最后一次更新需要更新的库存记录 + if(CollectionUtils.isNotEmpty(toUpdateGoodsStock)){ + for(GoodsStock gs : toUpdateGoodsStock){ + objectDao.saveOrUpdate(gs); + } + } + } + private boolean isInstock(GoodsStock gs){ + return StringTools.equals(MODE_INSTOCK, gs.getMode()); + } + private boolean isOutStock(GoodsStock gs){ + return StringTools.equals(MODE_OUTSTOCK, gs.getMode()); + } @Override public List saveOrUpdateGoodsStock(GoodsStock gs,String mode){ List goodsStockList = new ArrayList(); goodsStockList.add(gs); return saveOrUpdateGoodsStock(goodsStockList,mode); } private void doInStock(List goodsStockList) { - GoodsStock goodsStock = null; +// GoodsStock goodsStock = null; // Set wareHouseIds = new HashSet(); // Set tousseDefIds = new HashSet(); // for(GoodsStock gs : goodsStockList){ @@ -123,58 +168,69 @@ getGoodsStockSynchronized(goodsStockList,goodsStockInDB,null); for(GoodsStock goodsStockTemp : goodsStockList){ - if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ - throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); - } - //如果为器械包 - if(DatabaseUtil.isPoIdValid(goodsStockTemp.getTousseDefinitionId())){ - //先从list中找 - goodsStock = CollectionUtils.find(goodsStockInDB, new Predicate(){ - @Override - public boolean evaluate(GoodsStock gs) { - if(gs.getWareHouseId().equals(goodsStockTemp.getWareHouseId()) - && gs.getTousseDefinitionId().equals(goodsStockTemp.getTousseDefinitionId())){ - return true; - } - return false; + doInStock(goodsStockInDB, goodsStockTemp); + } + //一次写入数据库 + for(GoodsStock gs : goodsStockInDB){ + objectDao.saveOrUpdate(gs); + } + } + /** + * 入库操作。根据goodsStockTemp的信息,修改goodsStockInDB集合中某一记录的库存数量 + * @param goodsStockInDB + * @param goodsStockTemp + */ + private void doInStock(List goodsStockInDB, + GoodsStock goodsStockTemp) { + GoodsStock goodsStock; + if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ + throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + } + //如果为器械包 + if(DatabaseUtil.isPoIdValid(goodsStockTemp.getTousseDefinitionId())){ + //先从list中找 + goodsStock = CollectionUtils.find(goodsStockInDB, new Predicate(){ + @Override + public boolean evaluate(GoodsStock gs) { + if(gs.getWareHouseId().equals(goodsStockTemp.getWareHouseId()) + && gs.getTousseDefinitionId().equals(goodsStockTemp.getTousseDefinitionId())){ + return true; } - }); + return false; + } + }); // if(goodsStock == null){ // sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); // //判断库存数量是否大于退/出库数量 // goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); // } - if(goodsStock == null){ - goodsStock = new GoodsStock(); - goodsStock.setGoodsType(GoodsStock.TYPE_TOUSSE); - goodsStock.setWareHouseId(goodsStockTemp.getWareHouseId()); - goodsStock.setWareHouseName(goodsStockTemp.getWareHouseName()); - goodsStock.setMaterialDefinitionId(goodsStockTemp.getMaterialDefinitionId()); - goodsStock.setTousseDefinitionId(goodsStockTemp.getTousseDefinitionId()); - goodsStock.setName(goodsStockTemp.getName()); - goodsStock.setGoodsType(goodsStockTemp.getGoodsType()); - goodsStock.setOrgUnitCode(goodsStockTemp.getOrgUnitCode()); - goodsStock.setOrgUnitName(goodsStockTemp.getOrgUnitName()); - goodsStock.setAmount(goodsStockTemp.getAmount()); - objectDao.saveOrUpdate(goodsStock); - goodsStockInDB.add(goodsStock); - } else { - goodsStock.setAmount(goodsStock.getAmount() + goodsStockTemp.getAmount()); - addIfNotFind(goodsStockInDB, goodsStock); - //objectDao.saveOrUpdate(goodsStock); - } - }else if(DatabaseUtil.isPoIdValid(goodsStockTemp.getMaterialDefinitionId())){ - goodsStock = goodsStockTemp; - //如果为材料 + if(goodsStock == null){ + //这里不可能进入,除非goodsStockTemp的仓库id和包定义id其中一项为null,但是这种数据是没有用的 + goodsStock = new GoodsStock(); + goodsStock.setGoodsType(GoodsStock.TYPE_TOUSSE); + goodsStock.setWareHouseId(goodsStockTemp.getWareHouseId()); + goodsStock.setWareHouseName(goodsStockTemp.getWareHouseName()); + goodsStock.setMaterialDefinitionId(goodsStockTemp.getMaterialDefinitionId()); + goodsStock.setTousseDefinitionId(goodsStockTemp.getTousseDefinitionId()); + goodsStock.setName(goodsStockTemp.getName()); + goodsStock.setGoodsType(goodsStockTemp.getGoodsType()); + goodsStock.setOrgUnitCode(goodsStockTemp.getOrgUnitCode()); + goodsStock.setOrgUnitName(goodsStockTemp.getOrgUnitName()); + goodsStock.setAmount(goodsStockTemp.getAmount()); objectDao.saveOrUpdate(goodsStock); + goodsStockInDB.add(goodsStock); } else { - throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); + goodsStock.setAmount(goodsStock.getAmount() + goodsStockTemp.getAmount()); + addIfNotFind(goodsStockInDB, goodsStock); + //objectDao.saveOrUpdate(goodsStock); } + }else if(DatabaseUtil.isPoIdValid(goodsStockTemp.getMaterialDefinitionId())){ + goodsStock = goodsStockTemp; + //如果为材料 + objectDao.saveOrUpdate(goodsStock); + } else { + throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); } - //一次写入数据库 - for(GoodsStock gs : goodsStockInDB){ - objectDao.saveOrUpdate(gs); - } } /** @@ -196,78 +252,87 @@ List toUpdateGoodsStock = new ArrayList(); //需要更新库存数量的库存记录 for(GoodsStock goodsStockTemp : goodsStockList){ - if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ - throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + doOutStock(outStockInfo, idTousseDefinitionMap, + toussedefGoodsStockListInDb, materialDefGoodsStockListInDb, + toUpdateGoodsStock, goodsStockTemp); + } + //最后一次更新需要更新的库存记录 + if(CollectionUtils.isNotEmpty(toUpdateGoodsStock)){ + for(GoodsStock gs : toUpdateGoodsStock){ + objectDao.saveOrUpdate(gs); } - - if(DatabaseUtil.isPoIdValid(goodsStockTemp.getTousseDefinitionId())){ - TousseDefinition td = idTousseDefinitionMap.get(goodsStockTemp.getTousseDefinitionId()); - if(td != null){ + } + return outStockInfo; + } + private void doOutStock(List outStockInfo, + Map idTousseDefinitionMap, + List toussedefGoodsStockListInDb, + List materialDefGoodsStockListInDb, + List toUpdateGoodsStock, GoodsStock goodsStockTemp) { + if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ + throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + } + + if(DatabaseUtil.isPoIdValid(goodsStockTemp.getTousseDefinitionId())){ + TousseDefinition td = idTousseDefinitionMap.get(goodsStockTemp.getTousseDefinitionId()); + if(td != null){ - //按包定义祖先id查询并扣减库存 - GoodsStock goodsStock = CollectionUtils.find(toussedefGoodsStockListInDb,new Predicate(){ - @Override - public boolean evaluate(GoodsStock goodsStock) { - //goodsStock的wareHouseId有可能会为null,所以在equals前需要加上判断不为空 - return goodsStockTemp.getWareHouseId() != null && goodsStock.getWareHouseId() != null - && goodsStockTemp.getWareHouseId().equals(goodsStock.getWareHouseId()) - && goodsStockTemp.getTousseDefinitionId().equals(goodsStock.getTousseDefinitionId()); - }}); - //判断库存数量是否大于退/出库数量 - if(goodsStock == null){ - //这里应该是不可能再进入了,除非参数中,包定义id或者仓库id值非法 - int amount = getTousseInstanceStock(goodsStockTemp.getWareHouseId(),goodsStockTemp.getTousseDefinitionId()); - goodsStock = saveTousseStock(goodsStockTemp.getWareHouseId(),td, amount); - toussedefGoodsStockListInDb.add(goodsStock); - } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ - int amount = getTousseInstanceStock(goodsStockTemp.getWareHouseId(),goodsStockTemp.getTousseDefinitionId()); - goodsStock.setAmount(amount); - addIfNotFind(toUpdateGoodsStock,goodsStock); - }else{ - goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); - addIfNotFind(toUpdateGoodsStock,goodsStock); - } + //按包定义祖先id查询并扣减库存 + GoodsStock goodsStock = CollectionUtils.find(toussedefGoodsStockListInDb,new Predicate(){ + @Override + public boolean evaluate(GoodsStock goodsStock) { + //goodsStock的wareHouseId有可能会为null,所以在equals前需要加上判断不为空 + return goodsStockTemp.getWareHouseId() != null && goodsStock.getWareHouseId() != null + && goodsStockTemp.getWareHouseId().equals(goodsStock.getWareHouseId()) + && goodsStockTemp.getTousseDefinitionId().equals(goodsStock.getTousseDefinitionId()); + }}); + //判断库存数量是否大于退/出库数量 + if(goodsStock == null){ + //这里应该是不可能再进入了,除非参数中,包定义id或者仓库id值非法 + int amount = getTousseInstanceStock(goodsStockTemp.getWareHouseId(),goodsStockTemp.getTousseDefinitionId()); + goodsStock = saveTousseStock(goodsStockTemp.getWareHouseId(),td, amount); + toussedefGoodsStockListInDb.add(goodsStock); + } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ + int amount = getTousseInstanceStock(goodsStockTemp.getWareHouseId(),goodsStockTemp.getTousseDefinitionId()); + goodsStock.setAmount(amount); + addIfNotFind(toUpdateGoodsStock,goodsStock); }else{ - throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的器械包定义"); + goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); + addIfNotFind(toUpdateGoodsStock,goodsStock); } - }else if(DatabaseUtil.isPoIdValid(goodsStockTemp.getMaterialDefinitionId())){ - //先判断该材料所有库存总和是否大于需扣减的数量 - List list = materialDefGoodsStockListInDb.stream().filter( - gs->gs.getWareHouseId().equals(goodsStockTemp.getWareHouseId()) - && gs.getMaterialDefinitionId().equals(goodsStockTemp.getMaterialDefinitionId()) - && gs.getAmount() > 0).collect(Collectors.toList()); - int totalAmount = calculateTotalAmount(list); - - int needReturnAmount = goodsStockTemp.getAmount(); - if(totalAmount < needReturnAmount){ - throw new RuntimeException(goodsStockTemp.getName() + ",材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); - } - for(GoodsStock goodsStock : list){ - if(goodsStock.getAmount() >= needReturnAmount){ - addOutStockInfo(outStockInfo,goodsStock.getMaterialDefinitionId(), - goodsStock.getPrice(),needReturnAmount); - goodsStock.setAmount(goodsStock.getAmount() - needReturnAmount); - addIfNotFind(toUpdateGoodsStock,goodsStock); - - break; - } + }else{ + throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的器械包定义"); + } + }else if(DatabaseUtil.isPoIdValid(goodsStockTemp.getMaterialDefinitionId())){ + //先判断该材料所有库存总和是否大于需扣减的数量 + List list = materialDefGoodsStockListInDb.stream().filter( + gs->gs.getWareHouseId().equals(goodsStockTemp.getWareHouseId()) + && gs.getMaterialDefinitionId().equals(goodsStockTemp.getMaterialDefinitionId()) + && gs.getAmount() > 0).collect(Collectors.toList()); + int totalAmount = calculateTotalAmount(list); + + int needReturnAmount = goodsStockTemp.getAmount(); + if(totalAmount < needReturnAmount){ + throw new RuntimeException(goodsStockTemp.getName() + ",材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + for(GoodsStock goodsStock : list){ + if(goodsStock.getAmount() >= needReturnAmount){ addOutStockInfo(outStockInfo,goodsStock.getMaterialDefinitionId(), - goodsStock.getPrice(),goodsStock.getAmount()); - needReturnAmount -= goodsStock.getAmount(); - goodsStock.setAmount(0); + goodsStock.getPrice(),needReturnAmount); + goodsStock.setAmount(goodsStock.getAmount() - needReturnAmount); addIfNotFind(toUpdateGoodsStock,goodsStock); + + break; } - } else { - throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); + addOutStockInfo(outStockInfo,goodsStock.getMaterialDefinitionId(), + goodsStock.getPrice(),goodsStock.getAmount()); + needReturnAmount -= goodsStock.getAmount(); + goodsStock.setAmount(0); + addIfNotFind(toUpdateGoodsStock,goodsStock); } + } else { + throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); } - //最后一次更新需要更新的库存记录 - if(CollectionUtils.isNotEmpty(toUpdateGoodsStock)){ - for(GoodsStock gs : toUpdateGoodsStock){ - objectDao.saveOrUpdate(gs); - } - } - return outStockInfo; } private void addOutStockInfo(List outStockInfo,Long materialDefId,Double price,Integer amount){ if(outStockInfo != null && materialDefId != null){ @@ -407,6 +472,21 @@ }}); return goodsStockFind; } + private GoodsStock findTousseGoodsStock(Collection goodsStocks, + Long wareHouseId,Long toussedefinitionId,String mode){ + if(wareHouseId == null || toussedefinitionId == null || CollectionUtils.isEmpty(goodsStocks)){ + return null; + } + GoodsStock goodsStockFind = CollectionUtils.find(goodsStocks,new Predicate(){ + @Override + public boolean evaluate(GoodsStock gs) { + return gs != null && StringTools.equals(gs.getGoodsType(), GoodsStock.TYPE_TOUSSE) + && StringTools.equals(mode, gs.getMode()) + && wareHouseId.equals(gs.getWareHouseId()) + && toussedefinitionId.equals(gs.getTousseDefinitionId()); + }}); + return goodsStockFind; + } /** * 在集合中如果没有找到库存记录,则将库存记录添加到集合中。根据id进行比对查找 * @param goodsStocks @@ -555,6 +635,31 @@ } find.setAmount(MathTools.add(find.getAmount(), 1).intValue()); } + + public void addToList(Collection goodsStocks, + TousseInstance tousseInstance, WareHouse wareHouse,String mode) { + if(!MODE_INSTOCK.equals(mode) && !MODE_OUTSTOCK.equals(mode)){ + throw new RuntimeException("参数mode="+mode+"值非法"); + } + if(tousseInstance == null || wareHouse == null || goodsStocks == null){ + return ; + } + GoodsStock find = findTousseGoodsStock(goodsStocks,wareHouse.getId(), + tousseInstance.getTousseDefinitionAncestorID(),mode); + if(find == null){ + find = new GoodsStock(); + find.setGoodsType(GoodsStock.TYPE_TOUSSE); + find.setName(tousseInstance.getTousseName()); + find.setOrgUnitCode(wareHouse.getOrgUnitCode()); + find.setOrgUnitName(wareHouse.getOrgUnitName()); + find.setTousseDefinitionId(tousseInstance.getTousseDefinitionAncestorID()); + find.setWareHouseId(wareHouse.getId()); + find.setWareHouseName(wareHouse.getName()); + find.setMode(mode); + goodsStocks.add(find); + } + find.setAmount(MathTools.add(find.getAmount(), 1).intValue()); + } @Override public void addToList(Collection goodsStocks, @@ -568,6 +673,18 @@ } } } + @Override + public void addToList(Collection goodsStocks, + Collection tousseInstances, WareHouse wareHouse,String mode){ + if(goodsStocks == null){ + return; + } + if(CollectionUtils.isNotEmpty(tousseInstances)){ + for(TousseInstance ti : tousseInstances){ + addToList(goodsStocks,ti,wareHouse,mode); + } + } + } @Override public void addToList(List goodsStockList, Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java =================================================================== diff -u -r17162 -r17203 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 17162) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 17203) @@ -34,6 +34,11 @@ */ public List saveOrUpdateGoodsStock(List goodsStockList, String mode); /** + * 发货时扣减库存,出入库的对象集合一起 + * @param goodsStockList + */ + public void saveOrUpdateGoodsStockForInvoice(List goodsStockList); + /** * 材料扣库存。只做库存扣减,不加增加操作。扣减的时候,会按供应商扣,供应商A提供的物品A,供应商B也提供了物品A,如果扣物品A,需要指定供应商。 * 如果指定供应商A,则只扣供应商A的库存,供应商B的库存不变 * 同一个供应商不同价格的物品,价格相同的才扣减 @@ -113,13 +118,31 @@ */ public void addToList(Collection goodsStocks,TousseInstance tousseInstance,WareHouse wareHouse); /** + * 向集合中添加指定仓库的器械包库存。只能适用于器械包。如果根据仓库和包实例关联包定义的祖先在集合中可以找到库存对象,并且同为入库或者同为出库,则将数量添加到原来的对象中;否则创建对象 + * @param goodsStocks + * @param tousseInstance + * @param wareHouse + * @param mode + */ + public void addToList(Collection goodsStocks, + TousseInstance tousseInstance, WareHouse wareHouse,String mode); + /** * 向集合中添加指定仓库的器械包库存。只能适用于器械包。如果根据仓库和包实例关联包定义的祖先在集合中可以找到库存对象,则将数量添加到原来的对象中;否则创建对象 * @param goodsStocks * @param tousseInstances * @param wareHouse */ public void addToList(Collection goodsStocks,Collection tousseInstances,WareHouse wareHouse); /** + * 将库存对象添加到集合中,并指定是入库对象还是出库对象 + * @param goodsStocks + * @param tousseInstances + * @param wareHouse + * @param mode + */ + public void addToList(Collection goodsStocks, + Collection tousseInstances, WareHouse wareHouse,String mode); + /** * 创建器械包的库存对象。库存的仓库属性取包实例的仓库属性。用于出库 * @param goodsStocks * @param tousseInstance Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/WareHouse.java =================================================================== diff -u -r12835 -r17203 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/WareHouse.java (.../WareHouse.java) (revision 12835) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/WareHouse.java (.../WareHouse.java) (revision 17203) @@ -6,6 +6,8 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.Cache; @@ -20,6 +22,7 @@ * @since 2016-03-19 */ @Entity +@Table(indexes = {@Index(columnList = "orgUnitCode", name = "orgUnitCode_index"),@Index(columnList = "sequence",name = "sequence_index")}) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @JsonFilter("fieldFilter") public class WareHouse extends BarcodeDevice { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java =================================================================== diff -u -r17162 -r17203 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java (.../GoodsStock.java) (revision 17162) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java (.../GoodsStock.java) (revision 17203) @@ -95,6 +95,10 @@ * 供应商,临时变量,不持久化。目前在材料退库时,需要退对应的供应商,有使用 */ private String supplier; + /** + * 入库或者出库。临时变量,在批量操作库存的时候使用,用于标志当前库存对象是作入库操作还是做出库操作 + */ + private String mode; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -204,6 +208,15 @@ public void setSupplier(String supplier) { this.supplier = supplier; } + @Transient + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + /** * 判断是否是器械包类型的库存.如果类型为器械包或者有包定义id有效(现在的逻辑是包定义id有效就是器械包),则是器械包的库存 * @return Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r17114 -r17203 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 17114) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 17203) @@ -415,5 +415,13 @@ * @return true 当器械包的灭菌炉有配了定期监测,并且没有录入了相关的定期监测记录;其他情况均返回false */ public boolean isNeedRoutineMonitoringWarming(String barcode); + + /** + * 将器械包的集合设置仓库属性。如果targetWareHouse为null,则将包实例的仓库id设置为null,仓库名称设置为""; + * @param tousseInstances + * @param targetWareHouse + */ + public void setToWarehouse(Collection tousseInstances, + WareHouse targetWareHouse); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r17149 -r17203 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 17149) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 17203) @@ -2758,4 +2758,21 @@ } return haveRoutineMonitoring; } + + @Override + public void setToWarehouse(Collection tousseInstances, + WareHouse targetWareHouse) { + if(CollectionUtils.isNotEmpty(tousseInstances)){ + if(targetWareHouse == null){ + targetWareHouse = new WareHouse(); + targetWareHouse.setId(null); + targetWareHouse.setName(""); + } + for(TousseInstance ti : tousseInstances){ + if(ti != null){ + setToWarehouse(ti,targetWareHouse); + } + } + } + } }