From 100e952066f126467e128a672fb6a7fc3cf367c3 Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Mon, 08 Nov 2021 11:29:18 +0800 Subject: [PATCH] update --- screen-job/src/main/java/com/moral/api/service/CityAqiMonthlyService.java | 19 ++ screen-job/src/main/java/com/moral/api/entity/CityAqiYearly.java | 45 +++++ screen-job/src/main/java/com/moral/api/entity/CityAqiMonthly.java | 45 +++++ screen-job/src/main/java/com/moral/api/service/CityAqiYearlyService.java | 19 ++ screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java | 138 +++++++++++++++++ screen-job/src/main/java/com/moral/api/mapper/CityAqiMonthlyMapper.java | 16 ++ screen-job/src/main/resources/mapper/CityAqiYearlyMapper.xml | 12 + screen-job/src/main/resources/mapper/CityAqiMonthlyMapper.xml | 12 + screen-job/src/main/java/com/moral/api/mapper/CityAqiYearlyMapper.java | 16 ++ screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java | 143 +++++++++++++++++ 10 files changed, 465 insertions(+), 0 deletions(-) diff --git a/screen-job/src/main/java/com/moral/api/entity/CityAqiMonthly.java b/screen-job/src/main/java/com/moral/api/entity/CityAqiMonthly.java new file mode 100644 index 0000000..f7c3435 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/CityAqiMonthly.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-11-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class CityAqiMonthly extends Model<CityAqiMonthly> { + + private static final long serialVersionUID = 1L; + + /** + * ������������code + */ + 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/CityAqiYearly.java b/screen-job/src/main/java/com/moral/api/entity/CityAqiYearly.java new file mode 100644 index 0000000..a95b77e --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/CityAqiYearly.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-11-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class CityAqiYearly extends Model<CityAqiYearly> { + + private static final long serialVersionUID = 1L; + + /** + * ������������code + */ + 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/mapper/CityAqiMonthlyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/CityAqiMonthlyMapper.java new file mode 100644 index 0000000..014740c --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/CityAqiMonthlyMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.CityAqiMonthly; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ������aqi������������ Mapper ������ + * </p> + * + * @author moral + * @since 2021-11-05 + */ +public interface CityAqiMonthlyMapper extends BaseMapper<CityAqiMonthly> { + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/CityAqiYearlyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/CityAqiYearlyMapper.java new file mode 100644 index 0000000..a076787 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/CityAqiYearlyMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.CityAqiYearly; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ������aqi������������ Mapper ������ + * </p> + * + * @author moral + * @since 2021-11-05 + */ +public interface CityAqiYearlyMapper extends BaseMapper<CityAqiYearly> { + +} diff --git a/screen-job/src/main/java/com/moral/api/service/CityAqiMonthlyService.java b/screen-job/src/main/java/com/moral/api/service/CityAqiMonthlyService.java new file mode 100644 index 0000000..7d899dd --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/CityAqiMonthlyService.java @@ -0,0 +1,19 @@ +package com.moral.api.service; + +import com.moral.api.entity.CityAqiMonthly; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ������aqi������������ ��������� + * </p> + * + * @author moral + * @since 2021-11-04 + */ +public interface CityAqiMonthlyService extends IService<CityAqiMonthly> { + + //������aqi��������������� + void insertCityAqiMonthly(); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/CityAqiYearlyService.java b/screen-job/src/main/java/com/moral/api/service/CityAqiYearlyService.java new file mode 100644 index 0000000..6e27353 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/CityAqiYearlyService.java @@ -0,0 +1,19 @@ +package com.moral.api.service; + +import com.moral.api.entity.CityAqiYearly; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ������aqi������������ ��������� + * </p> + * + * @author moral + * @since 2021-11-04 + */ +public interface CityAqiYearlyService extends IService<CityAqiYearly> { + + //������aqi��������������� + void insertCityAqiYearly(); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java new file mode 100644 index 0000000..7fd2098 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java @@ -0,0 +1,138 @@ +package com.moral.api.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.moral.api.entity.CityAqiDaily; +import com.moral.api.entity.CityAqiMonthly; +import com.moral.api.mapper.CityAqiMonthlyMapper; +import com.moral.api.service.CityAqiDailyService; +import com.moral.api.service.CityAqiMonthlyService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.constant.Constants; +import com.moral.util.AmendUtils; +import com.moral.util.ComprehensiveIndexUtils; +import com.moral.util.DateUtils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.text.DecimalFormat; +import java.util.ArrayList; +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-11-04 + */ +@Service +public class CityAqiMonthlyServiceImpl extends ServiceImpl<CityAqiMonthlyMapper, CityAqiMonthly> implements CityAqiMonthlyService { + + @Autowired + private CityAqiMonthlyMapper cityAqiMonthlyMapper; + + @Autowired + private CityAqiDailyService cityAqiDailyService; + + @Override + public void insertCityAqiMonthly() { + //��������������������������� + List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); + + //���������������������1��� + Date start = DateUtils.getFirstDayOfLastMonth(); + //��������� + Date lastLastMonth = DateUtils.addMonths(start, -1); + //���������������������1��� + Date end = DateUtils.addMonths(start, 1); + + + //������������������aqi������������ + QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); + wrapper.select("city_code", "time", "value") + .ge("time", DateUtils.dateToDateString(start)) + .lt("time", DateUtils.dateToDateString(end)); + List<Map<String, Object>> monthlyData = cityAqiDailyService.listMaps(wrapper); + + if (monthlyData.size() == 0) { + return; + } + //���city_code������ + Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + + data.forEach((cityCode, value) -> { + Map<String, Object> jsonMap = new HashMap<>(); + CityAqiMonthly cityAqiMonthly = new CityAqiMonthly(); + cityAqiMonthly.setCityCode(Integer.parseInt(cityCode)); + cityAqiMonthly.setTime(start); + + Map<String, Object> params = new HashMap<>(); + List<Map<String, Object>> temp = new ArrayList<>(); + for (Map<String, Object> map : value) { + Map<String, Object> sensorsValue = JSONObject.parseObject(map.get("value").toString(), Map.class); + Map<String, Object> tempMap = new HashMap<>(); + tempMap.put(Constants.SENSOR_CODE_CO, sensorsValue.get("CO")); + tempMap.put(Constants.SENSOR_CODE_O3, sensorsValue.get("O3")); + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("value", JSONObject.toJSONString(tempMap)); + temp.add(hashMap); + } + params.put("data", temp); + //1. CO 95������������������������ + Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); + if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { + jsonMap.put("CO", coAvgOfWeekOrMonth.get(Constants.SENSOR_CODE_CO)); + } + + //2. O3 90������������������������ + Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); + if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { + jsonMap.put("O3", o3AvgOfWeekOrMonth.get(Constants.SENSOR_CODE_O3)); + } + + sensors.forEach(sensor -> { + OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> { + Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); + double aDouble = Double.parseDouble(dataValue.get(sensor).toString()); + return DoubleStream.of(aDouble); + }).average(); + if (optionalDouble.isPresent()) { + //��������������������� + jsonMap.put(sensor, AmendUtils.sciCal(optionalDouble.getAsDouble(), 0)); + } + }); + + //��������������������� + Double compositeIndex = ComprehensiveIndexUtils.dailyData(jsonMap); + jsonMap.put("compositeIndex", compositeIndex); + + //��������������������������� + QueryWrapper<CityAqiMonthly> queryWrapper = new QueryWrapper<>(); + queryWrapper.select("value") + .eq("city_code", cityCode) + .eq("time", DateUtils.dateToDateString(lastLastMonth)); + //��������������������� + CityAqiMonthly lastCityAqiMonthly = cityAqiMonthlyMapper.selectOne(queryWrapper); + if (lastCityAqiMonthly != null) { + Map<String, Object> map = JSONObject.parseObject(lastCityAqiMonthly.getValue(), Map.class); + double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString()); + DecimalFormat decimalFormat = new DecimalFormat("0.00%"); + String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); + jsonMap.put("monthContrast", format); + } + cityAqiMonthly.setValue(JSONObject.toJSONString(jsonMap)); + cityAqiMonthlyMapper.insert(cityAqiMonthly); + }); + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java new file mode 100644 index 0000000..240981a --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java @@ -0,0 +1,143 @@ +package com.moral.api.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.moral.api.entity.CityAqiDaily; +import com.moral.api.entity.CityAqiYearly; +import com.moral.api.mapper.CityAqiYearlyMapper; +import com.moral.api.service.CityAqiDailyService; +import com.moral.api.service.CityAqiYearlyService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.constant.Constants; +import com.moral.util.AmendUtils; +import com.moral.util.ComprehensiveIndexUtils; +import com.moral.util.DateUtils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.text.DecimalFormat; +import java.util.ArrayList; +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-11-04 + */ +@Service +public class CityAqiYearlyServiceImpl extends ServiceImpl<CityAqiYearlyMapper, CityAqiYearly> implements CityAqiYearlyService { + + @Autowired + private CityAqiDailyService cityAqiDailyService; + + @Autowired + private CityAqiYearlyMapper cityAqiYearlyMapper; + + + @Override + public void insertCityAqiYearly() { + //��������������������������� + List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); + + //���������������������1��� + Date start = DateUtils.getFirstDayOfLastYear(); + //��������� + Date lastLastYear = DateUtils.getDate(DateUtils.getDateAddYear(DateUtils.dateToDateString(start, DateUtils.yyyy), -1), DateUtils.yyyy); + //���������������������1��� + Date end = DateUtils.getDate(DateUtils.getDateAddYear(DateUtils.dateToDateString(start, DateUtils.yyyy), 1), DateUtils.yyyy); + + + //������������������aqi������������ + QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); + wrapper.select("city_code", "time", "value") + .ge("time", DateUtils.dateToDateString(start)) + .lt("time", DateUtils.dateToDateString(end)); + List<Map<String, Object>> monthlyData = cityAqiDailyService.listMaps(wrapper); + + if (monthlyData.size() == 0) { + return; + } + //���city_code������ + Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + + data.forEach((cityCode, value) -> { + Map<String, Object> jsonMap = new HashMap<>(); + CityAqiYearly cityAqiYearly = new CityAqiYearly(); + cityAqiYearly.setCityCode(Integer.parseInt(cityCode)); + cityAqiYearly.setTime(start); + + + Map<String, Object> params = new HashMap<>(); + List<Map<String, Object>> temp = new ArrayList<>(); + System.out.println(value); + for (Map<String, Object> map : value) { + Map<String, Object> sensorsValue = JSONObject.parseObject(map.get("value").toString(), Map.class); + Map<String, Object> tempMap = new HashMap<>(); + tempMap.put(Constants.SENSOR_CODE_CO, sensorsValue.get("PM2_5")); + tempMap.put(Constants.SENSOR_CODE_O3, sensorsValue.get("O3")); + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("value", JSONObject.toJSONString(tempMap)); + temp.add(hashMap); + } + params.put("data", temp); + //1. CO 95������������������������ + Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); + if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { + jsonMap.put("CO", coAvgOfWeekOrMonth.get(Constants.SENSOR_CODE_CO)); + } + + //2. O3 90������������������������ + Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); + if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { + jsonMap.put("O3", o3AvgOfWeekOrMonth.get(Constants.SENSOR_CODE_O3)); + } + + sensors.forEach(sensor -> { + OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> { + Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); + double aDouble = Double.parseDouble(dataValue.get(sensor).toString()); + return DoubleStream.of(aDouble); + }).average(); + if (optionalDouble.isPresent()) { + //��������������������� + jsonMap.put(sensor, AmendUtils.sciCal(optionalDouble.getAsDouble(), 0)); + } + }); + + //��������������������� + Double compositeIndex = ComprehensiveIndexUtils.dailyData(jsonMap); + jsonMap.put("compositeIndex", compositeIndex); + + //��������������������������� + QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); + queryWrapper.select("value") + .eq("city_code", cityCode) + .eq("time", DateUtils.dateToDateString(lastLastYear)); + //��������������������� + CityAqiYearly lastCityAqiYearly = cityAqiYearlyMapper.selectOne(queryWrapper); + if (lastCityAqiYearly != null) { + Map<String, Object> map = JSONObject.parseObject(lastCityAqiYearly.getValue(), Map.class); + double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString()); + DecimalFormat decimalFormat = new DecimalFormat("0.00%"); + String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); + jsonMap.put("yearContrast", format); + } + cityAqiYearly.setValue(JSONObject.toJSONString(jsonMap)); + cityAqiYearlyMapper.insert(cityAqiYearly); + }); + + + } +} diff --git a/screen-job/src/main/resources/mapper/CityAqiMonthlyMapper.xml b/screen-job/src/main/resources/mapper/CityAqiMonthlyMapper.xml new file mode 100644 index 0000000..3e471f9 --- /dev/null +++ b/screen-job/src/main/resources/mapper/CityAqiMonthlyMapper.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.CityAqiMonthlyMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqiMonthly"> + <result column="city_code" property="cityCode" /> + <result column="time" property="time" /> + <result column="value" property="value" /> + </resultMap> + +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/CityAqiYearlyMapper.xml b/screen-job/src/main/resources/mapper/CityAqiYearlyMapper.xml new file mode 100644 index 0000000..63bf554 --- /dev/null +++ b/screen-job/src/main/resources/mapper/CityAqiYearlyMapper.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.CityAqiYearlyMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqiYearly"> + <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