jinpengyong
2021-10-08 4c4b97b0fc6b418254b8b7c29e55c7ee8f39997b
臭氧预测实测对比
11 files added
1 files modified
344 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/AqiController.java 45 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/CityAqi.java 45 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/Forecast.java 45 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/mapper/CityAqiMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/mapper/ForecastMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiService.java 21 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/ForecastService.java 16 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 95 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/ForecastServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/CityAqiMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/mapper/ForecastMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java 1 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/AqiController.java
New file
@@ -0,0 +1,45 @@
package com.moral.api.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.moral.api.service.CityAqiService;
import com.moral.constant.ResponseCodeEnum;
import com.moral.constant.ResultMessage;
import com.moral.util.WebUtils;
@RestController
@RequestMapping("/aqi")
@CrossOrigin(origins = "*", maxAge = 3600)
@Api(tags = {"aqi"})
public class AqiController {
    @Autowired
    private CityAqiService cityAqiService;
    @GetMapping("compareO3")
    @ApiOperation(value = "预测和实测臭氧对比", notes = "预测和实测臭氧对比")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "regionCode", value = "区号", required = true, paramType = "query", dataType = "String")
    })
    public ResultMessage MeasuredCompareForecast(HttpServletRequest request) {
        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
        if (!params.containsKey("regionCode") || !params.containsKey("time")) {
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        List<Map<String, Object>> response = cityAqiService.measuredCompareForecastOfO3(params);
        return ResultMessage.ok(response);
    }
}
screen-api/src/main/java/com/moral/api/entity/CityAqi.java
New file
@@ -0,0 +1,45 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 城市aqi实测小时数据表
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityAqi extends Model<CityAqi> {
    private static final long serialVersionUID = 1L;
    /**
     * 城市id
     */
    private String cityCode;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-api/src/main/java/com/moral/api/entity/Forecast.java
New file
@@ -0,0 +1,45 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 预测小时数据
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Forecast extends Model<Forecast> {
    private static final long serialVersionUID = 1L;
    /**
     * 城市id
     */
    private String cityCode;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-api/src/main/java/com/moral/api/mapper/CityAqiMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityAqi;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市aqi实测小时数据表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
public interface CityAqiMapper extends BaseMapper<CityAqi> {
}
screen-api/src/main/java/com/moral/api/mapper/ForecastMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.Forecast;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 预测小时数据 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
public interface ForecastMapper extends BaseMapper<Forecast> {
}
screen-api/src/main/java/com/moral/api/service/CityAqiService.java
New file
@@ -0,0 +1,21 @@
package com.moral.api.service;
import java.util.List;
import java.util.Map;
import com.moral.api.entity.CityAqi;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市aqi实测小时数据表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
public interface CityAqiService extends IService<CityAqi> {
    //臭氧实测和预测对比
    List<Map<String, Object>> measuredCompareForecastOfO3(Map<String, Object> params);
}
screen-api/src/main/java/com/moral/api/service/ForecastService.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.service;
import com.moral.api.entity.Forecast;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 预测小时数据 服务类
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
public interface ForecastService extends IService<Forecast> {
}
screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
New file
@@ -0,0 +1,95 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.CityAqi;
import com.moral.api.entity.Forecast;
import com.moral.api.mapper.CityAqiMapper;
import com.moral.api.mapper.ForecastMapper;
import com.moral.api.service.CityAqiService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * 城市aqi实测小时数据表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
@Service
public class CityAqiServiceImpl extends ServiceImpl<CityAqiMapper, CityAqi> implements CityAqiService {
    @Autowired
    private CityAqiMapper cityAqiMapper;
    @Autowired
    private ForecastMapper forecastMapper;
    @Override
    public List<Map<String, Object>> measuredCompareForecastOfO3(Map<String, Object> params) {
        String regionCode = params.get("regionCode").toString();
        String time = params.get("time").toString();
        //预测数据
        QueryWrapper<Forecast> forecastQueryWrapper = new QueryWrapper<>();
        forecastQueryWrapper.select("time", "value")
                .eq("city_code", regionCode)
                .likeRight("time", time);
        List<Map<String, Object>> forecastData = forecastMapper.selectMaps(forecastQueryWrapper);
        //实测数据
        QueryWrapper<CityAqi> cityAqiQueryWrapper = new QueryWrapper<>();
        cityAqiQueryWrapper.select("time", "value")
                .eq("city_code", regionCode)
                .likeRight("time", time);
        List<Map<String, Object>> measuredData = cityAqiMapper.selectMaps(cityAqiQueryWrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (int i = 0; i < 48; i++) {
            Map<String, Object> map = new HashMap<>();
            if (i % 2 == 0) {
                map.put("type", "预测");
                Date d = DateUtils.addHours(DateUtils.getDate(time), i / 2);
                map.put("time", DateUtils.dateToDateString(d, DateUtils.yyyy_MM_dd_HH_EN));
                for (Map<String, Object> forecastDatum : forecastData) {
                    Date date = (Date) forecastDatum.get("time");
                    String value = forecastDatum.get("value").toString();
                    Map<String, Object> data = JSONObject.parseObject(value, Map.class);
                    Object o3 = data.get("o3");
                    if (i == DateUtils.getHour(date) * 2) {
                        if (!ObjectUtils.isEmpty(o3)) {
                            map.put("O3", o3);
                        }
                    }
                }
            } else {
                map.put("type", "实测");
                Date d = DateUtils.addHours(DateUtils.getDate(time), (i - 1) / 2);
                map.put("time", DateUtils.dateToDateString(d, DateUtils.yyyy_MM_dd_HH_EN));
                for (Map<String, Object> measuredDatum : measuredData) {
                    Date date = (Date) measuredDatum.get("time");
                    String value = measuredDatum.get("value").toString();
                    Map<String, Object> data = JSONObject.parseObject(value, Map.class);
                    Object o3 = data.get("o3");
                    if (i == (DateUtils.getHour(date) * 2 + 1)) {
                        if (!ObjectUtils.isEmpty(o3)) {
                            map.put("O3", o3);
                        }
                    }
                }
            }
            result.add(map);
        }
        return result;
    }
}
screen-api/src/main/java/com/moral/api/service/impl/ForecastServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.service.impl;
import com.moral.api.entity.Forecast;
import com.moral.api.mapper.ForecastMapper;
import com.moral.api.service.ForecastService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 预测小时数据 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-09-28
 */
@Service
public class ForecastServiceImpl extends ServiceImpl<ForecastMapper, Forecast> implements ForecastService {
}
screen-api/src/main/resources/mapper/CityAqiMapper.xml
New file
@@ -0,0 +1,12 @@
<?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.CityAqiMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqi">
        <result column="city_code" property="cityCode"/>
        <result column="time" property="time"/>
        <result column="value" property="value"/>
    </resultMap>
</mapper>
screen-api/src/main/resources/mapper/ForecastMapper.xml
New file
@@ -0,0 +1,12 @@
<?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.ForecastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.Forecast">
        <result column="city_code" property="cityCode"/>
        <result column="time" property="time"/>
        <result column="value" property="value"/>
    </resultMap>
</mapper>
screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java
@@ -82,7 +82,6 @@
            }
        } catch (Exception e) {
            log.error("param[0] deviceData:" + JSON.toJSONString(deviceData));
            log.error(e.getMessage());
        }
        return deviceData;
    }