ソースを参照

天气台账同步历史真实数据

qianxb 1 年間 前
コミット
28c3cd90d5

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -197,7 +197,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
                 if (urlList.size() > 0){
                     Long id = SnowFlakeUtil.getId();
                     FileUtils.mergePdfPublicMethods(urlList,localUrl+id+".pdf");
-                    dto.setAllFilePdf(localUrl+id+".pdf");
+                    dto.setAllFilePdf(id+".pdf");
                 }
             }
 

+ 6 - 0
blade-service/blade-business/pom.xml

@@ -21,6 +21,12 @@
     <packaging>jar</packaging>
 
     <dependencies>
+        <!--        拼音-->
+        <dependency>
+            <groupId>com.hankcs</groupId>
+            <artifactId>hanlp</artifactId>
+            <version>portable-1.8.3</version>
+        </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-boot</artifactId>

+ 70 - 13
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -2,9 +2,16 @@ package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hankcs.hanlp.dictionary.py.Pinyin;
+import com.hankcs.hanlp.dictionary.py.PinyinDictionary;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.business.entity.WeatherInfo;
@@ -20,11 +27,13 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springblade.core.mp.support.Condition;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 @Slf4j
@@ -179,7 +188,7 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                     weatherInfo = new WeatherInfo();
                     GregorianCalendar calendar = new GregorianCalendar();
                     calendar.setTime(new Date());
-                    calendar.add(Calendar.DATE,1);
+//                    calendar.add(Calendar.DATE,1);
                     weatherInfo.setRecordTime(calendar.getTime());
                 }
                 Date recordTime = weatherInfo.getRecordTime();
