package com.moral.api.service.impl; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.SysTest; import com.moral.api.mapper.SysTestMapper; import com.moral.api.service.SysTestService; 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.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author moral * @since 2023-08-01 */ @Service public class SysTestServiceImpl extends ServiceImpl implements SysTestService { @Override public List listAll(String startTime,String endTime, String mac) { QueryWrapper 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 listAll = this.baseMapper.selectList(queryWrapper); for(SysTest s : listAll){ Map map = new HashMap<>(); map.put("PM2_5",s.getPm25()); map.put("PM10",s.getPm10()); map.put("CO",s.getCo()); map.put("SO2",s.getSo2()); map.put("NO2",s.getNo2()); map.put("O3",s.getO3()); Map getAqi = AqiUtils.getAqi(map); s.setSu(getAqi.get("SU").toString()); s.setAqi(getAqi.get("AQI").toString()); } return listAll; } @Override public List listAllAvg(String startTime, String endTime, String mac) { Date time = DateUtils.convertDate(startTime); QueryWrapper 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 listAll = this.baseMapper.selectList(queryWrapper); return resultList(listAll,time); } private List resultList(List listAll,Date time){ List list = new ArrayList<>(); if(CollectionUtils.isEmpty(listAll)) { return list; } String mon = DateUtils.dateToDateString(time,DateUtils.yyyy_MM_EN); List nameList = new ArrayList<>(); Map> 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 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 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 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 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 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 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 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 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(); } }