| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.moral.api.utils.AqiUtils; |
| | | import com.moral.util.DateUtils; |
| | | import org.apache.commons.collections4.CollectionUtils; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | @Override |
| | | public List<SysTest> listAll(String startTime,String endTime, String mac) { |
| | | QueryWrapper<SysTest> queryWrapper = new QueryWrapper<>(); |
| | | // queryWrapper.between(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime),"time",startTime,endTime); |
| | | queryWrapper.eq(!StringUtils.isEmpty(startTime),"time", DateUtils.convertDate(startTime)); |
| | | if(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime)){ |
| | | queryWrapper.between(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime),"time",DateUtils.convertDate(startTime),DateUtils.convertDate(endTime)); |
| | | }else if(!StringUtils.isEmpty(startTime)){ |
| | | queryWrapper.eq(!StringUtils.isEmpty(startTime),"time", DateUtils.convertDate(startTime)); |
| | | } |
| | | queryWrapper.eq(!StringUtils.isEmpty(mac),"mac",mac); |
| | | queryWrapper.orderByAsc("time","mac"); |
| | | List<SysTest> listAll = this.baseMapper.selectList(queryWrapper); |
| | |
| | | } |
| | | return listAll; |
| | | } |
| | | |
| | | @Override |
| | | public List<SysTest> listAllAvg(String startTime, String endTime, String mac) { |
| | | Date time = DateUtils.convertDate(startTime); |
| | | QueryWrapper<SysTest> queryWrapper = new QueryWrapper<>(); |
| | | if(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime)){ |
| | | queryWrapper.between(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime),"time",DateUtils.convertDate(startTime),DateUtils.convertDate(endTime)); |
| | | }else if(!StringUtils.isEmpty(startTime)){ |
| | | queryWrapper.eq(!StringUtils.isEmpty(startTime),"time", DateUtils.convertDate(startTime)); |
| | | } |
| | | queryWrapper.eq(!StringUtils.isEmpty(mac),"mac",mac); |
| | | queryWrapper.orderByAsc("time","mac"); |
| | | List<SysTest> listAll = this.baseMapper.selectList(queryWrapper); |
| | | return resultList(listAll,time); |
| | | } |
| | | |
| | | private List<SysTest> resultList(List<SysTest> listAll,Date time){ |
| | | List<SysTest> list = new ArrayList<>(); |
| | | if(CollectionUtils.isEmpty(listAll)) { |
| | | return list; |
| | | } |
| | | String mon = DateUtils.dateToDateString(time,DateUtils.yyyy_MM_EN); |
| | | List<String> nameList = new ArrayList<>(); |
| | | Map<String, ArrayList<Double>> map = new HashMap<>(); |
| | | for(SysTest s : listAll) { |
| | | if(nameList.size()<4 && !nameList.contains(s.getName())){ |
| | | nameList.add(s.getName()); |
| | | SysTest sysTest = new SysTest(); |
| | | sysTest.setName(s.getName()); |
| | | sysTest.setMon(mon); |
| | | list.add(sysTest); |
| | | } |
| | | String pm10 = s.getName()+"_pm10"; |
| | | ArrayList<Double> pm10D = Objects.nonNull(map.get(pm10))?map.get(pm10):new ArrayList<>(); |
| | | pm10D.add(Double.parseDouble(s.getPm10())); |
| | | map.put(pm10,pm10D); |
| | | |
| | | String pm25 = s.getName()+"_pm25"; |
| | | ArrayList<Double> pm25D = Objects.nonNull(map.get(pm25))?map.get(pm25):new ArrayList<>(); |
| | | pm25D.add(Double.parseDouble(s.getPm25())); |
| | | map.put(pm25,pm25D); |
| | | |
| | | String o2 = s.getName()+"_o2"; |
| | | ArrayList<Double> o2D = Objects.nonNull(map.get(o2))?map.get(o2):new ArrayList<>(); |
| | | o2D.add(Double.parseDouble(s.getSo2())); |
| | | map.put(o2,o2D); |
| | | |
| | | String no = s.getName()+"_no"; |
| | | ArrayList<Double> noD = Objects.nonNull(map.get(no))?map.get(no):new ArrayList<>(); |
| | | noD.add(Double.parseDouble(s.getNo2())); |
| | | map.put(no,noD); |
| | | |
| | | String co = s.getName()+"_co"; |
| | | ArrayList<Double> coD = Objects.nonNull(map.get(co))?map.get(co):new ArrayList<>(); |
| | | coD.add(Double.parseDouble(s.getCo())); |
| | | map.put(co,coD); |
| | | |
| | | String o3 = s.getName()+"_o3"; |
| | | ArrayList<Double> o3D = Objects.nonNull(map.get(o3))?map.get(o3):new ArrayList<>(); |
| | | o3D.add(Double.parseDouble(s.getO3())); |
| | | map.put(o3,o3D); |
| | | |
| | | String tv = s.getName()+"_tv"; |
| | | ArrayList<Double> tvD = Objects.nonNull(map.get(tv))?map.get(tv):new ArrayList<>(); |
| | | tvD.add(Double.parseDouble(s.getVoc())); |
| | | map.put(tv,tvD); |
| | | } |
| | | for(SysTest s : list){ |
| | | String name = s.getName(); |
| | | if(map.containsKey(name+"_pm10")){ |
| | | Double ListAvg = map.get(name+"_pm10").stream().collect(Collectors.averagingDouble(Double::doubleValue)); |
| | | double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | s.setPm10(String.valueOf(rsAvg)); |
| | | } |
| | | if(map.containsKey(name+"_pm25")){ |
| | | Double ListAvg = map.get(name+"_pm25").stream().collect(Collectors.averagingDouble(Double::doubleValue)); |
| | | double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | s.setPm25(String.valueOf(rsAvg)); |
| | | } |
| | | if(map.containsKey(name+"_o2")){ |
| | | Double ListAvg = map.get(name+"_o2").stream().collect(Collectors.averagingDouble(Double::doubleValue)); |
| | | double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | s.setSo2(String.valueOf(rsAvg)); |
| | | } |
| | | if(map.containsKey(name+"_no")){ |
| | | Double ListAvg = map.get(name+"_no").stream().collect(Collectors.averagingDouble(Double::doubleValue)); |
| | | double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | s.setNo2(String.valueOf(rsAvg)); |
| | | } |
| | | if(map.containsKey(name+"_tv")){ |
| | | Double ListAvg = map.get(name+"_tv").stream().collect(Collectors.averagingDouble(Double::doubleValue)); |
| | | double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | s.setVoc(String.valueOf(rsAvg)); |
| | | } |
| | | if(map.containsKey(name+"_co")){ |
| | | double rsAvg = percentile(map.get(name+"_co"),95d); |
| | | s.setCo(String.valueOf(rsAvg)); |
| | | } |
| | | |
| | | if(map.containsKey(name+"_o3")){ |
| | | double rsAvg = percentile(map.get(name+"_o3"),90d); |
| | | s.setO3(String.valueOf(rsAvg)); |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | private Double percentile(List<Double> date,double num){ |
| | | Collections.sort(date); |
| | | double position = (num / 100) * (date.size() - 1); |
| | | int index = (int) position; |
| | | // 获取小数部分的位置索引 |
| | | double fraction = position - index; |
| | | |
| | | // 获取百分位值 |
| | | double percentileValue = date.get(index) + fraction * (date.get(index + 1) - date.get(index)); |
| | | return new BigDecimal(percentileValue).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); |
| | | } |
| | | } |