ソースを参照

添加法人库模糊库、表、优化多线程处理流程逻辑。
添加配置文件参数,可一键切换区划环境和code。

DESKTOP-6LTVLN7\Liumouren 3 ヶ月 前
コミット
47ab849154
23 ファイル変更472 行追加100 行削除
  1. 22 18
      src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java
  2. 0 16
      src/main/java/com/skyversation/poiaddr/addquery/AddressTools.java
  3. 31 15
      src/main/java/com/skyversation/poiaddr/addquery/Constant.java
  4. 46 16
      src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java
  5. 3 1
      src/main/java/com/skyversation/poiaddr/config/AuthInterceptor.java
  6. 6 3
      src/main/java/com/skyversation/poiaddr/controller/PoiAddressController.java
  7. 1 1
      src/main/java/com/skyversation/poiaddr/entity/LegalPerson.java
  8. 44 0
      src/main/java/com/skyversation/poiaddr/entity/TableA.java
  9. 38 0
      src/main/java/com/skyversation/poiaddr/entity/TableB.java
  10. 50 0
      src/main/java/com/skyversation/poiaddr/entity/TableC.java
  11. 75 0
      src/main/java/com/skyversation/poiaddr/entity/TableD.java
  12. 18 5
      src/main/java/com/skyversation/poiaddr/service/AreaService.java
  13. 8 0
      src/main/java/com/skyversation/poiaddr/service/LegalPersonRepository.java
  14. 9 0
      src/main/java/com/skyversation/poiaddr/service/TableARepository.java
  15. 9 0
      src/main/java/com/skyversation/poiaddr/service/TableBRepository.java
  16. 9 0
      src/main/java/com/skyversation/poiaddr/service/TableCRepository.java
  17. 9 0
      src/main/java/com/skyversation/poiaddr/service/TableDRepository.java
  18. 15 12
      src/main/java/com/skyversation/poiaddr/service/impl/LegalPersonServiceImpl.java
  19. 60 0
      src/main/java/com/skyversation/poiaddr/service/impl/TestTablesServiceImpl.java
  20. 2 1
      src/main/java/com/skyversation/poiaddr/util/ExcelReaderUtils.java
  21. 13 8
      src/main/java/com/skyversation/poiaddr/util/net/AddressNetTools.java
  22. 1 1
      src/main/java/com/skyversation/poiaddr/util/tasks/ScheduledTasks.java
  23. 3 3
      src/main/resources/application.properties

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

@@ -78,7 +78,7 @@ public class AddressQueryEngine {
                     addressResult.setData(contentBeans);
                     addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
                     addressResult.setMessage("成功");
-                    return addressResult;
+                    return getCjWgWgwByLoc(addressResult);
                 }
             }
         }
@@ -90,7 +90,7 @@ public class AddressQueryEngine {
                     addressResult.setData(contentBeans);
                     addressResult.setCode(AddressResultEnum.GD_SUCCESS);
                     addressResult.setMessage("成功");
-                    return addressResult;
+                    return getCjWgWgwByLoc(addressResult);
                 }
             }
         }
@@ -102,7 +102,7 @@ public class AddressQueryEngine {
                     addressResult.setData(contentBeans);
                     addressResult.setCode(AddressResultEnum.GDV3_SUCCESS);
                     addressResult.setMessage("成功");
-                    return addressResult;
+                    return getCjWgWgwByLoc(addressResult);
                 }
             }
         }
