|  |  |  | 
|---|
|  |  |  | import com.moral.mapper.AQIMapper; | 
|---|
|  |  |  | import com.moral.mapper.AreaMapper; | 
|---|
|  |  |  | import com.moral.mapper.CityMapper; | 
|---|
|  |  |  | import com.moral.mapper.DeviceMapper; | 
|---|
|  |  |  | import com.moral.mapper.ForecastWeatherMapper; | 
|---|
|  |  |  | import com.moral.mapper.HistoryHourlyMapper; | 
|---|
|  |  |  | import com.moral.mapper.MonitorPointMapper; | 
|---|
|  |  |  | import com.moral.mapper.ProvinceMapper; | 
|---|
|  |  |  | import com.moral.mapper.RealWeatherMapper; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AQIMapper aqiMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private DeviceMapper deviceMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private HistoryHourlyMapper historyHourlyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public int insertForecastWeather() throws ParseException { | 
|---|
|  |  |  | 
|---|
|  |  |  | Date endTime = sdf.parse(sdf.format(c.getTime())); | 
|---|
|  |  |  | c.add(Calendar.MONTH, -2); | 
|---|
|  |  |  | Date startTime = sdf.parse(sdf.format(c.getTime())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (Map<String, Object> hashmap : hashSet) { | 
|---|
|  |  |  | Map<String, Object> map1 = new HashMap<>(); | 
|---|
|  |  |  | map1.put("typeFormat", "%Y-%m-%d %H:%i:%s"); | 
|---|
|  |  |  | map1.put("startTime", startTime); | 
|---|
|  |  |  | map1.put("endTime", endTime); | 
|---|
|  |  |  | hashmap.put("typeFormat", "%Y-%m-%d %H:%i:%s"); | 
|---|
|  |  |  | hashmap.put("startTime", startTime); | 
|---|
|  |  |  | hashmap.put("endTime", endTime); | 
|---|
|  |  |  | map1.put("cityCode", Integer.valueOf(hashmap.get("cityCode").toString())); | 
|---|
|  |  |  | List<List<Map<String, Object>>> list1 = new ArrayList<>(); | 
|---|
|  |  |  | List<List<Map<String, Object>>> list2 = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (int i = 0; i < 24; i++) { | 
|---|
|  |  |  | List<Map<String, Object>> list3 = new ArrayList<>(); | 
|---|
|  |  |  | List<Map<String, Object>> list4 = new ArrayList<>(); | 
|---|
|  |  |  | if (i < 10) { | 
|---|
|  |  |  | map1.put("time", "0" + i + ":00:00"); | 
|---|
|  |  |  | hashmap.put("time", "0" + i + ":00:00"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | map1.put("time", i + ":00:00"); | 
|---|
|  |  |  | hashmap.put("time", i + ":00:00"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Map<String, Object>> tempList = realWeatherMapper.getTemp(hashmap); | 
|---|
|  |  |  | List<Map<String, Object>> O3List = aqiMapper.getO3(map1); | 
|---|
|  |  |  | if (O3List.size() == 0) { | 
|---|
|  |  |  | map1.put("cityCode", Integer.valueOf(hashmap.get("parentCode").toString())); | 
|---|
|  |  |  | O3List = aqiMapper.getO3(map1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | list3.addAll(tempList); | 
|---|
|  |  |  | list4.addAll(O3List); | 
|---|
|  |  |  | list1.add(list3); | 
|---|
|  |  |  | list2.add(list4); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<List<Map<String, Object>>> list = new ArrayList<>(); | 
|---|
|  |  |  | if (list2.get(0).size() == 0) { | 
|---|
|  |  |  | list = list1; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | for (List<Map<String, Object>> tempList : list1) { | 
|---|
|  |  |  | List<Map<String, Object>> list3 = new ArrayList<>(); | 
|---|
|  |  |  | for (List<Map<String, Object>> O3List : list2) { | 
|---|
|  |  |  | for (Map<String, Object> tempMap : tempList) { | 
|---|
|  |  |  | for (Map<String, Object> O3Map : O3List) { | 
|---|
|  |  |  | if (O3Map.get("O3") != null) { | 
|---|
|  |  |  | if (tempMap.get("time").equals(O3Map.get("time"))) { | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | map.put("time", tempMap.get("time")); | 
|---|
|  |  |  | map.put("temp", tempMap.get("temp").toString()); | 
|---|
|  |  |  | map.put("O3", O3Map.get("O3").toString()); | 
|---|
|  |  |  | list3.add(map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | list.add(list3); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (list.get(0).size()!=0) { | 
|---|
|  |  |  | if (list.get(0).get(0).size() > 2) { | 
|---|
|  |  |  | List<Map<String, Object>> constantList = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i < list.size(); i++) { | 
|---|
|  |  |  | List<Map<String, Object>> mapList = list.get(i); | 
|---|
|  |  |  | double tempSum = 0;//温度和 | 
|---|
|  |  |  | double O3Sum = 0;//O3和 | 
|---|
|  |  |  | double sum = 0;// | 
|---|
|  |  |  | double sum1 = 0; | 
|---|
|  |  |  | int length = mapList.size(); | 
|---|
|  |  |  | Map<String, Object> cmap = new HashMap<>(); | 
|---|
|  |  |  | cmap.put("time", i); | 
|---|
|  |  |  | for (Map<String, Object> map : mapList) { | 
|---|
|  |  |  | double temp = Double.valueOf(map.get("temp").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | double O3 = Double.valueOf(map.get("O3").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | tempSum = tempSum + temp; | 
|---|
|  |  |  | O3Sum = O3Sum + O3; | 
|---|
|  |  |  | sum = sum + temp * O3; | 
|---|
|  |  |  | sum1 = sum1 + temp * temp; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | double tempAvg = tempSum / length; | 
|---|
|  |  |  | double O3Avg = O3Sum / length; | 
|---|
|  |  |  | double b = (sum - length * tempAvg * O3Avg) / (sum1 - length * tempAvg * tempAvg); | 
|---|
|  |  |  | double a = O3Avg - (b * tempAvg); | 
|---|
|  |  |  | cmap.put("a", a); | 
|---|
|  |  |  | cmap.put("b", b); | 
|---|
|  |  |  | constantList.add(cmap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | hashmap.put("constants", constantList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int count = 0; | 
|---|
|  |  |  | for (Map<String, Object> map : hashSet) { | 
|---|
|  |  |  | String id = map.get("cityID").toString(); | 
|---|
|  |  |  | 
|---|
|  |  |  | String hour1 = hourlyMap.get("fxTime").toString().split("\\+")[0].split(":")[0].replace("T", " "); | 
|---|
|  |  |  | if (hour.equals(nextDay)) { | 
|---|
|  |  |  | nextDayList.add(hourlyMap); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (hour1.equals(nextNextDay)) { | 
|---|
|  |  |  | nextDayList.add(hourlyMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("data", nextDayList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | nextDayList.remove(0); | 
|---|
|  |  |  | for (Map<String, Object> nextDayMap : nextDayList) { | 
|---|
|  |  |  | String text = nextDayMap.get("text").toString(); | 
|---|
|  |  |  | String condition = ""; | 
|---|
|  |  |  | if ("晴".equals(text)) { | 
|---|
|  |  |  | condition = "100"; | 
|---|
|  |  |  | } else if ("多云".equals(text)) { | 
|---|
|  |  |  | condition = "80"; | 
|---|
|  |  |  | } else if ("阴".equals(text)) { | 
|---|
|  |  |  | condition = "60"; | 
|---|
|  |  |  | } else if ("雷阵雨".equals(text) || "阵雨".equals(text)) { | 
|---|
|  |  |  | condition = "40"; | 
|---|
|  |  |  | } else if ("小雨".equals(text)) { | 
|---|
|  |  |  | condition = "20"; | 
|---|
|  |  |  | } else if ("雨".equals(text)) { | 
|---|
|  |  |  | condition = "0"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | nextDayMap.put("condition", condition); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("data", nextDayList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (Map<String, Object> map : hashSet) { | 
|---|
|  |  |  | String cityCode = map.get("cityCode").toString(); | 
|---|
|  |  |  | List<Map<String, Object>> resultList = new ArrayList<>(); | 
|---|
|  |  |  | String cityCode = map.get("cityCode").toString(); | 
|---|
|  |  |  | map.put("startTime", startTime); | 
|---|
|  |  |  | map.put("endTime", endTime); | 
|---|
|  |  |  | map.put("typeFormat", "%Y-%m-%d %H:%i:%s"); | 
|---|
|  |  |  | Map<String, Object> map1 = new HashMap<>(); | 
|---|
|  |  |  | map1.put("typeFormat", "%Y-%m-%d %H:%i:%s"); | 
|---|
|  |  |  | map1.put("cityCode", Integer.valueOf(cityCode)); | 
|---|
|  |  |  | //根据city_code获取所有monitorPoint | 
|---|
|  |  |  | Map<String, Object> params = new HashMap<>(); | 
|---|
|  |  |  | if (cityCode.endsWith("0000")) { | 
|---|
|  |  |  | params.put("provinceCode", Integer.valueOf(cityCode)); | 
|---|
|  |  |  | } else if (cityCode.endsWith("00")) { | 
|---|
|  |  |  | params.put("cityCode", Integer.valueOf(cityCode)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | params.put("areaCode", Integer.valueOf(cityCode)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Integer> pointList = new ArrayList<>(); | 
|---|
|  |  |  | if (cityCode.equals("130900")) { | 
|---|
|  |  |  | pointList.add(48); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | pointList = monitorPointMapper.getMonitorList(params); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<String> macList = deviceMapper.getMacsByMonitorPointIds(pointList); | 
|---|
|  |  |  | if (macList.size() != 0) { | 
|---|
|  |  |  | map.put("macs", macList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | ArrayList<Map<String, Object>> dataList = (ArrayList<Map<String, Object>>) map.get("data"); | 
|---|
|  |  |  | for (Map<String, Object> dataMap : dataList) { | 
|---|
|  |  |  | Map<String, Object> hashMap = new HashMap<>(); | 
|---|
|  |  |  | hashMap.put("cityCode", cityCode); | 
|---|
|  |  |  | String time = dataMap.get("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00"; | 
|---|
|  |  |  | hashMap.put("time", sdf1.parse(time)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String temp = dataMap.get("temp").toString(); | 
|---|
|  |  |  | int hour = Integer.valueOf(time.substring(11, 13)); | 
|---|
|  |  |  | if (map.get("constants") != null) { | 
|---|
|  |  |  | List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("constants"); | 
|---|
|  |  |  | for (Map<String, Object> listMap : list) { | 
|---|
|  |  |  | int value = Integer.valueOf(listMap.get("time").toString()); | 
|---|
|  |  |  | Double a = Double.valueOf(listMap.get("a").toString()); | 
|---|
|  |  |  | Double b = Double.valueOf(listMap.get("b").toString()); | 
|---|
|  |  |  | if (hour == value) { | 
|---|
|  |  |  | double O3C = b * Double.valueOf(temp) + a; | 
|---|
|  |  |  | dataMap.put("O3C", String.valueOf(Math.round(O3C))); | 
|---|
|  |  |  | map.put("time", hour); | 
|---|
|  |  |  | hashMap.put("time", sdf1.parse(time)); | 
|---|
|  |  |  | String nextDayTemp = dataMap.get("temp").toString(); | 
|---|
|  |  |  | String nextDayCloud = dataMap.get("cloud").toString(); | 
|---|
|  |  |  | Integer condition = Integer.valueOf(dataMap.get("condition").toString()); | 
|---|
|  |  |  | String value=""; | 
|---|
|  |  |  | if (condition >= 80) { | 
|---|
|  |  |  | value = "80"; | 
|---|
|  |  |  | } else if (condition >= 40) { | 
|---|
|  |  |  | value = "40"; | 
|---|
|  |  |  | } else if (condition >= 0) { | 
|---|
|  |  |  | value = "0"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("condition", value); | 
|---|
|  |  |  | List<Map<String, Object>> tempAndCloudList = realWeatherMapper.getTempAndCloud(map); | 
|---|
|  |  |  | List<String> times = new ArrayList<>(); | 
|---|
|  |  |  | for (Map<String, Object> tempAndCloudMap : tempAndCloudList) { | 
|---|
|  |  |  | times.add(tempAndCloudMap.get("time").toString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("times", times); | 
|---|
|  |  |  | map1.put("times", times); | 
|---|
|  |  |  | map1.put("time", hour); | 
|---|
|  |  |  | List<Map<String, Object>> O3List = aqiMapper.getO3(map1); | 
|---|
|  |  |  | if (O3List.size() == 0) { | 
|---|
|  |  |  | map1.put("cityCode", Integer.valueOf(map.get("parentCode").toString())); | 
|---|
|  |  |  | O3List = aqiMapper.getO3(map1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Map<String, Object>> beamList = new ArrayList<>(); | 
|---|
|  |  |  | if (map.get("macs") != null) { | 
|---|
|  |  |  | beamList = historyHourlyMapper.getBeamByMacs(map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Map<String, Object> tempAndCloudMap : tempAndCloudList) { | 
|---|
|  |  |  | String time1 = tempAndCloudMap.get("time").toString(); | 
|---|
|  |  |  | for (Map<String, Object> beamMap : beamList) { | 
|---|
|  |  |  | if (beamList.size() != 0) { | 
|---|
|  |  |  | String time2 = beamMap.get("time").toString(); | 
|---|
|  |  |  | if (time1.equals(time2)) { | 
|---|
|  |  |  | tempAndCloudMap.putAll(beamMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (Map<String, Object> tempAndCloudMap : tempAndCloudList) { | 
|---|
|  |  |  | String time1 = tempAndCloudMap.get("time").toString(); | 
|---|
|  |  |  | for (Map<String, Object> O3Map : O3List) { | 
|---|
|  |  |  | if (O3List.size() != 0) { | 
|---|
|  |  |  | String time3 = O3Map.get("time").toString(); | 
|---|
|  |  |  | if (time1.equals(time3)) { | 
|---|
|  |  |  | tempAndCloudMap.putAll(O3Map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double tempSum = 0.0;//温度和 | 
|---|
|  |  |  | double O3Sum = 0.0;//O3和 | 
|---|
|  |  |  | double sum1 = 0.0;// | 
|---|
|  |  |  | double sum2 = 0.0; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double cloudSum = 0.0;//温度和 | 
|---|
|  |  |  | double beamSum = 0.0;//O3和 | 
|---|
|  |  |  | double sum3 = 0.0;// | 
|---|
|  |  |  | double sum4 = 0.0; | 
|---|
|  |  |  | int size = tempAndCloudList.size(); | 
|---|
|  |  |  | Map<String, Object> cmap = new HashMap<>(); | 
|---|
|  |  |  | cmap.put("time", hour); | 
|---|
|  |  |  | for (Map<String, Object> listMap : tempAndCloudList) { | 
|---|
|  |  |  | //O3 | 
|---|
|  |  |  | double temp = Double.valueOf(listMap.get("temp").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | if (listMap.get("O3") != null) { | 
|---|
|  |  |  | double O3 = Double.valueOf(listMap.get("O3").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | tempSum = tempSum + temp; | 
|---|
|  |  |  | O3Sum = O3Sum + O3; | 
|---|
|  |  |  | sum1 = sum1 + temp * O3; | 
|---|
|  |  |  | sum2 = sum2 + temp * temp; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //光照 | 
|---|
|  |  |  | double cloud = Double.valueOf(listMap.get("cloud").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | if (listMap.get("beam") != null) { | 
|---|
|  |  |  | double beam = Double.valueOf(listMap.get("beam").toString().replace("\"", "").split("\\.")[0]); | 
|---|
|  |  |  | cloudSum = cloudSum + cloud; | 
|---|
|  |  |  | beamSum = beamSum + beam; | 
|---|
|  |  |  | sum3 = sum3 + cloud * beam; | 
|---|
|  |  |  | sum4 = sum4 + cloud * cloud; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (tempSum != 0.0) { | 
|---|
|  |  |  | double tempAvg = tempSum / size; | 
|---|
|  |  |  | double O3Avg = O3Sum / size; | 
|---|
|  |  |  | double b = (sum1 - size * tempAvg * O3Avg) / (sum2 - size * tempAvg * tempAvg); | 
|---|
|  |  |  | double a = O3Avg - (b * tempAvg); | 
|---|
|  |  |  | cmap.put("a", a); | 
|---|
|  |  |  | cmap.put("b", b); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (cloudSum != 0.0) { | 
|---|
|  |  |  | double cloudAvg = cloudSum / size; | 
|---|
|  |  |  | double beamAvg = beamSum / size; | 
|---|
|  |  |  | double n = (sum3 - size * cloudAvg * beamAvg) / (sum4 - size * cloudAvg * cloudAvg); | 
|---|
|  |  |  | double m = beamAvg - (n * cloudAvg); | 
|---|
|  |  |  | cmap.put("m", m); | 
|---|
|  |  |  | cmap.put("n", n); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (cmap.get("a") != null) { | 
|---|
|  |  |  | Double a = Double.valueOf(cmap.get("a").toString()); | 
|---|
|  |  |  | Double b = Double.valueOf(cmap.get("b").toString()); | 
|---|
|  |  |  | double O3C = b * Double.valueOf(nextDayTemp) + a; | 
|---|
|  |  |  | if (O3C < 1.0) { | 
|---|
|  |  |  | O3C=1.0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | dataMap.put("O3C", String.valueOf(Math.round(O3C))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (cmap.get("m") != null) { | 
|---|
|  |  |  | Double m = Double.valueOf(cmap.get("m").toString()); | 
|---|
|  |  |  | Double n = Double.valueOf(cmap.get("n").toString()); | 
|---|
|  |  |  | double beam = n * Double.valueOf(nextDayCloud) + m; | 
|---|
|  |  |  | if (beam < 1.0) { | 
|---|
|  |  |  | beam=1.0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | dataMap.put("beam", String.valueOf(Math.round(beam))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | dataMap.remove("icon"); | 
|---|
|  |  |  | dataMap.remove("fxTime"); | 
|---|
|  |  |  | hashMap.put("json", JSONObject.toJSONString(dataMap)); | 
|---|
|  |  |  | resultList.add(hashMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | resultList.remove(0); | 
|---|
|  |  |  | for (Map<String, Object> resultMap : resultList) { | 
|---|
|  |  |  | Map<String, Object> jsonMap = (Map<String, Object>) JSONObject.parse(resultMap.get("json").toString()); | 
|---|
|  |  |  | jsonMap.remove("fxTime"); | 
|---|
|  |  |  | jsonMap.remove("icon"); | 
|---|
|  |  |  | resultMap.put("json", JSONObject.toJSONString(jsonMap)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Map<String, Object> parameters = new HashMap<>(); | 
|---|
|  |  |  | parameters.put("start", start); | 
|---|