Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r21031 -r21052 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 21031) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 21052) @@ -1696,6 +1696,12 @@ } Map targetWareHouseMap = wareHouseManager.getDefaultWareHouse(applyDepartCodes); submitInvoiceContext.getTargetWareHouseMap().putAll(targetWareHouseMap); + if(!targetWareHouseMap.isEmpty()){ + for (WareHouse wareHouse : targetWareHouseMap.values()) { + submitInvoiceContext.getTargetIdToWareHouseMap().put(wareHouse.getId(), wareHouse); + } + } + } /** * 锁定器械包的库存,包括源仓库和目标仓库的库存. @@ -1786,8 +1792,80 @@ throw new RuntimeException(String.format("%s 的仓库和发货仓库不一致", expensiveGoodsStock.getShowName())); } } + // 获取和创建临床库存 + Set wareHouseIdSet = new HashSet(); + Map targetWareHouseMap = submitInvoiceContext.getTargetWareHouseMap(); + Map targetIdToWareHouseMap = submitInvoiceContext.getTargetIdToWareHouseMap(); + for (String orgUnitCode : targetWareHouseMap.keySet()) { + WareHouse wareHouse = targetWareHouseMap.get(orgUnitCode); + wareHouseIdSet.add(wareHouse.getId()); + } + if(!wareHouseIdSet.isEmpty()){ + String sql = String.format(" where %s and %s ", SqlUtils.getNonStringFieldInCollectionsPredicate("po.expensiveGoods.id", expensiveGoodsServiceContext.getExpensiveGoodsIdsSet()), + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", wareHouseIdSet)); + List destExpensiveGoodsStockList = objectDao.findBySql(ExpensiveGoodsStock.class.getSimpleName(), sql); + if(destExpensiveGoodsStockList != null){ + Map expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap = expensiveGoodsServiceContext.getExpensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap(); + Map expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap = expensiveGoodsServiceContext.getExpensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap(); + for (ExpensiveGoodsStock expensiveGoodsStock : destExpensiveGoodsStockList) { + expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap.put(getExpensiveGoodsStockKey(expensiveGoodsStock), expensiveGoodsStock); + expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap.put(getExpensiveGoodsStockKey(expensiveGoodsStock,targetIdToWareHouseMap), expensiveGoodsStock); + } + } + } } + private String getExpensiveGoodsStockKey(ExpensiveGoodsStock expensiveGoodsStock){ + ExpensiveGoods expensiveGoods = expensiveGoodsStock.getExpensiveGoods(); + if(expensiveGoods == null){ + throw new RuntimeException(String.format("高值耗材库存的定义为空")); + } + Long expensiveGoodsId = expensiveGoods.getId(); + if(expensiveGoodsId == null){ + throw new RuntimeException(String.format("高值耗材库存的定义id为空")); + } + Long warehouseId = expensiveGoodsStock.getWarehouseID(); + if(warehouseId == null){ + throw new RuntimeException(String.format("高值耗材库存的仓库id为空!")); + } + return expensiveGoodsId+"_"+warehouseId; + } + private String getExpensiveGoodsStockKey(ExpensiveGoodsStock expensiveGoodsStock,Map targetIdToWareHouseMap){ + ExpensiveGoods expensiveGoods = expensiveGoodsStock.getExpensiveGoods(); + if(expensiveGoods == null){ + throw new RuntimeException(String.format("高值耗材库存的定义为空")); + } + Long expensiveGoodsId = expensiveGoods.getId(); + if(expensiveGoodsId == null){ + throw new RuntimeException(String.format("高值耗材库存的定义id为空")); + } + Long warehouseId = expensiveGoodsStock.getWarehouseID(); + if(warehouseId == null){ + throw new RuntimeException(String.format("高值耗材库存的仓库id为空!")); + } + WareHouse wareHouse = targetIdToWareHouseMap.get(warehouseId); + if(wareHouse == null){ + throw new RuntimeException(String.format("未获取到仓库!")); + } + String orgUnitCode = wareHouse.getOrgUnitCode(); + if(StringUtils.isBlank(orgUnitCode)){ + throw new RuntimeException(String.format("科室编码不能为空!")); + } + return expensiveGoodsId+"_"+orgUnitCode; + } + private String getExpensiveGoodsStockKey(Long expensiveGoodsId,String orgUnitCode){ + if(expensiveGoodsId == null){ + throw new RuntimeException(String.format("高值耗材库存的定义id为空")); + } + + if(StringUtils.isBlank(orgUnitCode)){ + throw new RuntimeException(String.format("科室编码不能为空!")); + } + return expensiveGoodsId+"_"+orgUnitCode; + } + + + // 发货处理 private Invoice invoice( InvoicePlan invoicePlan,SubmitInvoiceContext submitInvoiceContext , List disposableGoodsStorageAdjustVoTotalList) { @@ -2512,12 +2590,12 @@ getBarcodes(submitInvoiceItems,submitInvoiceContext); // 锁定器械包 lockTousseInstances2(submitInvoiceContext); + // 获取目标仓库 + loadTargetWareHouse(submitInvoiceContext); // 锁定一次性物品 lockDiposableGoods2(submitInvoiceContext); // 锁定高值耗材 lockExpensiveGoods(submitInvoiceContext); - // 获取目标仓库 - loadTargetWareHouse(submitInvoiceContext); // 锁定库存记录 lockGoodsStocks(submitInvoiceContext); // 自动扣减的一次性物品id @@ -3002,15 +3080,38 @@ autoDeductionDisposableGoodsInvoiceItems); } + private ExpensiveGoodsStock getOrCreateExpensiveGoodsStock(SubmitInvoiceContext submitInvoiceContext,String orgUnitCode,ExpensiveGoodsInstance expensiveGoodsInstance,Map expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap){ + String key = getExpensiveGoodsStockKey(expensiveGoodsInstance.getExpensiveGoods().getId(), orgUnitCode); + ExpensiveGoodsStock expensiveGoodsStock = expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap.get(key); + Map targetWareHouseMap = submitInvoiceContext.getTargetWareHouseMap(); + if(expensiveGoodsStock == null){ + WareHouse wareHouse = targetWareHouseMap.get(orgUnitCode); + if(wareHouse == null){ + throw new RuntimeException(String.format("仓库为空!")); + } + ExpensiveGoods expensiveGoods = expensiveGoodsInstance.getExpensiveGoods(); + expensiveGoodsStock = new ExpensiveGoodsStock(); + expensiveGoodsStock.setExpensiveGoods(expensiveGoodsInstance.getExpensiveGoods()); + expensiveGoodsStock.setName(expensiveGoods.getName()); + expensiveGoodsStock.setReferencePrice(expensiveGoods.getReferencePrice()); + expensiveGoodsStock.setSpecification(expensiveGoods.getSpecification()); + expensiveGoodsStock.setWarehouseID(wareHouse.getId()); + expensiveGoodsStock.setWarehouseName(wareHouse.getName()); + expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap.put(key, expensiveGoodsStock); + } + return expensiveGoodsStock; + } private int createInvoiceItem(SubmitInvoiceContext submitInvoiceContext,InvoiceItem invoiceItem,List expensiveGoodsItems,Invoice invoice,String depart,String departCoding){ double floatPercent = supplyRoomConfigManager .getDisposableGoodsFluctuationPercent(); ExpensiveGoodsServiceContext expensiveGoodsServiceContext = submitInvoiceContext.getExpensiveGoodsServiceContext(); Map idToExpensiveGoodsStockMap = expensiveGoodsServiceContext.getIdToExpensiveGoodsStockMap(); + Map expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap = expensiveGoodsServiceContext.getExpensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap(); // 高值耗材 List expensiveGoodsInstanceList = invoiceItem .getExpensiveGoodsInstanceList(); int sendAmount = 0; + Set updateExpensiveGoodsStock = new HashSet(); for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceList) { if (!expensiveGoodsInstance.inWarehouse()) { throw new RuntimeException(String.format( @@ -3021,12 +3122,18 @@ // 扣减源仓库库存 ExpensiveGoodsStock expensiveGoodsStock = idToExpensiveGoodsStockMap.get(expensiveGoodsInstance.getExpensiveGoodsStockId()); expensiveGoodsStock.adjustAmount(-1); - objectDao.update(expensiveGoodsStock); +// expensiveGoodsInstance .setStatus(ExpensiveDisposablegoods.STATUS_DELIVERED); // expensiveGoodsInstance.adjustAmount(-1); + // 增加目标库存 + ExpensiveGoodsStock targetExpensiveGoodsStock = getOrCreateExpensiveGoodsStock(submitInvoiceContext, invoice.getDepartCoding(), expensiveGoodsInstance, expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap); + targetExpensiveGoodsStock.adjustAmount(1); + updateExpensiveGoodsStock.add(expensiveGoodsStock); + updateExpensiveGoodsStock.add(targetExpensiveGoodsStock); + ++sendAmount; expensiveGoodsInstance.setInvoiceItemId(invoiceItem .getId());// 明细汇总关联 @@ -3068,6 +3175,9 @@ invoiceItem.setSettlementPrice(tmpSettlementPrice); } + for (ExpensiveGoodsStock expensiveGoodsStock2 : updateExpensiveGoodsStock) { + objectDao.saveOrUpdate(expensiveGoodsStock2); + } return sendAmount; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r20821 -r21052 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 20821) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 21052) @@ -81,6 +81,7 @@ * 发货的目标仓库的所属科室编码和发货的目标仓库的Map */ private Map targetWareHouseMap = new HashMap<>(); + private Map targetIdToWareHouseMap = new HashMap<>(); /** * 发货员 @@ -327,6 +328,10 @@ return targetWareHouseMap; } + public Map getTargetIdToWareHouseMap() { + return targetIdToWareHouseMap; + } + public String getSender() { return sender; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/expensivegoods/ExpensiveGoodsServiceContext.java =================================================================== diff -u -r20826 -r21052 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/expensivegoods/ExpensiveGoodsServiceContext.java (.../ExpensiveGoodsServiceContext.java) (revision 20826) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/expensivegoods/ExpensiveGoodsServiceContext.java (.../ExpensiveGoodsServiceContext.java) (revision 21052) @@ -43,6 +43,8 @@ private Map idToExpensiveGoodsMap = new HashMap(); private Map idToExpensiveGoodsStockMap = new HashMap(); private Map expensiveGoodsIdToExpensiveGoodsStockMap = new HashMap(); + private Map expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap = new HashMap(); + private Map expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap = new HashMap(); /** * 高值耗材的集合 @@ -130,6 +132,24 @@ this.expensiveGoodsIdToExpensiveGoodsStockMap = expensiveGoodsIdToExpensiveGoodsStockMap; } + public Map getExpensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap() { + return expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap; + } + + public void setExpensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap( + Map expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap) { + this.expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap = expensiveGoodsIdAndWareHouseIdToExpensiveGoodsStockMap; + } + + public Map getExpensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap() { + return expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap; + } + + public void setExpensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap( + Map expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap) { + this.expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap = expensiveGoodsIdAndOrgUnitCodeToExpensiveGoodsStockMap; + } + public List getExpensiveGoodsList() { return expensiveGoodsList; }