Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r25406 -r25616 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 25406) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 25616) @@ -19,12 +19,16 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.TreeMap; +import java.util.regex.Pattern; import java.util.stream.Collectors; import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.Query; @@ -94,6 +98,7 @@ import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.SqlUtils; +import com.google.common.base.Optional; import com.google.common.collect.Maps; /** @@ -4300,4 +4305,191 @@ result.put(JSONUtil.JSON_KEY_MESSAGE, "保存成功"); return result; } + +/*************************/ + @SuppressWarnings("unchecked") + @Override + public JSONObject getPrintSterilizaerRecordsById(Long id){ + JSONObject result = new JSONObject(); + //1、根据id获取灭菌记录 + List sterilizerRecords = getSterilizaerRecordsById(id); + //2、防止因为灭菌器参数的对象太多导致打印超多,所以只取关键的点 + //取峰值,谷值,中间值 + //设备接口 +// String deviceInterfaceID = sterilizerRecords.get(0).getDeviceInterfaceID(); +// DeviceInterface di = (DeviceInterface) objectDao.getById(DeviceInterface.class.getSimpleName(), deviceInterfaceID); +// String deviceBrand = di.getDeviceBrand(); + //3、根据灭菌阶段分组 + Map> phaseMapSr = new HashMap>(); + for (SterilizerRecord sr : sterilizerRecords) { + String phase = sr.getPhase(); + List srByPhase = phaseMapSr.get(phase); + //有可能阶段为null + if(null == phase){ + phase = ""; + } + if (srByPhase == null) { + srByPhase = new ArrayList(); + phaseMapSr.put(phase, srByPhase); + } + srByPhase.add(sr); + } + //4、获得每阶段的关键点 + HashMap resultMap = new HashMap();//各阶段对应的打印参数 + List sortByPhaseList = new ArrayList();//用于按灭菌阶段的第一个时间排序 + for (Map.Entry> entry : phaseMapSr.entrySet()) { + List srList = entry.getValue();//该阶段的灭菌参数 + String key = entry.getKey();//灭菌阶段 + List printSrForPhase = new ArrayList(); + printSterilizerRecords_SetKeyPoint(srList, printSrForPhase);//记录该阶段的灭菌参数的关键点 + sortByTime(printSrForPhase);//按时间time排序 + resultMap.put(key, JSONUtil.toJsonArrayWithJsonlib(printSrForPhase, new String[]{"sterilizationRecord"})); + sortByPhaseList.add(printSrForPhase.stream().findFirst().orElse(new SterilizerRecord()));//获取第一个时间的sr对象 + } + //5、按各阶段的第一个时间进行排序 + sortByTime(sortByPhaseList); + for (SterilizerRecord sr : sortByPhaseList) { + String phase = sr.getPhase(); + result.put(phase, resultMap.get(phase)); + } + return result; + } + + /** + * 获得灭菌详情的参数关键点 + * @param srList + * @param print + */ + private void printSterilizerRecords_SetKeyPoint(List srList, List print) { + if(CollectionUtils.isNotEmpty(srList)){ + sortByTime(srList);//按时间time排序 + List temp1Result = new ArrayList();//用于记录温度1的一段(峰-谷) +// List p1MbarResult = new ArrayList();//用于记录压力1的一段(峰-谷) + for (int i = 0; i < srList.size(); i++) { + if(i == 0){//取最初值 + print.add(srList.get(i));// + temp1Result.add(srList.get(i)); +// p1MbarResult.add(result.get(i)); + continue; + } + if(i == srList.size()-1){//取最后值 + print.add(srList.get(i));// + //取(最后一个转折点-最后一个值)的中间值 + temp1Result.add(srList.get(i)); + setListMedian(temp1Result,print); +// p1MbarResult.add(result.get(i)); +// setListMedian(p1MbarResult,print); + break; + } + //目前只取温度的关键点 + //获取现在,前,后的值 + SterilizerRecord beforeSr = srList.get(i-1); + SterilizerRecord nowSr = srList.get(i); + SterilizerRecord afterSr = srList.get(i+1); + + //t1Temp + BigDecimal beforeSrT1temp =new BigDecimal(beforeSr.getT1Temp()); + BigDecimal nowSrT1temp = new BigDecimal(nowSr.getT1Temp()); + BigDecimal afterSrT1temp = new BigDecimal(afterSr.getT1Temp()); + //大于最高温度则不记录 + BigDecimal maxtemp = new BigDecimal(200);//最高温度:200度 + if(nowSrT1temp.compareTo(maxtemp) >0){ + continue; + } + //设置该点是否为温度1曲线关键点 + setKeyPoint(print, temp1Result,nowSr, nowSrT1temp, beforeSrT1temp,afterSrT1temp); + //设置该点是否为压力1曲线关键点 + //P1Mbar +// BigDecimal beforeSrP1Mbar =new BigDecimal(beforeSr.getP1Mbar()); +// BigDecimal nowSrP1Mbar = new BigDecimal(nowSr.getP1Mbar()); +// BigDecimal afterSrP1Mbar = new BigDecimal(afterSr.getP1Mbar()); +// setKeyPoint(print, p1MbarResult,nowSr, nowSrP1Mbar, beforeSrP1Mbar,afterSrP1Mbar); + } + } + } + + /** + * + * @param printReuslt 打印的灭菌参数数据 + * @param paramsResult 曲线某参数的一段(转折点—转折点) + * @param nowSr 当前的灭菌数据 + * @param nowSrParam 当前的曲线某参数数据 + * @param beforeSrParam 前一个曲线某参数数据 + * @param afterSrParam 后一个曲线某参数数据 + */ + private void setKeyPoint(List printReuslt,List paramsResult,SterilizerRecord nowSr, + BigDecimal nowSrParam,BigDecimal beforeSrParam, BigDecimal afterSrParam) { + paramsResult.add(nowSr); + //是否峰值转折点(现在大于前 且 现在大于后)、(现在大于前 且 现在等于后)、(现在等于前 且 现在大于后) + //是否谷值转折点(现在小于前 且 现在小于等于后)、(现在小于前 且 现在等于后)、(现在等于前 且 现在小于后) + if((nowSrParam.compareTo(beforeSrParam) > 0 && nowSrParam.compareTo(afterSrParam) > 0) +// ||(nowSrParam.compareTo(beforeSrParam) > 0 && nowSrParam.compareTo(afterSrParam) == 0) +// ||(nowSrParam.compareTo(beforeSrParam) == 0 && nowSrParam.compareTo(afterSrParam) > 0) + ||(nowSrParam.compareTo(beforeSrParam) < 0 && nowSrParam.compareTo(afterSrParam) < 0) +// ||(nowSrParam.compareTo(beforeSrParam) < 0 && nowSrParam.compareTo(afterSrParam) == 0) +// ||(nowSrParam.compareTo(beforeSrParam) == 0 && nowSrParam.compareTo(afterSrParam) < 0) + ){ + //若无记录该转折点则记录 + if(!printReuslt.stream().anyMatch(prs -> prs.getTime().equals(nowSr.getTime()))){ + printReuslt.add(nowSr);// + } + setListMedian(paramsResult,printReuslt);//取两转折点的中间值 + paramsResult.clear();//清空该段记录 + paramsResult.add(nowSr);//下一段(转折点—转折点)的起点 + }; + } + + /** + * 取这段(转折点—转折点)中间值 + * @param paramsResult + * @param printReuslt + */ + private void setListMedian(List paramsResult,List printReuslt){ + int peak_ValleySize = paramsResult.size(); + if(peak_ValleySize > 2){ + int medianInex = peak_ValleySize / 2; + SterilizerRecord medianSr = paramsResult.get(medianInex); + //若无记录该中间点则记录 + if(!printReuslt.stream().anyMatch(prs -> prs.getTime().equals(medianSr.getTime()))){ + printReuslt.add(medianSr);// + } + } + } + + + //按时间time排序 + private void sortByTime(List srList){ + Collections.sort(srList, new Comparator(){ + @Override + public int compare(SterilizerRecord arg0, SterilizerRecord arg1) { + Date time1 = getTimeDate(arg0.getTime()); + Date time2 = getTimeDate(arg1.getTime()); + if(null == time1 || null == time2){ + return 0; + } + if(time1.before(time2)){ + return -1; + } + if(time1.after(time2)){ + return 1; + } + return 0; + } + }); + } + + // + private Date getTimeDate(String timeStr){ + Date timeDate = null; + if(StringUtils.isNotBlank(timeStr)){ + String timeFormat = "[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}";//是否为yy/mm/ddd hh:mm:ss + if(Pattern.compile(timeFormat).matcher(timeStr).matches()){ + timeDate = ForgonDateUtils.safelyParseDate(timeStr,"yy/MM/dd hh:mm:ss"); + }else{ + timeDate = ForgonDateUtils.safelyParseDate(timeStr); + } + } + return timeDate; + } +/******************/ } Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java =================================================================== diff -u -r25399 -r25616 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java (.../XinHuaDataManagerImpl.java) (revision 25399) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java (.../XinHuaDataManagerImpl.java) (revision 25616) @@ -257,9 +257,14 @@ record.setDeviceInterfaceID(devInterface.getId().toString()); // 时间格式 2016/4/15 16:32:49 record.setTime(new SimpleDateFormat("yy/MM/dd HH:mm:ss").format(startDate)); - record.setP1Mbar(line.substring(28,33)); - record.setT1Temp(line.substring(33,38)); - + record.setP1Mbar(line.substring(28,33));//室内压力 + record.setT1Temp(line.substring(33,38));//室内温度 + // + String programNo_source = line.substring(12,14);//程序编号 + String phase_source = line.substring(14,16);//程序阶段号 + String phase = SterilizerRecord.STERILIZERRECORD_PHASE_XINHUA.get(phase_source);//阶段号对应的阶段 + record.setPhase(phase);//阶段 + record.setProgramNo(programNo_source); objectDao.saveOrUpdate(record); } br.close(); Index: ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/sterilizerLineChart.jsp =================================================================== diff -u -r24875 -r25616 --- ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/sterilizerLineChart.jsp (.../sterilizerLineChart.jsp) (revision 24875) +++ ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/sterilizerLineChart.jsp (.../sterilizerLineChart.jsp) (revision 25616) @@ -9,15 +9,16 @@ 灭菌炉温度、压力曲线图 - + <%-- --%> - + +