项目维护记录--半日数据分析业务层处理
一次取出所有的未处理的数据,在业务层进行处理:
因为是半日分析,所以首先找出所有的时间段,将所有的分割时间存到一个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 }

浙公网安备 33010602011771号