@@ -199,20 +208,36 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                 Duration duration = Duration.between(plainTime, ContractTime);
                 if (duration.toDays() > 0){
                     List<WeatherInfo> list = new ArrayList<>();
+                    Map<String, Map<String, String>> weatherMap = null;
+                    List<Pinyin> py = PinyinDictionary.convertToPinyin(projectContractArea.getCounty().substring(0, projectContractArea.getCounty().length() - 1));
+                    StringBuilder county = new StringBuilder();
+                    for (int i = 0; i < py.size(); i++) {
+                        county.append(py.get(i).getPinyinWithoutTone());
+                    }
+                    List<Pinyin> py2 = PinyinDictionary.convertToPinyin(projectContractArea.getCity().substring(0, projectContractArea.getCity().length() - 1));
+                    StringBuilder city = new StringBuilder();
+                    for (int i = 0; i < py2.size(); i++) {
+                        city.append(py2.get(i).getPinyinWithoutTone());
+                    }
                     while (Duration.between(plainTime,ContractTime).toDays() != 0){
-                        //获取天气信息(百度天气)
-                        Map<String,String> weatherMap = BaiduApiUtil.getTodayWeather(projectContractArea.getCity_code());
-                        if(weatherMap != null){
-                            //计算平均气温
-                            BigDecimal aver = (new BigDecimal(weatherMap.get("high")).add(new BigDecimal(weatherMap.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
-                            WeatherInfo newWeather = new WeatherInfo(String.valueOf(projectContractArea.getId()), weatherMap.get("weather"), aver.toString(), weatherMap.get("high"), weatherMap.get("low"), weatherMap.get("windLevel"));
-                            newWeather.setRecordTime(Date.from( plainTime.atZone( ZoneId.systemDefault()).toInstant()));
-//                            this.save(newWeather);
-                            list.add(newWeather);
-                            log.info("历史天气已经同步完成!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
-                        } else {
-                            log.info("获取历史天气失败!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                        //判断集合中是否存在当前天气,如果不存在则获取
+                        if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                            weatherMap = this.getWeather(county.toString(), plainTime.format(DateTimeFormatter.ofPattern("yyyyMM")));
+                            if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                                weatherMap = this.getWeather(city.toString(), plainTime.format(DateTimeFormatter.ofPattern("yyyyMM")));
+                                if (weatherMap == null || weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))) == null){
+                                    log.info("获取历史天气失败!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
+                                    break;
+                                }
+                            }
                         }
+                        Map<String, String> day = weatherMap.get(plainTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
+                        //计算平均气温
+                        BigDecimal aver = (new BigDecimal(day.get("high")).add(new BigDecimal(day.get("low")))).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_HALF_UP);
+                        WeatherInfo newWeather = new WeatherInfo(String.valueOf(projectContractArea.getId()), day.get("weather"), aver.toString(), day.get("high"), day.get("low"), day.get("windLevel"));
+                        newWeather.setRecordTime(Date.from( plainTime.atZone( ZoneId.systemDefault()).toInstant()));
+                        list.add(newWeather);
+                        log.info("历史天气已经同步完成!contractAreaId:" + projectContractArea.getId() + ",syncTime:" + plainTime);
                         plainTime = plainTime.plusDays(1);
                     }
                     this.saveBatch(list);
@@ -222,4 +247,36 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
 
     }
 
+    public  Map<String,Map<String,String>> getWeather(String city,String month){
+        String html = "http://www.tianqihoubao.com/lishi/"+city+"/month/"+month+".html";
+        Map<String,Map<String,String>> map = new HashMap<>();
+        Document document = null;
+        try {
+            document = Jsoup.connect(html).get();
+            Element body = document.body();
+            Elements table = body.getElementsByTag("table");
+            Elements trs = table.select("tr");
+            //判断网页是否存在
+            if (trs.get(0).select("td").text().contains("本站目前")){
+                System.out.println("网页错误");
+                return null;
+            }
+            for (int i = 1; i < trs.size(); i++) {
+                Element tr = trs.get(i);
+                Elements tds = tr.select("td");
+
+                Map<String,String> m = new HashMap<>();
+                m.put("weather",tds.get(1).text().split("/")[0].trim());
+                String[] split = tds.get(2).text().split("/");
+                m.put("low",split[0].substring(0,split[0].length()-2));
+                m.put("high",split[1].substring(0,split[1].length()-1).trim());
+                m.put("windLevel",tds.get(3).text().substring(tds.get(3).text().length()-2));
+                map.put(tds.get(0).text(),m);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
 }

+ 32 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

@@ -1,5 +1,9 @@
 package org.springblade.manager.utils;
 
+import cn.hutool.core.comparator.PinyinComparator;
+import cn.hutool.extra.pinyin.PinyinUtil;
+import cn.hutool.extra.pinyin.engine.pinyin4j.Pinyin4jEngine;
+import com.alibaba.druid.sql.repository.SchemaObjectType;
 import com.alibaba.excel.util.DateUtils;
 import org.jsoup.Connection;
 import org.jsoup.Jsoup;
@@ -8,29 +12,44 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 
 import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.Map;
 
 public class test {
 
-    private static String URL = "http://www.tianqihoubao.com/lishi/";
-
-    public static void main111(String[] args) {
-        getWeather("重庆市");
+    public static void main(String[] args) {
+        Map<String, Map<String, String>> map = getWeather("chongqing", "202304");
+//        String str = LocalDateTime.now().minusDays(1L).format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
+//        System.out.println(map.get(str));
     }
-
-    public static Map<String,Object> getWeather(String city){
-
-        Map<String,Object> map = new HashMap<>();
-        String pinYin = "chongqing";//Pinyin4jUtils.getPinYin(city);
-        pinYin = pinYin.replace("shi","");
-        String yyMMdd = "202303";//DateUtils.getFormat("yyyyMMdd");
+    public static  Map<String,Map<String,String>> getWeather(String city,String month){
+        String html = "http://www.tianqihoubao.com/lishi/"+city+"/month/"+month+".html";
+        System.out.println(html);
+        Map<String,Map<String,String>> map = new HashMap<>();
         Document document = null;
         try {
-            document = Jsoup.connect("http://www.tianqihoubao.com/lishi/chongqing/month/202303.html").get();
+            document = Jsoup.connect(html).get();
             Element body = document.body();
             Elements table = body.getElementsByTag("table");
-            System.out.println("ddd");
+            Elements trs = table.select("tr");
+            if (trs.get(0).select("td").text().contains("本站目前")){
+                System.out.println("网页错误");
+                return null;
+            }
+            for (int i = 1; i < trs.size(); i++) {
+                Element tr = trs.get(i);
+                Elements tds = tr.select("td");
+
+                Map<String,String> m = new HashMap<>();
+                m.put("weather",tds.get(1).text().split("/")[0].trim());
+                String[] split = tds.get(2).text().split("/");
+                m.put("tempLow",split[0].substring(0,split[0].length()-2));
+                m.put("tempHigh",split[1].substring(0,split[1].length()-1));
+                m.put("windLevel",tds.get(3).text().substring(tds.get(3).text().length()-2));
+                map.put(tds.get(0).text(),m);
+            }
         } catch (IOException e) {
             e.printStackTrace();
         }