screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -270,31 +270,8 @@ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //查询业务 List<AirQualityComparisonVO> datas = cityAqiService.queryAirQualityComparison(form); //返回数据 ConcentrationAndPercent c = new ConcentrationAndPercent(); c.setConcentration("5"); c.setPercent("10%"); List<AirQualityComparisonVO> datas = new ArrayList<>(); AirQualityComparisonVO vo1 = new AirQualityComparisonVO(); vo1.setCityName("XXX"); vo1.setCompositeIndex(c); vo1.setPM10(c); vo1.setPM25(c); vo1.setSO2(c); vo1.setNO2(c); vo1.setCO(c); vo1.setO3(c); vo1.setFineDays(c); vo1.setServerDays(c); AirQualityComparisonVO vo2 = vo1; AirQualityComparisonVO vo3 = vo1; AirQualityComparisonVO vo4 = vo1; AirQualityComparisonVO vo5 = vo1; datas.add(vo1); datas.add(vo2); datas.add(vo3); datas.add(vo4); datas.add(vo5); return ResultMessage.ok(datas); } screen-api/src/main/java/com/moral/api/entity/CityAqi.java
@@ -42,4 +42,24 @@ return null; } public CityAqi() { } public CityAqi(CityAqiDaily cityAqiDaily) { this.cityCode = cityAqiDaily.getCityCode(); this.value = cityAqiDaily.getValue(); this.time = cityAqiDaily.getTime(); } public CityAqi(CityAqiMonthly cityAqiMonthly) { this.cityCode = cityAqiMonthly.getCityCode(); this.value = cityAqiMonthly.getValue(); this.time = cityAqiMonthly.getTime(); } public CityAqi(CityAqiYearly cityAqiYearly) { this.cityCode = cityAqiYearly.getCityCode(); this.value = cityAqiYearly.getValue(); this.time = cityAqiYearly.getTime(); } } screen-api/src/main/java/com/moral/api/entity/CityAqiMonthly.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; @@ -16,7 +18,7 @@ */ @Data @EqualsAndHashCode(callSuper = false) public class CityAqiMonthly extends Model<CityAqiMonthly> { public class CityAqiMonthly extends Model<CityAqiMonthly>{ private static final long serialVersionUID = 1L; @@ -28,7 +30,7 @@ /** * 时间 */ private LocalDateTime time; private Date time; /** * 数据 screen-api/src/main/java/com/moral/api/entity/CityAqiYearly.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,7 +30,7 @@ /** * 时间 */ private LocalDateTime time; private Date time; /** * 数据 screen-api/src/main/java/com/moral/api/pojo/form/aqi/AirQualityComparisonForm.java
@@ -23,12 +23,12 @@ Integer regionCode; /* * 地区类型 0为市内城市,1为省内城市,2为28城市 * 地区类型 city为市内城市,province为省内城市,28为28城市 * */ String regionType; /* * 对比类型,0为同比 1为环比 * 对比类型,yoy为同比 mom为环比 * */ String comparisonType; @@ -56,6 +56,16 @@ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") Date endDate; /* * 对比开始时间 * */ Date comparisonStartDate; /* * 对比结束时间 * */ Date comparisonEndDate; public boolean valid() { //校验地区类型对应的地区码 if(regionType==null||comparisonType==null) @@ -76,23 +86,36 @@ Date date = DateUtils.getDate(time, "yyyy-MM"); startDate = DateUtils.getFirstDayOfMonth(date); endDate = DateUtils.getLastDayOfMonth(date); return true; } if(dateType.equals(Constants.YEAR)){ Date date = DateUtils.getDate(time, "yyyy"); startDate = DateUtils.getFirstDayOfYear(date); endDate = DateUtils.getLastDayOfYear(date); return true; } if(startDate!=null&&endDate!=null) return true; if(startDate==null||endDate==null) return false; return false; calculateComparisonDate(); return true; } public static void main(String[] args) { /** * @Description: 计算对比时间 * @Param: [startDate, endDate] * @return: void * @Author: 陈凯裕 * @Date: 2022/1/14 */ private void calculateComparisonDate(){ if(comparisonType.equals(Constants.MOM)){ comparisonStartDate = DateUtils.addMonths(startDate,-1); comparisonEndDate = DateUtils.addMonths(endDate,-1); }else{ comparisonStartDate = DateUtils.addMonths(startDate,-12); comparisonEndDate = DateUtils.addMonths(endDate,-12); } } } screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/AirQualityComparisonVO.java
@@ -37,6 +37,10 @@ private ConcentrationAndPercent serverDays; public String getCityName() { return cityName; } screen-api/src/main/java/com/moral/api/service/CityAqiDailyService.java
@@ -2,14 +2,13 @@ import com.moral.api.entity.CityAqiDaily; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.entity.SysArea; import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.form.aqi.AreaPollutionLevelForm; import com.moral.api.pojo.form.aqi.ProvinceCitiesPollutionLevelForm; import com.moral.api.pojo.form.aqi.SpecialCitiesPollutionLevelForm; import com.moral.api.pojo.form.aqi.*; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.ChartOfPollutionLevelForm; import java.util.Date; import java.util.List; import java.util.Map; @@ -24,56 +23,76 @@ public interface CityAqiDailyService extends IService<CityAqiDaily> { /** * @Description: 查询污染等级的饼状图,包括天数,占比 * @Param: [regionCode] * @return: com.moral.api.pojo.dto.dataDisplay.PollutionLevelProportionDTO * @Author: 陈凯裕 * @Date: 2021/11/9 */ * @Description: 根据地区码和时间获取数据 * @Param: [regionCode, startDate, endDate] * @return: java.util.List<com.moral.api.entity.CityAqiDaily> * @Author: 陈凯裕 * @Date: 2022/1/17 */ List<CityAqiDaily> getCityAqiDailyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate); /** * @Description: 查询污染等级的饼状图,包括天数,占比 * @Param: [regionCode] * @return: com.moral.api.pojo.dto.dataDisplay.PollutionLevelProportionDTO * @Author: 陈凯裕 * @Date: 2021/11/9 */ PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(ChartOfPollutionLevelForm form); /** * @Description: 查询污染等级的柱状图数据,包括天数和占比 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/11/22 */ * @Description: 查询污染等级的柱状图数据,包括天数和占比 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/11/22 */ List<MonthlyPollutionLevel> queryBarChartOfPollutionLevels(ChartOfPollutionLevelForm form); /** *@Description: 查询一年的数据,并分月份保存 *@Param: [map] *@return: java.util.Map<java.lang.String,java.lang.Object> *@Author: lizijie *@Date: 2021/11/23 14:42 * @Description: 查询一年的数据,并分月份保存 * @Param: [map] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: lizijie * @Date: 2021/11/23 14:42 **/ Map<String,Map<String,Object>> oneYearsData(Map map); Map<String, Map<String, Object>> oneYearsData(Map map); /** * @Description: 查询一个城市所有县的优良天气数 * @Param: [AreaPollutionLevelForm] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/30 */ * @Description: 查询一个城市所有县的优良天气数 * @Param: [AreaPollutionLevelForm] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/30 */ List<CityPollutionLevel> queryAreaPollutionLevel(AreaPollutionLevelForm form); /** * @Description: 查询28市优良天气数 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/31 */ * @Description: 查询28市优良天气数 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/31 */ List<CityPollutionLevel> querySpecialCitiesPollutionLevel(SpecialCitiesPollutionLevelForm form); /** * @Description: 查询一个省内所有市的优良天数 * @Param: [from] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2022/1/7 */ * @Description: 查询一个省内所有市的优良天数 * @Param: [from] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2022/1/7 */ List<CityPollutionLevel> queryProvinceCitiesPollutionLevel(ProvinceCitiesPollutionLevelForm form); /** * @Description: 根据地区和开始结束时间计算优良天气数 * @Param: [area, startDate, endDate] * @return: com.moral.api.pojo.dto.cityAQI.CityPollutionLevel * @Author: 陈凯裕 * @Date: 2022/1/17 */ CityPollutionLevel calculateDaysByTimeAndSysArea(SysArea area, Date startDate, Date endDate); } screen-api/src/main/java/com/moral/api/service/CityAqiMonthlyService.java
@@ -3,6 +3,9 @@ import com.moral.api.entity.CityAqiMonthly; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; import java.util.List; /** * <p> * 城市aqi月数据表 服务类 @@ -13,4 +16,13 @@ */ public interface CityAqiMonthlyService extends IService<CityAqiMonthly> { /** * @Description: 根据地区码和时间获取数据 * @Param: [regionCode, startDate, endDate] * @return: java.util.List<com.moral.api.entity.CityAqiMonthly> * @Author: 陈凯裕 * @Date: 2022/1/17 */ List<CityAqiMonthly> getCityAqiMonthByRegionCodeAndTime(Integer regionCode, Date startDate,Date endDate); } screen-api/src/main/java/com/moral/api/service/CityAqiService.java
@@ -5,6 +5,8 @@ import com.moral.api.entity.CityAqi; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.form.aqi.AirQualityComparisonForm; import com.moral.api.pojo.vo.cityAQI.AirQualityComparisonVO; /** * <p> @@ -52,4 +54,13 @@ //城市空气质量排名详情 List<Map<String, Object>> rankingDetails(Map<String, Object> params); /** * @Description: 查询城市空气同期对比数据 * @Param: [form] * @return: void * @Author: 陈凯裕 * @Date: 2022/1/14 */ List<AirQualityComparisonVO> queryAirQualityComparison(AirQualityComparisonForm form); } screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java
@@ -3,6 +3,9 @@ import com.moral.api.entity.CityAqiYearly; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; import java.util.List; /** * <p> * 城市aqi年数据表 服务类 @@ -12,5 +15,12 @@ * @since 2021-11-05 */ public interface CityAqiYearlyService extends IService<CityAqiYearly> { /** * @Description: 根据地区码和时间获取数据 * @Param: [regionCode, startDate, endDate] * @return: java.util.List<com.moral.api.entity.CityAqiYearly> * @Author: 陈凯裕 * @Date: 2022/1/17 */ List<CityAqiYearly> getCityAqiYearlyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate); } screen-api/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -10,16 +10,16 @@ import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion; import com.moral.api.pojo.form.aqi.AreaPollutionLevelForm; import com.moral.api.pojo.form.aqi.ProvinceCitiesPollutionLevelForm; import com.moral.api.pojo.form.aqi.SpecialCitiesPollutionLevelForm; import com.moral.api.pojo.form.aqi.*; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.ChartOfPollutionLevelForm; import com.moral.api.service.CityAqiDailyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.CityAqiMonthlyService; import com.moral.api.service.CityAqiYearlyService; import com.moral.api.service.SysAreaService; import com.moral.constant.Constants; import com.moral.util.AQIUtils; import com.moral.util.ComprehensiveIndexUtils; import com.moral.util.DateUtils; import com.moral.util.MathUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -46,6 +46,14 @@ SysAreaService sysAreaService; @Autowired SpecialCitiesProperties specialCitiesProperties; @Override public List<CityAqiDaily> getCityAqiDailyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate) { QueryWrapper<CityAqiDaily> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("city_code",regionCode); queryWrapper.between("time",startDate,endDate); return cityAqiDailyMapper.selectList(queryWrapper); } @Override public PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(ChartOfPollutionLevelForm form) { @@ -301,7 +309,7 @@ List<CityPollutionLevel> datas = new ArrayList<>(); //遍历每个县级市 查询数据 for (SysArea area : allAreas) { CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndCityCode(area,startDate,endDate); CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndSysArea(area, startDate, endDate); datas.add(cityPollutionLevel); } return datas; @@ -317,7 +325,7 @@ List<CityPollutionLevel> datas = new ArrayList<>(); //遍历每个县级市 查询数据 for (SysArea area : areas) { CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndCityCode(area,startDate,endDate); CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndSysArea(area, startDate, endDate); datas.add(cityPollutionLevel); } return datas; @@ -335,20 +343,22 @@ List<CityPollutionLevel> datas = new ArrayList<>(); //遍历每个县级市 查询数据 for (SysArea city : allCities) { CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndCityCode(city,startDate,endDate); CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndSysArea(city, startDate, endDate); datas.add(cityPollutionLevel); } return datas; } /** * @Description: 根据地区对象和开始结束时间计算污染天气 * @Param: [area, startDate, endDate] * @return: com.moral.api.pojo.dto.cityAQI.CityPollutionLevel * @Author: 陈凯裕 * @Date: 2021/12/31 */ private CityPollutionLevel calculateDaysByTimeAndCityCode(SysArea area, Date startDate, Date endDate) { * @Description: 根据地区对象和开始结束时间计算污染天气 * @Param: [area, startDate, endDate] * @return: com.moral.api.pojo.dto.cityAQI.CityPollutionLevel * @Author: 陈凯裕 * @Date: 2021/12/31 */ @Override public CityPollutionLevel calculateDaysByTimeAndSysArea(SysArea area, Date startDate, Date endDate) { //查询数据 QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.eq("city_code", area.getAreaCode()); @@ -392,4 +402,9 @@ return cityPollutionLevel; } } screen-api/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java
@@ -1,10 +1,15 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.CityAqiMonthly; import com.moral.api.mapper.CityAqiMonthlyMapper; import com.moral.api.service.CityAqiMonthlyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * <p> @@ -17,4 +22,14 @@ @Service public class CityAqiMonthlyServiceImpl extends ServiceImpl<CityAqiMonthlyMapper, CityAqiMonthly> implements CityAqiMonthlyService { @Autowired CityAqiMonthlyMapper cityAqiMonthlyMapper; @Override public List<CityAqiMonthly> getCityAqiMonthByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate) { QueryWrapper<CityAqiMonthly> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("city_code",regionCode); queryWrapper.between("time",startDate,endDate); return cityAqiMonthlyMapper.selectList(queryWrapper); } } screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -13,6 +13,10 @@ import com.moral.api.entity.SysArea; import com.moral.api.mapper.CityAqiMapper; import com.moral.api.mapper.ForecastMapper; import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; import com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent; import com.moral.api.pojo.form.aqi.AirQualityComparisonForm; import com.moral.api.pojo.vo.cityAQI.AirQualityComparisonVO; import com.moral.api.service.CityAqiDailyService; import com.moral.api.service.CityAqiMonthlyService; import com.moral.api.service.CityAqiService; @@ -817,64 +821,11 @@ return result; } /** * @Description: 计算6参平均值 * @Param: [cityAqiList] * @return: java.util.Map<java.lang.String, java.lang.Double> * 返回值key为sensorCode,value为值 * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Map<String, Object> calculate6ParamAvg(List<CityAqi> cityAqiList) { Double co = calculateSensorAvg(cityAqiList, "CO"); Double pm2_5 = calculateSensorAvg(cityAqiList, "PM2_5"); Double pm10 = calculateSensorAvg(cityAqiList, "PM10"); Double so2 = calculateSensorAvg(cityAqiList, "SO2"); Double no2 = calculateSensorAvg(cityAqiList, "NO2"); Double o3 = calculateSensorAvg(cityAqiList, "O3"); Map<String, Object> result = new HashMap<>(); result.put(Constants.SENSOR_CODE_CO, co); result.put(Constants.SENSOR_CODE_NO2, no2); result.put(Constants.SENSOR_CODE_SO2, so2); result.put(Constants.SENSOR_CODE_O3, o3); result.put(Constants.SENSOR_CODE_PM25, pm2_5); result.put(Constants.SENSOR_CODE_PM10, pm10); return result; } /** * @Description: 计算因子的平均值 * @Param: [cityAqiList, sensor] * ,sensor是要计算的因子名称 * @return: java.lang.Double * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Double calculateSensorAvg(List<CityAqi> cityAqiList, String sensor) { Double sum = 0d; int num = 0; for (CityAqi cityAqi : cityAqiList) { String value = cityAqi.getValue(); if (value == null) continue; Map<String, Object> valueMap = JSON.parseObject(value, Map.class); Object sensorValueObject = valueMap.get(sensor); if (sensorValueObject == null) continue; Double sensorValue = Double.valueOf(sensorValueObject.toString()); sum = MathUtils.add(sum, sensorValue); num++; } if (num == 0) return null; Double avg = MathUtils.division(sum, num, 2); return avg; } /** * @Description: 从数据库查询数据 * @Param: [regionCode] * @return: java.util.Map<java.lang.String, java.lang.Object> * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/10/28 */ @@ -1000,6 +951,161 @@ return result; } @Override public List<AirQualityComparisonVO> queryAirQualityComparison(AirQualityComparisonForm form) { //取参 Integer regionCode = form.getRegionCode(); String regionType = form.getRegionType(); Date startDate = form.getStartDate(); Date endDate = form.getEndDate(); Date comparisonStartDate = form.getComparisonStartDate(); Date comparisonEndDate = form.getComparisonEndDate(); String dateType = form.getDateType(); //获取城市/区县 List<SysArea> areas = getSysAreasByRegionType(regionType, regionCode); if (ObjectUtils.isEmpty(areas)) return null; List<AirQualityComparisonVO> vos = new ArrayList<>(); for (SysArea area : areas) { //获取查询时间和对比时间的6参和综合指数 Map<String, Object> data = getDataByTimeTypeAndRegionCode(dateType, startDate, endDate, area.getAreaCode()); Map<String, Object> comparisonData = getDataByTimeTypeAndRegionCode(dateType, comparisonStartDate, comparisonEndDate, area.getAreaCode()); if (ObjectUtils.isEmpty(data) || ObjectUtils.isEmpty(comparisonData)) continue; //查询优良天数以及重污染天数 CityPollutionLevel days = cityAqiDailyService.calculateDaysByTimeAndSysArea(area, startDate, endDate); CityPollutionLevel comparisonDays = cityAqiDailyService.calculateDaysByTimeAndSysArea(area, comparisonStartDate, comparisonEndDate); int fineDays = days.getExcellentWeatherDays() + days.getGoodWeatherDays(); int serverDays = days.getSeriousWeatherDays() + days.getServerWeatherDays(); int comparisonFineDays = comparisonDays.getExcellentWeatherDays() + comparisonDays.getGoodWeatherDays(); int comparisonServerDays = comparisonDays.getSeriousWeatherDays() + comparisonDays.getServerWeatherDays(); //对比6参和综合指数 Map<String, ConcentrationAndPercent> sixParamAndComIndexResult = contrastSixParamAndComIndex(data, comparisonData); //对比优良天数以及重污染天气数 ConcentrationAndPercent fine = contrastDays(fineDays, comparisonFineDays); ConcentrationAndPercent server = contrastDays(serverDays, comparisonServerDays); //创建返回对象 AirQualityComparisonVO vo = new AirQualityComparisonVO(); vo.setFineDays(fine); vo.setServerDays(server); vo.setCO(sixParamAndComIndexResult.get("CO")); vo.setO3(sixParamAndComIndexResult.get("O3")); vo.setPM25(sixParamAndComIndexResult.get("PM2_5")); vo.setPM10(sixParamAndComIndexResult.get("PM10")); vo.setSO2(sixParamAndComIndexResult.get("SO2")); vo.setNO2(sixParamAndComIndexResult.get("NO2")); vo.setCompositeIndex(sixParamAndComIndexResult.get("compositeIndex")); vo.setCityName(area.getAreaName()); vos.add(vo); } return vos; } /** * @Description: 计算6参和综合指数对比的百分比 * @Param: [data, comparisonData] * @return: java.util.Map<java.lang.String , com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent> * @Author: 陈凯裕 * @Date: 2022/1/17 */ private Map<String, ConcentrationAndPercent> contrastSixParamAndComIndex(Map<String, Object> data, Map<String, Object> comparisonData) { Map<String, ConcentrationAndPercent> result = new HashMap<>(); result.put("CO", contrastParam(Double.parseDouble(data.get("CO").toString()), Double.parseDouble(comparisonData.get("CO").toString()), "CO")); result.put("NO2", contrastParam(Double.parseDouble(data.get("NO2").toString()), Double.parseDouble(comparisonData.get("NO2").toString()), "NO2")); result.put("SO2", contrastParam(Double.parseDouble(data.get("SO2").toString()), Double.parseDouble(comparisonData.get("SO2").toString()), "SO2")); result.put("O3", contrastParam(Double.parseDouble(data.get("O3").toString()), Double.parseDouble(comparisonData.get("O3").toString()), "O3")); result.put("PM2_5", contrastParam(Double.parseDouble(data.get("PM2_5").toString()), Double.parseDouble(comparisonData.get("PM2_5").toString()), "PM2_5")); result.put("PM10", contrastParam(Double.parseDouble(data.get("PM10").toString()), Double.parseDouble(comparisonData.get("PM10").toString()), "PM10")); result.put("compositeIndex", contrastParam(Double.parseDouble(data.get("compositeIndex").toString()), Double.parseDouble(comparisonData.get("compositeIndex").toString()), "compositeIndex")); return result; } /** * @Description: 计算6参和综合指数同比/环比百分比数据 * @Param: [data, comparisonData] * @return: com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent * @Author: 陈凯裕 * @Date: 2022/1/17 */ private ConcentrationAndPercent contrastParam(Double data, Double comparisonData, String sensor) { double percentD = MathUtils.division(data - comparisonData, comparisonData, 4); String percent = MathUtils.mul(percentD,100d) + "%"; ConcentrationAndPercent concentrationAndPercent = new ConcentrationAndPercent(); concentrationAndPercent.setPercent(percent); if (sensor.equals("CO")) {//CO小数点保留一位 Double CO = AmendUtils.sciCal(data, 1); concentrationAndPercent.setConcentration(CO.toString()); }else if (sensor.equals("compositeIndex")){ concentrationAndPercent.setConcentration(data.toString()); }else{ Double sensorD = AmendUtils.sciCal(data, 0); Integer sensorI = new Double(sensorD).intValue(); concentrationAndPercent.setConcentration(sensorI.toString()); } return concentrationAndPercent; } /** * @Description: 对比天数,返回天数差值 * @Param: [days, comparisonDays] * @return: com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent * @Author: 陈凯裕 * @Date: 2022/1/17 */ private ConcentrationAndPercent contrastDays(Integer days, Integer comparisonDays) { ConcentrationAndPercent concentrationAndPercent = new ConcentrationAndPercent(); concentrationAndPercent.setConcentration(days.toString()); Integer result = days - comparisonDays; concentrationAndPercent.setPercent(result.toString() + "天"); return concentrationAndPercent; } /** * @Description: 根据时间类型查询对应的6参以及综合指数,自定义时间类型用日数据做均值处理 * @Param: [comparisonType, startDate, endDate, regionCode] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2022/1/17 */ private Map<String, Object> getDataByTimeTypeAndRegionCode(String TimeType, Date startDate, Date endDate, Integer regionCode) { Map<String, Object> data; if (Constants.MONTH.equals(TimeType) && (!DateUtils.isCurrentMonth(startDate) || !DateUtils.isCurrentYear(startDate))) {//月数据处理 不包括本月 List<CityAqiMonthly> cityAqis = cityAqiMonthlyService.getCityAqiMonthByRegionCodeAndTime(regionCode, startDate, endDate); if (ObjectUtils.isEmpty(cityAqis)) return null; data = JSON.parseObject(cityAqis.get(0).getValue(), Map.class); } else if (Constants.YEAR.equals(TimeType) && (!DateUtils.isCurrentYear(startDate))) {//年数据处理 不包括本年 List<CityAqiYearly> cityAqis = cityAqiYearlyService.getCityAqiYearlyByRegionCodeAndTime(regionCode, startDate, endDate); if (ObjectUtils.isEmpty(cityAqis)) return null; data = JSON.parseObject(cityAqis.get(0).getValue(), Map.class); } else {//自定义数据处理 List<CityAqiDaily> cityAqis = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(regionCode, startDate, endDate); if (ObjectUtils.isEmpty(cityAqis)) return null; List<CityAqi> newCityAqis = new ArrayList<>(); List<Map<String, Object>> dailyDataMaps = new ArrayList<>(); cityAqis.forEach((value) -> { newCityAqis.add(new CityAqi(value)); dailyDataMaps.add(JSON.parseObject(value.getValue(), Map.class)); }); //计算均值 data = calculate6ParamAvg(newCityAqis); //小数点处理 data.put("CO", Double.parseDouble(data.remove(Constants.SENSOR_CODE_CO).toString())); data.put("NO2", Double.parseDouble(data.remove(Constants.SENSOR_CODE_NO2).toString())); data.put("SO2", Double.parseDouble(data.remove(Constants.SENSOR_CODE_SO2).toString())); data.put("O3", Double.parseDouble(data.remove(Constants.SENSOR_CODE_O3).toString())); data.put("PM2_5", Double.parseDouble(data.remove(Constants.SENSOR_CODE_PM25).toString())); data.put("PM10", Double.parseDouble(data.remove(Constants.SENSOR_CODE_PM10).toString())); //计算综合指数 Double compositeIndex = ComprehensiveIndexUtils.dailyData(data); data.put("compositeIndex", compositeIndex); } return data; } //按某字段排序 private void sortByField(List<Map<String, Object>> list, String sortField) { list.sort((o1, o2) -> { @@ -1030,4 +1136,76 @@ } return result; } /** * @Description: 根据类型和地区码获取所有的城市或者区县 * @Param: [regionType, regionCode] * @return: java.util.List<com.moral.api.entity.SysArea> * @Author: 陈凯裕 * @Date: 2022/1/14 */ private List<SysArea> getSysAreasByRegionType(String regionType, Integer regionCode) { List<SysArea> areas; if (regionType.equals(Constants.TWENTY_EIGHT_CITIES)) { SpecialCitiesProperties properties = new SpecialCitiesProperties(); areas = properties.getTwentyEightCities(); } else { areas = sysAreaService.getChildren(regionCode); } return areas; } /** * @Description: 计算6参平均值 * @Param: [cityAqiList] * @return: java.util.Map<java.lang.String , java.lang.Double> * 返回值key为sensorCode,value为值 * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Map<String, Object> calculate6ParamAvg(List<CityAqi> cityAqiList) { Double co = calculateSensorAvg(cityAqiList, "CO"); Double pm2_5 = calculateSensorAvg(cityAqiList, "PM2_5"); Double pm10 = calculateSensorAvg(cityAqiList, "PM10"); Double so2 = calculateSensorAvg(cityAqiList, "SO2"); Double no2 = calculateSensorAvg(cityAqiList, "NO2"); Double o3 = calculateSensorAvg(cityAqiList, "O3"); Map<String, Object> result = new HashMap<>(); result.put(Constants.SENSOR_CODE_CO, co); result.put(Constants.SENSOR_CODE_NO2, no2); result.put(Constants.SENSOR_CODE_SO2, so2); result.put(Constants.SENSOR_CODE_O3, o3); result.put(Constants.SENSOR_CODE_PM25, pm2_5); result.put(Constants.SENSOR_CODE_PM10, pm10); return result; } /** * @Description: 计算因子的平均值 * @Param: [cityAqiList, sensor] * ,sensor是要计算的因子名称 * @return: java.lang.Double * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Double calculateSensorAvg(List<CityAqi> cityAqiList, String sensor) { Double sum = 0d; int num = 0; for (CityAqi cityAqi : cityAqiList) { String value = cityAqi.getValue(); if (value == null) continue; Map<String, Object> valueMap = JSON.parseObject(value, Map.class); Object sensorValueObject = valueMap.get(sensor); if (sensorValueObject == null) continue; Double sensorValue = Double.valueOf(sensorValueObject.toString()); sum = MathUtils.add(sum, sensorValue); num++; } if (num == 0) return null; Double avg = MathUtils.division(sum, num, 2); return avg; } } screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
@@ -1,10 +1,15 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.CityAqiYearly; import com.moral.api.mapper.CityAqiYearlyMapper; import com.moral.api.service.CityAqiYearlyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * <p> @@ -17,4 +22,14 @@ @Service public class CityAqiYearlyServiceImpl extends ServiceImpl<CityAqiYearlyMapper, CityAqiYearly> implements CityAqiYearlyService { @Autowired CityAqiYearlyMapper cityAqiYearlyMapper; @Override public List<CityAqiYearly> getCityAqiYearlyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate) { QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("city_code",regionCode); queryWrapper.between("time",startDate,endDate); return cityAqiYearlyMapper.selectList(queryWrapper); } } screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
@@ -214,4 +214,5 @@ return comprehensiveIndex; } } screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -651,6 +651,8 @@ return new Date(); } public static String getAfterNDays(Date date, int n, String formateStr) { SimpleDateFormat sdf = new SimpleDateFormat(formateStr); Calendar calendar = new GregorianCalendar(); @@ -1016,6 +1018,19 @@ int year = cal.get(Calendar.YEAR); return year == currentYear; } /* * 判断日期是否为本月 * */ public static boolean isCurrentMonth(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); int currentYear = cal.get(Calendar.MONTH); cal.setTime(date); int year = cal.get(Calendar.MONTH); return year == currentYear; } /** * 获取当前月的最后一天 @@ -1431,6 +1446,7 @@ return calendar.getTime(); } /** * <p> * Title: getDays screen-manage/src/main/java/com/moral/api/controller/DeviceController.java
@@ -262,4 +262,12 @@ List<Map<String, Object>> professions = deviceService.selectDeviceDictData(Constants.SYSTEM_DICT_TYPE_PURCHASER); return ResultMessage.ok(professions); } @RequestMapping(value = "selectMonitorPiontAndDeviceByOrgId", method = RequestMethod.GET) public ResultMessage selectMonitorPiontAndDeviceByOrgId(HttpServletRequest request){ Map parames = WebUtils.getParametersStartingWith(request,null); int id = Integer.parseInt(parames.get("organization_id").toString()); List<Map<String, Object>> maps = deviceService.selectMonitorPiontAndDeviceByOrgId(id); return ResultMessage.ok(maps); } } screen-manage/src/main/java/com/moral/api/entity/ServicesScopeDevice.java
New file @@ -0,0 +1,62 @@ package com.moral.api.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author moral * @since 2022-01-17 */ @Data @EqualsAndHashCode(callSuper = false) public class ServicesScopeDevice extends Model<ServicesScopeDevice> { private static final long serialVersionUID = 1L; /** * id */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 服务范围id */ private Integer servicesScopeId; /** * 设备id */ private Integer deviceId; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime; /** * 是否删除 */ private String isDelete; @Override protected Serializable pkVal() { return this.id; } } screen-manage/src/main/java/com/moral/api/mapper/ServicesScopeDeviceMapper.java
New file @@ -0,0 +1,16 @@ package com.moral.api.mapper; import com.moral.api.entity.ServicesScopeDevice; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * Mapper 接口 * </p> * * @author moral * @since 2022-01-17 */ public interface ServicesScopeDeviceMapper extends BaseMapper<ServicesScopeDevice> { } screen-manage/src/main/java/com/moral/api/service/DeviceService.java
@@ -64,4 +64,13 @@ //判断并修改设备状态 void judgeDeviceState(Map<String, Object> data); /** *@Description: 通过组织id获取站点和设备 *@Param: [orgId] *@return: java.util.List<java.util.Map<java.lang.String,java.lang.Object>> *@Author: lizijie *@Date: 2022/1/17 10:30 **/ List<Map<String,Object>> selectMonitorPiontAndDeviceByOrgId(int orgId); } screen-manage/src/main/java/com/moral/api/service/ServicesScopeDeviceService.java
New file @@ -0,0 +1,16 @@ package com.moral.api.service; import com.moral.api.entity.ServicesScopeDevice; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 服务类 * </p> * * @author moral * @since 2022-01-17 */ public interface ServicesScopeDeviceService extends IService<ServicesScopeDevice> { } screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -1,5 +1,6 @@ package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -35,11 +36,7 @@ import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; @@ -522,6 +519,28 @@ deviceMapper.update(null, updateWrapper); } @Override public List<Map<String, Object>> selectMonitorPiontAndDeviceByOrgId(int orgId) { QueryWrapper<MonitorPoint> monitorPointQueryWrapper = new QueryWrapper<>(); monitorPointQueryWrapper.eq("is_delete",Constants.NOT_DELETE); monitorPointQueryWrapper.eq("organization_id",orgId); List<MonitorPoint> monitorPointList = monitorPointMapper.selectList(monitorPointQueryWrapper); List<Map<String, Object>> resultList = new ArrayList<>(); for (MonitorPoint monitorPoint:monitorPointList) { Map<String,Object> resultMap = new HashMap<>(); resultMap = JSON.parseObject(JSON.toJSONString(monitorPoint), Map.class); int mp_id = monitorPoint.getId(); QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>(); deviceQueryWrapper.eq("is_delete", Constants.NOT_DELETE); deviceQueryWrapper.eq("monitor_point_id",mp_id); List<Device> devices = new ArrayList<>(); devices = deviceMapper.selectList(deviceQueryWrapper); resultMap.put("devices",devices); resultList.add(resultMap); } return resultList; } //根据因子值判断状态 private int judgeState(List<Object> levels, Double data) { int state = 1; screen-manage/src/main/java/com/moral/api/service/impl/ServicesScopeDeviceServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.moral.api.service.impl; import com.moral.api.entity.ServicesScopeDevice; import com.moral.api.mapper.ServicesScopeDeviceMapper; import com.moral.api.service.ServicesScopeDeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 服务实现类 * </p> * * @author moral * @since 2022-01-17 */ @Service public class ServicesScopeDeviceServiceImpl extends ServiceImpl<ServicesScopeDeviceMapper, ServicesScopeDevice> implements ServicesScopeDeviceService { } screen-manage/src/main/resources/mapper/ServicesScopeDeviceMapper.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moral.api.mapper.ServicesScopeDeviceMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.ServicesScopeDevice"> <id column="id" property="id" /> <result column="services_scope_id" property="servicesScopeId" /> <result column="device_id" property="deviceId" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="is_delete" property="isDelete" /> </resultMap> </mapper>