Ver código fonte

天气服务切换聚合数据

learshaw 2 meses atrás
pai
commit
fcda33b095
19 arquivos alterados com 525 adições e 200 exclusões
  1. 0 13
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/AmapWeatherConfig.java
  2. 2 47
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/CollectConfig.java
  3. 103 0
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/JuheWeatherConfig.java
  4. 4 26
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/controller/WeatherController.java
  5. 1 1
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/mapper/AdmWeatherRtMapper.java
  6. 11 2
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/mapper/DimGbRegionMapper.java
  7. 9 2
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/RegionService.java
  8. 7 52
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/TaskService.java
  9. 1 8
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/WeatherColService.java
  10. 32 5
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/RegionServiceImpl.java
  11. 73 10
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherColAmapServiceImpl.java
  12. 227 0
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherColJuheServiceImpl.java
  13. 4 1
      common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherServiceImpl.java
  14. 17 7
      common-cloud/tool-modules/general-data/src/main/resources/application-local.yml
  15. 17 7
      common-cloud/tool-modules/general-data/src/main/resources/application-prod-139.yml
  16. 2 2
      common-cloud/tool-modules/general-data/src/main/resources/mapper/AdmWeatherRtMapper.xml
  17. 9 3
      common-cloud/tool-modules/general-data/src/main/resources/mapper/DimGbRegionMapper.xml
  18. 2 11
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java
  19. 4 3
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/WeatherServiceImpl.java

+ 0 - 13
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/AmapWeatherConfig.java

