src/main/java/com/moral/service/DeviceService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/moral/service/impl/DeviceServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/moral/service/impl/WeatherServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/moral/task/DeviceAdjustValueTimingTask.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/com/moral/util/RedisUtils.java | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/AQIMapper.xml | ●●●●● patch | view | raw | blame | history | |
src/main/resources/mapper/WeatherMapper.xml | ●●●●● patch | view | raw | blame | history |
src/main/java/com/moral/service/DeviceService.java
@@ -1,5 +1,7 @@ package com.moral.service; import com.moral.entity.Device; import java.util.List; import java.util.Map; @@ -20,4 +22,6 @@ List<Map<String, Object>> macAndOrganizationIdMap(List<String> macs); List<Map<String, Object>> getAllByMacList(List<String> macList); Device getDeviceByID(int id); } src/main/java/com/moral/service/impl/DeviceServiceImpl.java
@@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; import com.moral.entity.Device; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -61,4 +62,10 @@ public List<Map<String, Object>> getAllByMacList(List<String> macList) { return deviceMapper.getAllByMacList(macList); } @Override public Device getDeviceByID(int id) { Device result = deviceMapper.selectByPrimaryKey(id); return result; } } src/main/java/com/moral/service/impl/WeatherServiceImpl.java
@@ -18,13 +18,10 @@ import com.alibaba.fastjson.JSONObject; import com.moral.mapper.AQIMapper; import com.moral.mapper.AreaMapper; import com.moral.mapper.CityMapper; import com.moral.mapper.DeviceMapper; import com.moral.mapper.WeatherMapper; import com.moral.mapper.HistoryHourlyMapper; import com.moral.mapper.MonitorPointMapper; import com.moral.mapper.ProvinceMapper; import com.moral.service.WeatherService; @Service @@ -45,6 +42,7 @@ @Resource private HistoryHourlyMapper historyHourlyMapper; //O3,PM2.5,PM10预测数据插入forecast_weather表 @Override public int insertForecastWeatherNew() throws ParseException { Calendar c = Calendar.getInstance(); @@ -70,6 +68,7 @@ cityList.add(ks); int count = 0; for (Map<String, Object> map : cityList) { String cityCode = map.get("cityCode").toString(); String id = map.get("cityId").toString(); Map<String, Object> dataMap = restTemplate.getForObject("https://api.heweather.net/v7/weather/72h?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, id); if (dataMap == null) { @@ -82,51 +81,18 @@ List<Map<String, Object>> hourlyList = (List<Map<String, Object>>) JSONObject.parse(string); for (Map<String, Object> hourlyMap : hourlyList) { //逐小时预报时间 String fxTime = hourlyMap.get("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00"; hourlyMap.remove("fxTime"); String fxTime = hourlyMap.remove("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00"; //icon为不需要字段 hourlyMap.remove("icon"); hourlyMap.put("time", fxTime); //天气 String text = hourlyMap.get("text").toString(); //风速km/h->m/s Double windSpeed = Double.valueOf(hourlyMap.get("windSpeed").toString()); double windSpeed = Double.parseDouble(hourlyMap.get("windSpeed").toString()); windSpeed = windSpeed * 1000 / 3600; hourlyMap.put("windSpeed", df.format(windSpeed)); String condition = ""; if ("晴".equals(text)) { condition = "100"; } else if ("雾".equals(text)) { condition = "90"; } else if ("多云".equals(text)) { condition = "80"; } else if ("霾".equals(text)) { condition = "70"; } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { condition = "60"; } else if ("阵雨".equals(text)) { condition = "45"; } else if ("雷阵雨".equals(text)) { condition = "40"; } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { condition = "30"; } else if ("小雨".equals(text)) { condition = "20"; } else if ("雨".equals(text)) { condition = "10"; } else if ("雷阵雨转中雨".equals(text)) { condition = "5"; } else if ("雷阵雨转大雨".equals(text)) { condition = "4"; } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) ) { condition = "0"; } else { condition = "50"; } hourlyMap.put("condition", condition); hourlyMap.put("windScale", String.valueOf(getWindScale(windSpeed))); hourlyMap.put("condition", getWeatherCondition(text)); String hour = fxTime.split(" ")[0]; String hour1 = fxTime.split(":")[0]; if (hour.equals(nextDay)) { @@ -138,39 +104,42 @@ } nextDayList.remove(0); map.put("data", nextDayList); } //计算 c.setTime(sdf.parse(today)); c.add(Calendar.YEAR, -3); Date start = c.getTime(); Date end = sdf.parse(today); int timeUnits1 = c.get(Calendar.YEAR); int timeUnits2 = timeUnits1 + 1; int timeUnits3 = timeUnits1 + 2; int timeUnits4 = timeUnits1 + 3; //当天前15天 70%,当天前45天15%,其他 15% c.setTime(end); c.add(Calendar.DAY_OF_MONTH, -15); //前15天分割时间 Date slicedTime1 = c.getTime(); //前45天分割时间 c.add(Calendar.DAY_OF_MONTH, -30); Date slicedTime2 = c.getTime(); //today:今天 c.setTime(sdf.parse(today)); c.add(Calendar.YEAR, -3); Date start = c.getTime(); Date end = sdf.parse(today); int timeUnits1 = c.get(Calendar.YEAR); int timeUnits2 = timeUnits1 + 1; int timeUnits3 = timeUnits1 + 2; int timeUnits4 = timeUnits1 + 3; //当天前15天 70%,当天前45天15%,其他 15% c.setTime(end); c.add(Calendar.DAY_OF_MONTH, -15); //前15天分割时间 Date slicedTime1 = c.getTime(); //前45天分割时间 c.add(Calendar.DAY_OF_MONTH, -30); Date slicedTime2 = c.getTime(); for (Map<String, Object> map : cityList) { String cityCode = map.get("cityCode").toString(); ArrayList<Map<String, Object>> dataList = (ArrayList<Map<String, Object>>) map.get("data"); for (Map<String, Object> dataMap : dataList) { //每个城市结果存放list List<Map<String, Object>> resultList = new ArrayList<>(); for (Map<String, Object> nextDayMap : nextDayList) { Map<String, Object> hashMap = new HashMap<>(); List<String> hours = new ArrayList<>(); hashMap.put("cityCode", cityCode); hashMap.put("start", start); hashMap.put("end", end); hashMap.put("typeFormat", "%Y-%m-%d %H:%i:%s"); Integer condition = Integer.valueOf(dataMap.get("condition").toString()); Double temp = Double.valueOf(dataMap.get("temp").toString()); Integer pressure = Integer.valueOf(dataMap.get("pressure").toString()); String time = dataMap.get("time").toString(); int condition = Integer.parseInt(nextDayMap.get("condition").toString()); double temp = Double.parseDouble(nextDayMap.get("temp").toString()); int pressure = Integer.parseInt(nextDayMap.get("pressure").toString()); String time = nextDayMap.remove("time").toString(); //月份,pm2.5,pm10去往年同月取 String month = time.substring(5, 7); //明日此小时风向 String windDir = nextDayMap.get("windDir").toString(); double windSpeed = Double.parseDouble(nextDayMap.get("windSpeed").toString()); //当前小时 hours.add(time.substring(11, 13)); c.setTime(sdf1.parse(time)); @@ -222,23 +191,18 @@ Double avg2 = getAvgO3(params, times2); Double avg3 = getAvgO3(params, times3); Double resultO3 = avg1 * 0.7 + avg2 * 0.15 + avg3 * 0.15; dataMap.put("O3C", String.valueOf(Math.round(resultO3))); } List<Map<String, Object>> resultList = new ArrayList<>(); for (Map<String, Object> dataMap : dataList) { Map<String, Object> resultMap = new HashMap<>(); String time = dataMap.remove("time").toString(); Map<String, Object> params = new HashMap<>(); params.put("cityCode", cityCode); params.put("time", sdf1.parse(time)); nextDayMap.put("O3C", String.valueOf(Math.round(resultO3))); //pm2.5,pm10预测 params.put("time", time); String beam = weatherMapper.getBeam(params); if (beam != null) { dataMap.put("beam", beam.replace("\"", "")); nextDayMap.put("beam", beam.replace("\"", "")); } //每个小时一个map Map<String, Object> resultMap = new HashMap<>(); resultMap.put("cityCode", cityCode); resultMap.put("time", time); resultMap.put("json", JSONObject.toJSONString(dataMap)); resultMap.put("json", JSONObject.toJSONString(nextDayMap)); resultList.add(resultMap); } Map<String, Object> parameters = new HashMap<>(); @@ -387,41 +351,9 @@ Double windSpeed = Double.valueOf(nextDayMap.get("windSpeed").toString()); windSpeed = windSpeed * 1000 / 3600; nextDayMap.put("windSpeed", df.format(windSpeed)); nextDayMap.put("windScale", String.valueOf(getWindScale(windSpeed))); String text = nextDayMap.get("text").toString(); String condition = ""; if ("晴".equals(text)) { condition = "100"; } else if ("雾".equals(text)) { condition = "90"; } else if ("多云".equals(text)) { condition = "80"; } else if ("霾".equals(text)) { condition = "70"; } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { condition = "60"; } else if ("阵雨".equals(text)) { condition = "45"; } else if ("雷阵雨".equals(text)) { condition = "40"; } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { condition = "30"; } else if ("小雨".equals(text)) { condition = "20"; } else if ("雨".equals(text)) { condition = "10"; } else if ("雷阵雨转中雨".equals(text)) { condition = "5"; } else if ("雷阵雨转大雨".equals(text)) { condition = "4"; } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) ) { condition = "0"; } else { condition = "50"; } nextDayMap.put("condition", condition); nextDayMap.put("condition", getWeatherCondition(text)); } map.put("data", nextDayList); } @@ -649,44 +581,80 @@ jsonMap.remove("obsTime"); jsonMap.remove("icon"); String text = jsonMap.get("text").toString(); String condition; if ("晴".equals(text)) { condition = "100"; } else if ("雾".equals(text)) { condition = "90"; } else if ("多云".equals(text)) { condition = "80"; } else if ("霾".equals(text)) { condition = "70"; } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { condition = "60"; } else if ("阵雨".equals(text)) { condition = "45"; } else if ("雷阵雨".equals(text)) { condition = "40"; } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { condition = "30"; } else if ("小雨".equals(text)) { condition = "20"; } else if ("雨".equals(text)) { condition = "10"; } else if ("雷阵雨转中雨".equals(text)) { condition = "5"; } else if ("雷阵雨转大雨".equals(text)) { condition = "4"; } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) ) { condition = "0"; } else { condition = "50"; } jsonMap.put("condition", condition); jsonMap.put("condition", getWeatherCondition(text)); resultMap.put("json", JSONObject.toJSONString(jsonMap)); resultList.add(resultMap); } weatherMapper.deleteRealWeather(sdf1.format(now)); return weatherMapper.insertRealWeather(resultList); } private int getWindScale(Double windSpeed) { int windScale = 0; if (windSpeed <= 1.5) { windScale = 1; } else if (windSpeed <= 3.3) { windScale = 2; } else if (windSpeed <= 5.4) { windScale = 3; } else if (windSpeed <= 7.9) { windScale = 4; } else if (windSpeed <= 10.7) { windScale = 5; } else if (windSpeed <= 13.8) { windScale = 6; } else if (windSpeed <= 17.1) { windScale = 7; } else if (windSpeed <= 20.7) { windScale = 8; } else if (windSpeed <= 24.4) { windScale = 9; } else if (windSpeed <= 28.4) { windScale = 10; } else if (windSpeed <= 32.6) { windScale = 11; }else if (windSpeed <= 36.9) { windScale = 12; } return windScale; } private String getWeatherCondition(String text) { String condition; if ("晴".equals(text)) { condition = "100"; } else if ("雾".equals(text)) { condition = "90"; } else if ("多云".equals(text)) { condition = "80"; } else if ("霾".equals(text)) { condition = "70"; } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { condition = "60"; } else if ("阵雨".equals(text)) { condition = "45"; } else if ("雷阵雨".equals(text)) { condition = "40"; } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { condition = "30"; } else if ("小雨".equals(text)) { condition = "20"; } else if ("雨".equals(text)) { condition = "10"; } else if ("雷阵雨转中雨".equals(text)) { condition = "5"; } else if ("雷阵雨转大雨".equals(text)) { condition = "4"; } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) ) { condition = "0"; } else { condition = "50"; } return condition; } } src/main/java/com/moral/task/DeviceAdjustValueTimingTask.java
@@ -1,9 +1,13 @@ package com.moral.task; import com.alibaba.fastjson.JSON; import com.moral.entity.Device; import com.moral.service.DeviceAdjustValueService; import com.moral.service.DeviceAdjustValueTimingService; import com.moral.service.DeviceService; import com.moral.util.AlarmUtils_2; import com.moral.util.LengthOfTimeUtils; import com.moral.util.RedisUtils; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.log.XxlJobLogger; @@ -27,6 +31,12 @@ @Resource private DeviceAdjustValueService deviceAdjustValueService; @Resource private DeviceService deviceService; @Resource RedisUtils redisUtils; @XxlJob("DeviceAdjustValueTiming") public ReturnT DeviceAdjustValueTiming(String params) { @@ -70,6 +80,22 @@ }else { deviceAdjustValueService.updateValueByDeviceID(device_id,value); } try { // 存储到redis //Map<String,String> adjustMap = new HashMap<>(); if(value!=null&&!value.isEmpty()){ Map<String, Object> valueMap = JSON.parseObject(value); System.out.println("valueMap:"+valueMap); if(!valueMap.isEmpty()){ Device device = deviceService.getDeviceByID(device_id); String key = RedisUtils.getAdjustKey(device.getMac()); redisUtils.set(key,valueMap); } } }catch (Exception e){ ReturnT returnT = new ReturnT(500, "插入redis出现问题!"); return returnT; } ReturnT returnT = new ReturnT(200, "校准值变更成功!"); return returnT; } src/main/java/com/moral/util/RedisUtils.java
New file @@ -0,0 +1,195 @@ package com.moral.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.moral.common.BooleanValueFilter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @Component public class RedisUtils { private static final String AlarmPrefix = "alarm_"; public static String getAlarmKey(int organizationId){ return AlarmPrefix+organizationId; } private static final String Adjust = "adjust_"; public static String getAdjustKey(String mac){ return Adjust + mac; } @Resource private RedisTemplate redisTemplate; @Resource private BooleanValueFilter javaTypePatchValueFilter; /** * 批量删除对应的value * * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量删除key * * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * 删除对应的value * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 读取缓存,返回指定类型 * * @param key * @return */ public <T>T get(String key,Class<T> clazz) { Object obj = get(key); String json = obj!=null?obj.toString():null; if(json!=null) { return (T) parseObject(json,clazz); } return null; } /** * 读取缓存,返回指定类型 * * @param key * @return */ public <T>T get(String key,TypeReference typeReference) { Object obj = get(key); String json = obj!=null?obj.toString():null; if(json!=null) { return (T) parseObject(json,typeReference); } return null; } private static <T>T parseObject(String key,Class<T> clazz) { return (T) JSON.parseObject(key,clazz); } private static <T>T parseObject(String key,TypeReference typeReference) { return (T) JSON.parseObject(key,typeReference); } public <T> List<T> getList(String pattern,TypeReference typeReference){ List<String> jsonList = getList(pattern); List<T> list = new ArrayList<T>(); for(String json:jsonList) { list.add((T)parseObject(json,typeReference)); } return list; } public <T> List<T> getList(String pattern,Class<T> clazz){ List<String> jsonList = getList(pattern); List<T> list = new ArrayList<>(); for(String json:jsonList) { list.add(parseObject(json,clazz)); } return list; } public List<String> getList(String pattern){ Set<String> keys = keys(pattern); List<String> list = new ArrayList<String>(); for(String key:keys) { Object obj = get(key); String json = obj!=null?obj.toString():null; if(json!=null) { list.add(json); } } return list; } public Set<String> keys(String pattern) { return redisTemplate.keys(pattern); } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { if(value!=null&&!(value instanceof String)) { value = JSON.toJSONString(value,new BooleanValueFilter()); } ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { if(value!=null&&!(value instanceof String)) { value = JSON.toJSONString(value, javaTypePatchValueFilter); } ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } } src/main/resources/mapper/AQIMapper.xml
@@ -1,6 +1,8 @@ <?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.mapper.AQIMapper"> <cache/> <select id="getCityAqiConfig" resultType="java.util.LinkedHashMap"> select * from city_aqi_config; </select> @@ -24,7 +26,7 @@ </foreach> </select> <select id="getO3ByTime" resultType="java.lang.String"> <select id="getO3ByTime" resultType="java.lang.String" useCache="true"> select ifnull(aqi_json->'$.O3C',aqi_json->'$.O3') as 'O3' from hangzhou_aqi where city_code=#{cityCode} @@ -39,7 +41,7 @@ and DATE_FORMAT(time, '%Y%H')=#{yearAndHour} </select> <select id="getO3FromHistory" resultType="java.lang.String"> <select id="getO3FromHistory" resultType="java.lang.String" useCache="true"> select value ->'$.O3C' as 'O3' from history_aqi_${timeUnits} where city_code=#{cityCode} src/main/resources/mapper/WeatherMapper.xml
@@ -1,6 +1,8 @@ <?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.mapper.WeatherMapper"> <cache/> <select id="getCityWeatherConfig" resultType="java.util.Map"> select city_code AS cityCode, city_id AS cityId @@ -114,7 +116,7 @@ ) </select> <select id="getSampleFromHistoryWeather" resultType="java.lang.String"> <select id="getSampleFromHistoryWeather" resultType="java.lang.String" useCache="true"> select DATE_FORMAT(time, #{typeFormat}) as time from history_weather_${timeUnits} <where> @@ -143,20 +145,34 @@ and cast(value->'$.pressure' as UNSIGNED integer) <![CDATA[<=]]> #{endPressure} </if> and time >= #{start} and time <![CDATA[<]]> #{end} and DATE_FORMAT(time, '%H') in <foreach collection="hours" open="(" separator="," close=")" item="hour"> #{hour} </foreach> <if test="start != null"> and time >= #{start} </if> <if test="end != null"> and time <![CDATA[<]]> #{end} </if> <if test="hours != null"> and DATE_FORMAT(time, '%H') in <foreach collection="hours" open="(" separator="," close=")" item="hour"> #{hour} </foreach> </if> </where> </select> <select id="getSampleFromRealWeather" resultType="java.lang.String"> <select id="getSampleFromRealWeather" resultType="java.lang.String" useCache="true"> select DATE_FORMAT(time, #{typeFormat}) as time from real_weather <where> city_code=#{cityCode} <if test="windDir != null"> and json->'$.windDir' = #{windDir} </if> <if test="condition == 0"> and cast(json->'$.condition' as UNSIGNED integer) > #{score} </if> @@ -181,12 +197,24 @@ and cast(json->'$.pressure' as UNSIGNED integer) <![CDATA[<=]]> #{endPressure} </if> and time >= #{start} and time <![CDATA[<]]> #{end} and DATE_FORMAT(time, '%H') in <foreach collection="hours" open="(" separator="," close=")" item="hour"> #{hour} </foreach> <if test="start != null"> and time >= #{start} </if> <if test="end != null"> and time <![CDATA[<]]> #{end} </if> <if test="hours != null"> and DATE_FORMAT(time, '%H') in <foreach collection="hours" open="(" separator="," close=")" item="hour"> #{hour} </foreach> </if> <if test="month != null"> and DATE_FORMAT(time, '%m')=#{month} </if> </where> </select> </mapper>