Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r28488 -r28490 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 28488) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 28490) @@ -2323,7 +2323,24 @@ return null; } - @Override + @SuppressWarnings("unchecked") + @Override + public List getNotSentTousseInstanceListByForeignTousseApplicationIdListForInvoice( + List idList) { + if (CollectionUtils.isNotEmpty(idList)) { + try { + String sql = String.format("where invoice_id is null and %s and po.wasteDate is null and po.insteadTiBarcode is null ", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.foreignTousseApp_id", idList)); + return objectDao.findBySql( + TousseInstance.class.getSimpleName(), sql); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public List getTousseInstanceByClassifyBasket(Long basketId) { return objectDao.findBySql( TousseInstance.class.getSimpleName(), Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r28488 -r28490 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 28488) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 28490) @@ -277,6 +277,13 @@ public List getToussInstanceByForeignTousseApplicationIdForInvoice(Long id); /** + * 根据外来申请单id集合查询该申请单还未发货的包实例. + * @param idList 外来器械包申请单id集合 + * @return + */ + public List getNotSentTousseInstanceListByForeignTousseApplicationIdListForInvoice(List idList); + + /** * 获取审核篮筐里面的器械包实例. * @param basketId 审核篮筐id * @return Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r28484 -r28490 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 28484) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 28490) @@ -585,9 +585,15 @@ validateFixedTousseInstance(unTraceNotLimitNotDisinfectTousseList,tousseDefinitionIdToBarcodeMap); validateFixedTousseInstance(unTraceForeignProxyTousseList,tousseDefinitionIdToBarcodeMap); + //所有外来器械申请单id对应的外来器械包实例(含拆分小包)的map,用于发货后的申请项的发货数量及申请单的发货状态的计算 + Map> allForeignTousseAppIdToNotSentForeignTousseInstanceListMap = null; //如果配置为外来器械包不允许部分发货时,则进行校验。后续发货的地方也相应进行处理(申请项的发货数量及申请单的发货状态) if(!allowPartlyInvoiceForeignTousse){ - validateForeignToussePartlyInvoice(invoicePlanIdToForeignTousseListMap,invoicePlanIdToForeignSplitTousseListMap); + allForeignTousseAppIdToNotSentForeignTousseInstanceListMap = validateForeignToussePartlyInvoice(invoicePlanIdToForeignTousseListMap,invoicePlanIdToForeignSplitTousseListMap); + }else{ + Map> summaryInvoicePlanIdToForeignTousseListMap = new HashMap>(); + allForeignTousseAppIdToNotSentForeignTousseInstanceListMap = getAllNotSentForeignTousseAppIdToForeignTousseInstanceListMap(summaryForeignTousseAppId(invoicePlanIdToForeignTousseListMap, + invoicePlanIdToForeignSplitTousseListMap,summaryInvoicePlanIdToForeignTousseListMap)); } //2.判断唯一条码包实例的器械包定义是否追溯不为是、发货状态、失效期、科室等是否一致。;(按加级优先级降序、生产日期升序) @@ -978,7 +984,7 @@ }); } List invoiceList = - batchGenerateInvoiceAndRelativeTableData(invoicePlanToTousseItemMapListMap, + batchGenerateInvoiceAndRelativeTableData(invoicePlanToTousseItemMapListMap, allForeignTousseAppIdToNotSentForeignTousseInstanceListMap, currentDateTime,params,orgUnit,targetWarehouse, idToDisposableGoodsMap,idToDisposableGoodsBatchMap, invoiceOrigin,afterRecyclingTousseDeliver, @@ -1082,10 +1088,51 @@ * @param invoicePlanIdToForeignTousseListMap 申请单id对应外来器械包实例集合的map * @param invoicePlanIdToForeignSplitTousseListMap 申请单id对应外来器械拆分小包实例集合的map */ - private void validateForeignToussePartlyInvoice(Map> invoicePlanIdToForeignTousseListMap, - Map> invoicePlanIdToForeignSplitTousseListMap){/* + private Map> validateForeignToussePartlyInvoice(Map> invoicePlanIdToForeignTousseListMap, + Map> invoicePlanIdToForeignSplitTousseListMap){ //1.汇总所有涉及到的申请单id(通常为外来器械申请单) Map> summaryInvoicePlanIdToForeignTousseListMap = new HashMap>(); + List invoicePlanIdList = summaryForeignTousseAppId(invoicePlanIdToForeignTousseListMap, invoicePlanIdToForeignSplitTousseListMap, + summaryInvoicePlanIdToForeignTousseListMap); + if(CollectionUtils.isEmpty(invoicePlanIdList)){ + return null; + } + + Map idToInvoicePlanMap = new HashMap(); + @SuppressWarnings("unchecked") + Collection invoicePlanList = objectDao.getCollection(InvoicePlan.class.getSimpleName(), "id", invoicePlanIdList); + invoicePlanList.stream().forEach(ip -> { + idToInvoicePlanMap.put(ip.getId(), ip); + }); + //2.根据申请单id查出申请的外来器械包及拆分小包包实例集合 + Map> invoicePlanIdToAllTiListMap = + getAllNotSentForeignTousseAppIdToForeignTousseInstanceListMap(invoicePlanIdList); + + //3.进行比较,如有遗漏包实例的,则进行提示 + summaryInvoicePlanIdToForeignTousseListMap.entrySet().stream().forEach(entry -> { + Long invoicePlanId = entry.getKey(); + List ti1List = entry.getValue(); + List ti2List = invoicePlanIdToAllTiListMap.get(invoicePlanId); + Collection diffTiList = CollectionUtils.subtract(ti2List, ti1List); + if(CollectionUtils.isNotEmpty(diffTiList)){ + throw new SystemException(String.format("外来器械申请单不允许部分发货,缺少[%s],流水号[%s]", + diffTiList.stream().map(TousseInstance::getTousseName).collect(Collectors.joining(";")), + idToInvoicePlanMap.get(invoicePlanId).getSerialNumber())); + } + }); + return invoicePlanIdToAllTiListMap; + } + + /** + * 进行汇总 + * @param invoicePlanIdToForeignTousseListMap + * @param invoicePlanIdToForeignSplitTousseListMap + * @param summaryInvoicePlanIdToForeignTousseListMap + * @return + */ + private List summaryForeignTousseAppId(Map> invoicePlanIdToForeignTousseListMap, + Map> invoicePlanIdToForeignSplitTousseListMap, + Map> summaryInvoicePlanIdToForeignTousseListMap){ summaryInvoicePlanIdToForeignTousseListMap.putAll(invoicePlanIdToForeignTousseListMap); Optional.of(invoicePlanIdToForeignSplitTousseListMap).orElse(new HashMap>()).entrySet().stream().forEach(entry -> { Long invoicePlanId = entry.getKey(); @@ -1101,20 +1148,20 @@ summaryInvoicePlanIdToForeignTousseListMap.put(invoicePlanId, mergeList); }); Set invoicePlanIdSet = summaryInvoicePlanIdToForeignTousseListMap.keySet(); - if(CollectionUtils.isEmpty(invoicePlanIdSet)){ - return; - } + return new ArrayList(invoicePlanIdSet); + } - //2.根据申请单id查出申请的外来器械包及拆分小包包实例集合 - List tousseInstanceList = tousseInstanceManager.getTousseInstanceListByForeignTousseApplicationIdListForInvoice(new ArrayList(invoicePlanIdSet)); + /** + * 查出所有外来器械申请单id对应的未发货的外来器械包实例集合map + * @param invoicePlanIdList + * @return + */ + private Map> getAllNotSentForeignTousseAppIdToForeignTousseInstanceListMap(List invoicePlanIdList){ + List tousseInstanceList = tousseInstanceManager.getNotSentTousseInstanceListByForeignTousseApplicationIdListForInvoice(invoicePlanIdList); Map> invoicePlanIdToAllTiListMap = tousseInstanceList.stream().collect(Collectors.groupingBy(TousseInstance::getForeignTousseApp_id)); - - //3.进行比较,如有遗漏包实例的,则进行提示 - summaryInvoicePlanIdToForeignTousseListMap.entrySet().stream().forEach(entry -> { - - }); - */} + return invoicePlanIdToAllTiListMap; + } /** * 校验唯一条码的包实例并排序 @@ -4254,6 +4301,7 @@ */ private List batchGenerateInvoiceAndRelativeTableData( Map>> invoicePlanToTousseItemMapListMap, + Map> allForeignTousseAppIdToNotSentForeignTousseInstanceListMap, Date currentDateTime , JSONObject params,OrgUnit orgUnit,WareHouse targetWarehouse, Map idToDisposableGoodsMap,Map idToDisposableGoodsBatchMap, String invoiceOrigin,boolean afterRecyclingTousseDeliver, @@ -4287,7 +4335,8 @@ }); //1.2.批量插入发货项 Map> invoiceToInvoiceItemListMap = - batchInsertInvoiceItemTableData(invoicePlanToTousseItemMapListMap,invoiceList, + batchInsertInvoiceItemTableData(invoicePlanToTousseItemMapListMap, + allForeignTousseAppIdToNotSentForeignTousseInstanceListMap,invoiceList, idColumnName,idColumnValue,currentDateTime,params,orgUnit,targetWarehouse, invoiceOrigin, afterRecyclingTousseDeliver, idToDisposableGoodsMap, idToDisposableGoodsBatchMap,idToInvoiceMap, @@ -4486,6 +4535,7 @@ */ private Map> batchInsertInvoiceItemTableData( Map>> invoicePlanToTousseItemMapListMap, + Map> allForeignTousseAppIdToNotSentForeignTousseInstanceListMap, List invoiceList,String idColumnName,String idColumnValue,Date currentDateTime, JSONObject params,OrgUnit orgUnit,WareHouse targetWarehouse, String invoiceOrigin,boolean afterRecyclingTousseDeliver, @@ -4962,7 +5012,7 @@ * 更新申请项的发货数量、申请单的发货状态、最后发货时间等 */ //1.更新申请项的发货数量 - batchUpdateTousseItemTableData(invoicePlanToTousseItemMapListMap); + batchUpdateTousseItemTableData(invoicePlanToTousseItemMapListMap, allForeignTousseAppIdToNotSentForeignTousseInstanceListMap); //更新申请单的状态与最后发货时间 batchUpdateInvoicePlanTableData(invoicePlanToTousseItemMapListMap,currentDateTime, invoiceOrigin, afterRecyclingTousseDeliver); return invoiceToInvoiceItemListMap; @@ -6875,7 +6925,8 @@ * @param invoicePlanToTousseItemMapListMap */ private void batchUpdateTousseItemTableData( - Map>> invoicePlanToTousseItemMapListMap){ + Map>> invoicePlanToTousseItemMapListMap , + Map> allForeignTousseAppIdToNotSentForeignTousseInstanceListMap){ String updateTousseItemBatchSql = String.format( "update %s set sendoutAmount=sendoutAmount+?," + "urgentAmount=(case when urgentAmount > ? then urgentAmount-? else 0 end)," @@ -6886,10 +6937,12 @@ TousseItem.class.getSimpleName(),Constants.STR_YES,Constants.STR_NO); Map idToAmount = new HashMap(); invoicePlanToTousseItemMapListMap.entrySet().stream().forEach(entry -> { + InvoicePlan invoicePlan = entry.getKey(); List> list = entry.getValue(); list.stream().forEach(map -> { map.entrySet().forEach(subEntry -> { TousseItem tousseItem = subEntry.getKey(); + tousseItem.getTousseDefinitionId(); Object value = subEntry.getValue(); if(value instanceof List){ List subList = (List)value; @@ -6898,8 +6951,19 @@ Object element = subList.get(0); if(element instanceof TousseInstance){ TousseInstance ti = (TousseInstance)element; - if(ti.getTousseDefinition().isSplit()){ - amount = 1; + //如果申请单为外来器械申请单且该申请项所发的物品对象为外来器械拆分小包时 + if(invoicePlan.isForeignTousseAppliaction() && ti.getTousseDefinition().isSplit()){ + //申请项的包定义id + Long tdIdOfTousseItem = tousseItem.getTousseDefinitionId(); + //如果所扫的外来器械拆分小包与是否完全包含在该外来器械申请单下所有的该包中.则发货数量为1,否则发货数量为0 + List notSentForeignSplitTiList = allForeignTousseAppIdToNotSentForeignTousseInstanceListMap.get(invoicePlan.getId()).stream().filter(tis -> { + return tis.getTousseDefinition().getParentID().equals(tdIdOfTousseItem); + }).collect(Collectors.toList()); + if(CollectionUtils.size(notSentForeignSplitTiList) > amount){ + amount = 0;//外来器械包申请项对应的所有包实例大于所发的物品数量时,发货数量设置为0 + }else{ + amount = 1; + } } } }