Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java =================================================================== diff -u -r17203 -r17210 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 17203) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 17210) @@ -2,7 +2,9 @@ import java.util.Collection; import java.util.List; +import java.util.Map; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; @@ -37,7 +39,8 @@ * 发货时扣减库存,出入库的对象集合一起 * @param goodsStockList */ - public void saveOrUpdateGoodsStockForInvoice(List goodsStockList); + public void saveOrUpdateGoodsStockForInvoice(List toussedefGoodsStockListInDb, + Map idTousseDefinitionMap,List goodsStockList); /** * 材料扣库存。只做库存扣减,不加增加操作。扣减的时候,会按供应商扣,供应商A提供的物品A,供应商B也提供了物品A,如果扣物品A,需要指定供应商。 * 如果指定供应商A,则只扣供应商A的库存,供应商B的库存不变 @@ -155,5 +158,14 @@ */ public void addToList(List goodsStockList, List waitWasteTousseInstanceList); + /** + * 锁定仓库下器械包的库存记录 + * @param sourceWareHouse + * @param targetWareHouse + * @param toousseDefinitions + * @return + */ + public List lockGoodsStocks(WareHouse sourceWareHouse, + Collection targetWareHouse,Collection toousseDefinitions); } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r17203 -r17210 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 17203) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 17210) @@ -1479,7 +1479,53 @@ } } } - + /** + * 获取发货的目标仓库 + * @param submitInvoiceContext + */ + private void loadTargetWareHouse( + SubmitInvoiceContext submitInvoiceContext){ + if(submitInvoiceContext == null){ + return; + } + Set applyDepartCodes = new HashSet<>(); //申请科室条码 + String departCode = submitInvoiceContext.getDepartCode(); //发货的目标科室 + if(StringTools.isNotBlank(departCode)){ + applyDepartCodes.add(departCode); + } + if(CollectionUtils.isNotEmpty(submitInvoiceContext.getInvoicePlanList())){ + for(InvoicePlan ip : submitInvoiceContext.getInvoicePlanList()){ + String code = ip.getDepartCoding(); + if(StringTools.isNotBlank(code)){ + applyDepartCodes.add(code); + } + } + } + Map targetWareHouseMap = wareHouseManager.getDefaultWareHouse(applyDepartCodes); + submitInvoiceContext.getTargetWareHouseMap().putAll(targetWareHouseMap); + } + /** + * 锁定器械包的库存,包括源仓库和目标仓库的库存 + * @param submitInvoiceContext + */ + private void lockGoodsStocks( + SubmitInvoiceContext submitInvoiceContext){ + if(submitInvoiceContext == null){ + return; + } + WareHouse sourceWareHouse = submitInvoiceContext.getSourceWarehouse(); + Map targetWareHouseMap = submitInvoiceContext.getTargetWareHouseMap(); + Collection tousseInstances = submitInvoiceContext.getBarcodeToTousseInstanceMap().values(); + if(CollectionUtils.isNotEmpty(tousseInstances)){ + List tds = new ArrayList<>(); + for(TousseInstance ti : tousseInstances){ + if(ti != null){ + tds.add(ti.getTousseDefinition()); + } + } + submitInvoiceContext.getAllGoodsStocksInDB().addAll(goodsStockManager.lockGoodsStocks(sourceWareHouse, targetWareHouseMap.values(),tds)); + } + } private void lockDiposableGoods2( SubmitInvoiceContext submitInvoiceContext) { String sourceWarehouseId = submitInvoiceContext.getSourceWarehouseId(); @@ -1783,6 +1829,10 @@ lockTousseInstances2(submitInvoiceContext); // 锁定一次性物品 lockDiposableGoods2(submitInvoiceContext); + // 获取目标仓库 + loadTargetWareHouse(submitInvoiceContext); + // 锁定库存记录 + lockGoodsStocks(submitInvoiceContext); // 自动扣减的一次性物品id Set disposableGoodsIds = TousseInstanceUtils.getDisposableGoodsIds(objectDao, submitInvoiceContext.getScannedTousseInstances()); DisposableGoodsServiceContext autoDeductionDisposableGoodsServiceContext = submitInvoiceContext.getAutoDeductionDisposableGoodsServiceContext(); @@ -1808,7 +1858,7 @@ List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新仓库的库存 - updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext.getSourceWarehouseId()); + updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext); updateOtherInvoicePlanStatus(submitInvoiceContext); // 检查是否已完全发货 // for (Map.Entry entry : sendOutAmountMap.entrySet()) { @@ -1986,6 +2036,10 @@ lockTousseInstances2(submitInvoiceContext); // 锁定一次性物品 lockDiposableGoods2(submitInvoiceContext); + // 获取目标仓库 + loadTargetWareHouse(submitInvoiceContext); + // 锁定库存记录 + lockGoodsStocks(submitInvoiceContext); // 自动扣减的一次性物品id Set disposableGoodsIds = TousseInstanceUtils.getDisposableGoodsIds(objectDao, submitInvoiceContext.getScannedTousseInstances()); DisposableGoodsServiceContext autoDeductionDisposableGoodsServiceContext = submitInvoiceContext.getAutoDeductionDisposableGoodsServiceContext(); @@ -2002,7 +2056,7 @@ List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新仓库的库存 - updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext.getSourceWarehouseId()); + updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext); updateOtherInvoicePlanStatus(submitInvoiceContext); // 检查是否已完全发货 // for (Map.Entry entry : sendOutAmountMap.entrySet()) { @@ -2057,6 +2111,7 @@ submitInvoiceContext.setAssistantSender(assistantSender); submitInvoiceContext.setSender(sender); submitInvoiceContext.setSourceWarehouseId(sourceWarehouseId); + submitInvoiceContext.setSourceWarehouse(wareHouseManager.getWareHouseById(sourceWarehouseId)); submitInvoiceContext.setSourceWarehouseName(sourceWarehouseName); submitInvoiceContext.setParams(params); JSONArray jsonArrayInvoiceItems = params @@ -2096,6 +2151,10 @@ lockTousseInstances2(submitInvoiceContext); // 锁定一次性物品 lockDiposableGoods2(submitInvoiceContext); + // 获取目标仓库 + loadTargetWareHouse(submitInvoiceContext); + // 锁定库存记录 + lockGoodsStocks(submitInvoiceContext); // 自动扣减的一次性物品id Set disposableGoodsIds = TousseInstanceUtils.getDisposableGoodsIds(objectDao, submitInvoiceContext.getScannedTousseInstances()); DisposableGoodsServiceContext autoDeductionDisposableGoodsServiceContext = submitInvoiceContext.getAutoDeductionDisposableGoodsServiceContext(); @@ -2134,7 +2193,7 @@ // 更新其他单的状态 updateOtherInvoicePlanStatus(submitInvoiceContext); // 更新仓库的库存 - updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext.getSourceWarehouseId()); + updateTousseInstanceStockInwareHouse(updateStockInfo, submitInvoiceContext); // 更新与校验聚合包状态 updateAndValidateComboTousseStatus(submitInvoiceContext); // 检查是否已完全发货 @@ -2964,9 +3023,9 @@ // 更新各科室库存 updateDepartmentStock(filteredUpdateStockInfo,tdMap); } - private void updateTousseInstanceStockInwareHouse(Map> updateStockInfo,String sendWareHouseId){ + private void updateTousseInstanceStockInwareHouse(Map> updateStockInfo,SubmitInvoiceContext submitInvoiceContext){ if(updateStockInfo != null){ - WareHouse wareHouse = wareHouseManager.getWareHouseById(sendWareHouseId); + WareHouse wareHouse = submitInvoiceContext.getSourceWarehouse(); if(wareHouse == null){ throw new RuntimeException("未找到发货仓库!"); } @@ -2976,9 +3035,10 @@ //收货仓库加库存列表 // List allTargetStocks = new LinkedList(); //获取发货单中所有临床科室对应的默认仓库 - Map targetWareHouseMap = wareHouseManager.getDefaultWareHouse( - updateStockInfo.keySet().stream().map( - invoice->invoice.getDepartCoding()).collect(Collectors.toList())); + Map targetWareHouseMap = submitInvoiceContext.getTargetWareHouseMap(); +// Map targetWareHouseMap = wareHouseManager.getDefaultWareHouse( +// updateStockInfo.keySet().stream().map( +// invoice->invoice.getDepartCoding()).collect(Collectors.toList())); for (Map.Entry> entry : updateStockInfo.entrySet()) { WareHouse targetWareHouse = targetWareHouseMap.get(entry.getKey().getDepartCoding()); @@ -3012,7 +3072,8 @@ appLogManager.saveLog(AcegiHelper.getLoginUser(), "发货", "发货单明细", jsonInvoiceArray.toString()); try { if(CollectionUtils.isNotEmpty(allSourceStocks)){ - goodsStockManager.saveOrUpdateGoodsStockForInvoice(allSourceStocks); + goodsStockManager.saveOrUpdateGoodsStockForInvoice(submitInvoiceContext.getAllGoodsStocksInDB(), + submitInvoiceContext.getTousseDefinitionIdToTousseDefinitionMap(),allSourceStocks); } // if(CollectionUtils.isNotEmpty(allTargetStocks)){ // goodsStockManager.saveOrUpdateGoodsStock(allTargetStocks, GoodsStockManager.MODE_INSTOCK); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r16848 -r17210 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 16848) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 17210) @@ -20,6 +20,8 @@ import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; @@ -38,6 +40,12 @@ private String depart = ""; private String sourceWarehouseId = ""; private String sourceWarehouseName = ""; + /** + * 发货源仓库 + */ + private WareHouse sourceWarehouse; + + private Map targetWareHouseMap = new HashMap<>(); private String sender = ""; private String assistantSender = ""; private JSONObject params; @@ -67,7 +75,12 @@ private DisposableGoodsServiceContext autoDeductionDisposableGoodsServiceContext = new DisposableGoodsServiceContext(); private Set autoDeductionDisposableGoodsInvoiceItems = new HashSet(); private List autoDeductionDisposableGoodsItems = new LinkedList(); + private List allGoodsStocksInDB = new LinkedList<>();//数据库中的库存对象 + public List getAllGoodsStocksInDB() { + return allGoodsStocksInDB; + } + public SupplyRoomConfig getSupplyRoomConfig() { return supplyRoomConfig; } @@ -145,6 +158,14 @@ this.sourceWarehouseId = sourceWarehouseId; } + public WareHouse getSourceWarehouse() { + return sourceWarehouse; + } + + public void setSourceWarehouse(WareHouse sourceWarehouse) { + this.sourceWarehouse = sourceWarehouse; + } + public String getSourceWarehouseName() { return sourceWarehouseName; } @@ -153,6 +174,10 @@ this.sourceWarehouseName = sourceWarehouseName; } + public Map getTargetWareHouseMap() { + return targetWareHouseMap; + } + public String getSender() { return sender; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r17203 -r17210 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 17203) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 17210) @@ -109,24 +109,20 @@ * 发货时调用的扣减库存方法 * @param goodsStockList */ - public void saveOrUpdateGoodsStockForInvoice(List goodsStockList){ + public void saveOrUpdateGoodsStockForInvoice(List toussedefGoodsStockListInDb, + Map idTousseDefinitionMap,List goodsStockList){ if(CollectionUtils.isEmpty(goodsStockList)){ return; } List outStockInfo = new ArrayList<>(); - Map idTousseDefinitionMap = getIDTousseDefinitionMap(goodsStockList); +// 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, + toussedefGoodsStockListInDb, null, toUpdateGoodsStock, goodsStockTemp); }else if(isInstock(goodsStockTemp)){ doInStock(toussedefGoodsStockListInDb, goodsStockTemp); @@ -614,6 +610,55 @@ goodsStock.setAmount(MathTools.add(goodsStock.getAmount(), 1).intValue()); } + private List generateTousseGoodsStocks(WareHouse sourceWareHouse, + Collection targetWareHouse,Collection toousseDefinitions){ + List goodsStocks = new ArrayList<>(); + if(CollectionUtils.isNotEmpty(toousseDefinitions)){ + for(TousseDefinition td : toousseDefinitions){ + //源仓库里的 + addToList(goodsStocks,td,sourceWareHouse); + //目标仓库里的 + for(WareHouse wh : targetWareHouse){ + addToList(goodsStocks,td,wh); + } + } + } + return goodsStocks; + } + public List lockGoodsStocks(WareHouse sourceWareHouse, + Collection targetWareHouse,Collection toousseDefinitions){ + List tempGds = generateTousseGoodsStocks(sourceWareHouse,targetWareHouse,toousseDefinitions); + List tousseGoodsStocksInDB = new ArrayList(); + getGoodsStockSynchronized(tempGds, tousseGoodsStocksInDB, null); + return tousseGoodsStocksInDB; + } + /** + * 添加库存记录到集合中。用于构造参数,以获取数据库里的库存对象 + * @param goodsStocks + * @param tousseDefinition + * @param warehouse + */ + private void addToList(Collection goodsStocks,TousseDefinition tousseDefinition,WareHouse warehouse){ + + if(goodsStocks == null || warehouse == null || tousseDefinition == null){ + return; + } + GoodsStock goodsStock = findTousseGoodsStock(goodsStocks, + warehouse.getId(),tousseDefinition.getAncestorID()); + if(goodsStock == null){ + goodsStock = new GoodsStock(); + goodsStock.setGoodsType(GoodsStock.TYPE_TOUSSE); + goodsStock.setName(tousseDefinition.getName()); + goodsStock.setTousseDefinitionId(tousseDefinition.getAncestorID()); + goodsStock.setWareHouseId(warehouse.getId()); + goodsStock.setWareHouseName(warehouse.getName()); + goodsStock.setOrgUnitCode(warehouse.getOrgUnitCode()); + goodsStock.setOrgUnitName(warehouse.getOrgUnitName()); + goodsStocks.add(goodsStock); + } + //这里不需要amount,只是用来获取数据库里的库存记录 +// goodsStock.setAmount(MathTools.add(goodsStock.getAmount(), 1).intValue()); + } @Override public void addToList(Collection goodsStocks, TousseInstance tousseInstance, WareHouse wareHouse) {