@@ -151,14 +151,13 @@ public class AddressQueryEngine {
      * @return
      */
     public AddressResult szxSearchByName(String address) {
-        ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.SZX_URL + address, null, null);
+        ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.SZX_URL + "&region=" + Constant.getAMAP_CITY_CODE() + "&query=" + address, null, null);
         if (response != null) {
             String body = response.getBody() + "";
             if (!StringUtils.hasText(body))
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
             try {
-                JSONObject json = JSONObject.parseObject(body);
-                return getCjWgWgwByLoc(TransfromDataTool.szxResultToResult(json));
+                return TransfromDataTool.szxResultToResult(JSONObject.parseObject(body));
             } catch (Exception e) {
                 System.err.println(e);
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
@@ -169,7 +168,7 @@ public class AddressQueryEngine {
         }
     }
 
-    public AddressResult v4SearchByName(String address) {
+    /*public AddressResult v4SearchByName(String address) {
         ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.V4_URL + address, null, null);
         if (response != null) {
             String body = response.getBody() + "";
@@ -186,7 +185,7 @@ public class AddressQueryEngine {
             System.out.println("地址" + address + "未查询到数据!");
             return null;
         }
-    }
+    }*/
 
     /***
      * 高德普通地名搜索
@@ -194,14 +193,14 @@ public class AddressQueryEngine {
      * @return
      */
     public AddressResult gdSearchByName(String address) {
-        String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&output=JSON";
+        String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
         ResponseEntity response = AddressNetTools.getInstance().requestGet(geoUrl, null, null);
         String body = response.getBody() + "";
         if (!StringUtils.hasText(body))
             return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
         try {
             JSONObject json = JSONObject.parseObject(body);
-            return getCjWgWgwByLoc(TransfromDataTool.gdResultToResult(json));
+            return TransfromDataTool.gdResultToResult(json);
         } catch (Exception e) {
             System.err.println(e);
             return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
@@ -217,7 +216,7 @@ public class AddressQueryEngine {
         String geoUrl =
 //                + Constant.AMAP_SEARCH_TYPES  070500
                 Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
-                        "&keywords=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&offset=20";
+                        "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
         System.out.println("geoUrl:" + geoUrl);
         String body = null;
         body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
@@ -233,7 +232,7 @@ public class AddressQueryEngine {
             for (int i = 2; i < (count % 20 + 1); i++) {
                 geoUrl =
                         Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
-                                "&keywords=" + address + "&city=" + Constant.AMAP_CITY_CODE + "&offset=20&page=" + i;
+                                "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20&page=" + i;
                 body = AddressNetTools.getInstance().requestGet(geoUrl, null, null).getBody() + "";
                 if (!StringUtils.hasText(body)) {
                     return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
@@ -242,7 +241,7 @@ public class AddressQueryEngine {
             }
         }
         try {
-            return getCjWgWgwByLoc(TransfromDataTool.gdV3ResultToResult(pois));
+            return TransfromDataTool.gdV3ResultToResult(pois);
         } catch (Exception e) {
             System.err.println(e);
             return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
@@ -272,6 +271,11 @@ public class AddressQueryEngine {
         }
     }
 
+    //
+    public static boolean isNotEmptyOrBlank(String str) {
+        return str != null && !str.trim().isEmpty();
+    }
+
     /**
      * 1. 搜索到结果就返回第一个;
      * 2. 搜索到结果去除行政区划后,存在包含关系,则使用;
@@ -299,7 +303,7 @@ public class AddressQueryEngine {
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
                         String address = addressReplaceAll(contentBean1.getAddress());
                         String address2 = addressReplaceAll(addr);
-                        if (address.contains(address2) || address2.contains(address)) {
+                        if (isNotEmptyOrBlank(address) && (address.contains(address2) || address2.contains(address))) {
                             return contentBean1;
                         }
                     }
@@ -314,7 +318,7 @@ public class AddressQueryEngine {
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
                         String address = extractNumbers(contentBean1.getAddress(), false);
                         String address2 = extractNumbers(addr, false);
-                        if (address.contains(address2) || address2.contains(address)) {
+                        if (isNotEmptyOrBlank(address) && address.contains(address2) || address2.contains(address)) {
                             return contentBean1;
                         }
                     }
@@ -331,7 +335,7 @@ public class AddressQueryEngine {
                         String address2 = extractNumbers(addressReplaceAll(addr), true);
                         String addressNumber = extractNumbers(contentBean1.getAddress(), false);
                         String addressNumber2 = extractNumbers(addr, false);
-                        if ((address.contains(address2) || address2.contains(address)) && (addressNumber.contains(addressNumber2) || addressNumber2.contains(addressNumber))) {
+                        if (isNotEmptyOrBlank(address) && (address.contains(address2) || address2.contains(address)) && (addressNumber.contains(addressNumber2) || addressNumber2.contains(addressNumber))) {
                             return contentBean1;
                         }
                     }
@@ -346,7 +350,7 @@ public class AddressQueryEngine {
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
                         String address = addressReplaceAll(contentBean1.getAddress());
                         String address2 = addressReplaceAll(addr);
-                        if (address.equals(address2)) {
+                        if (isNotEmptyOrBlank(address) && address.equals(address2)) {
                             return contentBean1;
                         }
                     }
@@ -361,7 +365,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(Constant.getArea(), "").replaceAll("区", "").replaceAll("-", "").replaceAll("_", "").replaceAll("/", "").replaceAll(" ", "").replaceAll(",", "").replaceAll("\\.", "").replaceAll(",", "").replaceAll("。", "").replaceAll("\\+", "").replaceAll("\\*", "");
     }
 
     /**

+ 0 - 16
src/main/java/com/skyversation/poiaddr/addquery/AddressTools.java

@@ -58,22 +58,6 @@ public class AddressTools {
         }
     }
 
-    public static JSONObject agineGetAddress(String address) {
-        for (int i = 0; i < 10; i++) {
-            ResponseEntity response = AddressNetTools.getInstance().requestGet(Constant.SZX_URL + address, null, null);
-            if (response != null) {
-                JSONObject json = null;
-                try {
-                    json = JSONObject.parseObject(response.getBody() + "");
-                    return json;
-                } catch (Exception e) {
-                    e.toString();
-                }
-            }
-        }
-        return null;
-    }
-
     public AddressResult faildQuery(AddressResultEnum code, String message){
         return new AddressResult(code, message);
     }

+ 31 - 15
src/main/java/com/skyversation/poiaddr/addquery/Constant.java

@@ -1,23 +1,41 @@
 package com.skyversation.poiaddr.addquery;
 
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
 
+@Service
 public class Constant {
     public static Constant instance = new Constant();
 
-    private Constant(){};
+    private Constant() {
+    }
 
-    public static Constant getInstance(){
-        if(instance == null)
+    public static Constant getInstance() {
+        if (instance == null)
             instance = new Constant();
         return instance;
     }
 
+    //    TODO 青浦区行政区划编码:310118 松江区行政区划编码:310117
+    private String area;
+
+    public static void setArea(String area){
+        getInstance().area = area;
+    }
+
+    public static String getArea() {
+        return getInstance().area;
+    }
+
+    public static String getAMAP_CITY_CODE() {
+        return "青浦".equals(getArea()) ? "310118" : "310117";
+    }
+
     public static final String WD_USER_NAME = "yuanyi";
     public static final String WD_USER_PWD = "yuanyi@123";
     public static final String GET_TOKEN_URL = "http://10.235.245.226:7010/addrMatch/auth/getToken";
     public static final String GET_ADDRESS_MEG_URL = "http://10.235.245.226:7010/addrMatch/addrApi/searchAddr";
-    public static final String SZX_URL = "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/address_search/MapServer?region=310118&page_num=1&page_size=1&query=";
+    public static final String SZX_URL = "https://service-api.onemap.sh.gov.cn/data-service-manage-service/MapProxyApi/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBsaWNhdGlvbl9pZCI6NjEsImFwcGxpY2F0aW9uX25hbWUiOiLpnZLmtabkuozkuInnu7TmnI3liqHns7vnu58iLCJleHAiOjIwNDY2Nzg0MDN9.IKUMdjUX4U1jncIUNren-iotL7duXI90aLECMjpvUX8/address_search/MapServer?page_num=1&page_size=5";
     public static final String V4_URL = "http://10.235.245.174:10011/proxy/address/getAddressV4?token=65463DEE-620A-0ED5-2385-17ECD07CD351&address=";
 
     public static String AMAP_GEO_URL = "https://restapi.amap.com/v3/geocode/geo";
@@ -28,24 +46,22 @@ public class Constant {
             "|100000|110000|120000|130000|140000|150000|160000|170000|180000|190000|200000|220000|970000|980000|990000";
 
     @Value("${amap_key}")
-    public static  String AMAP_KEY = "161e0c673807a9586ba5a115da2a0112";
-    @Value("${amap_city_code}")
-    public static  String AMAP_CITY_CODE = "310118";
+    public static String AMAP_KEY = "161e0c673807a9586ba5a115da2a0112";
 
-//    oauth和dms搭建服务器地址
+    //    oauth和dms搭建服务器地址
     public static String ServerBaseUrl = "http://121.43.55.7:";
-//    DMS服务端口和路径
-    public static String Dms_Base_Url = ServerBaseUrl + ":2101/proxy_dms";
-//    Oauth服务端口和路径
+    //    DMS服务端口和路径
+    public static String Dms_Base_Url = ServerBaseUrl + "2101/proxy_dms";
+    //    Oauth服务端口和路径
     public static String Oauth_Base_Url = ServerBaseUrl + "2101/proxy_oauth";
 
-//    Oauth登录接口(直接使用user001默认登录获取token)
+    //    Oauth登录接口(直接使用user001默认登录获取token)
     public static String Oauth_login_URL = Oauth_Base_Url + "/user/login?userName=user001&password=1234567890&clientId=2";
 
-//    DMS添加数据接口
+    //    DMS添加数据接口
     public static String DMS_addContent_URL = Dms_Base_Url + "/content/addContent";
-//    DMS修改数据接口
+    //    DMS修改数据接口
     public static String DMS_updateContent_URL = Dms_Base_Url + "/content/updateContent";
-//    DMS查询接口
+    //    DMS查询接口
     public static String DMS_selectContentList_URL = Dms_Base_Url + "/content/selectContentList";
 }

+ 46 - 16
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -7,17 +7,18 @@ import com.skyversation.poiaddr.util.CoordTransform2;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public class TransfromDataTool {
 
-    public static AddressResult wdResultToResult(JSONObject json){
+    public static AddressResult wdResultToResult(JSONObject json) {
         AddressResult result = new AddressResult();
         JSONArray array = json.getJSONObject("data").getJSONArray("addrList");
-        if(array == null || array.size() < 1){
+        if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        for(int i = 0;i < array.size(); i ++){
+        for (int i = 0; i < array.size(); i++) {
             JSONObject jsonObject = array.getJSONObject(i);
             AddressResult.ContentBean content = new AddressResult.ContentBean();
             content.setPname(jsonObject.getString("city"));
@@ -34,7 +35,7 @@ public class TransfromDataTool {
             content.setLocation(points[0] + "," + points[1]);
             content.setLon(points[0]);
             content.setLat(points[1]);
-            if(result.getData() == null){
+            if (result.getData() == null) {
                 result.setData(new ArrayList<>());
             }
             result.getData().add(content);
@@ -43,25 +44,54 @@ public class TransfromDataTool {
         return result;
     }
 
-    public static AddressResult szxResultToResult(JSONObject json){
+    public static AddressResult szxResultToResult(JSONObject json) {
         AddressResult result = new AddressResult();
         JSONArray array = json.getJSONArray("result");
-        if(array == null || array.size() < 1){
+        if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        for(int i = 0;i < array.size(); i ++){
+        for (int i = 0; i < array.size(); i++) {
             JSONObject jsonObject = array.getJSONObject(i);
             AddressResult.ContentBean content = new AddressResult.ContentBean();
             content.setType(jsonObject.getString("type_name"));
+            List<String> addressList = new ArrayList<>();
             content.setAddress(jsonObject.getString("address"));
+            if (!jsonObject.getString("address").isEmpty()) {
+                addressList.add(jsonObject.getString("address"));
+            }
+            if (!jsonObject.getString("std_address").isEmpty()) {
+                addressList.add(jsonObject.getString("std_address"));
+            }
             content.setName(jsonObject.getString("name"));
             double[] points = new double[]{jsonObject.getJSONObject("location").getDouble("lng"),
                     jsonObject.getJSONObject("location").getDouble("lat")};
             content.setLocation(points[0] + "," + points[1]);
             content.setLon(points[0]);
             content.setLat(points[1]);
-            if(result.getData() == null){
+            if (jsonObject.containsKey("ext_data")) {
+                JSONObject extData = jsonObject.getJSONObject("ext_data");
+                if (extData.containsKey("address") && !extData.getString("address").isEmpty()) {
+                    addressList.add(extData.getString("address"));
+                }
+                if (extData.containsKey("source_address") && !extData.getString("source_address").isEmpty()) {
+                    addressList.add(extData.getString("source_address"));
+                }
+
+                if (extData.containsKey("region_jw") && !extData.getString("region_jw").isEmpty()) {
+                    JSONObject cjJson = new JSONObject();
+                    cjJson.put("所属街道", extData.getString("region_jd"));
+                    cjJson.put("所属居委", extData.getString("region_jw"));
+                    content.setCjJson(cjJson);
+                }
+
+            }
+            for (String item : addressList) {
+                if (item.contains("上海市") && item.contains(Constant.getArea() + "区") && item.length() > content.getAddress().length()) {
+                    content.setAddress(item);
+                }
+            }
+            if (result.getData() == null) {
                 result.setData(new ArrayList<>());
             }
             result.getData().add(content);
@@ -70,14 +100,14 @@ public class TransfromDataTool {
         return result;
     }
 
-    public static AddressResult gdResultToResult(JSONObject json){
+    public static AddressResult gdResultToResult(JSONObject json) {
         AddressResult result = new AddressResult();
         JSONArray array = json.getJSONArray("geocodes");
-        if(array == null || array.size() < 1){
+        if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        for(int i = 0;i < array.size(); i ++){
+        for (int i = 0; i < array.size(); i++) {
             JSONObject jsonObject = array.getJSONObject(i);
             AddressResult.ContentBean content = new AddressResult.ContentBean();
             content.setPname(jsonObject.getString("city"));
@@ -92,7 +122,7 @@ public class TransfromDataTool {
             content.setLocation(points[0] + "," + points[1]);
             content.setLon(points[0]);
             content.setLat(points[1]);
-            if(result.getData() == null){
+            if (result.getData() == null) {
                 result.setData(new ArrayList<>());
             }
             result.getData().add(content);
@@ -101,13 +131,13 @@ public class TransfromDataTool {
         return result;
     }
 
-    public static AddressResult gdV3ResultToResult(JSONArray array){
+    public static AddressResult gdV3ResultToResult(JSONArray array) {
         AddressResult result = new AddressResult();
-        if(array == null || array.size() < 1){
+        if (array == null || array.size() < 1) {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        for(int i = 0;i < array.size(); i ++){
+        for (int i = 0; i < array.size(); i++) {
             JSONObject jsonObject = array.getJSONObject(i);
             AddressResult.ContentBean content = new AddressResult.ContentBean();
             content.setPname(jsonObject.getString("pname"));
@@ -122,7 +152,7 @@ public class TransfromDataTool {
             content.setLocation(points[0] + "," + points[1]);
             content.setLon(points[0]);
             content.setLat(points[1]);
-            if(result.getData() == null){
+            if (result.getData() == null) {
                 result.setData(new ArrayList<>());
             }
             result.getData().add(content);

+ 3 - 1
src/main/java/com/skyversation/poiaddr/config/AuthInterceptor.java

@@ -43,7 +43,9 @@ public class AuthInterceptor implements HandlerInterceptor {
                 response.addHeader("Set-Cookie", builder.toString());
             }
         }
-
+        if(request.getRequestURI().contains("/poiApi/poiAddress/test")){
+            return true;
+        }
         String token = request.getHeader("token");
         String requestURI = request.getRequestURI();
         if (StringUtils.isEmpty(token)){

+ 6 - 3
src/main/java/com/skyversation/poiaddr/controller/PoiAddressController.java

@@ -67,7 +67,7 @@ public class PoiAddressController {
      * 5、将结果保存为ser文件
      */
     @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) {
+    public Object updateDataBaseData(@RequestParam(name = "pageNum") Integer pageNum, @RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "level") Integer level, @RequestParam(name = "init") Integer init) {
         if (init == 1) {
 //          恢复初始化
             Page<LegalPerson> outData = legalPersonServiceimpl.getAllData(pageNum, pageSize);
@@ -84,7 +84,10 @@ public class PoiAddressController {
             legalPersonServiceimpl.updateDatas(listData);
         } else {
 //          批量处理数据
-            legalPersonServiceimpl.iterativeProcessing(pageNum, pageSize);
+            if (level == null) {
+                level = 1;
+            }
+            legalPersonServiceimpl.iterativeProcessing(pageNum, pageSize, level);
         }
         System.out.println("处理完成!");
         return "成功!";
@@ -144,7 +147,7 @@ public class PoiAddressController {
             paramsContent.put("c_task_status", 0);
             params.put("content", paramsContent);
             JSONObject initDmsData = DmsTools.addContent(params);
-            if (initDmsData.get("message") == null || !"200".equals(initDmsData.get("code"))) {
+            if (initDmsData.get("message") == null || !"200".equals(initDmsData.get("code").toString())) {
                 return "任务初始化失败!DMS数据插入异常,请联系管理员!";
             }
             paramsContent.put("id", initDmsData.get("content"));

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

@@ -109,6 +109,6 @@ public class LegalPerson implements Serializable {
     /**
      * 返回地址
      */
-    @Column(name = "result_addrKey")
+    @Column(name = "result_addr_key")
     private String resultAddrKey;
 }

+ 44 - 0
src/main/java/com/skyversation/poiaddr/entity/TableA.java

@@ -0,0 +1,44 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-03-06 14:00:30 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="table_a" , schema = "")
+public class TableA  implements Serializable {
+
+	private static final long serialVersionUID =  709943805325871527L;
+
+	/**
+	 * 主键
+	 */
+	@Id
+   	@Column(name = "id" )
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	/**
+	 * 统一社会信用代码
+	 */
+   	@Column(name = "uscc" )
+	private String uscc;
+
+	/**
+	 * 企业名称
+	 */
+   	@Column(name = "enterprise_name" )
+	private String enterpriseName;
+}

+ 38 - 0
src/main/java/com/skyversation/poiaddr/entity/TableB.java

@@ -0,0 +1,38 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-03-06 14:00:38 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="table_b" , schema = "")
+public class TableB  implements Serializable {
+
+	private static final long serialVersionUID =  6596039390915216197L;
+
+	/**
+	 * 主键
+	 */
+	@Id
+   	@Column(name = "id" )
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	/**
+	 * 地址
+	 */
+   	@Column(name = "address" )
+	private String address;
+}

+ 50 - 0
src/main/java/com/skyversation/poiaddr/entity/TableC.java

@@ -0,0 +1,50 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-03-06 14:00:47 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="table_c" , schema = "")
+public class TableC  implements Serializable {
+
+	private static final long serialVersionUID =  6899664924464774463L;
+
+	/**
+	 * 主键
+	 */
+	@Id
+   	@Column(name = "id" )
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	/**
+	 * 统一社会信用代码
+	 */
+   	@Column(name = "uscc" )
+	private String uscc;
+
+	/**
+	 * 企业名称
+	 */
+   	@Column(name = "enterprise_name" )
+	private String enterpriseName;
+
+	/**
+	 * 地址
+	 */
+   	@Column(name = "address" )
+	private String address;
+}

+ 75 - 0
src/main/java/com/skyversation/poiaddr/entity/TableD.java

@@ -0,0 +1,75 @@
+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-06 14:00:53 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="table_d" , schema = "")
+public class TableD  implements Serializable {
+
+	private static final long serialVersionUID =  8617502787464716556L;
+
+	/**
+	 * 主键
+	 */
+	@Id
+   	@Column(name = "id" )
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	/**
+	 * 统一社会信用代码
+	 */
+   	@Column(name = "uscc" )
+	private String uscc;
+
+	/**
+	 * 企业名称
+	 */
+   	@Column(name = "enterprise_name" )
+	private String enterpriseName;
+
+	/**
+	 * 地址
+	 */
+   	@Column(name = "address" )
+	private String address;
+
+	/**
+	 * 标准地址
+	 */
+   	@Column(name = "standard_address" )
+	private String standardAddress;
+
+	/**
+	 * 所属区划
+	 */
+   	@Column(name = "belonging_division" )
+	private String belongingDivision;
+
+	/**
+	 * 所属街镇
+	 */
+   	@Column(name = "belonging_street_town" )
+	private String belongingStreetTown;
+
+	/**
+	 * 更新时间
+	 */
+   	@Column(name = "update_time" )
+	private Date updateTime;
+}

+ 18 - 5
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -4,11 +4,13 @@ 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.addquery.Constant;
 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.service.impl.TestTablesServiceImpl;
 import com.skyversation.poiaddr.util.CoordTransform;
 import com.skyversation.poiaddr.util.status.AddressLevel;
 import org.geotools.geojson.geom.GeometryJSON;
@@ -17,6 +19,7 @@ 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.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
@@ -32,6 +35,9 @@ public class AreaService {
     @Resource
     private LegalPersonServiceImpl legalPersonServiceimpl;
 
+    @Resource
+    private TestTablesServiceImpl testTablesService;
+
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -41,6 +47,8 @@ public class AreaService {
         return instance;
     }
 
+    @Value("${app.area:青浦}")
+    private String area;
 
     WKTReader reader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
     List<JSONObject> featureList = new ArrayList<>();
@@ -76,9 +84,14 @@ public class AreaService {
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
-
+//      TODO 初始化tableA、tableB
+        /*testTablesService.testData();*/
+        Constant.setArea(area);
+        System.out.println("<<<<<<<<------根据配置文件为AREA赋值:" + Constant.getArea());
+        System.out.println("<<<<<<<<------当前AMAP_CITY_CODE:" + Constant.getAMAP_CITY_CODE());
 //      TODO 网络连通性测试,可以请求一下测试的市中心地址
         try {
+            System.out.println("<<<<<<<<------开始网络连通性测试");
             AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{"上海市青浦区馨浦苑西区2号楼1201"}, AddressLevel.values()[0]);
             System.out.println("<<<<<<<<------网络连通性测试结果:" + addressResult);
         } catch (Exception e) {
@@ -86,11 +99,11 @@ public class AreaService {
         }
 
 //      TODO 数据库连接测试,可以查询表数据
-        try {
-            legalPersonServiceimpl.iterativeProcessing(1, 100);
+        /*try {
+            legalPersonServiceimpl.iterativeProcessing(1, 100, 1);
         } catch (Exception e) {
             System.err.println("<<<<<<<<------数据库连接测试异常:" + e);
-        }
+        }*/
     }
 
     public void initPolygons() {
@@ -339,7 +352,7 @@ public class AreaService {
     public void runGeoData() {
         try {
             // 创建 ClassPathResource 对象,指定静态文件的路径
-            ClassPathResource resource = new ClassPathResource("geojson/qp_cunju.json");
+            ClassPathResource resource = new ClassPathResource("geojson/qp_cunju.geojson");
             // 获取文件的输入流
             BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
             String line;

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

@@ -1,9 +1,17 @@
 package com.skyversation.poiaddr.service;
 
 import com.skyversation.poiaddr.entity.LegalPerson;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface LegalPersonRepository extends JpaRepository<LegalPerson, Long> {
+
+    // 使用原生 SQL 进行模糊查询并分页
+    @Query(value = "SELECT * FROM legal_person WHERE addressdb67Cf74 LIKE %:keyword%", nativeQuery = true)
+    Page<LegalPerson> findByAddressdb67Cf74Containing(@Param("keyword") String keyword, Pageable pageable);
 }

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

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

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

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

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

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

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

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

+ 15 - 12
src/main/java/com/skyversation/poiaddr/service/impl/LegalPersonServiceImpl.java

@@ -1,6 +1,7 @@
 package com.skyversation.poiaddr.service.impl;
 
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.entity.LegalPerson;
 import com.skyversation.poiaddr.service.LegalPersonRepository;
@@ -31,10 +32,10 @@ public class LegalPersonServiceImpl {
     @Transactional
     public Page<LegalPerson> getAllData(int page, int size) {
         Pageable pageable = PageRequest.of(page - 1, size); // 第一页,每页 10 条记录
-        return legalPersonRepository.findAll(pageable);
+        return legalPersonRepository.findByAddressdb67Cf74Containing(Constant.getArea(), pageable);
     }
 
-//    批量修改数据库数据
+    //    批量修改数据库数据
     public List<LegalPerson> updateDatas(List<LegalPerson> legalPerson) {
         return legalPersonRepository.saveAll(legalPerson);
     }
@@ -43,7 +44,8 @@ public class LegalPersonServiceImpl {
     /**
      * 首先要得到一个Page<T>对象,然后判断是否还有别的数据,有的话接着请求并返回新的Page<T>对象并迭代处理数据
      */
-    public void iterativeProcessing(Integer pageNum, Integer pageSize) {
+    @Transactional
+    public void iterativeProcessing(Integer pageNum, Integer pageSize, Integer level) {
         System.out.println("<<<<<<<<------iterativeProcessing{pageNum:" + pageNum + ",pageSize:" + pageSize + "}");
         Page<LegalPerson> outData = getAllData(pageNum, pageSize);
         List<LegalPerson> listData = outData.getContent();
@@ -55,12 +57,13 @@ public class LegalPersonServiceImpl {
             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 ((!addr.isEmpty() && ExcelReaderUtils.isOtherDistrictThanSongJiang(addr))) {
+//                  开始查询(先去除干扰字和行政区划)
+                    addr = "上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(addr);
+                    AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(new String[]{addr}, AddressLevel.values()[level - 1]);
                     if (addressResult != null) {
                         if (addressResult.getData() == null || addressResult.getData().size() < 1) {
+                            item.setInTheArea("异常");
                             item.setResultAddrKey("未查询到结果!");
                         } else {
                             try {
@@ -78,8 +81,8 @@ public class LegalPersonServiceImpl {
                                         item.setLon(lng);
                                         item.setResultAddrKey(resultAddrKey);
                                         break;
-                                    }else{
-                                        item.setInTheArea("");
+                                    } else {
+                                        item.setInTheArea("异常");
                                         item.setResultAddrKey("未查询到符合条件的结果!");
                                     }
                                 }
@@ -89,7 +92,7 @@ public class LegalPersonServiceImpl {
                             }
                         }
                     } else {
-                        item.setInTheArea("");
+                        item.setInTheArea("异常");
                         item.setResultAddrKey("未查询到符合条件的结果!");
                     }
                 } else {
@@ -113,8 +116,8 @@ public class LegalPersonServiceImpl {
         updateDatas(listData);
 //      多线程处理完成后,判断是否有其他分页并迭代
         if ((long) pageNum * pageSize < outData.getTotalElements()) {
-            iterativeProcessing(pageNum + 1, pageSize);
-        }else{
+            iterativeProcessing(pageNum + 1, pageSize, level);
+        } else {
             System.out.println("<<<<<<<<------任务处理完成!");
         }
     }

+ 60 - 0
src/main/java/com/skyversation/poiaddr/service/impl/TestTablesServiceImpl.java

@@ -0,0 +1,60 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.entity.LegalPerson;
+import com.skyversation.poiaddr.entity.TableA;
+import com.skyversation.poiaddr.entity.TableB;
+import com.skyversation.poiaddr.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 法人库处理流程
+ * 1、根据tableA(统一社会信用代码、企业名称)和tableB(地址)得到tableC(统一社会信用代码、企业名称、地址)
+ * 2、根据tableC调用地名地址接口得到tableD(统一社会信用代码、企业名称、地址、标准地址、所属区划、所属街镇)
+ */
+@Service
+public class TestTablesServiceImpl {
+    @Autowired
+    private LegalPersonRepository legalPersonRepository;
+    @Autowired
+    private TableARepository tableARepository;
+    @Autowired
+    private TableBRepository tableBRepository;
+    @Autowired
+    private TableCRepository tableCRepository;
+    @Autowired
+    private TableDRepository tableDRepository;
+
+
+    /**
+     * 模拟数据,首先得到所有的LegalPerson表中的数据,然后得到:统一社会信用代码和企业名称,录入到TableA表中
+     * 然后根据LegalPerson表中的地址字段,保存到TableB表中
+     */
+    @Transactional
+    public void testData() {
+        List<LegalPerson> lpDataList = legalPersonRepository.findAll();
+        List<TableA> tableADataList = new ArrayList<>();
+        List<TableB> tableBDataList = new ArrayList<>();
+        for(LegalPerson item: lpDataList){
+            if(item.getUniScId615Fa8B2() != null && item.getCorpName0498842C() != null){
+                TableA tableA = new TableA();
+                tableA.setUscc(item.getUniScId615Fa8B2());
+                tableA.setEnterpriseName(item.getCorpName0498842C());
+                tableADataList.add(tableA);
+            };
+            if(item.getAddressdb67Cf74() != null){
+                TableB tableB = new TableB();
+                tableB.setAddress(item.getAddressdb67Cf74());
+                tableBDataList.add(tableB);
+            }
+        }
+        tableARepository.saveAll(tableADataList);
+        tableBRepository.saveAll(tableBDataList);
+        System.out.println("初始化模拟表tableA、tableB结束!");
+    }
+
+}

+ 2 - 1
src/main/java/com/skyversation/poiaddr/util/ExcelReaderUtils.java

@@ -1,5 +1,6 @@
 package com.skyversation.poiaddr.util;
 
+import com.skyversation.poiaddr.addquery.Constant;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 
@@ -302,7 +303,7 @@ public class ExcelReaderUtils {
         String lowerCaseAddress = address.toLowerCase();
         // 检查地址是否包含 "青浦区" 字样,如果不包含,则可能是其他区
         // 列出上海市的其他区(已补充完整)
-        String[] otherDistricts = {"黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "金山区", "松江区", "奉贤区", "崇明区", "浦东新区"};
+        String[] otherDistricts = {"黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "金山区", ("青浦".equals(Constant.getArea()) ? "松江区" : "青浦区"), "奉贤区", "崇明区", "浦东新区"};
         for (String district : otherDistricts) {
             if (lowerCaseAddress.contains(district.toLowerCase())) {
                 return false;

+ 13 - 8
src/main/java/com/skyversation/poiaddr/util/net/AddressNetTools.java

@@ -12,6 +12,7 @@ import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.client.SimpleClientHttpRequestFactory;
 import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
@@ -22,9 +23,12 @@ import java.util.Set;
 public class AddressNetTools {
 
     private static AddressNetTools instance = new AddressNetTools();
-    private AddressNetTools(){}
-    public synchronized static AddressNetTools getInstance(){
-        if(instance == null){
+
+    private AddressNetTools() {
+    }
+
+    public synchronized static AddressNetTools getInstance() {
+        if (instance == null) {
             instance = new AddressNetTools();
         }
         return instance;
@@ -38,17 +42,18 @@ public class AddressNetTools {
         return EntityUtils.toString(entity);
     }
 
-    public ResponseEntity requestGet(String url, MultiValueMap<String, String> params, Map<String, String> headerMap){
+    @Async
+    public ResponseEntity requestGet(String url, MultiValueMap<String, String> params, Map<String, String> headerMap) {
         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
-        requestFactory.setConnectTimeout(30*1000);
-        requestFactory.setReadTimeout(30*1000);
+        requestFactory.setConnectTimeout(3 * 1000);
+        requestFactory.setReadTimeout(3 * 1000);
         RestTemplate client = new RestTemplate(requestFactory);
         client.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
 
         HttpHeaders headers = new HttpHeaders();
         //请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-        if(headerMap != null){
+        if (headerMap != null) {
             Set<String> sets = headerMap.keySet();
             for (String key : sets) {
                 headers.add(key, headerMap.get(key));
@@ -59,7 +64,7 @@ public class AddressNetTools {
         ResponseEntity<String> response = null;
         try {
             response = client.exchange(url, HttpMethod.GET, requestEntity, String.class);
-        } catch (Exception e){
+        } catch (Exception e) {
             e.toString();
         }
 

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

@@ -25,6 +25,6 @@ public class ScheduledTasks {
     public void executeAtOneOClock() {
         System.out.println("每天 1 点执行的方法,当前时间:" + new Date());
         // 在这里编写具体的业务逻辑
-        legalPersonServiceimpl.iterativeProcessing(1, 100);
+//        legalPersonServiceimpl.iterativeProcessing(1, 100, 1);
     }
 }

+ 3 - 3
src/main/resources/application.properties

@@ -3,12 +3,12 @@ server.servlet.context-path=/poiApi/
 spring.application.name=poiAddr
 spring.servlet.multipart.max-file-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
+spring.jpa.show-sql=false
+# \u533A\u57DF
+app.area=\u677E\u6C5F