| 
					
				 | 
			
			
				@@ -0,0 +1,227 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 文 件 名:  WeatherColAmapServiceImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 版    权: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 描    述:  <描述> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 修 改 人:  learshaw 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 修改时间:  2021/9/22 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 跟踪单号:  <跟踪单号> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 修改单号:  <修改单号> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 修改内容:  <修改内容> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.huashe.common.data.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.data.config.JuheWeatherConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.data.mapper.AdmWeatherForecastMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.data.mapper.AdmWeatherRtMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.data.service.RegionService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.data.service.WeatherColService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.domain.model.Region; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.domain.model.WeatherForecast; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.domain.model.WeatherRt; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.exception.Assert; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.huashe.common.utils.HttpUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.ArrayUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Date; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 天气实时采集-聚合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * <功能详细描述> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @author learshaw 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @version [版本号, 2021/9/22] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @see [相关类/方法] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @since [产品/模块版本] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Service("weatherColJuheService") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@ConditionalOnProperty(prefix = "weather", name = "service-provider", havingValue = "juhe", matchIfMissing = false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class WeatherColJuheServiceImpl implements WeatherColService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static final Logger log = LoggerFactory.getLogger(WeatherColJuheServiceImpl.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 系统配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private JuheWeatherConfig config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private AdmWeatherRtMapper weatherRtMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private AdmWeatherForecastMapper weatherForecastMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${weather.region.conf-adcodes}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String weatherAdcodes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 区域映射装配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private RegionService regionService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 天气采集 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void collect() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<Region> regions = getArea(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (Region region : regions) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                colSingle(region); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("collect weather fail!", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void colSingle(Region region) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String dfUrl = StringUtils.replace(config.getUrl(), "#{cityname}", region.getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.debug("get url:\r\n{}", dfUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String res = HttpUtils.doGet(dfUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.debug("get res:\r\n{}", res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject resBody = JSON.parseObject(res); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String code = resBody.getString("error_code"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.isTrue(StringUtils.equals(code, "0"), -1, resBody.getString("reason")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject result = resBody.getJSONObject("result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (null != result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONObject realtime = result.getJSONObject("realtime"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (null != realtime) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    WeatherRt weatherRt = convertRt(region, realtime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    weatherRtMapper.merge(weatherRt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONArray future = result.getJSONArray("future"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (null != future) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<WeatherForecast> forecasts = convertForecast(region, future); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (CollectionUtils.isNotEmpty(forecasts)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        weatherForecastMapper.deleteByAdcode(region.getAdcode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        weatherForecastMapper.insertBatch(forecasts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        weatherForecastMapper.deleteByAdcode(region.getAdcode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("collectRt fail!", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<Region> getArea() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Region> areas = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 直辖市 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Region> municipalitys = regionService.getMunicipality(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        areas.addAll(municipalitys); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 省会城市 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Region param = new Region(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        param.setAreaType(2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Region> regions = regionService.getRegion(param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        areas.addAll(regions); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 自定义城市 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] areaArray = StringUtils.split(weatherAdcodes, ","); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (ArrayUtils.isNotEmpty(areaArray)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (String areacode : areaArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Region region = regionService.getRegionByCode(areacode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                areas.add(region); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return areas; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private WeatherRt convertRt(Region region, JSONObject jsObj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        WeatherRt po = new WeatherRt(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setAdcode(region.getAdcode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setAreaName(region.getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setDate(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String weather = jsObj.getString("info"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setWeatherCn(weather); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String weatherStr = StringUtils.contains(weather, "-") ? StringUtils.substringBefore(weather, "-") : weather; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setWeatherType(config.getWeatherTypeByName(weatherStr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setTemperature(jsObj.getDouble("temperature")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setHumidity(jsObj.getInteger("humidity")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setWindPower(jsObj.getString("power")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setWindDirection(jsObj.getString("direct")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        po.setReportTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return po; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<WeatherForecast> convertForecast(Region region, JSONArray jsonArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date date = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<WeatherForecast> forecastList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        jsonArray.forEach(item -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject entity = (JSONObject) item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            WeatherForecast forecast = new WeatherForecast(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setAdcode(region.getAdcode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setAreaName(region.getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setDate(entity.getDate("date")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String dayWeather = entity.getString("weather"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setDayWeatherCn(dayWeather); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String weatherStr = StringUtils.contains(dayWeather, "-") ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                StringUtils.substringBefore(dayWeather, "-") : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dayWeather; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setDayWeatherType(config.getWeatherTypeByName(weatherStr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String nightWeather = entity.getString("dayWeather"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setNightWeatherCn(nightWeather); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String weatherStr2 = StringUtils.contains(nightWeather, "-") ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                StringUtils.substringBefore(nightWeather, "-") : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                nightWeather; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setNightWeatherType(config.getWeatherTypeByName(weatherStr2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String temp = entity.getString("temperature"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setDayTemp(safeDouble(StringUtils.substringAfter(temp, "/"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setNightTemp(safeDouble(StringUtils.substringBefore(temp, "/"))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setDayWindDir(entity.getString("direct")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setNightWindDir(entity.getString("direct")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecast.setReportTime(date); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            forecastList.add(forecast); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return forecastList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Double safeDouble(String str) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Double ret = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ret = Double.valueOf(str); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |