From a0224894fcc89500a701f39ccaf4322a03231ff6 Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Fri, 25 Feb 2022 16:48:28 +0800
Subject: [PATCH] screen-api            增加达标天数分析接口

---
 screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java |  157 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 157 insertions(+), 0 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
index 1fec4d8..1eca5b8 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
@@ -1,6 +1,7 @@
 package com.moral.api.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.config.properties.SpecialCitiesProperties;
 import com.moral.api.entity.CityAqi;
@@ -9,12 +10,15 @@
 import com.moral.api.entity.SysArea;
 import com.moral.api.mapper.CityAqiYearlyMapper;
 import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel;
+import com.moral.api.pojo.dto.cityAQI.ComplianceDaysDTO;
 import com.moral.api.pojo.dto.cityAQI.DataPercentRange;
+import com.moral.api.pojo.vo.cityAQI.ComplianceDaysVO;
 import com.moral.api.service.CityAqiDailyService;
 import com.moral.api.service.CityAqiYearlyService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moral.api.service.SysAreaService;
 import com.moral.constant.Constants;
+import com.moral.util.AQIUtils;
 import com.moral.util.AmendUtils;
 import com.moral.util.DateUtils;
 import com.moral.util.MathUtils;
@@ -23,6 +27,7 @@
 import org.springframework.util.ObjectUtils;
 
 import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -95,6 +100,144 @@
             return null;
         return result;
     }
