Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r29677 -r29718 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 29677) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 29718) @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; -import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -2600,7 +2599,8 @@ + dateQueryAdapter.dateAdapter(out_beginTime) + " and po.reviewTime < " + dateQueryAdapter.dateAdapter(out_endTime) - + " and po.orgUnitCoding = '" + orgUnitCode + "'" + + " and po.orgUnitCoding = '" + orgUnitCode + "' " + + " and po.comboTousseInstanceId is null " + " order by operationTime desc"; List list = objectDao.findBySql( TousseInstance.class.getSimpleName(), sql); @@ -5772,6 +5772,7 @@ + " and((ti.proxyDisinfection_id is not null and ip.handleDepartCoding='"+userCode+"') or " + " (ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"')) " + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " + barcodesSql + sqlStatus; }else if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(td.getTousseType()) || TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY.equals(td.getTousseType())){//消毒物品和外部代理灭菌包 @@ -5783,6 +5784,7 @@ + "and((ti.proxyDisinfection_id is not null and " + " ip.handleDepartCoding='"+userCode+"')or(ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"'))" + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " + barcodesSql + sqlStatus; } if(StringUtils.isBlank(findSql)){ @@ -5849,6 +5851,7 @@ + " and((ti.proxyDisinfection_id is not null and ip.handleDepartCoding='"+userCode+"') or " + " (ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"')) " + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " + barcodesSql + sqlStatus; }else if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(td.getTousseType()) || TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY.equals(td.getTousseType())){//消毒物品和外部代理灭菌包 @@ -5860,7 +5863,8 @@ + reviewedSql + " and((ti.proxyDisinfection_id is not null and " + " ip.handleDepartCoding='"+userCode+"')or(ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"'))" - + " and reviewBasket_id is null " + + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " +barcodesSql + sqlStatus; } if(StringUtils.isBlank(findSql)){ @@ -5936,6 +5940,7 @@ + " and((ti.proxyDisinfection_id is not null and ip.handleDepartCoding='"+userCode+"') or " + " (ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"')) " + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " + barcodesSql + sqlStatus; }else if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(td.getTousseType()) || TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY.equals(td.getTousseType())){//消毒物品和外部代理灭菌包 @@ -5948,6 +5953,7 @@ + " and((ti.proxyDisinfection_id is not null and " + " ip.handleDepartCoding='"+userCode+"')or(ti.proxyDisinfection_id is null and ti.orgUnitCoding='"+userCode+"'))" + " and reviewBasket_id is null " + + " and ti.comboTousseInstanceId is null " + barcodesSql + sqlStatus; } if(StringUtils.isBlank(findSql)){ @@ -6553,6 +6559,35 @@ }finally { DatabaseUtil.closeResultSetAndStatement(rs); } + + // 不追溯的包,包括非今天审核的 + ResultSet rs1 = null; + try { + rs1 = objectDao.executeSql(getUnTraceableReviewedTousseInsSql(orgUnitCode, extraOrder)); + while(rs1.next()){ + TousseSimpleVO ti = new TousseSimpleVO(); + ItemDefinitionVO td = new ItemDefinitionVO(); + ti.setItemDefinition(td); + td.setIncludeImplant(rs1.getInt("includeImplant")); + ti.setBarcode(rs1.getString("barcode")); + ti.setDepart(rs1.getString("depart")); + ti.setTousseName(rs1.getString("tousseName")); + ti.setSterilingMode(rs1.getString("sterilingMode")); + ti.setReviewTime(""); + // 如果该包的总数量超过2000,则只加载该包最新审核的2000个(ASSZDFY-80) + int amount = rs1.getInt("amount"); + ti.setStockAmount(Long.valueOf(amount)); + ti.setAmount(amount > SterilizationRecord.MAXSCANAMOUNT ? SterilizationRecord.MAXSCANAMOUNT : amount); + ti.setSterilingType(rs1.getString("sterilingType")); + ti.setIsUrgentTousse(rs1.getString("IsUrgentTousse")); + //ti.setTaskGroup(rs1.getString("taskGroup")); + tousseList.add(ti); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs1); + } return tousseList; } @@ -6582,20 +6617,12 @@ + " and ti.sterileStartTime < " + dateQueryAdapter.dateAdapter(out_endTime); } - String firstBarcodeSql = null; - if(dbConnection.isSqlServer()){ - firstBarcodeSql = "(select top 1 barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id) "; - } else if(dbConnection.isOracle()){ - firstBarcodeSql = "(select barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id and rownum <= 1) "; - } String sqlSelect_UrgentLevel = ""; String sqlJoin_UrgentLevel = ""; - String nullSql = ""; if(enableUrgentFunction){ //关联加急对象的sql语句(不追溯器械包暂不考虑加急) sqlSelect_UrgentLevel = String.format(" ,ul.colorCode ulColorCode ,ul.grade ulGrade, ul.name ulName , ul.id ulId "); sqlJoin_UrgentLevel = String.format(" left join %s ul on ti.urgentLevel_id = ul.id ", UrgentLevel.class.getSimpleName()); - nullSql = " ,null ulColorCode ,null ulGrade, null ulName , null ulId "; } String sql = "select * from ((select tdancestor.id,ti.depart,ti.tousseName,ti.sterilingType,ti.sterilingMode,ti.taskGroup," + "IsUrgentTousse,b.barcode,ti.reviewTime,1 amount, td.includeImplant " @@ -6607,12 +6634,13 @@ + "td.ancestorID=tdancestor.id left join "+ InvoicePlan.class.getSimpleName() +" pd on pd.id=ti.proxyDisinfection_id where tdancestor.isTraceable='"+ Constants.STR_YES +"' and ti.status='"+ TousseInstance.STATUS_REVIEWED +"' and ti.comboTousseInstanceId is null " + "and ti.reviewBasket_id is null "+dateSql+" " + "and (pd.id is null and ti.orgunitcoding='"+orgUnitCode+"' or pd.id is not null and pd.handleDepartCoding='"+orgUnitCode+"') ) " + + ")t"; - + " union " + /*+ " union " - + "(select tdancestor.id ,null depart,tdancestor.name tousseName,null,s.sterilizationMode sterilingMode,null,ti.taskGroup taskGroup," + + "(select tdancestor.id ,null depart,tdancestor.name tousseName,null sterilingType,s.sterilizationMode sterilingMode,ti.taskGroup taskGroup,null IsUrgentTousse," + firstBarcodeSql - + "barcode,null reviewTime,count(0) amount, max(tdancestor.includeImplant) " + + "barcode,null reviewTime,count(0) amount, max(tdancestor.includeImplant) includeImplant" + nullSql + " from "+ TousseInstance.class.getSimpleName() +" ti " + " join "+ BarcodeDevice.class.getSimpleName() +" b on b.id=ti.id " @@ -6622,12 +6650,39 @@ + " where 1=1 and tdancestor.isTraceable='"+ Constants.STR_NO +"' and ti.status='"+ TousseInstance.STATUS_REVIEWED +"' and ti.comboTousseInstanceId is null " + dateSql + " and ti.reviewBasket_id is null and (pd.id is null and ti.orgunitcoding='"+orgUnitCode+"' or pd.id is not null and pd.handleDepartCoding='"+orgUnitCode+"') group by tdancestor.id,tdancestor.name,ti.taskGroup,s.sterilizationMode" - + "))t"; + + "))t"*/; if(StringUtils.isNotBlank(extraOrder)){ sql += " order by " + extraOrder; } return sql; } + + /** + * 根据科室编码和该科室指定的待灭菌物品查询方式查询待灭菌的不追溯的包(不追溯的包不按审核时间为今天的条件过滤) + * @param orgUnitCode + * @param extraOrder + * @return + */ + private String getUnTraceableReviewedTousseInsSql(String orgUnitCode, String extraOrder){ + String firstBarcodeSql = null; + if(dbConnection.isSqlServer()){ + firstBarcodeSql = "(select top 1 barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id) "; + } else if(dbConnection.isOracle()){ + firstBarcodeSql = "(select barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id and rownum <= 1) "; + } + String sql = "select tdancestor.id ,null depart,tdancestor.name tousseName,null sterilingType,s.sterilizationMode sterilingMode,null IsUrgentTousse," + + firstBarcodeSql + + "barcode,null reviewTime,count(0) amount, max(tdancestor.includeImplant) includeImplant" + + " from "+ TousseInstance.class.getSimpleName() +" ti " + + " join "+ BarcodeDevice.class.getSimpleName() +" b on b.id=ti.id " + + " join "+ TousseDefinition.class.getSimpleName() +" td on ti.tousseDefinition_id=td.id join "+ TousseDefinition.class.getSimpleName() +" tdancestor " + + " on td.ancestorID=tdancestor.id left join "+ InvoicePlan.class.getSimpleName() +" pd on pd.id=ti.proxyDisinfection_id " + + " left join " + Sterilisation.class.getSimpleName() + " s on s.sterilisation = td.sterilingMethod" + + " where 1=1 and tdancestor.isTraceable='"+ Constants.STR_NO +"' and ti.status='"+ TousseInstance.STATUS_REVIEWED +"' and ti.comboTousseInstanceId is null " + + " and ti.reviewBasket_id is null and (pd.id is null and ti.orgunitcoding='"+orgUnitCode+"' or pd.id is not null and pd.handleDepartCoding='"+orgUnitCode+"') group by tdancestor.id,tdancestor.name,s.sterilizationMode "; + sql += " order by tdancestor.id "; + return sql; + } @Override public void setStatusAccordingToTousseDefinition( Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r29677 -r29718 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 29677) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 29718) @@ -3729,8 +3729,10 @@ //得到获取今天审核未入灭菌篮筐的器械包集合toussesOfToday,再转到todayToussesMap List toussesOfToday = tousseInstanceManager.getTodayReviewedTousseInstanceByNameAndOrgUnitCode(orgUnitCode, name); Map todayToussesMap = new HashMap(); - for (TousseInstance tousse : toussesOfToday) { - todayToussesMap.put(tousse.getBarcode(), tousse); + if(CollectionUtils.isNotEmpty(toussesOfToday)){ + for (TousseInstance tousse : toussesOfToday) { + todayToussesMap.put(tousse.getBarcode(), tousse); + } } //从toussesOfToday中删除已经扫描了的器械包集合 @@ -3743,7 +3745,7 @@ alreadyLoadedTousses.add(tousseInstance2); } } - if (CollectionUtils.isNotEmpty(alreadyLoadedTousses)) { + if (CollectionUtils.isNotEmpty(alreadyLoadedTousses) && CollectionUtils.isNotEmpty(toussesOfToday)) { for (TousseInstance temp : alreadyLoadedTousses) { toussesOfToday.remove(temp); } Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java =================================================================== diff -u -r29677 -r29718 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 29677) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 29718) @@ -8,6 +8,7 @@ import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -842,6 +843,7 @@ JSONObject validateResultJsonObject = new JSONObject(); JSONArray fixedBarodeJsonArray = new JSONArray();//返回至前台的固定条码集合 JSONArray barodeJsonArray = new JSONArray();//返回至前台的唯一条码集合 + Map tousseDefinitionIdToFixedBarodeMap = new HashMap();// 包定义对应的固定条码 if(StringUtils.isNotBlank(barcodes)){ @@ -853,35 +855,30 @@ //如果是固定条码,则去获取下面的包实例条码,按每次扫描数量去获取 if(StringUtils.isNotBlank(tousseDefinitionId)){ fixedBarodeJsonArray.add(barcode); - //待灭菌物品列表中显示按照科室供应室设置里面的每天开始时间作为时间节点(ZYYFS-118) - Date out_beginTime = new Date(); - Date out_endTime = new Date(); - supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); - String dateSql = ""; - dateSql = " and reviewTime >= " - + dateQueryAdapter.dateAdapter(out_beginTime) - + " and reviewTime < " - + dateQueryAdapter.dateAdapter(out_endTime); String barcodeNotInSql = ""; if(StringUtils.isNotBlank(savedBarcodes)){ barcodeNotInSql += SqlUtils.get_NotInSql("barcode", savedBarcodes.split(";")); } - barcodeList = tousseInstanceManager.getTousseInsDataByFixedBarcode - (barcode, myBarcodes, barcodeNotInSql + " and status = '"+TousseInstance.STATUS_REVIEWED+"'" + dateSql,"barcode",0,null,null); - //循环该固定条码下的包实例去校验 + List tempBarcodeList = tousseInstanceManager.getTousseInsDataByFixedBarcode + (barcode, myBarcodes, barcodeNotInSql + " and status = '"+TousseInstance.STATUS_REVIEWED+"'","barcode",0,SterilizationRecord.MAXSCANAMOUNT,null); + if(CollectionUtils.isNotEmpty(tempBarcodeList)){ + barcodeList.addAll(tempBarcodeList); + tousseDefinitionIdToFixedBarodeMap.put(tousseDefinitionId, barcode); + } + /*//循环该固定条码下的包实例去校验 for (String barcodeStr : barcodeList) { validateResultJsonObject = validateBarcodeForBarcodeDevice(sterilizationRecordId , barcodeStr , savedBarcodes); if(validateResultJsonObject.optBoolean("success")){ resultJsonArray.add(validateResultJsonObject.optJSONObject("dataList")); - }/*else{ + }else{ jsonObject.put("success", false); jsonObject.put("message", validateResultJsonObject.optString("message")); StrutsResponseUtils.output(jsonObject); return; - }*/ - } + } + }*/ }else{//唯一条码或灭菌筐 validateResultJsonObject = validateBarcodeForBarcodeDevice(sterilizationRecordId , barcode , savedBarcodes); if(validateResultJsonObject.optBoolean("success")){ @@ -894,6 +891,18 @@ } } } + //循环该固定条码下的包实例去校验 + if(CollectionUtils.isNotEmpty(barcodeList)){ + validateResultJsonObject = batchValidateBarcodeForTousseInstance(sterilizationRecordId , barcodeList, savedBarcodes, tousseDefinitionIdToFixedBarodeMap); + if(validateResultJsonObject.optBoolean("success")){ + resultJsonArray.addAll(validateResultJsonObject.optJSONArray("dataList")); + }else{ + jsonObject.put("success", false); + jsonObject.put("message", validateResultJsonObject.optString("message")); + StrutsResponseUtils.output(jsonObject); + return; + } + } @@ -989,6 +998,122 @@ } /** + * 点击一键入炉添加灭菌物品时,批量校验某一个固定条码下的器械包实例条码 + * @param sterilizationRecordId 灭菌记录id + * @param barcodeList 某一个固定条码下的包实例条码集合 + * @param savedBarcodes 已经保存的条码:用分号分割 + * @return + */ + private JSONObject batchValidateBarcodeForTousseInstance(Long sterilizationRecordId, List barcodeList, String savedBarcodes, Map tousseDefinitionIdToFixedBarodeMap) { + JSONArray tousseJSONArr = new JSONArray(); + if(StringUtils.isNotBlank(savedBarcodes)){ + List tempList = Arrays.asList(savedBarcodes.split(";")); + barcodeList.removeAll(tempList); + } + String hql = String.format("select ti, bd, ti.tousseDefinition, s from %s ti, %s bd, %s s " + + " where ti.id = bd.id and s.sterilisation = ti.tousseDefinition.sterilingMethod " + + " and ti.reviewBasket_id is null and %s ", + TousseInstance.class.getSimpleName(), BarcodeDevice.class.getSimpleName(), Sterilisation.class.getSimpleName(), + SqlUtils.getStringFieldInLargeCollectionsPredicate("bd.barcode", barcodeList)); + List list = objectDao.findByHql(hql); + if(CollectionUtils.isEmpty(list)){ + JSONObject returnJson = JSONUtil.buildJsonObject(true); + returnJson.put("dataList", tousseJSONArr); + return returnJson; + } + Map tousseInstanceMap = new HashMap(); + Map tousseDefinitionMap = new HashMap(); + Map sterilisationMap = new HashMap(); + for (int i=0; i sterilizationRecordList = + objectDao.findByHql("select po from " + SterilizationRecord.class.getSimpleName() + + " po inner join fetch po.tousseInstanceList til where po.status='"+ SterilizationRecord.STERILIZATION_STATUS_BEGIN + + "' and til.id=" + tousseInstance.getId()); + if(CollectionUtils.isNotEmpty(sterilizationRecordList)){ + if(sterilizationRecordList.get(0).getId().longValue() == sterilizationRecordId.longValue()){ + isSterilingAndTheSameSterilizationRecord = true; + } + } + } + + if (isReviewed || isSterilingAndTheSameSterilizationRecord) { + JSONObject returnDataJsonObject = new JSONObject(); + returnDataJsonObject.put("type", TousseDefinition.PACKAGE_TYPE_INSIDE); + returnDataJsonObject.put("barcode", tousseInstance.getBarcode()); + returnDataJsonObject.put("amount", 1); + returnDataJsonObject.put("name", tousseInstance.getTousseName()); + returnDataJsonObject.put("typeForSterilizationStatistics", getTypeForSterilizationStatistics(tousseInstance)); + returnDataJsonObject.put("fixedBarcode", ""); + returnDataJsonObject.put("includeImplant", tousseDefinition.getIncludeImplantStr()); + if(TousseDefinition.STR_NO.equals(tousseDefinition.getIsTraceable())){ + returnDataJsonObject.put("fixedBarcode", tousseDefinitionIdToFixedBarodeMap.get(tousseDefinition.getId().toString())); + returnDataJsonObject.put("sterilingMode", sterilisation == null ? "" : sterilisation.getSterilizationMode()); + tousseJSONArr.add(returnDataJsonObject); + } + + //检查代理灭菌是否已录入代理灭菌单 + String checkProxyDisinfection = StrutsParamUtils.getPraramValue("checkProxyDisinfection", ""); + if (StringUtils.isNotBlank(checkProxyDisinfection)) { + if (tousseInstance.getOrgUnitCoding() != null + && !tousseInstance.getOrgUnitCoding().equals(userOrgUnitCode) + && tousseInstance.getProxyDisinfection_id() == null) { + return JSONUtil.buildJsonObject(false, "条码为" + barcodeDevice.getBarcode() + "的器械包未录入代理灭菌单"); + } + } + } + } + } + } + JSONObject returnJson = JSONUtil.buildJsonObject(true); + returnJson.put("dataList", tousseJSONArr); + return returnJson; + } + + /** * 点击一键入炉添加灭菌物品时,校验条码对象... * @param sterilizationRecordId 灭菌记录id * @param barcode 器械包条码或者容器条码 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r29628 -r29718 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 29628) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 29718) @@ -366,6 +366,13 @@ */ private String includeImplant = Constants.STR_NO; + /** + * 登记灭菌记录时,每个器械包可以入炉的最大数量2000(ASSZDFY-80) + * 1、不追溯的待灭菌物品, 数量为所有待灭菌的包的数量,包括非今天审核的。但是如果该包的总数量超过2000,则只加载该包最新审核的2000个。 + * 2、不追溯的待灭菌物品,点击待灭菌物品列表的一键入炉按钮时入炉的最大数量; + */ + public static final Integer MAXSCANAMOUNT = 2000; + @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() {