|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private HistoryHourlyMapper historyHourlyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //O3,PM2.5,PM10预测数据插入forecast_weather表 | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public int insertForecastWeatherNew() throws ParseException { | 
|---|
|  |  |  | Calendar c = Calendar.getInstance(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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)) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|