From 03151f30b03113dcc72972972495c7735b5afb66 Mon Sep 17 00:00:00 2001 From: cjl <276999030@qq.com> Date: Thu, 03 Aug 2023 10:23:57 +0800 Subject: [PATCH] feat:空气质量报告 --- screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java | 132 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 127 insertions(+), 5 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java index 31e1e8c..c3dc5a8 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java @@ -8,11 +8,12 @@ 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> @@ -28,8 +29,11 @@ @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); @@ -47,4 +51,122 @@ } 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(); + } } -- Gitblit v1.8.0