@@ -44,11 +44,6 @@ public class AmapWeatherConfig extends BaseWeather {
     private String key;
 
     /**
-     * 结果类型
-     */
-    private String extensions;
-
-    /**
      * 天气映射
      */
     private Map<String, String> weatherMapper;
@@ -75,14 +70,6 @@ public class AmapWeatherConfig extends BaseWeather {
         this.key = key;
     }
 
-    public String getExtensions() {
-        return extensions;
-    }
-
-    public void setExtensions(String extensions) {
-        this.extensions = extensions;
-    }
-
     public String getWeatherTypeByName(String name) {
         String ret = null;
 

+ 2 - 47
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/CollectConfig.java

@@ -10,20 +10,15 @@
  */
 package com.huashe.common.data.config;
 
-import com.huashe.common.data.service.RegionService;
 import com.huashe.common.data.service.WeatherColService;
 import com.huashe.common.exception.BusinessException;
-import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import org.springframework.stereotype.Service;
 
 /**
  * 采集业务配置
@@ -36,53 +31,13 @@ import java.util.List;
  */
 @Configuration
 public class CollectConfig {
-    @Value("${weather.service-provider}")
-    private String weatherServiceProvider;
-
-    @Value("${weather.region.conf-adcodes}")
-    private String weatherAdcodes;
 
-    @Value("${weather.region.source}")
-    private String weatcherAdcodeSource;
 
     @Value("${holiday.url}")
     private String holidayColUrl;
 
-    /**
-     * 区域映射装配
-     */
-    @Resource
-    private RegionService regionService;
-
-    @Bean(value = "weatherColService")
-    public WeatherColService weatherColService(
-        @Qualifier(value = "weatherColAmapService") WeatherColService amapColService) {
-        if (StringUtils.equals("amap", weatherServiceProvider)) {
-            return amapColService;
-        }
-        else {
-            throw new BusinessException(-1, "serviceProvider 未匹配!");
-        }
-    }
-
-    /**
-     * 获取天气采集目标行政区划
-     * @return
-     */
-    public List<String> getWeatherAdcodes(){
-        if (StringUtils.equals("db", weatcherAdcodeSource)) {
-            return regionService.getPrefectureLevelCity();
-        }
-        else {
-            String[] areaArray = null;
 
-            if (StringUtils.isBlank(weatherAdcodes)) {
-                areaArray = StringUtils.split(weatherAdcodes, ",");
-            }
 
-            return ArrayUtils.isNotEmpty(areaArray) ? Arrays.asList(areaArray) : new ArrayList<>();
-        }
-    }
 
     public String getHolidayColUrl() {
         return holidayColUrl;

+ 103 - 0
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/config/JuheWeatherConfig.java

@@ -0,0 +1,103 @@
+/*
+ * 文 件 名:  AmapWeatherConfig
+ * 版    权:
+ * 描    述:  <描述>
+ * 修 改 人:  learshaw
+ * 修改时间:  2021/9/22
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.huashe.common.data.config;
+
+import com.huashe.common.data.model.BaseWeather;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 高德天气配置
+ * <功能详细描述>
+ *
+ * @author learshaw
+ * @version [版本号, 2021/9/22]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@Configuration
+@ConfigurationProperties(prefix = "weather.juhe")
+public class JuheWeatherConfig extends BaseWeather {
+    /**
+     * 访问地址
+     * <br/>https://lbs.amap.com/api/webservice/guide/api/weatherinfo
+     */
+    private String url;
+
+    /**
+     * 高德访问
+     */
+    private String key;
+
+    /**
+     * 天气映射
+     */
+    private Map<String, String> weatherMapper;
+
+
+    @PostConstruct
+    public void init() {
+        this.weatherMapper = resetCacheMap(weatherList);
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getWeatherTypeByName(String name) {
+        String ret = null;
+
+        for (Map.Entry<String, String> entry : weatherMapper.entrySet()) {
+            String key = entry.getKey();
+
+            if (StringUtils.equals(name, key) || StringUtils.contains(name, key)) {
+                ret = entry.getValue();
+                break;
+            }
+        }
+
+        return ret;
+    }
+
+    public Map<String, String> resetCacheMap(List<String> list) {
+        Map<String, String> cacheMap = new HashMap<>();
+
+        for (String str : list) {
+            String[] array = StringUtils.split(str, ":");
+
+            String[] subKeys = StringUtils.split(array[1], ",");
+
+            for (String subKey : subKeys) {
+                cacheMap.put(subKey, array[0]);
+            }
+        }
+
+        return cacheMap;
+    }
+}

+ 4 - 26
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/controller/WeatherController.java

@@ -159,37 +159,15 @@ public class WeatherController {
     /**
      * 实时天气采集
      */
-    @RequestMapping(value = "/triggerColRt", method = RequestMethod.GET)
-    @ApiOperation(value = "/triggerColRt", notes = "触发-天气实况采集")
+    @RequestMapping(value = "/triggerCol", method = RequestMethod.GET)
+    @ApiOperation(value = "/triggerCol", notes = "触发-天气实况采集")
     @ApiResponses({ @ApiResponse(code = 200, message = "success"),
         @ApiResponse(code = 400, message = "{code:****,message:'fail'}")
     })
-    public CallResponse<Void> colRt() {
+    public CallResponse<Void> triggerCol() {
         CallResponse<Void> callResponse = new CallResponse<>();
         try {
-            taskService.collectWeatherRt();
-            callResponse.setCode(0);
-            callResponse.setMessage("success");
-        }
-        catch (Exception e) {
-            throw new BusinessException(-1, e.getMessage());
-        }
-
-        return callResponse;
-    }
-
-    /**
-     * 实时天气采集
-     */
-    @RequestMapping(value = "/triggerColForecast", method = RequestMethod.GET)
-    @ApiOperation(value = "/triggerColForecast", notes = "触发-预报天气采集")
-    @ApiResponses({ @ApiResponse(code = 200, message = "success"),
-        @ApiResponse(code = 400, message = "{code:****,message:'fail'}")
-    })
-    public CallResponse<Void> colForecast() {
-        CallResponse<Void> callResponse = new CallResponse<>();
-        try {
-            taskService.collectWeatherForecast();
+            taskService.collectWeather();
             callResponse.setCode(0);
             callResponse.setMessage("success");
         }

+ 1 - 1
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/mapper/AdmWeatherRtMapper.java

@@ -39,7 +39,7 @@ public interface AdmWeatherRtMapper {
      * @param adcode 行政区划代码
      * @return WeatherRt
      */
-    WeatherRt getNewByAdcode(@Param("adcode") String adcode);
+    WeatherRt getByAdcode(@Param("adcode") String adcode, @Param("date") String date);
 
     /**
      * 根据adcode和date查询

+ 11 - 2
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/mapper/DimGbRegionMapper.java

@@ -13,6 +13,7 @@ package com.huashe.common.data.mapper;
 import com.huashe.common.data.model.GbRegion;
 import com.huashe.common.domain.model.Region;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -28,6 +29,14 @@ import java.util.List;
 @Mapper
 public interface DimGbRegionMapper {
     /**
+     * 根据行政区划代码查询区域信息
+     *
+     * @param adcode 行政区划代码
+     * @return 区域信息
+     */
+    GbRegion getRegionByCode(String adcode);
+
+    /**
      * 查询全部行政区划
      *
      * @return 行政区划
@@ -42,9 +51,9 @@ public interface DimGbRegionMapper {
     List<GbRegion> getGbRegion(Region param);
 
     /**
-     * 查询地级
+     * 查询直辖
      *
      * @return 区域列表
      */
-    List<String> getPrefectureLevelCity();
+    List<GbRegion> getMunicipality();
 }

+ 9 - 2
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/RegionService.java

@@ -25,6 +25,13 @@ import java.util.List;
  */
 public interface RegionService {
     /**
+     * 查询行政区划
+     * @param adcode 行政区划编码
+     * @return 行政区划
+     */
+    Region getRegionByCode(String adcode);
+
+    /**
      * 查询全部行政区划
      *
      * @return 行政区划
@@ -39,9 +46,9 @@ public interface RegionService {
     List<Region> getRegion(Region param);
 
     /**
-     * 查询地级
+     * 查询直辖
      *
      * @return 区域列表
      */
-    List<String> getPrefectureLevelCity();
+    List<Region> getMunicipality();
 }

+ 7 - 52
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/TaskService.java

@@ -10,12 +10,10 @@
  */
 package com.huashe.common.data.service;
 
-import com.huashe.common.data.config.CollectConfig;
-import com.huashe.common.exception.Assert;
 import com.huashe.common.exception.BusinessException;
-import com.huashe.common.utils.ThreadUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.Async;
@@ -24,7 +22,6 @@ import org.springframework.scheduling.annotation.Scheduled;
 
 import javax.annotation.Resource;
 import java.util.Calendar;
-import java.util.List;
 
 /**
  * 任务驱动
@@ -40,12 +37,9 @@ import java.util.List;
 public class TaskService {
     private static final Logger log = LoggerFactory.getLogger(TaskService.class);
 
-    @Resource
-    private CollectConfig collectConfig;
-
-    @Resource
-    @Qualifier(value = "weatherColService")
-    private WeatherColService colService;
+    @Autowired
+    @Qualifier(value = "weatherColJuheService")
+    private WeatherColService weatherColService;
 
     @Resource
     private DateService dateService;
@@ -56,53 +50,14 @@ public class TaskService {
      * @see [类、类#方法、类#成员]
      */
     @Async
-    @Scheduled(cron = "${weather.rt-cron}")
-    public void collectWeatherRt() {
+    @Scheduled(cron = "${weather.cron}")
+    public void collectWeather() {
         log.info("开始天气采集任务...");
-
-        try {
-            List<String> adcodes = collectConfig.getWeatherAdcodes();
-            Assert.notNull(adcodes, -1, "area is null!");
-
-            for (String area : adcodes) {
-                colService.collectRt(area);
-                ThreadUtils.sleep(1000);
-            }
-        }
-        catch (BusinessException e) {
-            log.error("collectWeatherRt fail!", e);
-        }
-
+        weatherColService.collect();
         log.info("天气实况采集完成.");
     }
 
     /**
-     * 天气实况采集
-     *
-     * @see [类、类#方法、类#成员]
-     */
-    @Async
-    @Scheduled(cron = "${weather.forecast-cron}")
-    public void collectWeatherForecast() {
-        log.info("开始天气采集任务...");
-
-        try {
-            List<String> adcodes = collectConfig.getWeatherAdcodes();
-            Assert.notNull(adcodes, -1, "area is null!");
-
-            for (String area : adcodes) {
-                colService.collectForecast(area);
-                ThreadUtils.sleep(1000);
-            }
-        }
-        catch (BusinessException e) {
-            log.error("collectWeatherForecast fail!", e);
-        }
-
-        log.info("天气预报采集完成.");
-    }
-
-    /**
      * 采集节假日信息
      *
      * @see [类、类#方法、类#成员]

+ 1 - 8
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/WeatherColService.java

@@ -25,12 +25,5 @@ public interface WeatherColService {
      *
      * @return 小时实时天气
      */
-    void collectRt(String adcode);
-
-    /**
-     * 按小时采集
-     *
-     * @return 小时实时天气
-     */
-    void collectForecast(String adcode);
+    void collect();
 }

+ 32 - 5
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/RegionServiceImpl.java

@@ -41,6 +41,16 @@ public class RegionServiceImpl implements RegionService {
     private DimGbRegionMapper regionMapper;
 
     @Override
+    public Region getRegionByCode(String adcode) {
+        GbRegion gbRegion = regionMapper.getRegionByCode(adcode);
+
+        Region region = new Region();
+        BeanUtils.copyProperties(gbRegion, region);
+
+        return region;
+    }
+
+    @Override
     public List<Region> getAll() {
         List<GbRegion> regions = regionMapper.getAll();
         List<Region> tmpList = ListUtils.convert(regions, gbRegion -> {
@@ -49,11 +59,14 @@ public class RegionServiceImpl implements RegionService {
             return region;
         });
 
-        List<Region> rootList = ListUtils.filterList(tmpList, region -> region.getParentArea() == null, new ArrayList<>());
+        List<Region> rootList = ListUtils.filterList(tmpList, region -> region.getParentArea() == null,
+            new ArrayList<>());
 
         if (CollectionUtils.isNotEmpty(rootList)) {
-            List<Region> subList = ListUtils.filterList(tmpList, region -> region.getParentArea() != null, new ArrayList<>());
-            Map<String, List<Region>> regionMap = subList.stream().collect(Collectors.groupingBy(Region::getParentArea));
+            List<Region> subList = ListUtils.filterList(tmpList, region -> region.getParentArea() != null,
+                new ArrayList<>());
+            Map<String, List<Region>> regionMap = subList.stream()
+                .collect(Collectors.groupingBy(Region::getParentArea));
 
             for (Region region : rootList) {
                 region.setChildren(buildSub(regionMap, region.getAdcode()));
@@ -95,7 +108,21 @@ public class RegionServiceImpl implements RegionService {
     }
 
     @Override
-    public List<String> getPrefectureLevelCity() {
-        return regionMapper.getPrefectureLevelCity();
+    public List<Region> getMunicipality() {
+        List<GbRegion> regions = regionMapper.getMunicipality();
+        List<Region> ret = null;
+
+        if (CollectionUtils.isNotEmpty(regions)) {
+            ret = ListUtils.convert(regions, gbRegion -> {
+                Region region = new Region();
+                BeanUtils.copyProperties(gbRegion, region);
+                return region;
+            });
+        }
+        else {
+            ret = Lists.newArrayList();
+        }
+
+        return ret;
     }
 }

+ 73 - 10
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherColAmapServiceImpl.java

@@ -13,6 +13,8 @@ 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.service.RegionService;
+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;
@@ -21,10 +23,14 @@ import com.huashe.common.data.mapper.AdmWeatherForecastMapper;
 import com.huashe.common.data.mapper.AdmWeatherRtMapper;
 import com.huashe.common.data.service.WeatherColService;
 import com.huashe.common.utils.HttpUtils;
+import com.huashe.common.utils.ThreadUtils;
 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;
@@ -42,6 +48,7 @@ import java.util.List;
  * @since [产品/模块版本]
  */
 @Service("weatherColAmapService")
+@ConditionalOnProperty(prefix = "weather", name = "service-provider", havingValue = "amap", matchIfMissing = false)
 public class WeatherColAmapServiceImpl implements WeatherColService {
     private static final Logger log = LoggerFactory.getLogger(WeatherColAmapServiceImpl.class);
 
@@ -57,12 +64,37 @@ public class WeatherColAmapServiceImpl implements WeatherColService {
     @Resource
     private AdmWeatherForecastMapper weatherForecastMapper;
 
+    @Value("${weather.region.conf-adcodes}")
+    private String weatherAdcodes;
+
     /**
-     * 按小时采集
-     *
-     * @param adcode 行政区划代码
+     * 区域映射装配
+     */
+    @Resource
+    private RegionService regionService;
+
+    /**
+     * 天气采集
      */
     @Override
+    public void collect() {
+        try {
+            List<String> adcodes= getAreaCodes();
+
+            for (String adcode : adcodes) {
+                // 实况采集
+                collectRt(adcode);
+                ThreadUtils.sleep(1000);
+                // 预报采集
+                collectForecast(adcode);
+                ThreadUtils.sleep(1000);
+            }
+        }
+        catch (Exception e) {
+            log.error("collect weather fail!", e);
+        }
+    }
+
     public void collectRt(String adcode) {
         try {
             String dfUrl = StringUtils.replace(config.getUrl(), "#{adcode}", adcode);
@@ -94,7 +126,6 @@ public class WeatherColAmapServiceImpl implements WeatherColService {
      *
      * @param adcode 行政区划代码
      */
-    @Override
     public void collectForecast(String adcode) {
         try {
             String dfUrl = StringUtils.replace(config.getUrl(), "#{adcode}", adcode);
@@ -111,20 +142,52 @@ public class WeatherColAmapServiceImpl implements WeatherColService {
             JSONArray jsonArray = jsonObject.getJSONArray("forecasts");
             Assert.notNull(jsonArray, -1, "forecasts list is null.");
 
-            if (!jsonArray.isEmpty()) {
-                List<WeatherForecast> forecastList = convertForecast((JSONObject) jsonArray.get(0));
+            List<WeatherForecast> forecastList = convertForecast((JSONObject) jsonArray.get(0));
 
-                if (CollectionUtils.isNotEmpty(forecastList)) {
-                    weatherForecastMapper.deleteByAdcode(adcode);
-                    weatherForecastMapper.insertBatch(forecastList);
-                }
+            if (CollectionUtils.isNotEmpty(forecastList)) {
+                weatherForecastMapper.deleteByAdcode(adcode);
+                weatherForecastMapper.insertBatch(forecastList);
+            }
+            else {
+                weatherForecastMapper.deleteByAdcode(adcode);
             }
         }
         catch (Exception e) {
+            weatherForecastMapper.deleteByAdcode(adcode);
             log.error("collectRt fail!", e);
         }
     }
 
+    public List<String> getAreaCodes() {
+        List<String> adcodes = new ArrayList<>();
+
+        // 直辖市
+        List<Region> municipalitys = regionService.getMunicipality();
+        municipalitys.forEach(region -> {
+            adcodes.add(region.getAdcode());
+        });
+
+        // 省会城市
+        Region param = new Region();
+        param.setAreaType(2);
+        List<Region> regions = regionService.getRegion(param);
+
+        regions.forEach(region -> {
+            adcodes.add(region.getAdcode());
+        });
+
+        // 自定义城市
+        String[] areaArray = StringUtils.split(weatherAdcodes, ",");
+
+        if (ArrayUtils.isNotEmpty(areaArray)) {
+            for (String areacode : areaArray) {
+                adcodes.add(areacode);
+            }
+        }
+
+        return adcodes;
+    }
+
     private WeatherRt convertRt(JSONObject jsObj) {
         WeatherRt po = new WeatherRt();
         po.setAdcode(jsObj.getString("adcode"));

+ 227 - 0
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherColJuheServiceImpl.java

@@ -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;
+    }
+}

+ 4 - 1
common-cloud/tool-modules/general-data/src/main/java/com/huashe/common/data/service/impl/WeatherServiceImpl.java

@@ -18,6 +18,7 @@ import com.huashe.common.data.service.WeatherService;
 import com.huashe.common.domain.model.WeatherForecast;
 import com.huashe.common.domain.model.WeatherRt;
 import com.huashe.common.domain.model.WeatherType;
+import com.huashe.common.utils.DateUtils;
 import com.huashe.common.utils.ListUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -28,6 +29,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -53,7 +55,8 @@ public class WeatherServiceImpl implements WeatherService {
     @Cacheable(value = "weatherRt", key = "#adcode")
     @Override
     public WeatherRt getWeatherRt(String adcode) {
-        return weatherRtMapper.getNewByAdcode(adcode);
+        String dateStr = DateUtils.dateToString(new Date(), DateUtils.YYYY_MM_DD);
+        return weatherRtMapper.getByAdcode(adcode, dateStr);
     }
 
     @Override

+ 17 - 7
common-cloud/tool-modules/general-data/src/main/resources/application-locale.yml → common-cloud/tool-modules/general-data/src/main/resources/application-local.yml

@@ -21,17 +21,27 @@ holiday:
   url: https://unpkg.com/holiday-calendar@1.1.6/data/CN/#year#.json
 
 weather:
-  rt-cron: 0 15 0,6,12,18 * * ?
-  forecast-cron: 0 15 8 * * ?
+  cron: 0 15 6 * * ?
   # 服务提供商
-  service-provider: amap
+  service-provider: juhe
   region:
-    # 数据来源 db、conf
-    source: db
-    conf-adcodes:
+    conf-adcodes: 321200
+  juhe:
+    url: http://apis.juhe.cn/simpleWeather/query?key=${weather.juhe.key}&city=#{cityname}
+    key: b2fce586f8784078f78deca9a5238ba8
+    weatherList:
+      - '1101:晴'
+      - '1103:多云'
+      - '1106:阴'
+      - '2200:雪'
+      - '2100:雨'
+      - '4100:雾'
+      - '4200:霾'
+      - '4300:沙'
+      - '4300:尘'
   amap:
     url: https://restapi.amap.com/v3/weather/weatherInfo?key=${weather.amap.key}&city=#{adcode}&extensions=#{extensions}&output=JSON
-    key: 9a5a4852c8698e783989e7f376d77816
+    key:
     weatherList:
       - '1101:晴'
       - '1103:多云'

+ 17 - 7
common-cloud/tool-modules/general-data/src/main/resources/application-prod-139.yml

@@ -21,17 +21,27 @@ holiday:
   url: https://unpkg.com/holiday-calendar@1.1.6/data/CN/#year#.json
 
 weather:
-  rt-cron: 0 15 0,6,12,18 * * ?
-  forecast-cron: 0 15 8 * * ?
+  cron: 0 15 6 * * ?
   # 服务提供商
-  service-provider: amap
+  service-provider: juhe
   region:
-    # 数据来源 db、conf
-    source: db
-    conf-adcodes:
+    conf-adcodes: 321200
+  juhe:
+    url: http://apis.juhe.cn/simpleWeather/query?key=${weather.juhe.key}&city=#{cityname}
+    key: b2fce586f8784078f78deca9a5238ba8
+    weatherList:
+      - '1101:晴'
+      - '1103:多云'
+      - '1106:阴'
+      - '2200:雪'
+      - '2100:雨'
+      - '4100:雾'
+      - '4200:霾'
+      - '4300:沙'
+      - '4300:尘'
   amap:
     url: https://restapi.amap.com/v3/weather/weatherInfo?key=${weather.amap.key}&city=#{adcode}&extensions=#{extensions}&output=JSON
-    key: 9a5a4852c8698e783989e7f376d77816
+    key:
     weatherList:
       - '1101:晴'
       - '1103:多云'

+ 2 - 2
common-cloud/tool-modules/general-data/src/main/resources/mapper/AdmWeatherRtMapper.xml

@@ -31,11 +31,11 @@
         VALUES (#{adcode}, #{areaName}, #{date}, #{weatherType}, #{weatherCn}, #{temperature}, #{humidity}, #{windPower}, #{windDirection}, #{reportTime})
     </update>
 
-    <select id="getNewByAdcode" resultMap="BaseResultMap">
+    <select id="getByAdcode" resultMap="BaseResultMap">
         select
             `adcode`,`area_name`,`date`,`weather_type`,`weather_cn`,`temperature`,`humidity`,`wind_power`,`wind_direction`,`report_time`
         from `adm_area_weather_rt`
-        where `adcode` = #{adcode} order by `date` desc limit 1
+        where `adcode` = #{adcode} and `date` = #{date}
     </select>
 
     <select id="getByTime" resultMap="BaseResultMap">

+ 9 - 3
common-cloud/tool-modules/general-data/src/main/resources/mapper/DimGbRegionMapper.xml

@@ -16,6 +16,11 @@
             dim_gb_region
     </sql>
 
+    <select id="getRegionByCode" resultMap="BaseResultMap">
+        <include refid="selectGbRegion"/>
+        WHERE adcode = #{adcode}
+    </select>
+
     <select id="getAll" resultMap="BaseResultMap">
         <include refid="selectGbRegion"/>
     </select>
@@ -25,15 +30,16 @@
         <where>
             <if test="parentArea != null and parentArea != ''">and parent_area = #{parentArea}</if>
             <if test="areaType != null">and area_type = #{areaType}</if>
+            <if test="name != null and name != ''">and `name` like '%#{name}'</if>
         </where>
     </select>
 
-    <select id="getPrefectureLevelCity" resultType="java.lang.String">
+    <select id="getMunicipality" resultMap="BaseResultMap">
         SELECT
-            `adcode`
+            `adcode`, `name`, `area_type`, `parent_area`, `parent_area_name`
         FROM
             dim_gb_region
         WHERE
-            (area_type = 1 and `name` like '%市') or area_type = 2 or area_type = 3
+            area_type = 1 and `name` like '%市'
     </select>
 </mapper>

+ 2 - 11
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/service/TaskService.java → ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/TaskService.java

@@ -8,17 +8,9 @@
  * 修改单号:  <修改单号>
  * 修改内容:  <修改内容>
  */
-package com.ruoyi.ems.service;
+package com.ruoyi.ems.task;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-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.StringUtils;
+import com.ruoyi.ems.service.IWeatherService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
@@ -28,7 +20,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 
 import javax.annotation.Resource;
-import java.util.List;
 
 /**
  * 调度任务

+ 4 - 3
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/WeatherServiceImpl.java

@@ -88,10 +88,11 @@ public class WeatherServiceImpl implements IWeatherService {
             Assert.isTrue(StringUtils.equals(code, "0"), -1, jsonObject.getString("message"));
 
             String data = jsonObject.getString("data");
-            Assert.notNull(data, -1, "weather list is null.");
 
-            WeatherRt weatherRt = JSONObject.parseObject(data, WeatherRt.class);
-            weatherRtMapper.merge(weatherRt);
+            if (data != null) {
+                WeatherRt weatherRt = JSONObject.parseObject(data, WeatherRt.class);
+                weatherRtMapper.merge(weatherRt);
+            }
         }
         catch (Exception e) {
             log.error("collectRt fail!", e);