Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedata/becleanitem/service/ClassifyBasketManagerImpl.java =================================================================== diff -u -r40800 -r40861 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedata/becleanitem/service/ClassifyBasketManagerImpl.java (.../ClassifyBasketManagerImpl.java) (revision 40800) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedata/becleanitem/service/ClassifyBasketManagerImpl.java (.../ClassifyBasketManagerImpl.java) (revision 40861) @@ -35,6 +35,7 @@ import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; +import com.forgon.exception.SystemException; import com.forgon.tools.MathTools; import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; @@ -558,17 +559,23 @@ //篮筐只包含当前归还物品 boolean multipleTousseIntoSameBasket = multipleTousseIntoSameBasket(classifyBasket); if(!multipleTousseIntoSameBasket){ - releaseClassifyBasketMap.put(tousseDefinition.getId(), classifyBasket); + releaseClassifyBasketMap.put(classifyBasket.getId(), classifyBasket); continue; } + //篮筐内多个物品都是没有装配任务了;并且篮筐内的物品都归还了;那状态就设置为空闲; + if(containerManager.isEmpty(classifyBasket.getContainerBarcode()) && allClassifiedItemReturned(classifyBasket, willReturnTousseDefinitions)){ + releaseClassifyBasketMap.put(classifyBasket.getId(), classifyBasket); + continue; + } + //判断篮筐内是否包含同一个回收记录上的多个物品 boolean multipleTousseFromSameRecyclingRecordIntoSameBasket = multipleTousseFromSameRecyclingRecordIntoSameBasket(classifyBasket); if(multipleTousseFromSameRecyclingRecordIntoSameBasket){ continue; } - //篮筐释放已经清洗了,不支持拆分篮筐 + //篮筐已经清洗了,不支持拆分篮筐 List washAndDisinfectRecords = classifyBasket.getWashAndDisinfectRecords(); if(CollectionUtils.isNotEmpty(washAndDisinfectRecords)){ continue; @@ -586,8 +593,106 @@ } } } + + /** + * 篮筐内的外来器械都归还了 + * @param classifyBasket 篮筐实例 + * @param willReturnTousseDefinitions 即将归还的外来器械包定义 + * @return true/false + */ + private boolean allClassifiedItemReturned(ClassifyBasket classifyBasket, List willReturnTousseDefinitions) { + if(classifyBasket == null){ + throw new SystemException("篮筐不能为空!"); + } + List classfiedItems = classifyBasket.getClassfiedItems(); + if(CollectionUtils.isEmpty(classfiedItems)){ + throw new SystemException("篮筐内物品为空!"); + } + List classifiedItemTousseDefinitionIdList = new ArrayList(); + for (ClassifiedItem classifiedItem : classfiedItems) { + Long ciTousseDefinitionID = classifiedItem.getTousseDefinitionID(); + if(DatabaseUtil.isPoIdValid(ciTousseDefinitionID)){ + classifiedItemTousseDefinitionIdList.add(ciTousseDefinitionID); + } + } + if(CollectionUtils.isEmpty(classifiedItemTousseDefinitionIdList)){ + throw new SystemException("篮筐内物品为空!"); + } + //即将归还的器械包定义id + List willReturnTousseDefinitionIdList = new ArrayList(); + if(CollectionUtils.isNotEmpty(willReturnTousseDefinitions)){ + for (TousseDefinition td : willReturnTousseDefinitions) { + willReturnTousseDefinitionIdList.add(td.getId()); + } + } + //篮筐内外来器械包定义的包状态map + Map tousseDefinitionIdPackageStatusMap = getTousseDefinitionIdPackageStatusMap(classifiedItemTousseDefinitionIdList); + for (ClassifiedItem classifiedItem : classfiedItems) { + Long ciTousseDefinitionID = classifiedItem.getTousseDefinitionID(); + String packageStatus = tousseDefinitionIdPackageStatusMap.get(ciTousseDefinitionID); + if(!StringUtils.equals(TousseItem.PACKAGE_STATUS_RETURNED, packageStatus) + && !StringUtils.equals(TousseItem.PACKAGE_STATUS_INADVANCERETURNED, packageStatus) + && !willReturnTousseDefinitionIdList.contains(ciTousseDefinitionID)){ + //篮筐内存在未归还的器械 + return false; + } + } + return true; + } /** + * 查询外来器械包定义id及申请项包状态的map + * @param classifiedItemTousseDefinitionIdList 外来器械包定义id + * @return map + */ + private Map getTousseDefinitionIdPackageStatusMap(List classifiedItemTousseDefinitionIdList) { + Map tousseDefinitionIdPackageStatusMap = new HashMap(); + if(CollectionUtils.isEmpty(classifiedItemTousseDefinitionIdList)){ + return tousseDefinitionIdPackageStatusMap; + } + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select po.tousseDefinitionId, po.packageStatus from "); + sqlBuffer.append(TousseItem.class.getSimpleName()); + sqlBuffer.append(" po where "); + sqlBuffer.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinitionId", classifiedItemTousseDefinitionIdList)); + + ResultSet rs = null; + try { + rs = objectDao.executeSql(sqlBuffer.toString()); + while(rs.next()){ + Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); + String packageStatus = rs.getString("packageStatus"); + tousseDefinitionIdPackageStatusMap.put(tousseDefinitionId, packageStatus); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + return tousseDefinitionIdPackageStatusMap; + } + + /** + * 是否还有其他清洗装载的篮筐实例 + * @param barcode 篮筐条码 + * @param classifyBasketId 当前篮筐实例id + * @return true/false + */ + private boolean isExistUnWashBasket(String barcode,Long classifyBasketId) { + if (StringUtils.isNotBlank(barcode) && classifyBasketId != null) { + String sql = String.format("select po,r from %s po left join po.washAndDisinfectRecords r " + + "where r.id is null and po.classifyBasketStatus = 0 and po.containerBarcode = '%s' and po.id > %s", ClassifyBasket.class.getSimpleName(),barcode,classifyBasketId); + List list = objectDao.findByHql(sql); + if(list.size() > 0) { + return true; + } + } + return false; + } + + /** * 拆分篮筐 * @param splitClassifyBasketMap */ @@ -652,7 +757,7 @@ } classifyBasket.getClassfiedItems().removeAll(splitClassifiedItems); classifyBasket.getRecyclingRecords().remove(recyclingRecord); - recyclingRecord.getClassifyBaskets().add(newClassifyBasket); + //recyclingRecord.getClassifyBaskets().add(newClassifyBasket); objectDao.saveOrUpdate(classifyBasket); objectDao.saveOrUpdate(recyclingRecord); } @@ -680,7 +785,8 @@ if(container == null){ continue; } - if(containerManager.isEmpty(container.getBarcode())){ + //篮筐没有其他清洗装载的篮筐实例;篮筐内多个物品都是没有装配任务了;那状态就设置为空闲; + if(!isExistUnWashBasket(classifyBasket.getContainerBarcode(), classifyBasket.getId()) && containerManager.isEmpty(container.getBarcode())){ container.setStatus(Container.CONTAINER_STATUS_FREE); containerManager.saveOrUpdate(container); }