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; }