+
+    @Override
+    public List<ComplianceDaysDTO> analysisComplianceDays(String year, Integer cityCode) {
+        List<ComplianceDaysDTO> dtos = new ArrayList<>();
+        //������������������������������������
+        Date posYear = DateUtils.getDate(year, "yyyy");
+        Date posYearStartDate = DateUtils.getFirstDayOfYear(posYear);
+        Date posYearEndDate = DateUtils.getLastDayOfYear(posYear);
+        //������������������������������������
+        String comYearStr = (Integer.parseInt(year)-1)+"";
+        Date comYear = DateUtils.getDate(comYearStr,"yyyy");
+        Date comYearStartDate = DateUtils.getFirstDayOfYear(comYear);
+        Date comYearEndDate = DateUtils.getLastDayOfYear(comYear);
+        //������������������������������������
+        List<CityAqiDaily> posYearDatas = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, posYearStartDate, posYearEndDate);
+        List<CityAqiDaily> comYearDatas = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, comYearStartDate, comYearEndDate);
+        //������������������������������
+        int month = maxMonth(posYearDatas);
+        if(month==0)
+            return dtos;
+        //������������������������������
+        for (int i = 1; i <= month; i++) {
+            ComplianceDaysDTO dto = analysisComplianceDaysForMonth(posYearDatas, comYearDatas, i);
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    //������������������������������������������������
+    private ComplianceDaysDTO analysisComplianceDaysForMonth(List<CityAqiDaily> posYearDatas,
+                                                            List<CityAqiDaily> comYearDatas,
+                                                            int month){
+        ComplianceDaysDTO dto = new ComplianceDaysDTO();
+        //������������������������
+        List<CityAqiDaily> posMonthDatas = new ArrayList<>();
+        List<CityAqiDaily> comMonthDatas = new ArrayList<>();
+        for (CityAqiDaily posYearData : posYearDatas) {
+            Date time = posYearData.getTime();
+            if(DateUtils.getMonth(time)==month)
+                posMonthDatas.add(posYearData);
+        }
+        for (CityAqiDaily comYearData : comYearDatas) {
+            Date time = comYearData.getTime();
+            if(DateUtils.getMonth(time)==month)
+                comMonthDatas.add(comYearData);
+        }
+        //���������������������������������������
+        for (CityAqiDaily posMonthData : posMonthDatas) {
+            //������������
+            Map<String,String> dataMap = JSON.parseObject(posMonthData.getValue(),Map.class);
+            String aqi = String.valueOf(dataMap.get("AQI"));
+            String PM2_5 = String.valueOf(dataMap.get("PM2_5"));
+            String PM10 = String.valueOf(dataMap.get("PM10"));
+            String SO2 = String.valueOf(dataMap.get("SO2"));
+            String NO2 = String.valueOf(dataMap.get("NO2"));
+            String O3 = String.valueOf(dataMap.get("O3"));
+            String CO = String.valueOf(dataMap.get("CO"));
+            //������aqi������6������������������
+            if(aqi!=null){
+                if(AQIUtils.aqiIsStandard(Integer.parseInt(aqi)))
+                    dto.setAqiComplianceDays(dto.getAqiComplianceDays()+1);
+            }
+            if(PM2_5!=null){
+                if(!AQIUtils.PM2_5IsStandard(Double.parseDouble(PM2_5)))
+                    dto.setPM2_5Days(dto.getPM2_5Days()+1);
+            }
+            if(PM10!=null){
+                if(!AQIUtils.PM10IsStandard(Double.parseDouble(PM10)))
+                    dto.setPM10Days(dto.getPM10Days()+1);
+            }
+            if(SO2!=null){
+                if(!AQIUtils.SO2IsStandard(Double.parseDouble(SO2)))
+                    dto.setSO2Days(dto.getSO2Days()+1);
+            }
+            if(NO2!=null){
+                if(!AQIUtils.NO2IsStandard(Double.parseDouble(NO2)))
+                    dto.setNO2Days(dto.getNO2Days()+1);
+            }
+            if(O3!=null){
+                if(!AQIUtils.O3IsStandard(Double.parseDouble(O3)))
+                    dto.setO3Days(dto.getO3Days()+1);
+            }
+            if(CO!=null){
+                if(!AQIUtils.COIsStandard(Double.parseDouble(CO)))
+                    dto.setCODays(dto.getCODays()+1);
+            }
+            //���������������������
+            Object primaryPollutantO = dataMap.get("primaryPollutant");
+            if(primaryPollutantO!=null){
+                JSONArray primaryPollutantArray = (JSONArray) primaryPollutantO;
+                List<String> primaryPollutant = JSON.parseObject(primaryPollutantArray.toJSONString(),List.class);
+                for (String s : primaryPollutant) {
+                    if(s.equals("PM2.5"))
+                        dto.setPM2_5FirstDays(dto.getPM2_5FirstDays()+1);
+                    if(s.equals("PM10"))
+                        dto.setPM10FirstDays(dto.getPM10FirstDays()+1);
+                    if(s.equals("SO2"))
+                        dto.setSO2FirstDays(dto.getSO2FirstDays()+1);
+                    if(s.equals("NO2"))
+                        dto.setNO2FirstDays(dto.getNO2FirstDays()+1);
+                    if(s.equals("CO"))
+                        dto.setCOFirstDays(dto.getCOFirstDays()+1);
+                    if(s.equals("O3"))
+                        dto.setO3FirstDays(dto.getO3FirstDays()+1);
+                }
+            }
+        }
+        //������������������������
+        for (CityAqiDaily comMonthData : comMonthDatas) {
+            //������������
+            Map<String,String> dataMap = JSON.parseObject(comMonthData.getValue(),Map.class);
+            String aqi = String.valueOf(dataMap.get("AQI"));
+            //������aqi������������
+            if(aqi!=null){
+                if(AQIUtils.aqiIsStandard(Integer.parseInt(aqi)))
+                    dto.setComAqiComplianceDays(dto.getComAqiComplianceDays()+1);
+            }
+        }
+        //������������������������������������������
+        Double posAqiComplianceDays = Double.parseDouble(dto.getAqiComplianceDays()+"");
+        Double posDays = Double.parseDouble(posMonthDatas.size()+"");
+        Double comAqiComplianceDays = Double.parseDouble(dto.getComAqiComplianceDays()+"");
+        Double comDays = Double.parseDouble(comMonthDatas.size()+"");
+        if(posDays==0d)
+            dto.setAqiCompliancePer(0d);
+        else
+            dto.setAqiCompliancePer(MathUtils.division(posAqiComplianceDays*100,posDays,2));
+
+        if(comDays==0d)
+            dto.setComAqiCompliancePer(0d);
+        else
+            dto.setComAqiCompliancePer(MathUtils.division(comAqiComplianceDays*100,comDays,2));
+
+        dto.setMonth(month);
+        return dto;
+    }
+
+
 
 
     //������������������������������������������28���������������������������������
@@ -449,5 +592,19 @@
         return DateUtils.dateToDateString(new Date(), "yyyy").equals(year);
     }
 
+    //������������������������������
+    private int maxMonth( List<CityAqiDaily> datas){
+        int i = 0;
+        for (CityAqiDaily data : datas) {
+            Date time = data.getTime();
+            int month = DateUtils.getMonth(time);
+            if(month>i)
+                i = month;
+        }
+        return i;
+    }
+
+
+
 
 }

--
Gitblit v1.8.0