项目维护记录--半日数据分析业务层处理

 一次取出所有的未处理的数据,在业务层进行处理:

  因为是半日分析,所以首先找出所有的时间段,将所有的分割时间存到一个list

  其次遍历分割时间,在每个分割时间中找出符合条件的未处理的数据。然后进行求平均,取最大值,最小值。然后存到一个实体对象中推入 list。

用到的知识以及注意点:

  判断字符串是否相等不要用 == ,要用 equals 。

  字符串转 double :

Double.parseDouble("XXX")

  double a 保留两位小数:

(double)Math.round(a*100)/100

  在遍历的时候,注意取list的值得时候不要越界。写好约束条件。

  

 

 

  1 /**
  2      * ty 
  3      * 2018.7.19 
  4      * 半日数据统计分析
  5      * @param  6      * @return  7      */
  8     public Page<LysimeterData> findSemidiurnalAnalysisPage(Page<LysimeterData> page, LysimeterData lysimeterData) {    
  9         try {
 10             List<LysimeterData> list = new ArrayList<LysimeterData>();
 11             
 12             //获取所有数据
 13             List<LysimeterData> dataList =lysimeterDataDao.findList(lysimeterData);
 14             lysimeterData.setPage(page);
 15             //获取前台选择分析开始日期
 16             Date time = lysimeterData.getAnalysisBeginTime();
 17             //从分析开始日期08:00:00作为第一个区间开始时间
 18             Date startTime = DateUtils.addHours(time, +8);
 19             List<Date> timeList = new ArrayList<Date>();
 20             //将查询条件的开始时间存入List集合
 21             timeList.add(startTime);
 22             //通过加12小时获取所有在所选区间内的查询条件的开始时间
 23             while(startTime.getTime() < lysimeterData.getAnalysisEndTime().getTime()){
 24                 startTime = DateUtils.addHours(startTime, +12);
 25                 timeList.add(startTime);
 26             }
 27             //用于遍历从数据库拿的数据
 28             int n = dataList.size()-1;
 29             //循环调用分析方法计算所需分析值(循环时间间隔)
 30             for(int i = 0;i < timeList.size() ; i++){
 31                 //在List集合中取得查询条件的开始时间
 32                 Date beginTime = timeList.get(i);
 33                 //计算得到查询条件的结束时间
 34                 Date endTime = DateUtils.addHours(beginTime, +12);
 35                 //循环完所有数据,跳出循环,防止 get(n) 出现异常
 36                 if(n<0)
 37                     break;
 38                 int countEvaData =0;
 39                 double sumEvaData = 0;
 40                 double maxEvaData = 0;
 41                 double minEvaData = 0;
 42                 int countLeaData = 0;
 43                 double sumLeaData = 0;
 44                 double maxLeaData = 0;
 45                 double minLeaData = 0;
 46                 //计算该时间间隔的 平均值 最大值 最小值
 47                 while(dataList.get(n).getDataTime().getTime()<endTime.getTime()){ //Data类的方法getTime() 得到的时间戳来比较
 48                     LysimeterData l = dataList.get(n);
 49                     if((l.getEvaportion()!=null)&&(!l.getEvaportion().equals(""))){
 50                         if(countEvaData == 0){
 51                             maxEvaData = Double.parseDouble(l.getEvaportion());//字符串转成了double
 52                             minEvaData = Double.parseDouble(l.getEvaportion());
 53                         }
 54                         sumEvaData += Double.parseDouble(l.getEvaportion());
 55                         if(Double.parseDouble(l.getEvaportion())>=maxEvaData)
 56                             maxEvaData = Double.parseDouble(l.getEvaportion());
 57                         if(Double.parseDouble(l.getEvaportion())<=minEvaData)
 58                             minEvaData = Double.parseDouble(l.getEvaportion());
 59                         countEvaData ++;
 60                     }
 61                     if((l.getLeakage() != null)&&(!l.getLeakage().equals(""))){
 62                         if(countLeaData == 0){
 63                             maxLeaData = Double.parseDouble(l.getLeakage());
 64                             minLeaData = Double.parseDouble(l.getLeakage());
 65                         }
 66                         sumLeaData += Double.parseDouble(l.getLeakage());
 67                         if(Double.parseDouble(l.getLeakage())>=maxLeaData)
 68                             maxLeaData = Double.parseDouble(l.getLeakage());
 69                         if(Double.parseDouble(l.getLeakage())<=minLeaData)
 70                             minLeaData = Double.parseDouble(l.getLeakage());
 71                         countLeaData ++;
 72                     }
 73                     n--;
 74                     if(n<0)
 75                         break;
 76                 }
 77                 LysimeterData lys = new LysimeterData();
 78                 lys.setAnalysisBeginTime(beginTime);
 79                 if(countEvaData != 0){
 80                     lys.setEvaAvg((double)Math.round(sumEvaData/countEvaData*100)/100);//用了保留两位小数
 81                     lys.setEvaMax((double)Math.round(maxEvaData*100)/100);
 82                     lys.setEvaMin((double)Math.round(minEvaData*100)/100);
 83                 }
 84                 if(countLeaData != 0){
 85                     lys.setLeaAvg((double)Math.round(sumLeaData/countLeaData*100)/100);
 86                     lys.setLeaMax((double)Math.round(maxLeaData*100)/100);
 87                     lys.setLeaMin((double)Math.round(minLeaData*100)/100);
 88                 }
 89                 //都为0说明都没数据,无效的没必要装到list里
 90                 if((countEvaData != 0)||(countLeaData != 0)){
 91                     lys.setDailyTime(beginTime);
 92                     list.add(lys);
 93                 }                                
 94             }
 95 //            lysimeterData.setAnalysisBeginTime(originTime);
 96             page.setList(list);
 97             page.setCount(list.size());
 98             
 99         } catch (Exception e) {
100             logger.error("半日数据分析拆分时间条件报错。" + e.getMessage());
101         }
102         return page;
103     }

 

posted @ 2018-07-19 20:09  hedgehogGeGe  阅读(153)  评论(0)    收藏  举报