jinpengyong
2022-01-17 3ddfa12fbc43e80e99e4959fbac8881eaa8e3ca3
Merge remote-tracking branch 'origin/dev' into dev_
5 files added
19 files modified
785 ■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/AqiController.java 25 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/CityAqi.java 20 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/CityAqiMonthly.java 6 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/CityAqiYearly.java 4 ●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/form/aqi/AirQualityComparisonForm.java 41 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/AirQualityComparisonVO.java 4 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiDailyService.java 99 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiMonthlyService.java 12 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiService.java 11 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java 12 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java 43 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java 15 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 286 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java 15 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java 1 ●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 16 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/controller/DeviceController.java 8 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/entity/ServicesScopeDevice.java 62 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/mapper/ServicesScopeDeviceMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/DeviceService.java 9 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/ServicesScopeDeviceService.java 16 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java 29 ●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/ServicesScopeDeviceServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/resources/mapper/ServicesScopeDeviceMapper.xml 15 ●●●●● patch | view | raw | blame | history
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>