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-common/src/main/java/com/moral/util/DateUtils.java | 8 + screen-api/src/main/java/com/moral/api/dto/SysTestDTO.java | 47 ++++++ screen-api/src/main/java/com/moral/api/service/SysTestService.java | 3 screen-api/src/main/resources/word/空气质量周报.docx | 0 screen-api/src/main/java/com/moral/api/controller/SysTestController.java | 184 +++++++++++++++++++++++-- screen-api/src/main/java/com/moral/api/entity/SysTest.java | 3 screen-api/src/main/java/com/moral/api/service/impl/SysTestServiceImpl.java | 132 ++++++++++++++++++ 7 files changed, 353 insertions(+), 24 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/controller/SysTestController.java b/screen-api/src/main/java/com/moral/api/controller/SysTestController.java index 36f131a..8071454 100644 --- a/screen-api/src/main/java/com/moral/api/controller/SysTestController.java +++ b/screen-api/src/main/java/com/moral/api/controller/SysTestController.java @@ -1,6 +1,10 @@ package com.moral.api.controller; import cn.afterturn.easypoi.word.WordExportUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.moral.api.dto.SysTestDTO; import com.moral.api.entity.SysTest; import com.moral.api.service.SysTestService; import com.moral.util.DateUtils; @@ -17,6 +21,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.FileOutputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.net.URLEncoder; @@ -40,23 +45,82 @@ @GetMapping("resultWord") - public void adresultWordd(HttpServletResponse response,String time) { - List<SysTest> listAll = sysTestService.listAll(time,"2022-06-22",null); + public void adresultWordd(HttpServletResponse response,String time,String endTime) { + // for(int i = 495;i<1095;i++){ + List<SysTest> listAll = sysTestService.listAll(time,endTime,null); + if(CollectionUtils.isEmpty(listAll)){ + return; + } + /* Date endTime =listAll.get(0).getTime(); + String endTimeStr = DateUtils.dateToDateString(endTime,DateUtils.yyyyMMdd_EN); + String fileName = "������������������.docx"; + Map<String,Object> map = resultMap(listAll); + downloadWord(fileName, map, response,"������������������"+endTimeStr+".docx");*/ + // time = DateUtils.dateToDateString(DateUtils.addDays(endTime,1),DateUtils.yyyy_MM_dd_EN); + // } + } + + @GetMapping("excelM") + public void excelM(HttpServletResponse response,String time,String endTime) { + // for(int i = 495;i<1095;i++){ + String ks = "2020-06-01"; + Date ksDate = DateUtils.convertDate(ks); + List<SysTest> result = new ArrayList<>(); + for(int i = 0;i<37;i++){ + Date jsDate = DateUtils.getLastDayOfCurrMonth(ksDate); + List<SysTest> listAll = sysTestService.listAllAvg(DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN),DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN),null); + System.out.println("���������"+DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN)); + System.out.println("���������"+DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN)); + ksDate = DateUtils.addMonths(ksDate,1); + result.addAll(listAll); + } + + if(CollectionUtils.isEmpty(result)){ + return; + } + String path = "D:\\���������������������.xls"; + WriteSheet build = EasyExcel.writerSheet("������������").head(SysTestDTO.class).build(); + // ������ easyexcel ��������������������� ������ ������������������������excel������������������������������execl������������������������java��������������������� + ExcelWriter excelWriter = EasyExcel.write(path, SysTestDTO.class).build(); + excelWriter.write(result, build); + excelWriter.finish(); + } + + @GetMapping("excelDay") + public void excelDay(HttpServletResponse response,String time,String endTime) { + + List<SysTest> listAll = sysTestService.listAll(time,endTime,null); + if(CollectionUtils.isEmpty(listAll)){ return; } - Date endTime =listAll.get(0).getTime(); - String endTimeStr = DateUtils.dateToDateString(endTime,DateUtils.yyyyMMdd_EN); - String fileName = "������������������.docx"; - Map<String,Object> map = resultMap(listAll); + String path = "D:\\���������������������.xls"; + WriteSheet build = EasyExcel.writerSheet("������������").head(SysTestDTO.class).build(); + // ������ easyexcel ��������������������� ������ ������������������������excel������������������������������execl������������������������java��������������������� + ExcelWriter excelWriter = EasyExcel.write(path, SysTestDTO.class).build(); + excelWriter.write(listAll, build); + excelWriter.finish(); + } - //���������map - // Map result = JSON.parseObject(JSON.toJSONString(entity), Map.class); - // Map<String, Object> result = EasyPoiUtil.entityToMap(entity); - downloadWord(fileName, map, response,"������������������"+endTimeStr+".docx"); - - - + @GetMapping("resultWordWeek") + public void resultWordWeek(HttpServletResponse response) { + String ks = "2020-06-22"; + Date ksDate = DateUtils.convertDate(ks); + for(int i = 0;i<157;i++){ + Date jsDate = DateUtils.addDays(ksDate,6); + String time = DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN); + String endTime = DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN); + List<SysTest> listAll = sysTestService.listAllAvg(time,endTime,null); + if(CollectionUtils.isEmpty(listAll)){ + return; + } + String fileName = "������������������.docx"; + String time1 = DateUtils.dateToDateString(ksDate,"yyyy.MM.dd"); + String endTime1= DateUtils.dateToDateString(jsDate,"yyyy.MM.dd"); + Map<String,Object> map = resultWeekMap(listAll,i+1,time1+"-"+endTime1); + downloadWord(fileName, map, response,"������������������"+time+".docx"); + ksDate = DateUtils.addDays(ksDate,7); + } } @@ -64,15 +128,14 @@ String path = getPath(fileName);//��������� resources������ try { //������������������ - + OutputStream out = new FileOutputStream("E:\\home\\week\\" + newFileName); File rootFile = new File(ResourceUtils.getURL("classpath:").getPath()); File file= new File(rootFile, path); - XWPFDocument word = WordExportUtil.exportWord07(file.getPath(), params); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(newFileName, "utf-8")); - OutputStream out = response.getOutputStream(); + //OutputStream out = response.getOutputStream(); word.write(out); out.flush(); out.close(); @@ -146,11 +209,39 @@ resultMap.put(name+"S", StringUtils.isNotEmpty(s.getSu())?s.getSu():"--"); } - String bodyName = stringButterStr(listAll); + //������ + String bodyName = stringButterStr(listAll); + resultMap.put("������������",bodyName); return resultMap; } - + private Map<String,Object> resultWeekMap(List<SysTest> listAll,int week,String weekTime){ + Map<String,Object> resultMap = new HashMap<>(); + resultMap.put("���",week); + resultMap.put("������",weekTime); + String name = "���"; + for(SysTest s : listAll){ + if(s.getName().contains("���")){ + name = "���"; + }else if(s.getName().contains("���")){ + name = "���"; + }else { + name = "���"; + } + resultMap.put(name+"AQI", StringUtils.isNotEmpty(s.getAqi())?s.getAqi():"--"); + resultMap.put(name+"PM10", StringUtils.isNotEmpty(s.getPm10())?s.getPm10():"--"); + resultMap.put(name+"PM2", StringUtils.isNotEmpty(s.getPm25())?s.getPm25():"--"); + resultMap.put(name+"SO2", StringUtils.isNotEmpty(s.getSo2())?s.getSo2():"--"); + resultMap.put(name+"NO2", StringUtils.isNotEmpty(s.getNo2())?s.getNo2():"--"); + resultMap.put(name+"CO", StringUtils.isNotEmpty(s.getCo())?s.getCo():"--"); + resultMap.put(name+"O3", StringUtils.isNotEmpty(s.getO3())?s.getO3():"--"); + resultMap.put(name+"TV", StringUtils.isNotEmpty(s.getVoc())?s.getVoc():"--"); + resultMap.put(name+"S", StringUtils.isNotEmpty(s.getSu())?s.getSu():"--"); + } + String bodyName = stringButterStrWeek(listAll); + resultMap.put("������������",bodyName); + return resultMap; + } private String stringButterStr(List<SysTest> listAll){ // 0 ������1 ������ 2���������3��������� @@ -279,7 +370,41 @@ } - + private String stringButterStrWeek(List<SysTest> listAll){ + StringBuffer stringBuffer = new StringBuffer(); + SysTest result0 = listAll.get(0); + SysTest result1 = listAll.get(1); + SysTest result2 = listAll.get(2); + Map<String,String> pm10 = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getPm10(),result1.getPm10(),result2.getPm10()); + Map<String,String> pm25 = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getPm25(),result1.getPm25(),result2.getPm25()); + Map<String,String> so = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getSo2(),result1.getSo2(),result2.getSo2()); + Map<String,String> no = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getNo2(),result1.getNo2(),result2.getNo2()); + Map<String,String> co = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getCo(),result1.getCo(),result2.getCo()); + Map<String,String> o3 = nameCode(result0.getName(),result1.getName(),result2.getName(),result0.getO3(),result1.getO3(),result2.getO3()); + if(pm10.isEmpty()&& pm25.isEmpty()&&so.isEmpty()&& no.isEmpty()&& co.isEmpty()&& o3.isEmpty()){ + return stringBuffer.toString(); + } + stringBuffer.append("���������"); + if(!pm10.isEmpty()){ + stringBuffer.append("PM10���������������"+pm10.get("high")+"������������������"+pm10.get("low")+"���"); + } + if(!pm25.isEmpty()){ + stringBuffer.append("PM2.5���������������"+pm25.get("high")+"������������������"+pm25.get("low")+"���"); + } + if(!so.isEmpty()){ + stringBuffer.append("SO2���������������"+so.get("high")+"������������������"+so.get("low")+"���"); + } + if(!no.isEmpty()){ + stringBuffer.append("NO2���������������"+no.get("high")+"������������������"+no.get("low")+"���"); + } + if(!co.isEmpty()){ + stringBuffer.append("CO���������������"+co.get("high")+"������������������"+co.get("low")+"���"); + } + if(!o3.isEmpty()){ + stringBuffer.append("O3���������������"+o3.get("high")+"������������������"+o3.get("low")+"���"); + } + return stringBuffer.toString(); + } private Map<String,String> nameCode(String name1,String name2,String name3,String nums1,String nums2,String nums3){ double num1 = StringUtils.isNotEmpty(nums1)?Double.parseDouble(nums1):0; double num2 = StringUtils.isNotEmpty(nums2)?Double.parseDouble(nums2):0; @@ -339,7 +464,28 @@ } + public static void main(String[] args) { + /*String ks = "2020-06-01"; + Date ksDate = DateUtils.convertDate(ks); + for(int i = 0;i<37;i++){ + Date jsDate = DateUtils.getLastDayOfCurrMonth(ksDate); + System.out.println("���������"+DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN)); + System.out.println("���������"+DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN)); + ksDate = DateUtils.addMonths(ksDate,1); + }*/ + String ks = "2020-06-22"; + Date ksDate = DateUtils.convertDate(ks); + for(int i = 0;i<157;i++){ + Date jsDate = DateUtils.addDays(ksDate,6); + System.out.println("���������"+DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN)); + System.out.println("���������"+DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN)); + ksDate = DateUtils.addDays(ksDate,7); + } + + + } + } diff --git a/screen-api/src/main/java/com/moral/api/dto/SysTestDTO.java b/screen-api/src/main/java/com/moral/api/dto/SysTestDTO.java new file mode 100644 index 0000000..61f2023 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/dto/SysTestDTO.java @@ -0,0 +1,47 @@ +package com.moral.api.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * @ClassName SysTestDTO + * @Description TODO + * @Author @lizijie + * @Date 2023-08-02 17:22 + * @Version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysTestDTO { + private static final long serialVersionUID = 1L; + /*@ExcelProperty("������") + private String mon;*/ + @ExcelProperty("������") + private String name; +/* + private String mac;*//**/ + @ExcelProperty("������") + private Date time; + @ExcelProperty("PM10") + private String pm10; + @ExcelProperty("PM2.5") + private String pm25; + @ExcelProperty("SO2") + private String so2; + @ExcelProperty("NO2") + private String no2; + @ExcelProperty("CO") + private String co; + @ExcelProperty("O3") + private String o3; + @ExcelProperty("TVOC") + private String voc; + @ExcelProperty("AQI") + private String aqi; + @ExcelProperty("������") + private String su; +} diff --git a/screen-api/src/main/java/com/moral/api/entity/SysTest.java b/screen-api/src/main/java/com/moral/api/entity/SysTest.java index b8b4590..3f2ee0e 100644 --- a/screen-api/src/main/java/com/moral/api/entity/SysTest.java +++ b/screen-api/src/main/java/com/moral/api/entity/SysTest.java @@ -49,4 +49,7 @@ @TableField(exist = false) private String su; + @TableField(exist = false) + private String mon; + } diff --git a/screen-api/src/main/java/com/moral/api/service/SysTestService.java b/screen-api/src/main/java/com/moral/api/service/SysTestService.java index c6ea4db..f78549e 100644 --- a/screen-api/src/main/java/com/moral/api/service/SysTestService.java +++ b/screen-api/src/main/java/com/moral/api/service/SysTestService.java @@ -16,4 +16,7 @@ public interface SysTestService extends IService<SysTest> { List<SysTest> listAll(String startTime,String endTime ,String mac); + + + List<SysTest> listAllAvg(String startTime,String endTime ,String mac); } 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(); + } } diff --git "a/screen-api/src/main/resources/word/\347\251\272\346\260\224\350\264\250\351\207\217\345\221\250\346\212\245.docx" "b/screen-api/src/main/resources/word/\347\251\272\346\260\224\350\264\250\351\207\217\345\221\250\346\212\245.docx" new file mode 100644 index 0000000..5a97ee9 --- /dev/null +++ "b/screen-api/src/main/resources/word/\347\251\272\346\260\224\350\264\250\351\207\217\345\221\250\346\212\245.docx" Binary files differ diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java index 2de5766..b86ee1c 100644 --- a/screen-common/src/main/java/com/moral/util/DateUtils.java +++ b/screen-common/src/main/java/com/moral/util/DateUtils.java @@ -1064,6 +1064,14 @@ return getDate(dateToDateString(cal.getTime(), yyyy_MM_dd_EN)); } + public static Date getLastDayOfCurrMonth(Date time) { + Calendar cal = Calendar.getInstance(); + cal.setTime(time); + cal.add(Calendar.MONTH, 1); + cal.set(Calendar.DAY_OF_MONTH, 0); + return getDate(dateToDateString(cal.getTime(), yyyy_MM_dd_EN)); + } + /** * ��������������������������������������������������� * -- Gitblit v1.8.0