Browse Source

添加测试表和jpa等依赖,实现多线程全量查询处理数据并批量更新。
添加定时任务(后续会用到)
调整静态文件读取方式,避免打包后路径解析异常。
临时注释掉武大吉奥接口。

DESKTOP-6LTVLN7\Liumouren 1 month ago
parent
commit
e10523ce9e

File diff suppressed because it is too large
+ 0 - 0
doc/park_express_spread.geojson


File diff suppressed because it is too large
+ 0 - 0
doc/青浦区边界.geojson


+ 20 - 4
pom.xml

@@ -32,6 +32,21 @@
         <java.version>8</java.version>
     </properties>
     <dependencies>
+        <!-- Spring Data JPA 依赖,用于简化数据库操作 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!-- MySQL 驱动依赖 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.33</version> <!-- 可根据需要选择合适的 MySQL 8 版本 -->
+        </dependency>
         <dependency>
             <groupId>org.json</groupId>
             <artifactId>json</artifactId>
@@ -42,6 +57,11 @@
             <artifactId>jackson-databind</artifactId>
             <version>2.12.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+            <version>2.12.3</version>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
@@ -131,10 +151,6 @@
             <artifactId>gt-referencing</artifactId>
             <version>${geotools.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
         <!-- PostgreSQL -->
         <dependency>
             <groupId>org.postgresql</groupId>

+ 5 - 3
src/main/java/com/skyversation/poiaddr/PoiAddrApplication.java

@@ -2,10 +2,12 @@ package com.skyversation.poiaddr;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.data.web.config.EnableSpringDataWebSupport;
 import org.springframework.scheduling.annotation.EnableScheduling;
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
-@EnableScheduling
+
+@SpringBootApplication
+@EnableSpringDataWebSupport // 以自动处理分页参数和 Page 的序列化:
+@EnableScheduling // 定时任务支持
 public class PoiAddrApplication {
     public static void main(String[] args) {
         SpringApplication.run(PoiAddrApplication.class, args);

+ 15 - 18
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -9,14 +9,11 @@ import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.util.net.AddressNetTools;
 import com.skyversation.poiaddr.util.status.AddressLevel;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -59,20 +56,20 @@ public class AddressQueryEngine {
         }
         AddressResult addressResult = new AddressResult();
         List<AddressResult.ContentBean> contentBeans = new ArrayList<>();
-        try {
-            for (String addr : addrs) {
-                AddressResult.ContentBean contentBean = verificaData(wdjaSearchByName(addr), level, addr);
-                if (contentBean != null) {
-                    contentBeans.add(contentBean);
-                    addressResult.setData(contentBeans);
-                    addressResult.setCode(AddressResultEnum.WDJA_SUCCESS);
-                    addressResult.setMessage("成功");
-                    return addressResult;
-                }
-            }
-        } catch (Exception e) {
-            System.err.println("武大吉奥:日常异常" + e);
-        }
+//        try {
+//            for (String addr : addrs) {
+//                AddressResult.ContentBean contentBean = verificaData(wdjaSearchByName(addr), level, addr);
+//                if (contentBean != null) {
+//                    contentBeans.add(contentBean);
+//                    addressResult.setData(contentBeans);
+//                    addressResult.setCode(AddressResultEnum.WDJA_SUCCESS);
+//                    addressResult.setMessage("成功");
+//                    return addressResult;
+//                }
+//            }
+//        } catch (Exception e) {
+//            System.err.println("武大吉奥:日常异常" + e);
+//        }
         if (addressResult.getData() == null || addressResult.getData().size() == 0) {
             for (String addr : addrs) {
                 AddressResult.ContentBean contentBean = verificaData(szxSearchByName(addr), level, addr);
@@ -364,7 +361,7 @@ public class AddressQueryEngine {
     }
 
     public static String addressReplaceAll(String address) {
-        return address.replaceAll("上海市", "").replaceAll("青浦", "").replaceAll("区", "").replaceAll("-", "").replaceAll("_", "").replaceAll("号", "").replaceAll("/", "").replaceAll(" ", "").replaceAll(",", "").replaceAll("\\.", "").replaceAll(",", "").replaceAll("。", "").replaceAll("\\+", "").replaceAll("\\*", "").replaceAll("弄", "").replaceAll("栋", "").replaceAll("幢", "");
+        return address.replaceAll("上海市", "").replaceAll("松江", "").replaceAll("区", "").replaceAll("-", "").replaceAll("_", "").replaceAll("号", "").replaceAll("/", "").replaceAll(" ", "").replaceAll(",", "").replaceAll("\\.", "").replaceAll(",", "").replaceAll("。", "").replaceAll("\\+", "").replaceAll("\\*", "").replaceAll("弄", "").replaceAll("栋", "").replaceAll("幢", "");
     }
 
     /**

+ 0 - 9
src/main/java/com/skyversation/poiaddr/callback/AddressQueryCallBack.java

@@ -1,9 +0,0 @@
-package com.skyversation.poiaddr.callback;
-
-public interface AddressQueryCallBack {
-
-    public void start();
-
-    public void done();
-
-}

+ 30 - 5
src/main/java/com/skyversation/poiaddr/controller/PoiAddressController.java

@@ -3,7 +3,8 @@ package com.skyversation.poiaddr.controller;
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.entity.FileDataDto;
-import com.skyversation.poiaddr.util.CsvWriter;
+import com.skyversation.poiaddr.entity.LegalPerson;
+import com.skyversation.poiaddr.service.impl.LegalPersonServiceImpl;
 import com.skyversation.poiaddr.util.ExcelReaderUtils;
 import com.skyversation.poiaddr.util.RequestUtils;
 import com.skyversation.poiaddr.util.SerializationUtils;
@@ -15,13 +16,13 @@ import com.skyversation.poiaddr.util.status.AddressLevel;
 import com.skyversation.poiaddr.util.zipunit.DataExportUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.json.simple.JSONObject;
-import org.locationtech.jts.io.ParseException;
+import org.springframework.data.domain.Page;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.util.*;
@@ -36,6 +37,9 @@ import java.util.concurrent.Future;
 @RequestMapping("/poiAddress")
 public class PoiAddressController {
 
+    @Resource
+    private LegalPersonServiceImpl legalPersonServiceimpl;
+
     //    地址查询
     @GetMapping(value = "/selectAddressInfo/{address}")
     public Object selectAddressInfo(@PathVariable("address") String address) {
@@ -55,14 +59,35 @@ public class PoiAddressController {
     /**
      * (开发中)
      * 定时器:每天都增量更新法人库的地名地址数据
+     * 每次分页查询每批次处理1W条数据
      * 1、获取数据库连接
      * 2、查询数据
      * 3、得到地名地址字段和值(清洗数据,并地名格式调整)
      * 4、批量多任务处理查询结果并判断网格区划
      * 5、将结果保存为ser文件
      */
-    public Object updateDataBaseData() {
-        return null;
+    @PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object updateDataBaseData(@RequestParam(name = "pageNum") Integer pageNum, @RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "init") Integer init) {
+        if (init == 1) {
+//          恢复初始化
+            Page<LegalPerson> outData = legalPersonServiceimpl.getAllData(pageNum, pageSize);
+            List<LegalPerson> listData = outData.getContent();
+            for (LegalPerson item : listData) {
+                item.setInTheArea(null);
+                item.setTwon(null);
+                item.setResidentialCommittee(null);
+                item.setLat(null);
+                item.setLon(null);
+                item.setResultAddrKey(null);
+                item.setUpdateTime(null);
+            }
+            legalPersonServiceimpl.updateDatas(listData);
+        } else {
+//          批量处理数据
+            legalPersonServiceimpl.iterativeProcessing(pageNum, pageSize);
+        }
+        System.out.println("处理完成!");
+        return "成功!";
     }
 
     /**

+ 114 - 0
src/main/java/com/skyversation/poiaddr/entity/LegalPerson.java

@@ -0,0 +1,114 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description
+ * @Author LiuMengxiang
+ * @Date 2025-03-04 14:59:13
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table(name = "legal_person")
+public class LegalPerson implements Serializable {
+
+    private static final long serialVersionUID = 5421387670374321021L;
+
+    @Id
+    @Column(name = "id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "addressdb67cf74")
+    private String addressdb67Cf74;
+
+    @Column(name = "real_address194a5246")
+    private String realAddress194A5246;
+
+    @Column(name = "uni_sc_id615fa8b2")
+    private String uniScId615Fa8B2;
+
+    @Column(name = "corp_name0498842c")
+    private String corpName0498842C;
+
+    @Column(name = "corp_info_id014e9273")
+    private String corpInfoId014E9273;
+
+    @Column(name = "organ_codeaff7da49")
+    private String organCodeaff7Da49;
+
+    @Column(name = "entity_idd3add11b")
+    private String entityIdd3Add11B;
+
+    @Column(name = "establish_date62322132")
+    private String establishDate62322132;
+
+    /**
+     * 街镇
+     */
+    @Column(name = "twon")
+    private String twon;
+
+    /**
+     * 经度
+     */
+    @Column(name = "lat")
+    private String lat;
+
+    /**
+     * 纬度
+     */
+    @Column(name = "lon")
+    private String lon;
+
+    /**
+     * 是否在松江区
+     */
+    @Column(name = "in_the_area")
+    private String inTheArea;
+
+    /**
+     * 村居
+     */
+    @Column(name = "residential_committee")
+    private String residentialCommittee;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    /**
+     * 区
+     */
+    @Column(name = "distinguish")
+    private String distinguish;
+
+    /**
+     * 网格
+     */
+    @Column(name = "grid")
+    private String grid;
+
+    /**
+     * 微格网
+     */
+    @Column(name = "microgrid_network")
+    private String microgridNetwork;
+
+    /**
+     * 返回地址
+     */
+    @Column(name = "result_addrKey")
+    private String resultAddrKey;
+}

+ 71 - 36
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -3,20 +3,25 @@ package com.skyversation.poiaddr.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
 import com.skyversation.poiaddr.bean.Village;
 import com.skyversation.poiaddr.bean.Zerenwangluo;
+import com.skyversation.poiaddr.service.impl.LegalPersonServiceImpl;
 import com.skyversation.poiaddr.util.CoordTransform;
+import com.skyversation.poiaddr.util.status.AddressLevel;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPolygon;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
-import org.springframework.util.ResourceUtils;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
@@ -24,6 +29,9 @@ import java.util.List;
 @Service
 public class AreaService {
 
+    @Resource
+    private LegalPersonServiceImpl legalPersonServiceimpl;
+
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -51,9 +59,38 @@ public class AreaService {
     public void initGeoData() {
         System.out.println("<<<<<<<<------AreaService>initGeoData------>>>>>>>>>");
         instance = this;
-        new Thread(() -> runGeoData()).start();
-        new Thread(() -> runZEWLData()).start();
-        new Thread(() -> initPolygons()).start();
+        Thread thread1 = new Thread(this::runGeoData);
+        Thread thread2 = new Thread(this::runZEWLData);
+        Thread thread3 = new Thread(this::initPolygons);
+
+        // 启动三个线程
+        thread1.start();
+        thread2.start();
+        thread3.start();
+
+        try {
+            // 等待三个线程执行完毕
+            thread1.join();
+            thread2.join();
+            thread3.join();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+//      TODO 网络连通性测试,可以请求一下测试的市中心地址
+        try {
+            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{"上海市青浦区馨浦苑西区2号楼1201"}, AddressLevel.values()[0]);
+            System.out.println("<<<<<<<<------网络连通性测试结果:" + addressResult);
+        } catch (Exception e) {
+            System.err.println("<<<<<<<<------网络连通性测试结果:" + e);
+        }
+
+//      TODO 数据库连接测试,可以查询表数据
+        try {
+            legalPersonServiceimpl.iterativeProcessing(1, 100);
+        } catch (Exception e) {
+            System.err.println("<<<<<<<<------数据库连接测试异常:" + e);
+        }
     }
 
     public void initPolygons() {
@@ -61,22 +98,22 @@ public class AreaService {
         lis.add(cjPolygonList);
         lis.add(wGridPolygonList);
         lis.add(gridPolygonList);
-        String[] path = new String[]{"classpath:geojson/qp_cunju.geojson", "classpath:geojson/青浦区微网格-wgs84.geojson",
-                "classpath:geojson/责任网格-wgs84.geojson"};
-//        String[] path = new String[]{"D:/geojson/qp_cunju.geojson", "D:/geojson/青浦区微网格-wgs84.geojson",
-//                "D:/geojson/责任网格-wgs84.geojson"};
+        String[] path = new String[]{"geojson/qp_cunju.geojson", "geojson/青浦区微网格-wgs84.geojson",
+                "geojson/责任网格-wgs84.geojson"};
 
         for (int j = 0; j < path.length; j++) {
-            BufferedReader br = null;
+            BufferedReader reader = null;
             try {
-                File file = ResourceUtils.getFile(path[j]);
-                br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-                String line = br.readLine();
+                // 创建 ClassPathResource 对象,指定静态文件的路径
+                ClassPathResource resource = new ClassPathResource(path[j]);
+                // 获取文件的输入流
+                reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
+                String line;
                 StringBuilder sb = new StringBuilder();
-                while (line != null) {
-                    sb.append(line + "\r\n");
-                    line = br.readLine();
+                while ((line = reader.readLine()) != null) {
+                    sb.append(line).append("\r\n");
                 }
+                reader.close();
                 JSONObject json = JSONObject.parseObject(sb.toString());
 
                 JSONArray featrues = json.getJSONArray("features");
@@ -91,7 +128,7 @@ public class AreaService {
                     GeometryJSON geometryJSON = new GeometryJSON();
                     MultiPolygon multiPolygon = geometryJSON.readMultiPolygon(geoJson.toJSONString());
                     GeoJsonBean geoJsonBean = new GeoJsonBean();
-                    if (file.getName().contains("cunju")) {
+                    if (path[j].contains("cunju")) {
                         JSONObject resultProp = new JSONObject();
                         resultProp.put("网格名称", properties.getString("__10"));
                         resultProp.put("shape_leng", properties.getString("shape__length"));
@@ -106,7 +143,7 @@ public class AreaService {
                         resultProp.put("面积", properties.getString("__1"));
                         resultProp.put("objectid", properties.getString("objectid"));
                         geoJsonBean.setProperties(resultProp);
-                    } else if (file.getName().contains("微网格")) {
+                    } else if (path[j].contains("微网格")) {
                         JSONObject resultProp = new JSONObject();
                         resultProp.put("objectid", properties.getString("OBJECTID"));
                         resultProp.put("所属街道", properties.getString("æ\u0089\u0080å±\u009Eè¡\u0097"));
@@ -116,7 +153,7 @@ public class AreaService {
                         resultProp.put("Shape_Area", properties.getString("Shape_Area"));
                         resultProp.put("微格网名称", properties.getString("å¾®ç½\u0091_1"));
                         geoJsonBean.setProperties(resultProp);
-                    } else if (file.getName().contains("责任网格")) {
+                    } else if (path[j].contains("责任网格")) {
                         geoJsonBean.setProperties(properties);
                     }
                     geoJsonBean.setMultiPolygon(multiPolygon);
@@ -189,17 +226,17 @@ public class AreaService {
      * 初始化责任网络数据
      **/
     public void runZEWLData() {
-        JSONArray jsonArray = new JSONArray();
-        BufferedReader br = null;
         try {
-            File file = ResourceUtils.getFile("classpath:geojson/zerenwangluo.json");
-            br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-            String line = br.readLine();
+            // 创建 ClassPathResource 对象,指定静态文件的路径
+            ClassPathResource resource = new ClassPathResource("geojson/zerenwangluo.json");
+            // 获取文件的输入流
+            BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
+            String line;
             StringBuilder sb = new StringBuilder();
-            while (line != null) {
-                sb.append(line + "\r\n");
-                line = br.readLine();
+            while ((line = reader.readLine()) != null) {
+                sb.append(line).append("\r\n");
             }
+            reader.close();
             zrwl = JSONObject.parseObject(sb.toString(), Zerenwangluo.class);
             zrwlFeatures = zrwl.getFeatures();
             for (int i = 0; i < zrwlFeatures.size(); i++) {
@@ -300,17 +337,17 @@ public class AreaService {
      * 初始化村居数据
      **/
     public void runGeoData() {
-        BufferedReader br = null;
         try {
-            File file = ResourceUtils.getFile("classpath:geojson/qp_cunju.geojson");
-            br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-            String line = br.readLine();
+            // 创建 ClassPathResource 对象,指定静态文件的路径
+            ClassPathResource resource = new ClassPathResource("geojson/qp_cunju.json");
+            // 获取文件的输入流
+            BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
+            String line;
             StringBuilder sb = new StringBuilder();
-            while (line != null) {
-                sb.append(line + "\r\n");
-                line = br.readLine();
+            while ((line = reader.readLine()) != null) {
+                sb.append(line).append("\r\n");
             }
-
+            reader.close();
             JSONObject json = JSONObject.parseObject(sb.toString());
             JSONArray features = json.getJSONArray("features");
             for (int i = 0; i < features.size(); i++) {
@@ -324,9 +361,7 @@ public class AreaService {
                 featureList.add(feature);
                 propertiList.add(JSONObject.parseObject(feature.getJSONObject("properties").toJSONString(), Village.class));
                 mulPolygonList.add(multiPolygon);
-
             }
-
         } catch (FileNotFoundException e) {
             e.printStackTrace();
             System.out.println("<<<<<<<<------run geo data error------>>>>>>>>>");

+ 9 - 0
src/main/java/com/skyversation/poiaddr/service/LegalPersonRepository.java

@@ -0,0 +1,9 @@
+package com.skyversation.poiaddr.service;
+
+import com.skyversation.poiaddr.entity.LegalPerson;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface LegalPersonRepository extends JpaRepository<LegalPerson, Long> {
+}

+ 121 - 0
src/main/java/com/skyversation/poiaddr/service/impl/LegalPersonServiceImpl.java

@@ -0,0 +1,121 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.entity.LegalPerson;
+import com.skyversation.poiaddr.service.LegalPersonRepository;
+import com.skyversation.poiaddr.util.ExcelReaderUtils;
+import com.skyversation.poiaddr.util.status.AddressLevel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+@Service
+public class LegalPersonServiceImpl {
+
+    @Autowired
+    private LegalPersonRepository legalPersonRepository;
+
+    //    查询所有
+    @Transactional
+    public Page<LegalPerson> getAllData(int page, int size) {
+        Pageable pageable = PageRequest.of(page - 1, size); // 第一页,每页 10 条记录
+        return legalPersonRepository.findAll(pageable);
+    }
+
+//    批量修改数据库数据
+    public List<LegalPerson> updateDatas(List<LegalPerson> legalPerson) {
+        return legalPersonRepository.saveAll(legalPerson);
+    }
+
+
+    /**
+     * 首先要得到一个Page<T>对象,然后判断是否还有别的数据,有的话接着请求并返回新的Page<T>对象并迭代处理数据
+     */
+    public void iterativeProcessing(Integer pageNum, Integer pageSize) {
+        System.out.println("<<<<<<<<------iterativeProcessing{pageNum:" + pageNum + ",pageSize:" + pageSize + "}");
+        Page<LegalPerson> outData = getAllData(pageNum, pageSize);
+        List<LegalPerson> listData = outData.getContent();
+        // 创建线程池
+        int threadCount = Runtime.getRuntime().availableProcessors();
+        ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
+        List<Future<?>> futures = new ArrayList<>();
+        for (LegalPerson item : listData) {
+            futures.add(executorService.submit(() -> {
+                String addr = item.getAddressdb67Cf74();
+//              判断地址是否属于松江区
+                if (!addr.isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(addr)) {
+//                  开始查询
+                    AddressQueryEngine.addressReplaceAll(addr);
+                    AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{addr}, AddressLevel.values()[0]);
+                    if (addressResult != null) {
+                        if (addressResult.getData() == null || addressResult.getData().size() < 1) {
+                            item.setResultAddrKey("未查询到结果!");
+                        } else {
+                            try {
+                                for (AddressResult.ContentBean contentBean : addressResult.getData()) {
+                                    String resultAddrKey = contentBean.getAddress();
+                                    if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null && ExcelReaderUtils.isOtherDistrictThanSongJiang(resultAddrKey)) {
+                                        String lng = contentBean.getLat() + "";
+                                        String lat = contentBean.getLon() + "";
+                                        item.setInTheArea("是");
+                                        if (contentBean.getCjJson() != null) {
+                                            item.setTwon(contentBean.getCjJson().getString("所属街道"));
+                                            item.setResidentialCommittee(contentBean.getCjJson().getString("所属居委"));
+                                        }
+                                        item.setLat(lat);
+                                        item.setLon(lng);
+                                        item.setResultAddrKey(resultAddrKey);
+                                        break;
+                                    }else{
+                                        item.setInTheArea("是");
+                                        item.setResultAddrKey("未查询到符合条件的结果!");
+                                    }
+                                }
+                            } catch (Exception e) {
+                                item.setInTheArea("异常");
+                                System.err.println("查询结果处理异常:" + e);
+                            }
+                        }
+                    } else {
+                        item.setInTheArea("否");
+                        item.setResultAddrKey("未查询到符合条件的结果!");
+                    }
+                } else {
+//                  更新时间,添加是否松江判断字段为否
+                    item.setInTheArea("否");
+                }
+                item.setUpdateTime(new Date());
+            }));
+        }
+
+        // 等待所有任务完成
+        for (Future<?> future : futures) {
+            try {
+                future.get();
+            } catch (InterruptedException | ExecutionException e) {
+                System.err.println("线程异常:" + e);
+            }
+        }
+        // 关闭线程池
+        executorService.shutdown();
+        updateDatas(listData);
+//      多线程处理完成后,判断是否有其他分页并迭代
+        if ((long) pageNum * pageSize < outData.getTotalElements()) {
+            iterativeProcessing(pageNum + 1, pageSize);
+        }else{
+            System.out.println("<<<<<<<<------任务处理完成!");
+        }
+    }
+}

+ 15 - 0
src/main/java/com/skyversation/poiaddr/util/ExcelReaderUtils.java

@@ -311,6 +311,21 @@ public class ExcelReaderUtils {
         return true;
     }
 
+
+    public static boolean isOtherDistrictThanSongJiang(String address) {
+        // 将地址字符串转换为小写,以便进行不区分大小写的比较
+        String lowerCaseAddress = address.toLowerCase();
+        // 检查地址是否包含 "青浦区" 字样,如果不包含,则可能是其他区
+        // 列出上海市的其他区(已补充完整)
+        String[] otherDistricts = {"黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "金山区", "青浦区", "奉贤区", "崇明区", "浦东新区"};
+        for (String district : otherDistricts) {
+            if (lowerCaseAddress.contains(district.toLowerCase())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     /*public static void main(String[] args) {
 //        根据Map字段修改表头
 //        ModifyExcelHeaderJExcelApi();

+ 30 - 0
src/main/java/com/skyversation/poiaddr/util/tasks/ScheduledTasks.java

@@ -0,0 +1,30 @@
+package com.skyversation.poiaddr.util.tasks;
+
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.service.impl.LegalPersonServiceImpl;
+import com.skyversation.poiaddr.util.status.AddressLevel;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Component
+public class ScheduledTasks {
+
+    @Resource
+    private LegalPersonServiceImpl legalPersonServiceimpl;
+
+    /**
+     * 每天 1 点执行的方法
+     * 全量跑C表数据
+     */
+    @Scheduled(cron = "0 0 1 * * *")
+    public void executeAtOneOClock() {
+        System.out.println("每天 1 点执行的方法,当前时间:" + new Date());
+        // 在这里编写具体的业务逻辑
+        legalPersonServiceimpl.iterativeProcessing(1, 100);
+    }
+}

+ 10 - 1
src/main/resources/application.properties

@@ -2,4 +2,13 @@ server.port=8081
 server.servlet.context-path=/poiApi/
 spring.application.name=poiAddr
 spring.servlet.multipart.max-file-size=300MB
-spring.servlet.multipart.max-request-size=300MB
+spring.servlet.multipart.max-request-size=300MB
+
+spring.datasource.url=jdbc:mysql://127.0.0.1:3306/songjiang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
+spring.datasource.username=root
+spring.datasource.password=root
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+
+# JPA
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=false

Some files were not shown because too many files changed in this diff