jinpengyong
2020-07-29 bc6aaea416da40038dee2df1b3de4a1581da2a48
src/main/java/com/moral/service/impl/WeatherServiceImpl.java
@@ -7,7 +7,6 @@
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -18,6 +17,7 @@
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;
@@ -25,11 +25,14 @@
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;
@@ -46,6 +49,9 @@
    private MonitorPointMapper monitorPointMapper;
    @Resource
    private ForecastWeatherMapper forecastWeatherMapper;
    @Resource
    private AreaMapper areaMapper;
    @Resource
@@ -53,6 +59,9 @@
    @Resource
    private ProvinceMapper provinceMapper;
    @Resource
    private RealTimeWeatherMapper realTimeWeatherMapper;
    @Override
    public Map<String, Object> getWeatherDataByRegion(Map<String, Object> parameters) {
@@ -156,124 +165,208 @@
    }
    @Override
    public List<Map<String, Object>> getNextDayWeatherDataByRegion(Map<String, Object> parameters) throws ParseException {
    public List<Map<String, Object>> getForecastAndReal(Map<String, Object> 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<Map<String, Object>> forecastList = forecastWeatherMapper.getForecastHour(parameters);
        MonitorPoint monitorPoint = monitorPointMapper.selectByPrimaryKey(Integer.valueOf(monitorPointId));
        Integer cityCode = monitorPoint.getCityCode();
        Integer areaCode = monitorPoint.getAreaCode();
        String name1 = "";
        String parentName = "";
        if (areaCode != null) {
            Area area = areaMapper.selectByPrimaryKey(areaCode);
            name1 = area.getAreaName();
            City city = cityMapper.selectByPrimaryKey(area.getCityCode());
            parentName = city.getCityName();
            if ("市辖区".equals(area.getAreaName())) {
                name1 = parentName;
                parentName = provinceMapper.selectByPrimaryKey(city.getProvinceCode()).getProvinceName();
        parameters.put("areaCode", monitorPoint.getAreaCode());
        String sensors = "O3C";
        String sensor1 = "O3";
        parameters.put("sensors", sensors);
        parameters.put("sensors1", sensor1);
        parameters.put("sensors2", sensor1);
        List<Map<String, Object>> aqiList = hangzhouAqiMapper.getAqiDataByAreaCode(parameters);
        if (aqiList.size() == 0) {
            parameters.put("areaCode", monitorPoint.getCityCode());
            aqiList = hangzhouAqiMapper.getAqiDataByAreaCode(parameters);
        }
        for (Map<String, Object> map : aqiList) {
            String O3 = map.get("O3").toString().replace("\"", "");
            map.put("O3", O3);
        }
        List<Map<String, Object>> resultList = new ArrayList<>();
        if (forecastList.size() == 0 && aqiList.size() == 0) {
            return new ArrayList<>();
        } else if (forecastList.size() == 0) {
            for (Map<String, Object> aqiMap : aqiList) {
                Map<String, Object> map = new HashMap<>();
                List<String> 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<String, Object> forecastMap : forecastList) {
                Map<String, Object> map = new HashMap<>();
                List<String> 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 {
            City city = cityMapper.selectByPrimaryKey(cityCode);
            name1 = city.getCityName();
            parentName = provinceMapper.selectByPrimaryKey(city.getProvinceCode()).getProvinceName();
            for (Map<String, Object> forecastMap : forecastList) {
                Map<String, Object> map = new HashMap<>();
                List<String> values = new ArrayList<>();
                String hour = forecastMap.get("time").toString().split(" ")[1].split(":")[0];
                if (hour.equals("00")) {
                    hour = "24";
        }
        List<Element> elements = Dom4jUtils.readDocument();
        String cityID = "101190404";
        for (Element element : elements) {
            String name2 = element.element("name").getText();
            if (name1.equals(name2)) {
                cityID = element.element("Fweathercn").getText();
                break;
            }
            if (name2.endsWith(name1)) {
                if (name2.startsWith(parentName)) {
                    cityID = element.element("Fweathercn").getText();
                    break;
                map.put("time", Integer.valueOf(hour));
                values.add(forecastMap.get("result").toString().replace("\"", ""));
                for (Map<String, Object> aqiMap : aqiList) {
                    if (forecastMap.get("time").equals(aqiMap.get("time"))) {
                        values.add(aqiMap.get(sensor1).toString());
                }
            }
                map.put("values", values);
                resultList.add(map);
        }
        RestTemplate restTemplate = new RestTemplate();
        Calendar c = Calendar.getInstance();
        }
        for (Map<String, Object> resultMap : resultList) {
            ArrayList<String> values = (ArrayList<String>) resultMap.get("values");
            if (values.size() == 1) {
                values.add("");
            }
        }
        return resultList;
    }
    @Override
    public List<Map<String, Object>> getWeatherData(Map<String, Object> 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");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH");
        String now = sdf.format(c.getTime());
        String selectTime = parameters.get("time").toString();
        Date t1 = sdf.parse(selectTime);
        Date t2 = sdf.parse(now);
        List<Map<String, Object>> resultList = new ArrayList<>();
        if (t1.getTime() > t2.getTime()) {
            parameters.put("now", now);
            Map<String, Object> map = restTemplate.getForObject("https://yiketianqi.com/api?version=v9&appid=68884517&appsecret=St9sFnvi&cityid={1}", Map.class, cityID);
            ArrayList<Map<String, Object>> dataList = (ArrayList<Map<String, Object>>) map.get("data");
            ArrayList<Map<String, Object>> arrayList = new ArrayList<>();
            String start = parameters.get("now").toString();
            String end = parameters.get("time").toString();
            for (Map<String, Object> dataMap : dataList) {
                String date = dataMap.get("date").toString();
                ArrayList<Map<String, Object>> list = (ArrayList<Map<String, Object>>) dataMap.get("hours");
                if (date.equals(start)) {
                    for (int i = list.size() - 7; i < list.size(); i++) {
                        Map<String, Object> resultMap = list.get(i);
                        arrayList.add(resultMap);
        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<Map<String, Object>> forecastList = forecastWeatherMapper.getForecast(parameters);
        List<Map<String, Object>> aqiList = hangzhouAqiMapper.getAqi(parameters);
        if (aqiList.size() == 0) {
            parameters.put("areaCode", cityCode);
            aqiList = hangzhouAqiMapper.getAqi(parameters);
                    }
        List<Map<String, Object>> list1 = new ArrayList<>();
        for (Map<String, Object> map : aqiList) {
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("time", map.get("time"));
            Map<String, Object> jsonMap = (Map<String, Object>) JSONObject.parse(map.get("json").toString());
            hashMap.putAll(jsonMap);
            hashMap.put("city", parameters.get("city").toString());
            list1.add(hashMap);
                }
                if (date.equals(end)) {
                    for (int i = 0; i < 17; i++) {
                        Map<String, Object> resultMap = list.get(i);
                        arrayList.add(resultMap);
        List<Map<String, Object>> realTimeList = realTimeWeatherMapper.getRealTimeWeather(parameters);
        List<Map<String, Object>> realList = new ArrayList<>();
        for (Map<String, Object> map : realTimeList) {
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("time", map.get("time"));
            hashMap.put("type", "实际");
            hashMap.put("city", parameters.get("city").toString());
            Map<String, Object> jsonMap = (Map<String, Object>) JSONObject.parse(map.get("json").toString());
            hashMap.putAll(jsonMap);
            realList.add(hashMap);
        }
        for (Map<String, Object> realTimeMap : realList) {
            for (Map<String, Object> aqiMap : list1) {
                if (aqiMap.get("time").equals(realTimeMap.get("time"))) {
                    realTimeMap.putAll(aqiMap);
                    }
                }
            }
            for (Map<String, Object> resultMap : arrayList) {
                Map<String, Object> hashMap = new LinkedHashMap<>();
                List<String> values = new ArrayList<>();
                String hour = resultMap.get("hours").toString().replaceAll("[\u4e00-\u9fa5]+", "");
                values.add(resultMap.get("tem").toString());
                values.add("");
                hashMap.put("values", values);
                hashMap.put("time", Integer.valueOf(hour));
                if (Integer.valueOf(hour) == 0) {
                    hashMap.put("time", 24);
        List<Map<String, Object>> foreList = new ArrayList<>();
        for (Map<String, Object> forecastMap : forecastList) {
            Map<String, Object> jsonMap = (Map<String, Object>) JSONObject.parse(forecastMap.get("json").toString());
            Map<String, Object> 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<Map<String, Object>> resultList = new ArrayList<>();
        for (Map<String, Object> foreMap : foreList) {
            for (Map<String, Object> 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<String, Object> map = foreList.get(i);
            resultList.add(map);
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("time", map.get("time").toString());
            hashMap.put("type", "实际");
            hashMap.put("city", parameters.get("city").toString());
                resultList.add(hashMap);
            }
        } else {
            parameters.put("start", selectTime);
            c.setTime(sdf.parse(selectTime));
            c.add(Calendar.DAY_OF_MONTH, 1);
            c.add(Calendar.HOUR_OF_DAY, 1);
            String end = sdf1.format(c.getTime());
            parameters.put("end", end);
            parameters.put("sensors", "O3C");
            parameters.put("sensors1", "O3");
            parameters.put("sensors2", parameters.get("sensors1").toString());
            List<Map<String, Object>> areaList = new ArrayList<>();
            if (areaCode == null) {
                parameters.put("areaCode", cityCode);
                areaList = hangzhouAqiMapper.getAreaAvgDataByAreaCode(parameters);
            } else {
                parameters.put("areaCode", areaCode);
                areaList = hangzhouAqiMapper.getAreaAvgDataByAreaCode(parameters);
                if (areaList.size() == 0) {
                    parameters.put("areaCode", cityCode);
                    areaList = hangzhouAqiMapper.getAreaAvgDataByAreaCode(parameters);
                }
            }
            areaList.remove(0);
            for (Map<String, Object> areaMap : areaList) {
                Map<String, Object> hashMap = new LinkedHashMap<>();
                List<String> values = new ArrayList<>();
                values.add("");
                values.add(areaMap.get("O3").toString());
                hashMap.put("values", values);
                String hour = areaMap.get("time").toString().split(" ")[1];
                hashMap.put("time", Integer.valueOf(hour));
                if (Integer.valueOf(hour) == 0) {
                    hashMap.put("time", 24);
                }
                resultList.add(hashMap);
            }
        }
        return resultList;
    }