Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r35364 -r35375 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35364) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35375) @@ -3353,6 +3353,9 @@ @Override public SubmitInvoiceContext disposableGoodsCustomBatchInvoice(JSONObject params){ + //性能测试用的语句 + /*long start = System.currentTimeMillis(); + long startTimeMillis = start;*/ SubmitInvoiceContext submitInvoiceContext = new SubmitInvoiceContext(); Map departCodeToInvoiceRemarkMap = new HashMap(); //为了便于后面clone对象,改为声明成HashMap实现类类型的变量 @@ -3382,7 +3385,10 @@ departCodeToOrgUnitMap,departCodeToDefaultSettleAccountsOrgUnitMap,departCodeToDefaultWarehouseMap, idToDisposableGoodsMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, dgIdToDisposableGoodsStockMap, batchIdToLastDisposableGoodsBatchStockMap,orderedBatchList); - + //性能测试用的语句 + /*long currentTimeMillis = System.currentTimeMillis(); + System.out.println("step1耗时毫秒数:" + (currentTimeMillis - start)); + start = currentTimeMillis;*/ //2.锁定库存(具体代码在第1步的校验参数的方法里) //3.各一次性物品的库存数量与发货总数量的判断 @@ -3533,13 +3539,21 @@ throw new SystemException(String.format("%s的发货总数量为%s,超过了可发货的库存总数量%s", idToDisposableGoodsMap.get(dgId).getShowName(),needSendAmount,matchedTotalAmount)); } }); - + //性能测试用的语句 + /*currentTimeMillis = System.currentTimeMillis(); + System.out.println("step2耗时毫秒数:" + (currentTimeMillis - start)); + start = currentTimeMillis;*/ Date currentDateTime = new Date(); List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); //5.生成发货单(一个科室生成一个发货单Invoice) List invoiceList = disposableBatchCustomBatchInsertInvoiceTableData(departCodeToDgIdToIdentificationToAmountMapMapMap, departCodeToOrgUnitMap, departCodeToDefaultSettleAccountsOrgUnitMap, departCodeToDefaultWarehouseMap, departCodeToInvoiceRemarkMap, params, currentDateTime); submitInvoiceContext.setInvoiceList(invoiceList); + //性能测试用的语句 + /*currentTimeMillis = System.currentTimeMillis(); + System.out.println("step3耗时毫秒数:" + (currentTimeMillis - start)); + start = currentTimeMillis;*/ + //6.生成发货项InvoiceItem(涉及多少个一次性物品批次库存则对应多少个发货项).已经包含批量处理仓库的库存数量(含源发货仓库、目标收货仓库的库存、批次库存、标识等)的业务 //下面的方法会调用disposableBatchCustomBatchUpdateDisposableGoodsStockTableData方法 disposableBatchCustomBatchInsertInvoiceItemTableData(departCodeToDgIdToIdentificationToAmountMapMapMap, invoiceList, params, @@ -3550,6 +3564,8 @@ //7.生成一次性物品发货明细项DisposableGoodsItem(涉及多少个一次性物品标识对象则对应多少个发货明细项)。 //disposableBatchCustomBatchUpdateDisposableGoodsStockTableData方法调用disposableBatchCustomBatchInsertDiposableGoodsItemTableData来实现第7步的逻辑 + //性能测试用的语句 +// System.out.println("总耗时毫秒数:" + (System.currentTimeMillis() - startTimeMillis)); // throw new SystemException("测试一次性物品自定义批量发货"); return submitInvoiceContext; } @@ -4206,9 +4222,10 @@ String.format("where warehouseID=%s and %s", params.optLong("sourceWarehouseId"), SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsID", dgIdToAmountMap.keySet()))); + List dgIdList = sourceStockList.stream().map(DisposableGoodsStock::getDisposableGoodsID).collect(Collectors.toList()); //如果未找到相关物品的源发货仓库的库存对象时,则进行提示 dgIdToAmountMap.keySet().stream().forEach(dgId -> { - if(!sourceStockList.stream().map(DisposableGoodsStock::getDisposableGoodsID).collect(Collectors.toList()).contains(dgId)){ + if(!dgIdList.contains(dgId)){ throw new SystemException(String.format("未找到%s的%s库存定义", idToDisposableGoodsMap.get(dgId).getShowName(),params.optString("sourceWarehouseName"))); } @@ -4247,20 +4264,23 @@ return disaposableGoodsStockDecreaseUpdateMapList.size(); } }); - //执行完后需要hibernate刷新源库存对象,便于接下来的科室进行库存数量扣减 - sourceStockList.stream().forEach(stock -> { + //执行完后需要hibernate刷新源库存对象,便于接下来的科室进行库存数量扣减(用hibernate的refresh导致大量的数据查询,效率低下) + /*sourceStockList.stream().forEach(stock -> { objectDao.refresh(stock); - }); + });*/ + //改成重新查询的方式 + sourceStockList = objectDao.findByIds(DisposableGoodsStock.class.getSimpleName(), sourceStockList.stream().map(DisposableGoodsStock::getId).collect(Collectors.toList())); } List sourceBatchStockList = objectDao.getBySql_ForUpdate2(DisposableGoodsBatchStock.class.getSimpleName(), String.format("where warehouseID=%s and %s", params.optLong("sourceWarehouseId"), SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsBatchId", batchIdToAmountMap.keySet()))); + List batchIdList = sourceBatchStockList.stream().map(DisposableGoodsBatchStock::getDisposableGoodsBatchId).collect(Collectors.toList()); //如果未找到相关物品的源发货仓库的批次库存对象时,则进行提示 batchIdToAmountMap.keySet().stream().forEach(batchId -> { - if(!sourceBatchStockList.stream().map(DisposableGoodsBatchStock::getDisposableGoodsBatchId).collect(Collectors.toList()).contains(batchId)){ + if(!batchIdList.contains(batchId)){ DisposableGoodsBatch batch = idToDisposableGoodsBatchMap.get(batchId); throw new SystemException(String.format("未找到批次号为%s的%s的%s库存定义", batch.getBatchNumber(),batch.getDiposableGoods().getShowName(),params.optString("sourceWarehouseName"))); @@ -4301,10 +4321,12 @@ return disaposableGoodsBatchStockDecreaseUpdateMapList.size(); } }); - //执行完后需要hibernate刷新源库存对象,便于接下来的科室进行库存数量扣减 - sourceBatchStockList.stream().forEach(batchStock -> { + //执行完后需要hibernate刷新源库存对象,便于接下来的科室进行库存数量扣减(用hibernate的refresh导致大量的数据查询,效率低下) + /*sourceBatchStockList.stream().forEach(batchStock -> { objectDao.refresh(batchStock); - }); + });*/ + //改成重新查询的方式 + sourceBatchStockList = objectDao.findByIds(DisposableGoodsBatchStock.class.getSimpleName(), sourceBatchStockList.stream().map(DisposableGoodsBatchStock::getId).collect(Collectors.toList())); } //供应室发货给自己时扣减物品的库存,默认值为true(值为true:则供应室发货给自己时,要扣减该发货物品的库存 ;值为false或者没有配置:则供应室发货给自己时,该物品的库存保持不变) @@ -4318,9 +4340,12 @@ SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsID", dgIdToAmountMap.keySet()))); //事先通过jdbcTemplate的bean对象update过表数据,重新刷新一下对象后再查 if(CollectionUtils.isNotEmpty(targetStockList)){ - targetStockList.stream().forEach(ts -> { + //(用hibernate的refresh导致大量的数据查询,效率低下) + /*targetStockList.stream().forEach(ts -> { objectDao.refresh(ts); - }); + });*/ + //改成重新查询的方式 + targetStockList = objectDao.findByIds(DisposableGoodsStock.class.getSimpleName(), targetStockList.stream().map(DisposableGoodsStock::getId).collect(Collectors.toList())); } /* * 1.对有找到相关物品的目标收货仓库的库存对象进行update更新 @@ -4490,9 +4515,12 @@ SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsBatchId", batchIdToAmountMap.keySet()))); //事先通过jdbcTemplate的bean对象update过表数据,重新刷新一下对象后再查 if(CollectionUtils.isNotEmpty(targetBatchStockList)){ - targetBatchStockList.stream().forEach(tbs -> { + //(用hibernate的refresh导致大量的数据查询,效率低下) + /*targetBatchStockList.stream().forEach(tbs -> { objectDao.refresh(tbs); - }); + });*/ + //改成重新查询的方式 + targetBatchStockList = objectDao.findByIds(DisposableGoodsBatchStock.class.getSimpleName(), targetBatchStockList.stream().map(DisposableGoodsBatchStock::getId).collect(Collectors.toList())); } /* * 1.对未找到相关物品的目标收货仓库的批次库存对象进行insert新增 @@ -4648,9 +4676,12 @@ SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsBatchId", batchIdToAmountMap.keySet()))); //事先通过jdbcTemplate的bean对象update过表数据,重新刷新一下对象后再查 if(CollectionUtils.isNotEmpty(targetBatchStockList)){ - targetBatchStockList.stream().forEach(tbs -> { + //(用hibernate的refresh导致大量的数据查询,效率低下) + /*targetBatchStockList.stream().forEach(tbs -> { objectDao.refresh(tbs); - }); + });*/ + //改成重新查询的方式 + targetBatchStockList = objectDao.findByIds(DisposableGoodsBatchStock.class.getSimpleName(), targetBatchStockList.stream().map(DisposableGoodsBatchStock::getId).collect(Collectors.toList())); } } if(CollectionUtils.isNotEmpty(allIdentiToAmountEntryListOfDepart)){