Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r28479 -r28484 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 28479) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 28484) @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -181,6 +182,8 @@ boolean enableComboTousse = CssdUtils.getSystemSetConfigByNameBool("enableComboTousse"); //聚合包按大包发货 boolean comboTousseSendByWrapperTousse = CssdUtils.getSystemSetConfigByNameBool("comboTousseSendByWrapperTousse"); + //外来器械包是否允许部分发货(1.拆分的外来器械拆包小包 2.一个外来器械包申请单有申请多个外来器械包) + boolean allowPartlyInvoiceForeignTousse = CssdUtils.getSystemSetConfigByNameBool("allowPartlyInvoiceForeignTousse"); //发货科室编码分组(默认为departCoding),可配置为settlementDepartCoding String invoiceGroupByConfig = InvoiceUtils.getInvoiceGroupByConfig(); @@ -582,6 +585,11 @@ validateFixedTousseInstance(unTraceNotLimitNotDisinfectTousseList,tousseDefinitionIdToBarcodeMap); validateFixedTousseInstance(unTraceForeignProxyTousseList,tousseDefinitionIdToBarcodeMap); + //如果配置为外来器械包不允许部分发货时,则进行校验。后续发货的地方也相应进行处理(申请项的发货数量及申请单的发货状态) + if(!allowPartlyInvoiceForeignTousse){ + validateForeignToussePartlyInvoice(invoicePlanIdToForeignTousseListMap,invoicePlanIdToForeignSplitTousseListMap); + } + //2.判断唯一条码包实例的器械包定义是否追溯不为是、发货状态、失效期、科室等是否一致。;(按加级优先级降序、生产日期升序) /*List sortedTraceLimitDisinfectTousseList = validateUniqueTousseInstanceAndSort( @@ -1070,6 +1078,45 @@ } /** + * 外来器械包及外来器械拆分小包的部分发货校验 + * @param invoicePlanIdToForeignTousseListMap 申请单id对应外来器械包实例集合的map + * @param invoicePlanIdToForeignSplitTousseListMap 申请单id对应外来器械拆分小包实例集合的map + */ + private void validateForeignToussePartlyInvoice(Map> invoicePlanIdToForeignTousseListMap, + Map> invoicePlanIdToForeignSplitTousseListMap){/* + //1.汇总所有涉及到的申请单id(通常为外来器械申请单) + Map> summaryInvoicePlanIdToForeignTousseListMap = new HashMap>(); + summaryInvoicePlanIdToForeignTousseListMap.putAll(invoicePlanIdToForeignTousseListMap); + Optional.of(invoicePlanIdToForeignSplitTousseListMap).orElse(new HashMap>()).entrySet().stream().forEach(entry -> { + Long invoicePlanId = entry.getKey(); + List tiList = summaryInvoicePlanIdToForeignTousseListMap.get(invoicePlanId); + List ti2List = entry.getValue(); + List mergeList = new ArrayList(); + if(CollectionUtils.isNotEmpty(tiList)){ + mergeList.addAll(tiList); + } + if(CollectionUtils.isNotEmpty(ti2List)){ + mergeList.addAll(ti2List); + } + summaryInvoicePlanIdToForeignTousseListMap.put(invoicePlanId, mergeList); + }); + Set invoicePlanIdSet = summaryInvoicePlanIdToForeignTousseListMap.keySet(); + if(CollectionUtils.isEmpty(invoicePlanIdSet)){ + return; + } + + //2.根据申请单id查出申请的外来器械包及拆分小包包实例集合 + List tousseInstanceList = tousseInstanceManager.getTousseInstanceListByForeignTousseApplicationIdListForInvoice(new ArrayList(invoicePlanIdSet)); + Map> invoicePlanIdToAllTiListMap = + tousseInstanceList.stream().collect(Collectors.groupingBy(TousseInstance::getForeignTousseApp_id)); + + //3.进行比较,如有遗漏包实例的,则进行提示 + summaryInvoicePlanIdToForeignTousseListMap.entrySet().stream().forEach(entry -> { + + }); + */} + + /** * 校验唯一条码的包实例并排序 * 校验及排序判断唯一条码包实例的器械包定义是否追溯不为是、发货状态、失效期、科室等是否一致;(按加级优先级降序、生产日期升序) * @param tousseInstanceList 包实例集合 @@ -6530,6 +6577,18 @@ return disaposableGoodsBatchStockIncreaseInsertMapList.size(); } }); + //新增批次库存对象,需再次查询一下 + targetBatchStockList = + objectDao.getBySql_ForUpdate2(DisposableGoodsBatchStock.class.getSimpleName(), + String.format("where warehouseID=%s and %s", + targetWarehouse.getId(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("disposableGoodsBatchId", batchIdToAmountMap.keySet()))); + //事先通过jdbcTemplate的bean对象update过表数据,重新刷新一下对象后再查 + if(CollectionUtils.isNotEmpty(targetBatchStockList)){ + targetBatchStockList.stream().forEach(tbs -> { + objectDao.refresh(tbs); + }); + } } if(CollectionUtils.isNotEmpty(allIdentiToAmountEntryList)){