Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r35383 -r35384 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35383) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 35384) @@ -3452,7 +3452,7 @@ HashMap> departCodeToDgIdToNeedDeductedAmountMapMap = (HashMap>)departCodeToDgIdToAmountMapMap.clone(); //第1层循环:遍历各个科室 - departCodeToDgIdToAmountMapMap.entrySet().stream().forEach(entry1 -> { + for(Entry> entry1 : departCodeToDgIdToAmountMapMap.entrySet()) { //科室编码 String departCode = entry1.getKey(); Map dgIdToNeedDeductedAmountMap = departCodeToDgIdToNeedDeductedAmountMapMap.get(departCode); @@ -3469,6 +3469,9 @@ if(needDeductAmount > 0){ //根据一次性物品定义id找到标识对象 List batchStockList = dgIdToBatchStockListMap.get(dgId); + if(CollectionUtils.isEmpty(batchStockList)){ + throw new SystemException(String.format("%s库存不足",idToDisposableGoodsMap.get(dgId).getShowName())); + } boolean breakBatchStockLoop = false; //第3层循环:遍历各科室的各一次性物品(定义)的各个批次 for(DisposableGoodsBatchStock batchStock : batchStockList){ @@ -3514,7 +3517,7 @@ } } } - }); + } //对比各个要发的一次性物品总数量与各科室对应的各一次性物品下的标识对象要发的数量之和是否有不够发的情况,如果有则进行提示 Map dgIdToMatchedTotalAmountMap = new HashMap(); @@ -4208,14 +4211,22 @@ sourceBatchStockList.stream().forEach(batchStock -> { batchIdToSourceDisposableGoodsBatchStockMap.put(batchStock.getDisposableGoodsBatchId(), batchStock); }); - //各一次性物品批次库存id对应已匹配的需要发货扣减的数量(遍历完各科室后,需将数量叠加) + //源仓库:各一次性物品批次库存id对应已匹配的需要发货扣减的数量(遍历完各科室后,需将数量叠加) Map batchStockIdToTotalDeductionMap = new HashMap(); + //源仓库:一次性物品标识对象需要扣减库存数量的map(key为标识对象id,value为扣减的数量,非扣减后的数量) + Map identityIdToDecreaseAmountUpdateMap = new HashMap(); - //目标仓库:一次性物品批次库存需要新增的库存数量map + //目标仓库:一次性物品库存需要增加库存数量的map(key为库存对象id,value为增加的数量,非增加后的数量) Map disaposableGoodsStockIdToIncreaseAmountUpdateMap = new HashMap(); - //目标仓库:一次性物品批次库存需要新增的库存数量map + //目标仓库:一次性物品批次库存需要增加库存数量的map(key为批次库存对象id,value为增加的数量,非增加后的数量) Map disaposableGoodsBatchStockIdToIncreaseAmountUpdateMap = new HashMap(); + //注:目标仓库的三个层级库存对象(定义的库存、批次库存及标识层)的新插入数据的业务暂时保留在对各科室的循环内进行处理(因为每一轮循环过程后需要加入业务数据至一次性物品业务数据表(DiposableGoodsItem)) + //--todo--后期优化的考虑如下: + //1.将对各目标仓库(即各收货科室的仓库)的三个层次库存数据新插入数据及对应科室的一次性物品业务数据插入放到循环体后进行处理 + //2.整合三个层级库存PO类的数量与库存字段,统一数据类型(重要)、字段名称(重要性一般)等 + //3.整合三个层级库存PO类的字段、去掉多余及冗余字段等(重要性一般、工作量大) + //4.剔除hibernate //第1层循环:遍历科室 for(Entry>> entryDepart : departCodeToDgIdToIdentificationToAmountMapMapMap.entrySet()){ @@ -4253,6 +4264,8 @@ batchIdToAmountMap.put(batchId, MathTools.add(batchIdToAmountMap.get(batchId), amount).intValue()); adjustAmountOfDg = MathTools.add(adjustAmountOfDg, amount).intValue(); allIdentiToAmountEntryListOfDepart.add(entryIdentification); + Long identificationId = identification.getId(); + identityIdToDecreaseAmountUpdateMap.put(identificationId, MathTools.add(identityIdToDecreaseAmountUpdateMap.get(identificationId), amount).longValue()); } dgIdToAmountMap.put(dgId, adjustAmountOfDg); } @@ -4596,8 +4609,8 @@ } } if(CollectionUtils.isNotEmpty(allIdentiToAmountEntryListOfDepart)){ - //1.修改标识表库存数据(减小数量) - String updateIdentificationDecreaseBatchSql = String.format( + //1.修改标识表库存数据(减小数量)--已经移至循环体外面 + /*String updateIdentificationDecreaseBatchSql = String.format( "update %s set amount=amount-? where id=?", DisposableGoodsIdentification.class.getSimpleName()); //用于批量更新数据库表的记录 @@ -4628,7 +4641,7 @@ return updateIdentificationDecreaseMapList.size(); } }); - } + }*/ targetBatchStockList = objectDao.getBySql_ForUpdate2(DisposableGoodsBatchStock.class.getSimpleName(), @@ -4828,7 +4841,7 @@ }); } - //4.循环所有科室的一次性物品发货数据后,更新批次库存表数据(增加各临床科室库存数量)-一次性物品批次批次库存、标识三层 + //4.循环所有科室的一次性物品发货数据后,更新批次库存表数据(增加各临床科室库存数量)-一次性物品批次批次库存级 if(MapUtils.isNotEmpty(disaposableGoodsBatchStockIdToIncreaseAmountUpdateMap)){ String updateDisposableGoodsBatchStockIncreaseBatchSql = String.format("update %s set storage=storage+? where id=?", DisposableGoodsBatchStock.class.getSimpleName()); @@ -4848,6 +4861,27 @@ } }); } + + //5.循环所有科室的一次性物品发货数据后,更新批次库存表数据(扣减供应室的各一次性物品标识对象的库存数量)-一次性物品标识级 + if(MapUtils.isNotEmpty(identityIdToDecreaseAmountUpdateMap)){ + String updateDisposableGoodsIdentificationDecreaseBatchSql = String.format("update %s set amount=amount-? where id=?", + DisposableGoodsIdentification.class.getSimpleName()); + jdbcTemplate.batchUpdate(updateDisposableGoodsIdentificationDecreaseBatchSql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + Entry entry = CollectionUtils.get(identityIdToDecreaseAmountUpdateMap, i); + ps.setLong(1, entry.getValue()); + ps.setLong(2, entry.getKey()); + } + + @Override + public int getBatchSize() { + // TODO Auto-generated method stub + return identityIdToDecreaseAmountUpdateMap.size(); + } + }); + } } }