Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallRecord.java =================================================================== diff -u -r39244 -r41300 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallRecord.java (.../RecallRecord.java) (revision 39244) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallRecord.java (.../RecallRecord.java) (revision 41300) @@ -72,6 +72,31 @@ */ private Date endDate; /** + * 所要召回的查询时间 + * 召回范围是截至上次生物监测成功前的炉次 才用到 + * 只有年月日 + */ + private Date queryDate; + /** + * 炉次 + * 召回范围是截至上次生物监测成功前的炉次 才用到 + */ + private Integer frequency; + /** + * 上次生物监测成功的灭菌记录id + * 暂时用不到 + * 防止后续有扩展 + */ + private Long lastSuccessfulbmStRecordId; + /** + * 上次生物监测成功的灭菌记录的开始时间的年月日 + */ + private String lastSuccessfulbmStRecordYmd; + /** + * 上次生物监测成功的灭菌记录的炉次 + */ + private Integer lastSuccessfulbmStRecordF; + /** * 炉号 */ private String sterilizerName; @@ -254,4 +279,44 @@ this.recallExecuse = recallExecuse; } + public Date getQueryDate() { + return queryDate; + } + + public void setQueryDate(Date queryDate) { + this.queryDate = queryDate; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public Long getLastSuccessfulbmStRecordId() { + return lastSuccessfulbmStRecordId; + } + + public void setLastSuccessfulbmStRecordId(Long lastSuccessfulbmStRecordId) { + this.lastSuccessfulbmStRecordId = lastSuccessfulbmStRecordId; + } + + public String getLastSuccessfulbmStRecordYmd() { + return lastSuccessfulbmStRecordYmd; + } + + public void setLastSuccessfulbmStRecordYmd(String lastSuccessfulbmStRecordYmd) { + this.lastSuccessfulbmStRecordYmd = lastSuccessfulbmStRecordYmd; + } + + public Integer getLastSuccessfulbmStRecordF() { + return lastSuccessfulbmStRecordF; + } + + public void setLastSuccessfulbmStRecordF(Integer lastSuccessfulbmStRecordF) { + this.lastSuccessfulbmStRecordF = lastSuccessfulbmStRecordF; + } + } Index: ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java =================================================================== diff -u -r39345 -r41300 --- ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 39345) +++ ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 41300) @@ -2,6 +2,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -12,11 +13,9 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import net.sf.json.JSONArray; @@ -28,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; @@ -37,6 +37,7 @@ import com.forgon.disinfectsystem.datasynchronization.model.OrgUnitVo; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; import com.forgon.disinfectsystem.entity.basedatamanager.foreigntoussedefinition.ForeignTousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; @@ -49,8 +50,6 @@ import com.forgon.disinfectsystem.entity.recall.RecallTousseItemVO; import com.forgon.disinfectsystem.entity.recall.RecallTousseVO; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; -import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; -import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; @@ -64,12 +63,14 @@ import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.exception.SystemException; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.util.ForgonDateUtils; -import com.forgon.util.SqlUtils; /** * @@ -95,7 +96,10 @@ private ForeignProxyDisinfectionManager foreignProxyDisinfectionManager; private InvoiceManager invoiceManager; - + private DateQueryAdapter dateQueryAdapter; + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } @Autowired private OrgUnitManager orgUnitManager; @@ -424,68 +428,71 @@ } List sterilizationRecords = sterilizationRecordManager .findRecordInTimePart(sterileName, begin, end); - if (sterilizationRecords != null) { - for (SterilizationRecord record : sterilizationRecords) { - //灭菌记录中的未入篮筐的包实例,包含聚合包实例及聚合包实例下属的普通器械包实例 - List tousseinstanceList = tousseInstanceManager.getTousseInstancesOfSterilization_tousseInstance(record.getId()); - //召回不用显示聚合包实例下属的普通器械包实例,所以需要过滤掉 - if(CollectionUtils.isNotEmpty(tousseinstanceList)){ - for(TousseInstance tousseInstance : tousseinstanceList){ - if(!DatabaseUtil.isPoIdValid(tousseInstance.getComboTousseInstanceId())){ - instances.add(tousseInstance); - } - } + return getToussesForRecall(sterilizationRecords, instances); + } + } + return null; + } + private List getToussesForRecall(List sterilizationRecords, List instances){ + if (sterilizationRecords != null) { + for (SterilizationRecord record : sterilizationRecords) { + //灭菌记录中的未入篮筐的包实例,包含聚合包实例及聚合包实例下属的普通器械包实例 + List tousseinstanceList = tousseInstanceManager.getTousseInstancesOfSterilization_tousseInstance(record.getId()); + //召回不用显示聚合包实例下属的普通器械包实例,所以需要过滤掉 + if(CollectionUtils.isNotEmpty(tousseinstanceList)){ + for(TousseInstance tousseInstance : tousseinstanceList){ + if(!DatabaseUtil.isPoIdValid(tousseInstance.getComboTousseInstanceId())){ + instances.add(tousseInstance); } - - //灭菌记录中的已入到篮筐的包实例 - for (ReviewedBasket basket : record - .getReviewedBaskets()) { - Set tousseinstanceSet = basket.getTousseInstances(objectDao); - //召回不用显示聚合包实例下属的普通器械包实例,所以需要过滤掉 - if(CollectionUtils.isNotEmpty(tousseinstanceSet)){ - for(TousseInstance tousseInstance : tousseinstanceSet){ - if(!DatabaseUtil.isPoIdValid(tousseInstance.getComboTousseInstanceId())){ - instances.add(tousseInstance); - } - } - } - } } } - 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(); + + //灭菌记录中的已入到篮筐的包实例 + for (ReviewedBasket basket : record + .getReviewedBaskets()) { + Set tousseinstanceSet = basket.getTousseInstances(objectDao); + //召回不用显示聚合包实例下属的普通器械包实例,所以需要过滤掉 + if(CollectionUtils.isNotEmpty(tousseinstanceSet)){ + for(TousseInstance tousseInstance : tousseinstanceSet){ + if(!DatabaseUtil.isPoIdValid(tousseInstance.getComboTousseInstanceId())){ + instances.add(tousseInstance); + } } - }*/ - 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; } } } + 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.在召回记录登记表单,输入搜索条件后,点击“搜索器械包”按钮,已废弃的包不应被搜索出来。 + continue; + } + + //如果包实例(通常是已使用记录状态的包实例针对SZYK-48 召回记录管理模块改进的处理)已经录入到其它的召回记录中,则也需要移除掉 + if(tousseInstanceIdToRecallRecordItem != null && tousseInstanceIdToRecallRecordItem.get(instance.getId()) != null){ + continue; + } + resultList.add(instance); + } + return resultList; + } return null; } - /** * 包实例对应所属的召回项map * @param instances @@ -806,8 +813,113 @@ sterilizingFrequency_start); return convertToJsonString(instances); } + @Override + public String searchToussesForRecallByBiologicalMonitoring(String ymd, Long sterilizerId, Integer sterilizingFrequency){ + List recallRecords = getRecallSterilizationRecordRecords(ymd, sterilizerId, sterilizingFrequency); + List instances = getToussesForRecall(recallRecords, new ArrayList()); + return convertToJsonString(instances); + } + @Override + public SterilizationRecord querySterilizationRecordsOfLastSuccessfulBiologicalMonitoring( + String sterileName, String ymd, String sterilizingFrequency) { + String[] dates = supplyRoomConfigManager.getStartDateAndEndDate(null, ymd); + Sterilizer sterilizer = (Sterilizer)objectDao.getByProperty(Sterilizer.class.getSimpleName(), "name", sterileName); + + if(sterilizer == null){ + throw new SystemException("不存在灭菌炉"+ sterileName); + } + //获取指定时间指定灭菌炉炉次的灭菌记录 + SterilizationRecord sterilizationRecord = sterilizationRecordManager.getSterilizationRecordByFrequency(dates[0], dates[1] , sterilizer.getId(), Integer.parseInt(sterilizingFrequency)); + if(sterilizationRecord == null){ + throw new SystemException(ymd + sterilizer.getName() + "不存在炉次为" + sterilizingFrequency + "的灭菌记录"); + } + if(!SterilizationRecord.STERILIZATION_STATUS_END.equals(sterilizationRecord.getStatus())){ + throw new SystemException(ymd + sterilizer.getName() + "炉次为" + sterilizingFrequency + "的灭菌记录状态为"+ sterilizationRecord.getStatus() +",不为灭菌完成"); + } + if(sterilizationRecord.getEndDate() == null){ + throw new SystemException(ymd + sterilizer.getName() + "炉次为" + sterilizingFrequency + "的灭菌记录未结束"); + } + if(!SterilizationRecord.MONITOR_RESULT_UNQUALIFIED.equals(sterilizationRecord.getBiologyResult())){ + throw new SystemException("灭菌记录的生物监测结果不为“不合格”,无法搜索物品。"); + } + // 构建HQL查询 + String hql = "SELECT po FROM " + SterilizationRecord.class.getSimpleName() + + " po WHERE po.sterilizer.id = :sterilizerId and po.endDate < " + + dateQueryAdapter.dateAdapter(dates[1]) + + " AND po.biologyResult = :biologyResult" + + " AND po.status = :status" + + " ORDER BY po.endDate DESC"; + // 创建查询对象 + Query query = objectDao.getHibernateSession().createQuery(hql) + .setParameter("sterilizerId", sterilizer.getId()) + .setParameter("biologyResult", SterilizationRecord.MONITOR_RESULT_QUALIFIED) + .setParameter("status", SterilizationRecord.STERILIZATION_STATUS_END); + List qualifiedRecords = query.setMaxResults(1).list(); + if(CollectionUtils.isEmpty(qualifiedRecords)){ + throw new SystemException("找不到上次生物监测成功的灭菌记录"); + } + return qualifiedRecords.get(0); + } @Override + public List getRecallSterilizationRecordRecords(String ymd, Long sterilizerId, Integer sterilizingFrequency){ + String[] dates = supplyRoomConfigManager.getStartDateAndEndDate(null, ymd); + + Sterilizer sterilizer = (Sterilizer)objectDao.getById(Sterilizer.class.getSimpleName(), sterilizerId); + //获取指定时间指定灭菌炉炉次的灭菌记录 + SterilizationRecord sterilizationRecord = sterilizationRecordManager.getSterilizationRecordByFrequency(dates[0], dates[1] , sterilizerId, sterilizingFrequency); + if(sterilizationRecord == null){ + throw new SystemException(ymd + sterilizer.getName() + "不存在炉次为" + sterilizingFrequency + "的灭菌记录"); + } + if(!SterilizationRecord.STERILIZATION_STATUS_END.equals(sterilizationRecord.getStatus())){ + throw new SystemException(ymd + sterilizer.getName() + "炉次为" + sterilizingFrequency + "的灭菌记录状态为"+ sterilizationRecord.getStatus() +",不为灭菌完成"); + } + if(sterilizationRecord.getEndDate() == null){ + throw new SystemException(ymd + sterilizer.getName() + "炉次为" + sterilizingFrequency + "的灭菌记录未结束"); + } + if(!SterilizationRecord.MONITOR_RESULT_UNQUALIFIED.equals(sterilizationRecord.getBiologyResult())){ + throw new SystemException("灭菌记录的生物监测结果不为“不合格”,无法搜索物品。"); + } + //查询上次生物监测成功的灭菌记录 + + // 构建HQL查询 + String hql = "SELECT po FROM " + SterilizationRecord.class.getSimpleName() + + " po WHERE po.sterilizer.id = :sterilizerId and po.endDate < " + + dateQueryAdapter.dateAdapter(dates[1]) + + " AND po.biologyResult = :biologyResult" + + " AND po.status = :status" + + " ORDER BY po.endDate DESC"; + // 创建查询对象 + Query query = objectDao.getHibernateSession().createQuery(hql) + .setParameter("sterilizerId", sterilizer.getId()) + .setParameter("biologyResult", SterilizationRecord.MONITOR_RESULT_QUALIFIED) + .setParameter("status", SterilizationRecord.STERILIZATION_STATUS_END); + + List qualifiedRecords = query.setMaxResults(1).list(); + if(CollectionUtils.isEmpty(qualifiedRecords)){ + throw new SystemException("找不到上次生物监测成功的灭菌记录"); + } + //上次生物监测成功的灭菌记录 + SterilizationRecord qualifiedRecord = qualifiedRecords.get(0); + DateFormat dateFormat = DateTools.YMDHMSFORMAT.get(); + //查询两条灭菌记录中间的灭菌记录 + String sql2 = "select po from " + SterilizationRecord.class.getSimpleName() + + " po where po.sterilizer.id=" + + sterilizer.getId() + + " and po.endDate between " + + dateQueryAdapter.dateAdapter(dateFormat.format(qualifiedRecord.getEndDate())) + + " and " + + dateQueryAdapter.dateAdapter(dateFormat.format(sterilizationRecord.getEndDate())) + + " and po.status='" + + SterilizationRecord.STERILIZATION_STATUS_END + +"' and po.id not in ("+ qualifiedRecord.getId() +","+ sterilizationRecord.getId() +")" + + " order by po.endDate desc"; + List recallRecords = objectDao.findByHql(sql2); + //再加上之前查询到的不合格的灭菌记录 + recallRecords.add(sterilizationRecord); + return recallRecords; + } + @Override public void saveOrUpdate(JSONArray jsonArray, RecallRecord recallRecord) { if (!jsonArray.isEmpty() && jsonArray.isArray()) { Index: ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java =================================================================== diff -u -r36049 -r41300 --- ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java (.../RecallRecordManager.java) (revision 36049) +++ ssts-recallrecord/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java (.../RecallRecordManager.java) (revision 41300) @@ -9,6 +9,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.recall.vo.RecalledTousseVO; /** @@ -90,5 +91,32 @@ * @return */ public Map getTousseInstanceIdToOrgunitVoMap(List instances); - + /** + * 查询指定年月日 灭菌炉 炉次的灭菌记录 + * 如果此灭菌记录生物监测不合格 那么 继续寻找上一条生物监测合格的记录 + * 再找到中间的记录 对其中的包进行召回 + * @param ymd + * @param sterilizerId + * @param sterilizingFrequency + * @return + */ + public String searchToussesForRecallByBiologicalMonitoring(String ymd, Long sterilizerId, Integer sterilizingFrequency); + /** + * 查询上一次生物监测成功的炉次 + * @param sterileName + * @param ymd + * @param sterilizingFrequency + * @return + */ + public SterilizationRecord querySterilizationRecordsOfLastSuccessfulBiologicalMonitoring(String sterileName, String ymd, String sterilizingFrequency); + /** + * 查询指定年月日 灭菌炉 炉次的灭菌记录 + * 如果此灭菌记录生物监测不合格 那么 继续寻找上一条生物监测合格的记录 + * 再找到中间的记录 + * @param ymd + * @param sterilizerId + * @param sterilizingFrequency + * @return 中间的记录 + 指定年月日 灭菌炉 炉次的灭菌记录 + */ + public List getRecallSterilizationRecordRecords(String ymd, Long sterilizerId, Integer sterilizingFrequency); }