From db56a260709d59c872b15d8eb6734fcb99f6cf2b Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Thu, 28 Oct 2021 10:46:02 +0800
Subject: [PATCH] 城市aqi日数据统计定时任务
---
screen-job/src/main/java/com/moral/api/entity/CityAqiDaily.java | 45 +++++++++
screen-job/src/main/java/com/moral/api/service/CityAqiService.java | 3
screen-job/src/main/java/com/moral/api/entity/CityWeather.java | 2
screen-job/src/main/java/com/moral/api/mapper/CityAqiDailyMapper.java | 16 +++
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java | 2
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java | 108 +++++++++++++++++++++
screen-job/src/main/resources/mapper/CityAqiDailyMapper.xml | 12 ++
screen-job/src/main/java/com/moral/api/service/CityAqiDailyService.java | 19 +++
screen-job/src/main/java/com/moral/api/entity/CityConfig.java | 2
screen-job/src/main/java/com/moral/api/entity/CityAqi.java | 2
screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java | 6 +
screen-api/src/main/java/com/moral/api/entity/CityAqi.java | 2
screen-common/src/main/java/com/moral/util/AmendUtils.java | 24 ++++
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java | 33 +-----
screen-api/src/main/java/com/moral/api/entity/Forecast.java | 2
15 files changed, 236 insertions(+), 42 deletions(-)
diff --git a/screen-api/src/main/java/com/moral/api/entity/CityAqi.java b/screen-api/src/main/java/com/moral/api/entity/CityAqi.java
index fc173c4..f76c3d5 100644
--- a/screen-api/src/main/java/com/moral/api/entity/CityAqi.java
+++ b/screen-api/src/main/java/com/moral/api/entity/CityAqi.java
@@ -24,7 +24,7 @@
/**
* ������id
*/
- private String cityCode;
+ private Integer cityCode;
/**
* ������
diff --git a/screen-api/src/main/java/com/moral/api/entity/Forecast.java b/screen-api/src/main/java/com/moral/api/entity/Forecast.java
index b09b6aa..23fa642 100644
--- a/screen-api/src/main/java/com/moral/api/entity/Forecast.java
+++ b/screen-api/src/main/java/com/moral/api/entity/Forecast.java
@@ -24,7 +24,7 @@
/**
* ������id
*/
- private String cityCode;
+ private Integer cityCode;
/**
* ������
diff --git a/screen-common/src/main/java/com/moral/util/AmendUtils.java b/screen-common/src/main/java/com/moral/util/AmendUtils.java
index ff1ede5..4218796 100644
--- a/screen-common/src/main/java/com/moral/util/AmendUtils.java
+++ b/screen-common/src/main/java/com/moral/util/AmendUtils.java
@@ -93,7 +93,6 @@
avgs.add(average);
}
max = avgs.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getMax();
- System.out.println(avgs.size());
if (avgs.size() < 14) {
if (max < 160d) {
return result;
@@ -103,8 +102,24 @@
return result;
}
+ //������aqi���������
+ public static Double o3OfDay(List<Map<String, Object>> value) {
+ List<Map<String, Object>> o3_8H = getO3_8H(value);
+ if (!ObjectUtils.isEmpty(o3_8H)) {
+ double o3 = 0d;
+ for (Map<String, Object> o : o3_8H) {
+ double temp = (double) o.get("o3");
+ if (temp > o3) {
+ o3 = temp;
+ }
+ }
+ return sciCal(o3, 0);
+ }
+ return null;
+ }
+
/**
- * @param data ������ time:Date������
+ * @param data ������ time:Date������,������key:o3
* @return ���������������8���������������������
*/
public static List<Map<String, Object>> getO3_8H(List<Map<String, Object>> data) {
@@ -129,7 +144,8 @@
}
List<Double> value = new ArrayList<>();
for (Map<String, Object> dataMap : data) {
- Double o3 = Double.parseDouble(dataMap.get(Constants.SENSOR_CODE_O3).toString());
+ Map<String, Object> sensorValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
+ Double o3 = Double.parseDouble(sensorValue.get("o3").toString());
Date time = (Date) dataMap.get("time");
int hour = DateUtils.getHour(time);
if (hour == 0) {
@@ -143,7 +159,7 @@
continue;
}
double average = value.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage();
- map.put(Constants.SENSOR_CODE_O3, average);
+ map.put("o3", average);
result.add(map);
}
return result;
diff --git a/screen-job/src/main/java/com/moral/api/entity/CityAqi.java b/screen-job/src/main/java/com/moral/api/entity/CityAqi.java
index c36fc66..74b52ad 100644
--- a/screen-job/src/main/java/com/moral/api/entity/CityAqi.java
+++ b/screen-job/src/main/java/com/moral/api/entity/CityAqi.java
@@ -24,7 +24,7 @@
/**
* ������id
*/
- private String cityCode;
+ private Integer cityCode;
/**
* ������
diff --git a/screen-job/src/main/java/com/moral/api/entity/CityAqiDaily.java b/screen-job/src/main/java/com/moral/api/entity/CityAqiDaily.java
new file mode 100644
index 0000000..f27de31
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/entity/CityAqiDaily.java
@@ -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-10-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class CityAqiDaily extends Model<CityAqiDaily> {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ������id
+ */
+ private Integer cityCode;
+
+ /**
+ * ������
+ */
+ private Date time;
+
+ /**
+ * ������
+ */
+ private String value;
+
+
+ @Override
+ protected Serializable pkVal() {
+ return null;
+ }
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/entity/CityConfig.java b/screen-job/src/main/java/com/moral/api/entity/CityConfig.java
index f0c0de1..5a43e9e 100644
--- a/screen-job/src/main/java/com/moral/api/entity/CityConfig.java
+++ b/screen-job/src/main/java/com/moral/api/entity/CityConfig.java
@@ -30,7 +30,7 @@
/**
* ������code
*/
- private String cityCode;
+ private Integer cityCode;
/**
* ������������
diff --git a/screen-job/src/main/java/com/moral/api/entity/CityWeather.java b/screen-job/src/main/java/com/moral/api/entity/CityWeather.java
index dbe0832..fadc378 100644
--- a/screen-job/src/main/java/com/moral/api/entity/CityWeather.java
+++ b/screen-job/src/main/java/com/moral/api/entity/CityWeather.java
@@ -24,7 +24,7 @@
/**
* ������code
*/
- private String cityCode;
+ private Integer cityCode;
/**
* ������
diff --git a/screen-job/src/main/java/com/moral/api/mapper/CityAqiDailyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/CityAqiDailyMapper.java
new file mode 100644
index 0000000..0383574
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/mapper/CityAqiDailyMapper.java
@@ -0,0 +1,16 @@
+package com.moral.api.mapper;
+
+import com.moral.api.entity.CityAqiDaily;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * ������aqi������������ Mapper ������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-10-28
+ */
+public interface CityAqiDailyMapper extends BaseMapper<CityAqiDaily> {
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/service/CityAqiDailyService.java b/screen-job/src/main/java/com/moral/api/service/CityAqiDailyService.java
new file mode 100644
index 0000000..eefc9d7
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/service/CityAqiDailyService.java
@@ -0,0 +1,19 @@
+package com.moral.api.service;
+
+import com.moral.api.entity.CityAqiDaily;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * ������aqi������������ ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-10-28
+ */
+public interface CityAqiDailyService extends IService<CityAqiDaily> {
+
+ //������aqi���������������
+ void insertCityAqiDaily();
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/service/CityAqiService.java b/screen-job/src/main/java/com/moral/api/service/CityAqiService.java
index 0644cde..17e3c3c 100644
--- a/screen-job/src/main/java/com/moral/api/service/CityAqiService.java
+++ b/screen-job/src/main/java/com/moral/api/service/CityAqiService.java
@@ -16,7 +16,4 @@
//aqi���������������insert
void insertCityAqi();
- //������aqi���������������
- void insertCityAqiDaily();
-
}
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
new file mode 100644
index 0000000..61a58ab
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -0,0 +1,108 @@
+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.CityAqiDaily;
+import com.moral.api.mapper.CityAqiDailyMapper;
+import com.moral.api.service.CityAqiDailyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.service.CityAqiService;
+import com.moral.util.AmendUtils;
+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.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.OptionalDouble;
+import java.util.stream.Collectors;
+import java.util.stream.DoubleStream;
+
+/**
+ * <p>
+ * ������aqi������������ ���������������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-10-28
+ */
+@Service
+public class CityAqiDailyServiceImpl extends ServiceImpl<CityAqiDailyMapper, CityAqiDaily> implements CityAqiDailyService {
+
+ @Autowired
+ private CityAqiDailyMapper cityAqiDailyMapper;
+
+ @Autowired
+ private CityAqiService cityAqiService;
+
+ @Override
+ public void insertCityAqiDaily() {
+ List<String> sensors = Arrays.asList("pm2_5", "pm10", "so2", "no2", "co", "o3", "aqi");
+ String format = DateUtils.yyyy_MM_dd_EN;
+ Date now = new Date();
+ //���������������������
+ Date start = DateUtils.dataToTimeStampTime(DateUtils.getDateOfDay(now, -1), format);
+ //���������������������
+ Date end = DateUtils.dataToTimeStampTime(now, format);
+ //������������������aqi������������
+ QueryWrapper<CityAqi> wrapper = new QueryWrapper<>();
+ wrapper.select("city_code", "time", "value")
+ .ge("time", DateUtils.dateToDateString(start))
+ .lt("time", DateUtils.dateToDateString(end));
+ List<Map<String, Object>> dailyData = cityAqiService.listMaps(wrapper);
+
+ if (dailyData.size() == 0) {
+ return;
+ }
+ //���city_code������
+ Map<String, List<Map<String, Object>>> data = dailyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString()));
+
+ data.forEach((cityCode, value) -> {
+ Map<String, Object> jsonMap = new HashMap<>();
+ CityAqiDaily cityAqiDaily = new CityAqiDaily();
+ cityAqiDaily.setCityCode(Integer.parseInt(cityCode));
+ cityAqiDaily.setTime(start);
+
+ //���������������������������
+ Double o3OfDay = AmendUtils.o3OfDay(value);
+ if (o3OfDay != null) {
+ jsonMap.put("o3", o3OfDay);
+ }
+
+ sensors.forEach(sensor -> {
+ OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> {
+ Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
+ //������������������
+ if ("o3".equals(sensor)) {
+ return null;
+ }
+
+ Object sensorValue = dataValue.get(sensor);
+ if (ObjectUtils.isEmpty(sensorValue)) {
+ return null;
+ }
+ double aDouble = Double.parseDouble(sensorValue.toString());
+ return DoubleStream.of(aDouble);
+ }).average();
+ if (optionalDouble.isPresent()) {
+ //���������������������
+ double sciCal;
+ if ("co".equals(sensor)) {
+ sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 1);
+ } else {
+ sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 0);
+ }
+ jsonMap.put(sensor, sciCal);
+ }
+ });
+ cityAqiDaily.setValue(JSONObject.toJSONString(jsonMap));
+ cityAqiDailyMapper.insert(cityAqiDaily);
+ });
+ }
+}
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
index 40921a6..1250a50 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -22,7 +22,6 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* <p>
@@ -47,6 +46,9 @@
@Autowired
private RedisTemplate redisTemplate;
+ @Autowired
+
+
@Override
public void insertCityAqi() {
//������������������
@@ -55,7 +57,7 @@
List<CityConfig> list = cityConfigService.list(wrapper);
Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
for (CityConfig cityConfig : list) {
- String cityCode = cityConfig.getCityCode();
+ Integer cityCode = cityConfig.getCityCode();
Map<String, Object> data;
try {
//������������������������������
@@ -83,32 +85,7 @@
cityAqi.setValue(JSONObject.toJSONString(aqi));
cityAqiMapper.insert(cityAqi);
//������redis
- redisTemplate.opsForHash().put(RedisConstants.CITY_AQI, cityCode, aqi);
+ redisTemplate.opsForHash().put(RedisConstants.CITY_AQI, cityCode.toString(), aqi);
}
- }
-
- @Override
- public void insertCityAqiDaily() {
- String format = DateUtils.yyyy_MM_dd_EN;
- Date now = new Date();
- //���������������������
- Date start = DateUtils.dataToTimeStampTime(DateUtils.getDateOfDay(now, -1), format);
- //���������������������
- Date end = DateUtils.dataToTimeStampTime(now, format);
- //������������������aqi������������
- QueryWrapper<CityAqi> wrapper = new QueryWrapper<>();
- wrapper.select("city_code", "value")
- .ge("time", DateUtils.dateToDateString(start))
- .lt("time", DateUtils.dateToDateString(end));
- List<Map<String, Object>> dailyData = cityAqiMapper.selectMaps(wrapper);
-
- if (dailyData.size() == 0) {
- return;
- }
- //���city_code������
- Map<String, List<Map<String, Object>>> data = dailyData.parallelStream().collect(Collectors.groupingBy(o -> (String) o.get("city_code")));
- data.forEach((cityCode, value) -> {
- });
-
}
}
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
index 313df32..bd6d9f2 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
@@ -51,7 +51,7 @@
wrapper.select("city_code", "location_id").eq("is_delete", Constants.NOT_DELETE);
List<CityConfig> list = cityConfigService.list(wrapper);
for (CityConfig cityConfig : list) {
- String cityCode = cityConfig.getCityCode();
+ Integer cityCode = cityConfig.getCityCode();
Integer locationId = cityConfig.getLocationId();
Map<String, Object> data = restTemplate.getForObject("https://api.qweather.com/v7/weather/now?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, locationId);
Map<String, Object> now = (Map<String, Object>) data.get("now");
diff --git a/screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java b/screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java
index 349cd24..0baea6a 100644
--- a/screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java
+++ b/screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java
@@ -3,6 +3,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import com.moral.api.service.CityAqiDailyService;
import com.moral.api.service.CityAqiService;
import com.moral.api.service.HistoryAqiService;
import com.xxl.job.core.biz.model.ReturnT;
@@ -14,6 +15,9 @@
@Autowired
private HistoryAqiService historyAqiService;
+
+ @Autowired
+ private CityAqiDailyService cityAqiDailyService;
@Autowired
private CityAqiService cityAqiService;
@@ -46,7 +50,7 @@
@XxlJob("insertCityAqiDaily")
public ReturnT insertCityAqiDaily(){
try {
- cityAqiService.insertCityAqiDaily();
+ cityAqiDailyService.insertCityAqiDaily();
} catch (Exception e) {
XxlJobHelper.log(e.getMessage());
return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
diff --git a/screen-job/src/main/resources/mapper/CityAqiDailyMapper.xml b/screen-job/src/main/resources/mapper/CityAqiDailyMapper.xml
new file mode 100644
index 0000000..212653b
--- /dev/null
+++ b/screen-job/src/main/resources/mapper/CityAqiDailyMapper.xml
@@ -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.CityAqiDailyMapper">
+
+ <!-- ������������������������ -->
+ <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqiDaily">
+ <result column="city_code" property="cityCode"/>
+ <result column="time" property="time"/>
+ <result column="value" property="value"/>
+ </resultMap>
+
+</mapper>
\ No newline at end of file
--
Gitblit v1.8.0