Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r35361 -r35364 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35361) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35364) @@ -3378,11 +3378,10 @@ //存放已经排好序的批次定义 List orderedBatchList = new ArrayList(); //1.校验参数、库存等(汇总各一次性物品的发货总数量),并返回源发货仓库对象 - WareHouse sourceWarehouse = validateParamAndFetchData(params, dgIdToTotalAmountMap, departCodeToInvoiceRemarkMap, departCodeToDgIdToAmountMapMap, + validateParamAndFetchData(params, dgIdToTotalAmountMap, departCodeToInvoiceRemarkMap, departCodeToDgIdToAmountMapMap, departCodeToOrgUnitMap,departCodeToDefaultSettleAccountsOrgUnitMap,departCodeToDefaultWarehouseMap, idToDisposableGoodsMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, dgIdToDisposableGoodsStockMap, batchIdToLastDisposableGoodsBatchStockMap,orderedBatchList); - Long sourceWarehouseId = sourceWarehouse.getId(); //2.锁定库存(具体代码在第1步的校验参数的方法里) @@ -3513,19 +3512,23 @@ //对比各个要发的一次性物品总数量与各科室对应的各一次性物品下的标识对象要发的数量之和是否有不够发的情况,如果有则进行提示 Map dgIdToMatchedTotalAmountMap = new HashMap(); - for(Entry>> entry : departCodeToDgIdToIdentificationToAmountMapMapMap.entrySet()){ - Map> map = entry.getValue(); - for(Entry> entry1 : map.entrySet()){ - dgIdToMatchedTotalAmountMap.put(entry1.getKey(), entry1.getValue().values().stream().reduce((amount1,amount2) -> { + for(Entry>> departCodeToDgIdToIdentificationToAmountMapMapEntry : departCodeToDgIdToIdentificationToAmountMapMapMap.entrySet()){ + Map> dgIdToIdentificationToAmountMapMap = departCodeToDgIdToIdentificationToAmountMapMapEntry.getValue(); + for(Entry> dgIdToIdentificationToAmountMapEntry : dgIdToIdentificationToAmountMapMap.entrySet()){ + Long dgId = dgIdToIdentificationToAmountMapEntry.getKey(); + dgIdToMatchedTotalAmountMap.put(dgId, MathTools.add(dgIdToMatchedTotalAmountMap.get(dgId), dgIdToIdentificationToAmountMapEntry.getValue().values().stream().reduce((amount1,amount2) -> { return MathTools.add(amount1, amount2).longValue(); - }).get()); + }).get()).longValue()); } } dgIdToTotalAmountMap.entrySet().stream().forEach(entry -> { Long dgId = entry.getKey(); Integer needSendAmount = entry.getValue(); Long matchedTotalAmount = dgIdToMatchedTotalAmountMap.get(dgId); + if(matchedTotalAmount == null){ + matchedTotalAmount = 0L; + } if(needSendAmount > matchedTotalAmount){ throw new SystemException(String.format("%s的发货总数量为%s,超过了可发货的库存总数量%s", idToDisposableGoodsMap.get(dgId).getShowName(),needSendAmount,matchedTotalAmount)); } @@ -3600,6 +3603,7 @@ } List departCodeList = new ArrayList(); List dgIdList = new ArrayList(); + //第1次循环发货明细数据时,只提取科室、备注、一次性物品定义id等数据,不提取各一次性物品发货数量 for (int i = 0; i < invoiceItems.size(); i++) { JSONObject jsonObject = invoiceItems.optJSONObject(i); String departCode = jsonObject.optString("departCode"); @@ -3616,13 +3620,45 @@ if(CollectionUtils.isEmpty(items)){ throw new SystemException("发货的物品明细不能为空"); } + for (int j = 0; j < items.size(); j++) { + JSONObject itemJsonObject = items.optJSONObject(j); + Long dgId = itemJsonObject.optLong("disposableGoodsId"); + if(!dgIdList.contains(dgId)){ + dgIdList.add(dgId); + } + } + } + List dgList = diposableGoodsManager.getCollection(dgIdList); + dgList.stream().forEach(dg -> { + if(dg.isDisable()){ + throw new SystemException(String.format("%s已经被停用,请重新设置待发物品", dg.getShowName())); + } + if(dg.expensiveDiposablegoods()){ + throw new SystemException(String.format("%s的物品类型为高值耗材,不能进行批量自定义发货", dg.getShowName())); + } + idToDisposableGoodsMap.put(dg.getId(), dg); + }); + //第2次循环发货明细数据时,只根据一次性物品定义的单位转换系数等提取各一次性物品发货数量 + for (int i = 0; i < invoiceItems.size(); i++) { + JSONObject jsonObject = invoiceItems.optJSONObject(i); + String departCode = jsonObject.optString("departCode"); + JSONArray items = jsonObject.optJSONArray("items"); Map dgIdToAmountMap = new HashMap(); for (int j = 0; j < items.size(); j++) { JSONObject itemJsonObject = items.optJSONObject(j); Long dgId = itemJsonObject.optLong("disposableGoodsId"); + DisposableGoods dg = idToDisposableGoodsMap.get(dgId); + //如果该一次性物品的单位转换系数有配置大于1时,发货需要乘以单位转换系数 int sendAmount = itemJsonObject.optInt("sendAmount"); + if(dg == null){ + continue; + } + //单位转换系数 + Integer transferScale = dg.getTransferScale(); + if(transferScale != null && transferScale > 1){ + sendAmount = MathTools.mul(sendAmount, transferScale).intValue(); + } dgIdToTotalAmountMap.put(dgId, MathTools.add(dgIdToTotalAmountMap.get(dgId),sendAmount).intValue()); - dgIdList.add(dgId); dgIdToAmountMap.put(dgId, sendAmount); } departCodeToDgIdToAmountMapMap.put(departCode, dgIdToAmountMap); @@ -3686,16 +3722,7 @@ //根据科室编码集合查出对应的默认仓库对象 departCodeToDefaultWarehouseMap.putAll(wareHouseManager.getDefaultWareHouse(departCodeList)); - List dgList = diposableGoodsManager.getCollection(dgIdList); - dgList.stream().forEach(dg -> { - if(dg.isDisable()){ - throw new SystemException(String.format("%s已经被停用,请重新设置待发物品", dg.getShowName())); - } - if(dg.expensiveDiposablegoods()){ - throw new SystemException(String.format("%s的物品类型为高值耗材,不能进行批量自定义发货", dg.getShowName())); - } - idToDisposableGoodsMap.put(dg.getId(), dg); - }); + //根据一次性物品集合查出源发货仓库的一次性物品库存对象(只查的发货科室的库存对象,通常一个一次性物品对于一个仓库只有一条库存对象) List stockList = diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsIDs(String.valueOf(sourceWarehouseId), dgIdList); stockList.stream().forEach(stock -> {