Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java =================================================================== diff -u -r32467 -r32543 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 32467) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 32543) @@ -1349,6 +1349,24 @@ return locationForDisplay2; } + /** + * 最终的位置(如果有二次发货则取二次发货后的位置) + * @return + */ + @Transient + public String getFinalLocation() { + return StringUtils.defaultIfEmpty(location_2, location); + } + + /** + * 最终的位置(如果有二次发货则取二次发货后的位置) + * @return + */ + @Transient + public String getFinalLocationForDisplay() { + return StringUtils.defaultIfEmpty(locationForDisplay2, locationForDisplay); + } + public String getSettleAccountsDepartCode2() { return settleAccountsDepartCode2; } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java =================================================================== diff -u -r28312 -r32543 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java (.../RecallRecordAction.java) (revision 28312) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java (.../RecallRecordAction.java) (revision 32543) @@ -6,10 +6,12 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; @@ -37,6 +39,7 @@ import com.forgon.tools.Constants; import com.forgon.tools.StrutsResponseUtils; import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.common.CssdUtils; @@ -45,6 +48,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.recall.RecallRecord; import com.forgon.disinfectsystem.entity.recall.RecallRecordItem; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.recall.service.RecallRecordManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; @@ -561,50 +565,104 @@ .getRecallRecordItemForDepart(); } List recalledTousseVOs = new ArrayList(); - // 由于数据结构的原因需要对item对象做一些处理。页面需要显示具体的器械包, - // 器械包的信息是item里面的一个list所以需要下面的for循环进行转换 - for (RecallRecordItem recallRecordItem : recallRecordItems) { - RecallRecord record = recallRecordItem.getRecallRecord(); - List tis = recallRecordItem.getTousseInstances(); - if (tis != null && tis.size() > 0) { - List instances = tis; - for (TousseInstance ti : instances) { - //聚合包内的普通包实例应该过滤掉不显示出来 - if(DatabaseUtil.isPoIdValid(ti.getComboTousseInstanceId())){ - continue; + if(CollectionUtils.isNotEmpty(recallRecordItems)){ + List allInstances = new ArrayList(); + recallRecordItems.stream().forEach(recallRecordItem -> { + List tis = recallRecordItem.getTousseInstances(); + allInstances.addAll(tis); + }); + //已灭菌器械包包实例的灭菌记录id(所在位置为空的包实例) + List sterilizationRecordIdList = allInstances.stream().filter(ti -> { + return StringUtils.isBlank(ti.getFinalLocation()); + }).map(TousseInstance::getSterilizationRecord_id).distinct().collect(Collectors.toList()); + Map idToSterilizationRecordMap = new HashMap(); + Map orgUnitCodingToOrgunitMap = new HashMap(); + if(CollectionUtils.isNotEmpty(sterilizationRecordIdList)){ + List sterilizationRecordList = sterilizationRecordManager.getCollection(sterilizationRecordIdList); + if(CollectionUtils.isNotEmpty(sterilizationRecordList)){ + sterilizationRecordList.stream().forEach(sr -> { + idToSterilizationRecordMap.put(sr.getId(), sr); + }); + List orgUnitCodingList = sterilizationRecordList.stream().map(SterilizationRecord::getOrgUnitCoding).distinct().collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(orgUnitCodingList)){ + List orgUnitList = orgUnitManager.getCollection("orgUnitCoding", orgUnitCodingList); + if(CollectionUtils.isNotEmpty(orgUnitList)){ + orgUnitList.stream().forEach(orgUnit -> { + orgUnitCodingToOrgunitMap.put(orgUnit.getOrgUnitCoding(), orgUnit); + }); + } } + } + } + + // 由于数据结构的原因需要对item对象做一些处理。页面需要显示具体的器械包, + // 器械包的信息是item里面的一个list所以需要下面的for循环进行转换 + for (RecallRecordItem recallRecordItem : recallRecordItems) { + RecallRecord record = recallRecordItem.getRecallRecord(); + List tis = recallRecordItem.getTousseInstances(); + if (CollectionUtils.isNotEmpty(tis)) { + List instances = tis; + for (TousseInstance ti : instances) { + //聚合包内的普通包实例应该过滤掉不显示出来 + if(DatabaseUtil.isPoIdValid(ti.getComboTousseInstanceId())){ + continue; + } + //已使用状态的包实例应该过滤掉不显示出来(SZYK-48 召回记录管理模块改进) + if(ti.isUsed()){ + continue; + } + String departName = ti.getFinalLocationForDisplay(); + if(StringUtils.isNotBlank(departName)){ + SterilizationRecord sterilizationRecord = idToSterilizationRecordMap.get(ti.getSterilizationRecord_id()); + if(sterilizationRecord != null && StringUtils.isNotBlank(sterilizationRecord.getOrgUnitCoding())){ + OrgUnit orgUnit = orgUnitCodingToOrgunitMap.get(sterilizationRecord.getOrgUnitCoding()); + if(orgUnit != null){ + departName = orgUnit.getOrgUnitCoding(); + } + } + } + RecalledTousseVO tousseVO = new RecalledTousseVO(); + tousseVO.setDepartName(departName); + tousseVO.setBarcode(ti.getBarcode()); + if(record != null){ + tousseVO.setRecallInfoPublishTimeStr(dateFormat + .format(record.getPublishDate())); + } + tousseVO.setTousseName(ti.getTousseDefinitionName()); + tousseVO.setStatus(ti.getStatus()); + tousseVO.setRecaller(ti.getRecaller()); + tousseVO.setRecallTimeStr(ti.getRecallTimeStr()); + tousseVO.setSterilizeTimeStr(ti.getSterileEndTime()); + tousseVO.setAmount(1); + recalledTousseVOs.add(tousseVO); + } + }else{ RecalledTousseVO tousseVO = new RecalledTousseVO(); - tousseVO.setBarcode(ti.getBarcode()); + tousseVO.setBarcode(""); if(record != null){ tousseVO.setRecallInfoPublishTimeStr(dateFormat .format(record.getPublishDate())); + tousseVO.setTousseName(record.getObjectName()); } - tousseVO.setTousseName(ti.getTousseDefinitionName()); - tousseVO.setStatus(ti.getStatus()); - tousseVO.setRecaller(ti.getRecaller()); - tousseVO.setRecallTimeStr(ti.getRecallTimeStr()); - tousseVO.setSterilizeTimeStr(ti.getSterileEndTime()); - tousseVO.setAmount(1); + tousseVO.setStatus("待召回"); + tousseVO.setAmount(recallRecordItem.getAmount()); recalledTousseVOs.add(tousseVO); } - }else{ - RecalledTousseVO tousseVO = new RecalledTousseVO(); - tousseVO.setBarcode(""); - if(record != null){ - tousseVO.setRecallInfoPublishTimeStr(dateFormat - .format(record.getPublishDate())); - tousseVO.setTousseName(record.getObjectName()); - } - tousseVO.setStatus("待召回"); - tousseVO.setAmount(recallRecordItem.getAmount()); - recalledTousseVOs.add(tousseVO); } + try { + //按科室名称排序(SZYK-48 召回记录管理模块改进),之前为按招架时间排序 + Collections.sort(recalledTousseVOs, new Comparator() { + @Override + public int compare(RecalledTousseVO o1, RecalledTousseVO o2) { + return o1.getDepartName().compareTo(o2.getDepartName()); + } + + }); + // 按照召回时间排序 +// Collections.sort(recalledTousseVOs); + } catch (Exception e) { + } } - try { - // 按照召回时间排序 - Collections.sort(recalledTousseVOs); - } catch (Exception e) { - } Map map = new HashMap(); // map.put("success", true); map.put("recallRecordItems", recalledTousseVOs); Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java =================================================================== diff -u -r32378 -r32543 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 32378) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 32543) @@ -68,6 +68,7 @@ import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.util.SqlUtils; /** * @@ -357,32 +358,68 @@ } } } - //按器械包状态的验证过滤 - ListIterator it = instances.listIterator(); - while (it.hasNext()) { - TousseInstance instance = it.next(); - /*if (!TousseInstance.STATUS_SHIPPED.equals(instance + if(CollectionUtils.isNotEmpty(instances)){ + //包实例对应所属的召回项map + Map tousseInstanceIdToRecallRecordItem = getTousseInstanceBelongRecallRecordItemMap(instances); + //按器械包状态的验证过滤 + List resultList = new ArrayList(); + for (TousseInstance instance : instances) { + /*if (!TousseInstance.STATUS_SHIPPED.equals(instance .getStatus())) { if (!TousseInstance.STATUS_STERILED.equals(instance .getStatus())) { // 既不是已发货,也不是已灭菌,那就干掉他 it.remove(); } }*/ - if(TousseInstance.STATUS_RECALLED.equals(instance.getStatus()) - || TousseInstance.STATUS_WAIT_FOR_RECALL.equals(instance.getStatus()) - || TousseInstance.STATUS_DISCARD.equals(instance.getStatus())){ - // 如果包状态是已召回或者待召回,需要过滤掉. DGSDBZXYY-106 5.在召回记录登记表单,输入搜索条件后,点击“搜索器械包”按钮,已废弃的包不应被搜索出来。 - it.remove(); + if(TousseInstance.STATUS_RECALLED.equals(instance.getStatus()) + || TousseInstance.STATUS_WAIT_FOR_RECALL.equals(instance.getStatus()) + || TousseInstance.STATUS_DISCARD.equals(instance.getStatus())){ + // 如果包状态是已召回或者待召回,需要过滤掉. DGSDBZXYY-106 5.在召回记录登记表单,输入搜索条件后,点击“搜索器械包”按钮,已废弃的包不应被搜索出来。 + continue; + } + + //如果包实例(通常是已使用记录状态的包实例针对SZYK-48 召回记录管理模块改进的处理)已经录入到其它的召回记录中,则也需要移除掉 + if(tousseInstanceIdToRecallRecordItem != null && tousseInstanceIdToRecallRecordItem.get(instance.getId()) != null){ + continue; + } + resultList.add(instance); } + return resultList; } - return instances; } } return null; } /** + * 包实例对应所属的召回项map + * @param instances + * @return + */ + private Map getTousseInstanceBelongRecallRecordItemMap(List instances){ + if(CollectionUtils.isNotEmpty(instances)){ + String querySql = String.format("select ti.id,ti.recallRecordItem_id from %s ti join %s rri on ti.recallRecordItem_id=rri.id where %s", + TousseInstance.class.getSimpleName(),RecallRecordItem.class.getSimpleName(), + com.forgon.tools.util.SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.id", instances.stream().map(TousseInstance::getId).collect(Collectors.toList()))); + ResultSet rs = null; + try { + Map tousseInstanceBelongRecallRecordItemMap = new HashMap(); + rs = objectDao.executeSql(querySql); + while(rs.next()){ + tousseInstanceBelongRecallRecordItemMap.put(rs.getLong("id"), rs.getLong("recallRecordItem_id")); + } + return tousseInstanceBelongRecallRecordItemMap; + } catch (Exception e) { + + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + } + return null; + } + + /** * 将包实例转换成json格式 * @param instances 包实例集合 * @return [ @@ -475,12 +512,45 @@ // map.value.value.value:RecallTousseInstanceVO Map>> departMap = new HashMap>>(); List tousseVOs = new ArrayList(); - //根据包实例查询对应的使用记录map(key为包实例id,map为使用记录对象)-(GGSRMYY-94 器械包召回功能的改进) - Map useRecordMap = tousseInstanceManager.getUseRecordMapByTousseInstanceList(instances); - if (instances != null) { + if (CollectionUtils.isNotEmpty(instances)) { + //已灭菌器械包包实例的灭菌记录id(所在位置为空的包实例) + List sterilizationRecordIdList = instances.stream().filter(ti -> { + return StringUtils.isBlank(ti.getFinalLocation()); + }).map(TousseInstance::getSterilizationRecord_id).distinct().collect(Collectors.toList()); + Map idToSterilizationRecordMap = new HashMap(); + Map orgUnitCodingToOrgunitMap = new HashMap(); + if(CollectionUtils.isNotEmpty(sterilizationRecordIdList)){ + List sterilizationRecordList = sterilizationRecordManager.getCollection(sterilizationRecordIdList); + if(CollectionUtils.isNotEmpty(sterilizationRecordList)){ + sterilizationRecordList.stream().forEach(sr -> { + idToSterilizationRecordMap.put(sr.getId(), sr); + }); + List orgUnitCodingList = sterilizationRecordList.stream().map(SterilizationRecord::getOrgUnitCoding).distinct().collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(orgUnitCodingList)){ + List orgUnitList = orgUnitManager.getCollection("orgUnitCoding", orgUnitCodingList); + if(CollectionUtils.isNotEmpty(orgUnitList)){ + orgUnitList.stream().forEach(orgUnit -> { + orgUnitCodingToOrgunitMap.put(orgUnit.getOrgUnitCoding(), orgUnit); + }); + } + } + } + } + //根据包实例查询对应的使用记录map(key为包实例id,map为使用记录对象)-(GGSRMYY-94 器械包召回功能的改进) + Map useRecordMap = tousseInstanceManager.getUseRecordMapByTousseInstanceList(instances); for (TousseInstance instance : instances) { - String departName = instance.getLocationForDisplay(); - String departCode = instance.getLocation(); + String departName = instance.getFinalLocationForDisplay(); + String departCode = instance.getFinalLocation(); + if(StringUtils.isNotBlank(departCode)){ + SterilizationRecord sterilizationRecord = idToSterilizationRecordMap.get(instance.getSterilizationRecord_id()); + if(sterilizationRecord != null && StringUtils.isNotBlank(sterilizationRecord.getOrgUnitCoding())){ + OrgUnit orgUnit = orgUnitCodingToOrgunitMap.get(sterilizationRecord.getOrgUnitCoding()); + if(orgUnit != null){ + departName = orgUnit.getOrgUnitCoding(); + departCode = orgUnit.getName(); + } + } + } String departMapKey = departName + ";" + departCode;//用科室名称+编码作为其map的key String realName = instance.getTousseName(); //包实例的使用记录(GGSRMYY-94 器械包召回功能的改进) @@ -664,6 +734,12 @@ } } } + + //已使用的包也加入到召回明细里(SZYK-48 召回记录管理模块改进) + if(instance.isUsed()){ + tousseInstances.add(instance); + recallAmount++; + } } } } @@ -818,8 +894,9 @@ continue; } //@see DGSDBZXYY-172召回记录转换申请单后导出的召回器械包信息报错,召回器械列表为空 + //待召回明细的已使用状态的包实例也不转换申请单(SZYK-48 召回记录管理模块改进) instances = instances.stream().filter(ti -> { - return !StringUtils.equals(TousseInstance.STATUS_DISCARD, ti.getStatus()); + return !ti.isDiscarded() && !ti.isUsed(); }).collect(Collectors.toList()); if(StringUtils.isNotBlank(departCode)){ Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecalledTousseVO.java =================================================================== diff -u -r12331 -r32543 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecalledTousseVO.java (.../RecalledTousseVO.java) (revision 12331) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecalledTousseVO.java (.../RecalledTousseVO.java) (revision 32543) @@ -11,6 +11,10 @@ private String status;// 包状态 private String recaller;// 召回人 private String recallTimeStr;// 召回时间 + /** + * 科室名称 + */ + private String departName; public String getTousseName() { return tousseName; @@ -86,5 +90,13 @@ public void setAmount(Integer amount) { this.amount = amount; } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } }