package com.moral.service.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.dom4j.Element; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.JSONObject; import com.moral.common.util.Dom4jUtils; import com.moral.common.util.ValidateUtil; import com.moral.entity.Area; import com.moral.entity.AreaNames; import com.moral.entity.City; import com.moral.entity.MonitorPoint; import com.moral.entity.Organization; import com.moral.entity.Province; import com.moral.mapper.AreaMapper; import com.moral.mapper.CityMapper; import com.moral.mapper.ForecastWeatherMapper; import com.moral.mapper.HangzhouAqiMapper; import com.moral.mapper.MonitorPointMapper; import com.moral.mapper.ProvinceMapper; import com.moral.mapper.RealTimeWeatherMapper; import com.moral.service.OrganizationService; import com.moral.service.WeatherService; @Service public class WeatherServiceImpl implements WeatherService { @Resource private OrganizationService organizationService; @Resource private HangzhouAqiMapper hangzhouAqiMapper; @Resource private MonitorPointMapper monitorPointMapper; @Resource private ForecastWeatherMapper forecastWeatherMapper; @Resource private AreaMapper areaMapper; @Resource private CityMapper cityMapper; @Resource private ProvinceMapper provinceMapper; @Resource private RealTimeWeatherMapper realTimeWeatherMapper; @Override public Map getWeatherDataByRegion(Map parameters) { Object organizationId = parameters.get("organizationId"); ValidateUtil.notNull(organizationId, "param.is.null"); String areaName = "昆山市"; String parentName = ""; Organization organization = organizationService.getOrganizationById(Integer.valueOf(parameters.get("organizationId").toString())); if (organization.getAreaNames() != null) { AreaNames areaNames = organization.getAreaNames(); if (ObjectUtils.isEmpty(areaNames.getAreaName())) { if (ObjectUtils.isEmpty(areaNames.getCityName())) { areaName = areaNames.getProvinceName(); } else { areaName = areaNames.getCityName(); } } else { areaName = areaNames.getAreaName(); parentName = areaNames.getCityName(); if ("市辖区".equals(areaName)) { areaName = parentName; } } } List elements = Dom4jUtils.readDocument(); String cityID = "1102"; for (Element element : elements) { String name = element.element("name").getText(); if (areaName.equals(name)) { cityID = element.element("Fid").getText(); break; } if (name.endsWith(areaName)) { if (name.startsWith(parentName)) { cityID = element.element("Fid").getText(); break; } } } RestTemplate restTemplate = new RestTemplate(); Map map = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=aqi", Map.class, cityID); Map result = (Map) ((Map) map.get("data")).get("aqi"); map = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=condition", Map.class, cityID); result.putAll((Map) ((Map) map.get("data")).get("condition")); return result; } @Override public Map get15DayWeatherDataByRegion(Map parameters) { Object organizationId = parameters.get("organizationId"); ValidateUtil.notNull(organizationId, "param.is.null"); String areaName = "昆山市"; String parentName = ""; Organization organization = organizationService.getOrganizationById(Integer.valueOf(parameters.get("organizationId").toString())); if (organization.getAreaNames() != null) { AreaNames areaNames = organization.getAreaNames(); if (ObjectUtils.isEmpty(areaNames.getAreaName())) { if (ObjectUtils.isEmpty(areaNames.getCityName())) { areaName = areaNames.getProvinceName(); } else { areaName = areaNames.getCityName(); } } else { areaName = areaNames.getAreaName(); parentName = areaNames.getCityName(); if ("市辖区".equals(areaName)) { areaName = parentName; } } } List elements = Dom4jUtils.readDocument(); String cityID = "1102"; for (Element element : elements) { String name = element.element("name").getText(); if (areaName.equals(name)) { cityID = element.element("Fid").getText(); break; } if (name.endsWith(areaName)) { if (name.startsWith(parentName)) { cityID = element.element("Fid").getText(); break; } } } RestTemplate restTemplate = new RestTemplate(); Map map = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=aqi", Map.class, cityID); List> result = new ArrayList<>(); map = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=forecast15days", Map.class, cityID); result.addAll((Collection>) ((Map) map.get("data")).get("forecast")); for (Map map2 : result) { Map returnMap = new HashMap<>(); String predictDate = map2.get("predictDate").toString(); String time = parameters.get("time").toString(); if (predictDate.equals(time)) { returnMap = map2; return returnMap; } } return null; } @Override public List> getForecastAndReal(Map parameters) throws ParseException { String monitorPointId = parameters.get("monitorPointId").toString(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = parameters.get("time").toString() + " 00:00:00"; Calendar c = Calendar.getInstance(); c.setTime(sdf.parse(time)); c.add(Calendar.HOUR_OF_DAY, 1); time = sdf.format(c.getTime()); c.add(Calendar.DAY_OF_MONTH, 1); String nextDay = sdf.format(c.getTime()); parameters.put("start", sdf.parse(time)); parameters.put("end", sdf.parse(nextDay)); List> forecastList = forecastWeatherMapper.getForecastHour(parameters); MonitorPoint monitorPoint = monitorPointMapper.selectByPrimaryKey(Integer.valueOf(monitorPointId)); parameters.put("areaCode", monitorPoint.getAreaCode()); String sensors = "O3C"; String sensor1 = "O3"; parameters.put("sensors", sensors); parameters.put("sensors1", sensor1); parameters.put("sensors2", sensor1); List> aqiList = hangzhouAqiMapper.getAqiDataByAreaCode(parameters); if (aqiList.size() == 0) { parameters.put("areaCode", monitorPoint.getCityCode()); aqiList = hangzhouAqiMapper.getAqiDataByAreaCode(parameters); } for (Map map : aqiList) { String O3 = map.get("O3").toString().replace("\"", ""); map.put("O3", O3); } List> resultList = new ArrayList<>(); if (forecastList.size() == 0 && aqiList.size() == 0) { return new ArrayList<>(); } else if (forecastList.size() == 0) { for (Map aqiMap : aqiList) { Map map = new HashMap<>(); List values = new ArrayList<>(); String hour = aqiMap.get("time").toString().split(" ")[1].split(":")[0]; if (hour.equals("00")) { hour = "24"; } map.put("time", Integer.valueOf(hour)); values.add(""); values.add(aqiMap.get(sensor1).toString()); map.put("values", values); resultList.add(map); } } else if (aqiList.size() == 0) { for (Map forecastMap : forecastList) { Map map = new HashMap<>(); List values = new ArrayList<>(); String hour = forecastMap.get("time").toString().split(" ")[1].split(":")[0]; if (hour.equals("00")) { hour = "24"; } map.put("time", Integer.valueOf(hour)); values.add(forecastMap.get("result").toString().replace("\"", "")); values.add(""); map.put("values", values); resultList.add(map); } } else { for (Map forecastMap : forecastList) { Map map = new HashMap<>(); List values = new ArrayList<>(); String hour = forecastMap.get("time").toString().split(" ")[1].split(":")[0]; if (hour.equals("00")) { hour = "24"; } map.put("time", Integer.valueOf(hour)); values.add(forecastMap.get("result").toString().replace("\"", "")); for (Map aqiMap : aqiList) { if (forecastMap.get("time").equals(aqiMap.get("time"))) { values.add(aqiMap.get(sensor1).toString()); } } map.put("values", values); resultList.add(map); } } for (Map resultMap : resultList) { ArrayList values = (ArrayList) resultMap.get("values"); if (values.size() == 1) { values.add(""); } } return resultList; } @Override public List> getWeatherData(Map parameters) throws ParseException { String cityName = parameters.get("city").toString(); Area area = areaMapper.getAreaByName(cityName); MonitorPoint monitorPoint; Integer areaCode = 0; Integer cityCode = 0; if (area == null) { City city = cityMapper.getCityByName(cityName); if (city == null) { Province province = provinceMapper.getProvinceByName(cityName); Integer provinceCode = province.getProvinceCode(); monitorPoint = monitorPointMapper.getFirstMonitorPointByProvinceCode(provinceCode); parameters.put("areaCode", provinceCode); parameters.put("city", province.getProvinceName()); } else { cityCode = city.getCityCode(); monitorPoint = monitorPointMapper.getFirstMonitorPointByCityCode(cityCode); parameters.put("areaCode", cityCode); parameters.put("city", city.getCityName()); } } else { areaCode = area.getAreaCode(); monitorPoint = monitorPointMapper.getFirstMonitorPointByAreaCode(areaCode); cityCode = area.getCityCode(); parameters.put("areaCode", areaCode); parameters.put("city", area.getAreaName()); } if (monitorPoint == null) { return new ArrayList<>(); } parameters.put("monitorPointId", monitorPoint.getId()); String time = parameters.get("time").toString(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(sdf.parse(time)); c.add(Calendar.HOUR_OF_DAY, 1); Date start = c.getTime(); c.add(Calendar.DAY_OF_MONTH, 1); Date end = c.getTime(); parameters.put("start", start); parameters.put("end", end); List> forecastList = forecastWeatherMapper.getForecast(parameters); List> aqiList = hangzhouAqiMapper.getAqi(parameters); if (aqiList.size() == 0) { parameters.put("areaCode", cityCode); aqiList = hangzhouAqiMapper.getAqi(parameters); } List> list1 = new ArrayList<>(); for (Map map : aqiList) { Map hashMap = new HashMap<>(); hashMap.put("time", map.get("time")); Map jsonMap = (Map) JSONObject.parse(map.get("json").toString()); hashMap.putAll(jsonMap); hashMap.put("city", parameters.get("city").toString()); list1.add(hashMap); } List> realTimeList = realTimeWeatherMapper.getRealTimeWeather(parameters); List> realList = new ArrayList<>(); for (Map map : realTimeList) { Map hashMap = new HashMap<>(); hashMap.put("time", map.get("time")); hashMap.put("type", "实际"); hashMap.put("city", parameters.get("city").toString()); Map jsonMap = (Map) JSONObject.parse(map.get("json").toString()); hashMap.putAll(jsonMap); realList.add(hashMap); } for (Map realTimeMap : realList) { for (Map aqiMap : list1) { if (aqiMap.get("time").equals(realTimeMap.get("time"))) { realTimeMap.putAll(aqiMap); } } } List> foreList = new ArrayList<>(); for (Map forecastMap : forecastList) { Map jsonMap = (Map) JSONObject.parse(forecastMap.get("json").toString()); Map hashMap = new HashMap<>(); hashMap.put("temp", jsonMap.get("tem")); hashMap.put("windDir", jsonMap.get("win")); hashMap.put("windLevel", jsonMap.get("win_speed")); hashMap.put("condition", jsonMap.get("wea")); hashMap.put("time", forecastMap.get("time").toString()); hashMap.put("type", "预测"); hashMap.put("city", parameters.get("city").toString()); foreList.add(hashMap); } List> resultList = new ArrayList<>(); for (Map foreMap : foreList) { for (Map realMap : realList) { if (foreMap.get("time").equals(realMap.get("time"))) { resultList.add(foreMap); resultList.add(realMap); } } } for (int i = realList.size(); i < forecastList.size(); i++) { Map map = foreList.get(i); resultList.add(map); Map hashMap = new HashMap<>(); hashMap.put("time", map.get("time").toString()); hashMap.put("type", "实际"); hashMap.put("city", parameters.get("city").toString()); resultList.add(hashMap); } return resultList; } }