瀏覽代碼

优化初始化逻辑,调整结果匹配逻辑,将最优结果总分保存到level字段

DESKTOP-6LTVLN7\Liumouren 3 月之前
父節點
當前提交
9d3f189205

+ 17 - 97
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -39,74 +39,24 @@ public class AddressQueryEngine {
     /***
      * 单条地名搜索通用方法,搜索顺序  1. 武大吉奥; 2. 市四中心; 3. 高德搜索; 4. 高德高级搜索;
      * @param addrs
-     * @param level 搜索等级:
-     *              1. 搜索到结果就返回第一个;
-     *              2. 搜索到结果去除行政区划后,存在包含关系,则使用;
-     *              3. 搜索到结果,数字进行分词,数字匹配则使用;
-     *              4. 搜索到结果,数字与文本均匹配,则使用;
-     *              5. 结果与基准数据完全一致,则使用。
      * @return
      */
-    public AddressResult commonSearchByName(List<String> addrs, AddressLevel level) {
+    public AddressResult commonSearchByName(List<String> addrs) {
         if (addrs == null || addrs.size() < 1) {
             return null;
         }
         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) {
-                    contentBean.setSearchAddress(addr);
-                    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(sj_szxSearchByName(addr), level, addr);
-                if (contentBean != null) {
-                    contentBean.setSearchAddress(addr);
-                    contentBeans.add(contentBean);
-                    addressResult.setData(contentBeans);
+//              创建请求
+                addressResult = sj_szxSearchByName(addr);
+                if(addressResult != null){
                     addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
                     addressResult.setMessage("成功");
                     return getCjWgWgwByLoc(addressResult);
                 }
             }
         }
-        /*if (addressResult.getData() == null || addressResult.getData().size() == 0) {
-            for (String addr : addrs) {
-                AddressResult.ContentBean contentBean = verificaData(gdSearchByName(addr), level, addr);
-                if (contentBean != null) {
-                    contentBean.setSearchAddress(addr);
-                    contentBeans.add(contentBean);
-                    addressResult.setData(contentBeans);
-                    addressResult.setCode(AddressResultEnum.GD_SUCCESS);
-                    addressResult.setMessage("成功");
-                    return getCjWgWgwByLoc(addressResult);
-                }
-            }
-        }*/
-        /*if (addressResult.getData() == null || addressResult.getData().size() == 0) {
-            for (String addr : addrs) {
-                AddressResult.ContentBean contentBean = verificaData(gdV3SearchByName(addr), level, addr);
-                if (contentBean != null) {
-                    contentBean.setSearchAddress(addr);
-                    contentBeans.add(contentBean);
-                    addressResult.setData(contentBeans);
-                    addressResult.setCode(AddressResultEnum.GDV3_SUCCESS);
-                    addressResult.setMessage("成功");
-                    return getCjWgWgwByLoc(addressResult);
-                }
-            }
-        }*/
         addressResult.setCode(AddressResultEnum.RESULT_NULL);
         addressResult.setMessage("失败");
         return addressResult;
@@ -185,43 +135,6 @@ public class AddressQueryEngine {
         return sign;
     }
 
-    public Object x_sjRHSearchByAddr(String address) {
-//      鉴权
-        Map<String, String> headerMap = new HashMap<>();
-        String timestamp = System.currentTimeMillis() + "";
-        String appCode = "7unv4vbwqxnq4a7m9h";
-        String UUid = UUID.randomUUID().toString();
-        String appSecret = "w6tawvf4k3ck4ikij9";
-        headerMap.put("x-timestamp", timestamp);
-        headerMap.put("x-appcode", appCode);
-        headerMap.put("x-uuid", UUid);
-//      签名
-        headerMap.put("x-sign", getSigns(timestamp, appCode, UUid, appSecret));
-        JSONObject params = new JSONObject();
-        JSONArray requestJson = new JSONArray();
-        JSONObject paramObject = new JSONObject();
-        paramObject.put("name", "query");
-        paramObject.put("position", "QUERY");
-        paramObject.put("value", address);
-        requestJson.add(paramObject);
-        params.put("requestJson", requestJson);
-        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.POST, Constant.SJ_SZX_SEARCH_BY_NAME, params, headerMap, 10);
-        if (response != null) {
-            String body = response.getBody() + "";
-            if (!StringUtils.hasText(body))
-                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
-            try {
-                JSONArray json = JSONArray.parseArray(body);
-                return TransfromDataTool.szxResultToResult2(json);
-            } catch (Exception e) {
-                System.err.println(e);
-                return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
-            }
-        } else {
-            return "地址[" + address + "]未查询到数据!";
-        }
-    }
-
     public AddressResult sj_szxSearchByName(String address) {
 //      鉴权
         Map<String, String> headerMap = new HashMap<>();
@@ -234,7 +147,6 @@ public class AddressQueryEngine {
         headerMap.put("x-uuid", UUid);
 //      签名
         headerMap.put("x-sign", getSigns(timestamp, appCode, UUid, appSecret));
-
         JSONObject params = new JSONObject();
         JSONArray requestJson = new JSONArray();
         JSONObject paramObject = new JSONObject();
@@ -243,16 +155,24 @@ public class AddressQueryEngine {
         paramObject.put("value", address);
         requestJson.add(paramObject);
         params.put("requestJson", requestJson);
-        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.POST, Constant.SJ_SZX_SEARCH_BY_NAME, params, headerMap, 10);
+//      发起请求
+        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.POST, Constant.SJ_SZX_SEARCH_BY_NAME, params, headerMap, 1);
         if (response != null) {
             String body = response.getBody() + "";
             if (!StringUtils.hasText(body))
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
             try {
-                System.out.println("请求地址:" + address + ";返回结果:" + body);
-                return TransfromDataTool.szxResultToResult(JSONObject.parseObject(body));
+                if(body.indexOf("[") != 0){
+                    System.out.println("请求地址:" + address + ";返回结果错误:" + body);
+                    return null;
+                }else{
+//                  匹配得到得分最高的结果
+                    JSONObject res = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(address,JSONArray.parseArray(body),"address");
+//                  将得分最高的结果映射到实体类
+                    return TransfromDataTool.szxResultToResult2(res);
+                }
             } catch (Exception e) {
-                System.err.println(e);
+                System.err.println("请求地址:" + address + ";返回结果:" + body + ";处理异常:" + e);
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
             }
         } else {
@@ -349,7 +269,7 @@ public class AddressQueryEngine {
         } else {
             AreaService areaService = AreaService.getInstance();
             for (AddressResult.ContentBean content : result.getData()) {
-                if (content.getLat() != null && content.getLon() != null) {
+                if ((content.getAdname() == null || content.getCityname() == null) && content.getLat() != null && content.getLon() != null) {
                     GeoJsonBean adBean = areaService.isInadPolygon(content.getLon(), content.getLat());
                     content.setAdJson(adBean == null ? new JSONObject() : adBean.getProperties());
                     GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());

+ 34 - 8
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -3,6 +3,7 @@ package com.skyversation.poiaddr.addquery;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.util.AddressTools;
 import com.skyversation.poiaddr.util.CoordTransform2;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 
@@ -56,20 +57,16 @@ public class TransfromDataTool {
             content.setPname(jsonObject.getString("province"));
             content.setCityname(jsonObject.getString("district"));
             content.setAdname(jsonObject.getString("town"));
-//            content.setCommunity(jsonObject.getString("community"));
-//            content.setCommunityCode(jsonObject.getString("communitycode"));
             content.setType(jsonObject.getString("type"));
             content.setAddress(jsonObject.getString("address"));
-//            content.setDistance(jsonObject.getString("lv"));
             content.setName(jsonObject.getString("address"));
-            if (jsonObject.containsKey("location") && jsonObject.getJSONObject("location").containsKey("lat")) {
+            if (jsonObject.containsKey("location") && jsonObject.getJSONObject("location").containsKey("lat") && jsonObject.getJSONObject("location").containsKey("lng")) {
                 double[] points = CoordTransform2.getInstance().shcj_to_wgs84(
-                        Double.parseDouble(jsonObject.getJSONObject("location").getString("lat")), Double.parseDouble(jsonObject.getJSONObject("location").getString("lon")));
+                        Double.parseDouble(jsonObject.getJSONObject("location").getString("lat")), Double.parseDouble(jsonObject.getJSONObject("location").getString("lng")));
                 content.setLocation(points[0] + "," + points[1]);
-                content.setLon(points[0]);
-                content.setLat(points[1]);
+                content.setLat(points[0]);
+                content.setLon(points[1]);
             }
-
             if (result.getData() == null) {
                 result.setData(new ArrayList<>());
             }
@@ -79,6 +76,35 @@ public class TransfromDataTool {
         return result;
     }
 
+    public static AddressResult szxResultToResult2(JSONObject jsonObject) {
+        AddressResult result = new AddressResult();
+        if (jsonObject == null || jsonObject.size() < 1) {
+            result.setCode(AddressResultEnum.RESULT_NULL);
+            return result;
+        }
+        AddressResult.ContentBean content = new AddressResult.ContentBean();
+        content.setPname(jsonObject.getString("province"));
+        content.setCityname(jsonObject.getString("district"));
+        content.setAdname(jsonObject.getString("town"));
+        content.setType(jsonObject.getString("type"));
+        content.setAddress(jsonObject.getString("address"));
+        content.setName(jsonObject.getString("address"));
+        content.setScore(jsonObject.getString("总分"));
+        if (jsonObject.containsKey("location") && jsonObject.getJSONObject("location").containsKey("lat") && jsonObject.getJSONObject("location").containsKey("lng")) {
+            double[] points = CoordTransform2.getInstance().shcj_to_wgs84(
+                    Double.parseDouble(jsonObject.getJSONObject("location").getString("lat")), Double.parseDouble(jsonObject.getJSONObject("location").getString("lng")));
+            content.setLocation(points[0] + "," + points[1]);
+            content.setLat(points[0]);
+            content.setLon(points[1]);
+        }
+        if (result.getData() == null) {
+            result.setData(new ArrayList<>());
+        }
+        result.getData().add(content);
+        result.setCode(AddressResultEnum.WDJA_SUCCESS);
+        return result;
+    }
+
     public static AddressResult szxResultToResult(JSONObject json) {
         AddressResult result = new AddressResult();
         JSONArray array = json.getJSONArray("result");

+ 2 - 0
src/main/java/com/skyversation/poiaddr/bean/AddressResult.java

@@ -60,6 +60,8 @@ public class AddressResult {
         private JSONObject adJson;
         // 街镇信息
         private JSONObject townJson;
+        // 匹配地址得分
+        private String score;
     }
 
 }

+ 2 - 1
src/main/java/com/skyversation/poiaddr/config/DbConnection.java

@@ -48,6 +48,7 @@ public class DbConnection {
     }
 
     public int updateSql(String sqlStr) throws SQLException {
+//        System.out.println("执行更新操作sql:" + sqlStr);
         return stmt.executeUpdate(sqlStr);
     }
 
@@ -59,7 +60,7 @@ public class DbConnection {
         while (rs.next()) {
             Map<String, Object> dataItem = new HashMap<>();
             for (int i = 0; i < size; i++) {
-                dataItem.put(rsmd.getColumnName(i + 1),rs.getString(i + 1));
+                dataItem.put(rsmd.getColumnName(i + 1), rs.getString(i + 1));
             }
             requestData.add(dataItem);
         }

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

@@ -39,14 +39,10 @@ public class PoiAddressController {
      * 5、将结果保存为ser文件
      */
     @PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
-    public Object updateDataBaseData(@RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "level") Integer level, @RequestParam(name = "init") Integer init) {
+    public Object updateDataBaseData(@RequestParam(name = "pageSize") Integer pageSize, @RequestParam(name = "init") Integer init) {
         // 记录程序开始时间
         long startTime = System.currentTimeMillis();
-//      批量处理数据
-        if (level == null) {
-            level = 1;
-        }
-        testDataService.iterativeProcessing(pageSize, level, init);// 记录程序结束时间
+        testDataService.iterativeProcessing(pageSize, init);// 记录程序结束时间
         long endTime = System.currentTimeMillis();
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
@@ -76,6 +72,6 @@ public class PoiAddressController {
      */
     @GetMapping(value = "/searchAddr/{address}")
     public Object searchByAddrStr(@PathVariable(name = "address") String address) {
-        return AddressQueryEngine.getInstance().x_sjRHSearchByAddr(address);
+        return AddressQueryEngine.getInstance().sj_szxSearchByName(address);
     }
 }

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

@@ -6,6 +6,8 @@ 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.entity.SjArrDzbzhSjWcbryDzxx;
+import com.skyversation.poiaddr.service.impl.SjArrDzbzhSjWcbryDzxxServiceImpl;
 import com.skyversation.poiaddr.util.status.AddressLevel;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
@@ -18,6 +20,7 @@ import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
@@ -25,6 +28,9 @@ import java.util.List;
 @Service
 public class AreaService {
 
+    @Resource
+    private SjArrDzbzhSjWcbryDzxxServiceImpl sjArrDzbzhSjWcbryDzxxService;
+
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -65,11 +71,19 @@ public class AreaService {
         try {
             System.out.println("<<<<<<<<------开始网络连通性测试");
             List<String> addrs = new ArrayList<>();
-            addrs.add("上海市青浦区馨浦苑西区2号楼1201");
-            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs, AddressLevel.values()[0]);
-            System.out.println("<<<<<<<<------网络连通性测试结果:" + addressResult);
+            addrs.add("上海市松江区乐都路339号");
+            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs);
+            System.out.println(">>>>>>>>------网络连通性测试结果:" + addressResult);
+        } catch (Exception e) {
+            System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
+        }
+//      TODO 数据库连通性测试
+        try {
+            System.out.println("<<<<<<<<------开始数据库连通性测试");
+            List<SjArrDzbzhSjWcbryDzxx> listData = sjArrDzbzhSjWcbryDzxxService.getAllDataPage(1);
+            System.out.println(">>>>>>>>------数据库连通性测试结果:" + listData.toString());
         } catch (Exception e) {
-            System.err.println("<<<<<<<<------网络连通性测试结果:" + e);
+            System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
         }
 
     }

+ 186 - 136
src/main/java/com/skyversation/poiaddr/service/impl/SjArrDzbzhSjWcbryDzxxServiceImpl.java

@@ -8,10 +8,7 @@ import com.skyversation.poiaddr.entity.SjArrDzbzhSjWcbryDzxx;
 import com.skyversation.poiaddr.util.status.AddressLevel;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -24,27 +21,73 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
     public List<SjArrDzbzhSjWcbryDzxx> getAllDataPage(int size) {
         try {
             List<SjArrDzbzhSjWcbryDzxx> requestData = new ArrayList<>();
-            String sql = "SELECT * FROM sj_zrr_dzbzh_sj_wcbry_dzxx WHERE update_time is null group by id limit " + size;
-            List<Map<String, Object>> dbData = DbConnection.getInstance().runSqlStr(sql);
+            String sql = "SELECT * FROM sj_zrr_dzbzh_sj_wcbry_dzxx WHERE update_time is null limit " + size;
+            List<Map<String, Object>> oldDbData = DbConnection.getInstance().runSqlStr(sql);
+//          去重
+            Map<String, Map<String, Object>> newRequestData = new HashMap<>();
+            for (Map<String, Object> item : oldDbData) {
+                if (item.get("id") != null) {
+                    newRequestData.put(item.get("id").toString(), item);
+                }
+
+            }
+            List<Map<String, Object>> dbData = new ArrayList<>();
+            for (String id : newRequestData.keySet()) {
+                dbData.add(newRequestData.get(id));
+            }
             for (Map<String, Object> item : dbData) {
                 SjArrDzbzhSjWcbryDzxx sjArrDzbzhSjWcbryDzxx = new SjArrDzbzhSjWcbryDzxx();
-                sjArrDzbzhSjWcbryDzxx.setId(item.getOrDefault("id", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setInTheArea(item.getOrDefault("in_the_area", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setResultAddrKey(item.getOrDefault("result_addr_key", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setLevel(item.getOrDefault("level", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setLat(item.getOrDefault("lat", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setLon(item.getOrDefault("lon", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setMarket(item.getOrDefault("market", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setTwon(item.getOrDefault("twon", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setAdministrativeDivision(item.getOrDefault("administrative_division", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setStandardizedAddress(item.getOrDefault("standardized_address", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setUpdateTime(new Date(item.getOrDefault("update_time", "").toString()));
-                sjArrDzbzhSjWcbryDzxx.setJcHjdz(item.getOrDefault("jc_hjdz", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setJcJzdz(item.getOrDefault("jc_jzdz", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setSkHjdz(item.getOrDefault("sk_hjdz", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setSkJzdz(item.getOrDefault("sk_jzdz", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setSqyHjdz(item.getOrDefault("sqy_hjdz", "").toString());
-                sjArrDzbzhSjWcbryDzxx.setSqyJzdz(item.getOrDefault("sqy_jzdz", "").toString());
+                if (item.get("id") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setId(item.getOrDefault("id", "").toString());
+                }
+                if (item.get("in_the_area") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setInTheArea(item.getOrDefault("in_the_area", "").toString());
+                }
+                if (item.get("result_addr_key") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setResultAddrKey(item.getOrDefault("result_addr_key", "").toString());
+                }
+                if (item.get("level") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setLevel(item.getOrDefault("level", "").toString());
+                }
+                if (item.get("lat") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setLat(item.getOrDefault("lat", "").toString());
+                }
+                if (item.get("lon") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setLon(item.getOrDefault("lon", "").toString());
+                }
+                if (item.get("market") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setMarket(item.getOrDefault("market", "").toString());
+                }
+                if (item.get("twon") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setTwon(item.getOrDefault("twon", "").toString());
+                }
+                if (item.get("administrative_division") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setAdministrativeDivision(item.getOrDefault("administrative_division", "").toString());
+                }
+                if (item.get("standardized_address") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setStandardizedAddress(item.getOrDefault("standardized_address", "").toString());
+                }
+                /*if (item.get("update_time") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setUpdateTime(new Date(item.getOrDefault("update_time", "").toString()));
+                }*/
+                if (item.get("jc_hjdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setJcHjdz(item.getOrDefault("jc_hjdz", "").toString());
+                }
+                if (item.get("jc_jzdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setJcJzdz(item.getOrDefault("jc_jzdz", "").toString());
+                }
+                if (item.get("sk_hjdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setSkHjdz(item.getOrDefault("sk_hjdz", "").toString());
+                }
+                if (item.get("sk_jzdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setSkJzdz(item.getOrDefault("sk_jzdz", "").toString());
+                }
+                if (item.get("sqy_hjdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setSqyHjdz(item.getOrDefault("sqy_hjdz", "").toString());
+                }
+                if (item.get("sqy_jzdz") != null) {
+                    sjArrDzbzhSjWcbryDzxx.setSqyJzdz(item.getOrDefault("sqy_jzdz", "").toString());
+                }
                 requestData.add(sjArrDzbzhSjWcbryDzxx);
             }
             return requestData;
@@ -60,53 +103,58 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
             if (!item.getId().isEmpty()) {
                 StringBuilder sql = new StringBuilder();
                 sql.append("update sj_zrr_dzbzh_sj_wcbry_dzxx set ");
-                if (item.getLat().isEmpty()) {
+                if (item.getLat() == null) {
                     sql.append(" lat = null");
                 } else {
-                    sql.append(" lat = ").append(item.getLat());
+                    sql.append(" lat = '").append(item.getLat()).append("'");
                 }
-                if (item.getLon().isEmpty()) {
-                    sql.append(" lon = null");
+                if (item.getLon() == null) {
+                    sql.append(", lon = null");
                 } else {
-                    sql.append(" lon = ").append(item.getLon());
+                    sql.append(", lon = '").append(item.getLon()).append("'");
                 }
-                if (item.getLevel().isEmpty()) {
-                    sql.append(" level = null");
+                if (item.getLevel() == null) {
+                    sql.append(", level = null");
                 } else {
-                    sql.append(" level = ").append(item.getLevel());
+                    sql.append(", level = '").append(item.getLevel()).append("'");
                 }
-                if (item.getAdministrativeDivision().isEmpty()) {
-                    sql.append(" administrative_division = null");
+                if (item.getAdministrativeDivision() == null) {
+                    sql.append(", administrative_division = null");
                 } else {
-                    sql.append(" administrative_division = ").append(item.getAdministrativeDivision());
+                    sql.append(", administrative_division = '").append(item.getAdministrativeDivision()).append("'");
                 }
-                if (item.getInTheArea().isEmpty()) {
-                    sql.append(" in_the_area = null");
+                if (item.getInTheArea() == null) {
+                    sql.append(", in_the_area = null");
                 } else {
-                    sql.append(" in_the_area = ").append(item.getInTheArea());
+                    sql.append(", in_the_area = '").append(item.getInTheArea()).append("'");
                 }
-                if (item.getMarket().isEmpty()) {
-                    sql.append(" market = null");
+                if (item.getMarket() == null) {
+                    sql.append(", market = null");
                 } else {
-                    sql.append(" market = ").append(item.getMarket());
+                    sql.append(", market = '").append(item.getMarket()).append("'");
                 }
-                if (item.getResultAddrKey().isEmpty()) {
-                    sql.append(" result_addr_key = null");
+                if (item.getResultAddrKey() == null) {
+                    sql.append(", result_addr_key = null");
                 } else {
-                    sql.append(" result_addr_key = ").append(item.getResultAddrKey());
+                    sql.append(", result_addr_key = '").append(item.getResultAddrKey()).append("'");
                 }
-                if (item.getStandardizedAddress().isEmpty()) {
-                    sql.append(" standardized_address = null");
+                if (item.getStandardizedAddress() == null) {
+                    sql.append(", standardized_address = null");
                 } else {
-                    sql.append(" standardized_address = ").append(item.getStandardizedAddress());
+                    sql.append(", standardized_address = '").append(item.getStandardizedAddress()).append("'");
                 }
                 if (item.getUpdateTime() == null) {
-                    sql.append(" standardized_address = null");
+                    sql.append(", update_time = null");
                 } else {
-                    sql.append(" standardized_address = ").append(item.getUpdateTime());
+                    sql.append(", update_time = ").append(item.getUpdateTime().getTime());
                 }
+
+                sql.append(" where id = '").append(item.getId()).append("'");
                 try {
-                    DbConnection.getInstance().updateSql(sql.toString());
+                    int updateDataSum = DbConnection.getInstance().updateSql(sql.toString());
+                    if (updateDataSum < 1) {
+                        System.err.println("------updateError--------------------------------------" + sql + "更新异常!");
+                    }
                 } catch (Exception e) {
                     System.err.println("更新异常" + e);
                 }
@@ -130,127 +178,129 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
 
     /**
      * 首先要得到一个Page<T>对象,然后判断是否还有别的数据,有的话接着请求并返回新的Page<T>对象并迭代处理数据
+     * init [0:批量处理;1:初始化]
      */
-    public void iterativeProcessing(Integer pageSize, Integer level, Integer init) {
+    public void iterativeProcessing(Integer pageSize, Integer init) {
         System.out.println("<<<<<<<<------iterativeProcessing{pageSize:" + pageSize + "}");
         long startTime = System.currentTimeMillis();
-        List<SjArrDzbzhSjWcbryDzxx> listData = getAllDataPage(pageSize);
-        if (listData.size() > 0) {
-            // 创建线程池
-            ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
-            List<Future<?>> futures = new ArrayList<>();
-            for (SjArrDzbzhSjWcbryDzxx item : listData) {
-                futures.add(executorService.submit(() -> {
-                    if (init == 1) {
-                        item.setInTheArea(null);
-                        item.setTwon(null);
-                        item.setLevel(null);
-                        item.setAdministrativeDivision(null);
-                        item.setStandardizedAddress(null);
-                        item.setMarket(null);
-                        item.setLat(null);
-                        item.setLon(null);
-                        item.setResultAddrKey(null);
-                        item.setUpdateTime(null);
-                    } else {
+        if (init == 0) {
+            List<SjArrDzbzhSjWcbryDzxx> listData = getAllDataPage(pageSize);
+            if (listData != null && listData.size() > 0) {
+                // 创建线程池
+                ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
+                List<Future<?>> futures = new ArrayList<>();
+                for (SjArrDzbzhSjWcbryDzxx item : listData) {
+                    futures.add(executorService.submit(() -> {
                         List<String> addrList = new ArrayList<>();
                         if (item.getSkHjdz() != null && !item.getSkHjdz().isEmpty() && isOtherDistrictThanSongJiang(item.getSkHjdz())) {
-//                          实口户籍地址
+//                              实口户籍地址
                             addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getSkHjdz()));
                         }
                         if (item.getSkJzdz() != null && !item.getSkJzdz().isEmpty() && isOtherDistrictThanSongJiang(item.getSkJzdz())) {
-//                          实口居住地址
+//                              实口居住地址
                             addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getSkJzdz()));
                         }
                         if (item.getJcHjdz() != null && !item.getJcHjdz().isEmpty() && isOtherDistrictThanSongJiang(item.getJcHjdz())) {
-//                          基层户籍地址
+//                              基层户籍地址
                             addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getJcHjdz()));
                         }
                         if (item.getJcJzdz() != null && !item.getJcJzdz().isEmpty() && isOtherDistrictThanSongJiang(item.getJcJzdz())) {
-//                          基层居住地址
+//                              基层居住地址
                             addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.getJcJzdz()));
                         }
-//                      判断地址是否属于松江区
+//                          判断地址是否属于松江区
                         if (addrList.size() > 0) {
-//                          开始查询
-                            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList, AddressLevel.values()[level - 1]);
-                            if (addressResult != null) {
-                                if (addressResult.getData() == null || addressResult.getData().size() < 1) {
-                                    item.setInTheArea("异常");
-                                    item.setResultAddrKey("未匹配到符合规则的结果!");
-                                } else {
-                                    try {
-                                        for (AddressResult.ContentBean contentBean : addressResult.getData()) {
-                                            String resultAddrKey = contentBean.getAddress();
-                                            if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null && isOtherDistrictThanSongJiang(resultAddrKey) && contentBean.getAdJson() != null && contentBean.getTownJson() != null) {
-                                                String lng = contentBean.getLat() + "";
-                                                String lat = contentBean.getLon() + "";
-                                                item.setInTheArea("是");
-                                                if (contentBean.getAdJson().getString("name") != null) {
-                                                    item.setAdministrativeDivision(contentBean.getAdJson().getString("name"));
-                                                }
-                                                if (contentBean.getTownJson().getString("name") != null) {
-                                                    item.setTwon(contentBean.getTownJson().getString("name"));
-                                                }
-                                                item.setLat(lat);
-                                                item.setLon(lng);
-                                                item.setResultAddrKey(resultAddrKey);
-                                                item.setMarket("上海市");
+//                              开始查询
+                            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList);
+                            if (addressResult == null || addressResult.getData() == null || addressResult.getData().size() < 1) {
+                                item.setInTheArea("异常");
+                                item.setResultAddrKey("未匹配到符合规则的结果");
+                            } else {
+                                try {
+                                    for (AddressResult.ContentBean contentBean : addressResult.getData()) {
+                                        String resultAddrKey = contentBean.getAddress();
+                                        if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null && isOtherDistrictThanSongJiang(resultAddrKey)) {
+                                            String lng = contentBean.getLon() + "";
+                                            String lat = contentBean.getLat() + "";
+                                            item.setInTheArea("是");
+                                            if (contentBean.getAdname() != null) {
+                                                item.setTwon(contentBean.getAdname());
+                                            } else if (contentBean.getTownJson().getString("name") != null) {
+                                                item.setTwon(contentBean.getTownJson().getString("name"));
+                                            }
+                                            if (contentBean.getCityname() != null) {
+                                                item.setAdministrativeDivision(contentBean.getCityname());
+                                            } else if (contentBean.getAdJson().getString("name") != null) {
+                                                item.setAdministrativeDivision(contentBean.getAdJson().getString("name"));
+                                            }
+                                            item.setLat(lat);
+                                            item.setLon(lng);
+                                            item.setResultAddrKey(resultAddrKey);
+                                            item.setMarket("上海市");
+                                            item.setLevel(contentBean.getScore());
 //                                              开始规范化地址(把查询地址的市、区、街镇替换为空,然后把得到的区、街镇拼接上去)(得到区、街镇)
-                                                String oldAddress = contentBean.getSearchAddress().replaceAll("上海市", "").replaceAll("松江区", "");
-                                                String[] towns = Constant.getTowns();
-                                                for (String town : towns) {
-                                                    oldAddress = oldAddress.replaceAll(town, "");
-                                                }
-                                                if (contentBean.getCjJson() != null && contentBean.getCjJson().containsKey("所属居委")) {
-                                                    oldAddress = contentBean.getCjJson().getString("所属居委") + oldAddress;
-                                                }
-                                                item.setStandardizedAddress("上海市" + item.getAdministrativeDivision() + item.getTwon() + oldAddress);
-                                                break;
-                                            } else {
-                                                item.setInTheArea("异常");
-                                                item.setResultAddrKey("未匹配到符合规则的结果!");
+                                            String oldAddress = contentBean.getSearchAddress().replaceAll("上海市", "").replaceAll("松江区", "");
+                                            String[] towns = Constant.getTowns();
+                                            for (String town : towns) {
+                                                oldAddress = oldAddress.replaceAll(town, "");
                                             }
+                                            if (contentBean.getCjJson() != null && contentBean.getCjJson().containsKey("所属居委")) {
+                                                oldAddress = contentBean.getCjJson().getString("所属居委") + oldAddress;
+                                            }
+                                            item.setStandardizedAddress("上海市" + item.getAdministrativeDivision() + item.getTwon() + oldAddress);
+                                            break;
+                                        } else {
+                                            item.setInTheArea("异常");
+                                            item.setResultAddrKey("结果处理异常");
                                         }
-                                    } catch (Exception e) {
-                                        item.setInTheArea("异常");
-                                        System.err.println("查询结果处理异常:" + e);
                                     }
+                                } catch (Exception e) {
+                                    item.setInTheArea("异常");
+                                    System.err.println("查询结果处理异常:" + e);
                                 }
-                            } else {
-                                item.setInTheArea("异常");
-                                item.setResultAddrKey("未匹配到符合规则的结果!");
                             }
                         } else {
 //                          更新时间,添加是否松江判断字段为否
                             item.setInTheArea("否");
                         }
                         item.setUpdateTime(new Date());
-                        item.setLevel(level.toString());
-                    }
-                }));
-            }
+                    }));
+                }
 
-            // 等待所有任务完成
-            for (Future<?> future : futures) {
-                try {
-                    future.get();
-                } catch (InterruptedException | ExecutionException e) {
-                    System.err.println("线程异常:" + e);
+                // 等待所有任务完成
+                for (Future<?> future : futures) {
+                    try {
+                        future.get();
+                    } catch (InterruptedException | ExecutionException e) {
+                        System.err.println("线程异常:" + e);
+                    }
+                }
+                // 关闭线程池
+                executorService.shutdown();
+                updateDatas(listData);
+                long endTime = System.currentTimeMillis();
+                System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!");
+                if (listData.size() > 0) {
+                    iterativeProcessing(pageSize, init);
+                } else {
+                    System.out.println("<<<<<<<<------任务处理完成!");
                 }
-            }
-            // 关闭线程池
-            executorService.shutdown();
-            updateDatas(listData);
-            long endTime = System.currentTimeMillis();
-            System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!");
-            if (listData.size() > 0) {
-                iterativeProcessing(pageSize, level, init);
             } else {
                 System.out.println("<<<<<<<<------任务处理完成!");
             }
         } else {
-            System.out.println("<<<<<<<<------任务处理完成!");
+            String SqlStr = "update sj_zrr_dzbzh_sj_wcbry_dzxx set lat = null, update_time = null, standardized_address = null, result_addr_key = null, market = null, lon = null, level = null, administrative_division = null, in_the_area = null where in_the_area is not null";
+            try {
+                int updateDataSum = DbConnection.getInstance().updateSql(SqlStr);
+                if (updateDataSum < 1) {
+                    System.err.println("------updateError--------------------------------------" + SqlStr + "更新异常!");
+                }
+                System.out.println("<<<<<<<<------任务处理完成!");
+                long endTime = System.currentTimeMillis();
+                System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!");
+            } catch (Exception e) {
+                System.err.println("更新异常" + e);
+            }
         }
     }
 }

+ 771 - 0
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -0,0 +1,771 @@
+package com.skyversation.poiaddr.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.skyversation.poiaddr.bean.AddressResult;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AddressTools {
+
+    private static AddressTools instance = new AddressTools();
+    private AddressTools (){};
+    public static AddressTools getInstance(){
+        if(instance == null) instance = new AddressTools();
+        return instance;
+    }
+
+    // 上海市所有的区
+    private static final Set<String> SHANGHAI_DISTRICTS = new HashSet<>(Arrays.asList(
+            "黄浦区", "徐汇区", "长宁区", "静安区", "普陀区",
+            "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区",
+            "浦东新区", "金山区", "松江区", "青浦区", "奉贤区",
+            "崇明区"
+    ));
+
+    // 各区下辖的镇与街道
+    private static final Map<String, Set<String>> DISTRICT_STREETS = new HashMap<>();
+    // 街镇下辖的村和居委
+    private static final Map<String, Set<String>> STREET_VILLAGES_COMMUNITIES = new HashMap<>();
+    static {
+//        // 松江区
+//        Set<String> songjiangStreets = new HashSet<>(Arrays.asList(
+//                "中山街道", "方松街道", "永丰街道", "岳阳街道",
+//                "泗泾镇", "佘山镇", "车墩镇", "新桥镇", "洞泾镇",
+//                "九亭镇", "泖港镇", "石湖荡镇", "新浜镇", "叶榭镇",
+//                "小昆山镇"
+//        ));
+//        DISTRICT_STREETS.put("松江区", songjiangStreets);
+
+        // 中山街道下辖的村居
+        Set<String> zhongshanCommunities = new HashSet<>(Arrays.asList(
+                "茸梅社区居委会", "方东社区居委会", "夏家浜社区居委会",
+                "五龙村", "永隆村", "白洋村",
+                "白云社区居委会"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("中山街道", zhongshanCommunities);
+
+        // 方松街道下辖的村居
+        Set<String> fangsongCommunities = new HashSet<>(Arrays.asList(
+                "泰晤士小镇社区居委会", "绿地社区居委会", "公捷苑社区居委会",
+                "新陈家村", "江秋村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("方松街道", fangsongCommunities);
+
+        // 永丰街道下辖的村居
+        Set<String> yongfengCommunities = new HashSet<>(Arrays.asList(
+                "秀南社区居委会", "仓桥社区居委会", "玉乐社区居委会",
+                "周星村", "秀塘浜村", "薛家埭村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("永丰街道", yongfengCommunities);
+
+        // 岳阳街道下辖的村居
+        Set<String> yueyangCommunities = new HashSet<>(Arrays.asList(
+                "太平社区居委会", "菜花泾社区居委会", "佛字桥社区居委会",
+                "长桥村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("岳阳街道", yueyangCommunities);
+
+        // 泗泾镇下辖的村居
+        Set<String> sijingCommunities = new HashSet<>(Arrays.asList(
+                "江川社区居委会", "横港社区居委会", "青松社区居委会",
+                "泗泾村", "张施村", "打铁桥村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("泗泾镇", sijingCommunities);
+
+        // 佘山镇下辖的村居
+        Set<String> sheshanCommunities = new HashSet<>(Arrays.asList(
+                "陈坊桥社区居委会", "北干山社区居委会", "佘山家园社区居委会",
+                "江秋村", "陈坊村", "高家厍村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("佘山镇", sheshanCommunities);
+
+        // 车墩镇下辖的村居
+        Set<String> chendunCommunities = new HashSet<>(Arrays.asList(
+                "虬长路社区居委会", "车墩社区居委会", "高桥村",
+                "联建村", "联庄村", "洋泾村", "新余村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("车墩镇", chendunCommunities);
+
+        // 新桥镇下辖的村居
+        Set<String> xinqiaoCommunities = new HashSet<>(Arrays.asList(
+                "新乐社区居委会", "晨星社区居委会", "春申社区居委会",
+                "民益村", "马汤村", "潘家浜村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("新桥镇", xinqiaoCommunities);
+
+        // 洞泾镇下辖的村居
+        Set<String> dongjingCommunities = new HashSet<>(Arrays.asList(
+                "海欣社区居委会", "洞泾社区居委会", "同欣社区居委会",
+                "渔洋浜村", "砖桥村", "张泾村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("洞泾镇", dongjingCommunities);
+
+        // 九亭镇下辖的村居
+        Set<String> jiutingCommunities = new HashSet<>(Arrays.asList(
+                "亭中社区居委会", "亭东社区居委会", "亭南社区居委会",
+                "九亭村", "朱泾浜村", "小寅村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("九亭镇", jiutingCommunities);
+
+        // 泖港镇下辖的村居
+        Set<String> maogangCommunities = new HashSet<>(Arrays.asList(
+                "泖港社区居委会", "五厍社区居委会", "腰泾村",
+                "胡光村", "新龚村", "泖港村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("泖港镇", maogangCommunities);
+
+        // 石湖荡镇下辖的村居
+        Set<String> shihudangCommunities = new HashSet<>(Arrays.asList(
+                "古松社区居委会", "李塔汇社区居委会", "新源村",
+                "东港村", "洙桥村", "金胜村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("石湖荡镇", shihudangCommunities);
+
+        // 新浜镇下辖的村居
+        Set<String> xinbangCommunities = new HashSet<>(Arrays.asList(
+                "新浜社区居委会", "赵王村", "胡家埭村",
+                "南杨村", "黄家埭村", "许家草村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("新浜镇", xinbangCommunities);
+
+        // 叶榭镇下辖的村居
+        Set<String> yexieCommunities = new HashSet<>(Arrays.asList(
+                "叶榭社区居委会", "张泽社区居委会", "堰泾村",
+                "井凌桥村", "兴达村", "同建村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("叶榭镇", yexieCommunities);
+
+        // 小昆山镇下辖的村居
+        Set<String> xiaokunshanCommunities = new HashSet<>(Arrays.asList(
+                "大港社区居委会", "平原社区居委会", "玉昆二村社区居委会",
+                "汤村庙村", "陆家埭村", "昆西村"
+        ));
+        STREET_VILLAGES_COMMUNITIES.put("小昆山镇", xiaokunshanCommunities);
+    }
+    static {
+        // 黄浦区
+        Set<String> huangpuStreets = new HashSet<>(Arrays.asList(
+                "南京东路街道", "外滩街道", "半淞园路街道", "小东门街道",
+                "豫园街道", "老西门街道", "五里桥街道", "打浦桥街道"
+        ));
+        DISTRICT_STREETS.put("黄浦区", huangpuStreets);
+
+        // 徐汇区
+        Set<String> xuhuiStreets = new HashSet<>(Arrays.asList(
+                "天平路街道", "湖南路街道", "斜土路街道", "枫林路街道",
+                "长桥街道", "漕河泾街道", "康健新村街道", "徐家汇街道",
+                "凌云路街道", "龙华街道", "漕河泾镇", "华泾镇"
+        ));
+        DISTRICT_STREETS.put("徐汇区", xuhuiStreets);
+
+        // 长宁区
+        Set<String> changningStreets = new HashSet<>(Arrays.asList(
+                "华阳路街道", "江苏路街道", "新华路街道", "周家桥街道",
+                "天山路街道", "仙霞新村街道", "虹桥街道", "程家桥街道",
+                "北新泾街道", "新泾镇"
+        ));
+        DISTRICT_STREETS.put("长宁区", changningStreets);
+
+        // 静安区
+        Set<String> jinganStreets = new HashSet<>(Arrays.asList(
+                "江宁路街道", "石门二路街道", "南京西路街道", "静安寺街道",
+                "曹家渡街道", "天目西路街道", "北站街道", "宝山路街道",
+                "芷江西路街道", "共和新路街道", "大宁路街道", "彭浦新村街道",
+                "临汾路街道", "彭浦镇"
+        ));
+        DISTRICT_STREETS.put("静安区", jinganStreets);
+
+        // 普陀区
+        Set<String> putuoStreets = new HashSet<>(Arrays.asList(
+                "曹杨新村街道", "长风新村街道", "长寿路街道", "甘泉路街道",
+                "石泉路街道", "宜川路街道", "万里街道", "真如镇街道",
+                "长征镇", "桃浦镇"
+        ));
+        DISTRICT_STREETS.put("普陀区", putuoStreets);
+
+        // 虹口区
+        Set<String> hongkouStreets = new HashSet<>(Arrays.asList(
+                "欧阳路街道", "曲阳路街道", "广中路街道", "嘉兴路街道",
+                "凉城新村街道", "四川北路街道", "提篮桥街道", "江湾镇街道"
+        ));
+        DISTRICT_STREETS.put("虹口区", hongkouStreets);
+
+        // 杨浦区
+        Set<String> yangpuStreets = new HashSet<>(Arrays.asList(
+                "定海路街道", "平凉路街道", "江浦路街道", "四平路街道",
+                "控江路街道", "长白新村街道", "延吉新村街道", "殷行街道",
+                "大桥街道", "五角场街道", "新江湾城街道", "五角场镇"
+        ));
+        DISTRICT_STREETS.put("杨浦区", yangpuStreets);
+
+        // 闵行区
+        Set<String> minhangStreets = new HashSet<>(Arrays.asList(
+                "江川路街道", "新虹街道", "古美路街道", "浦锦街道",
+                "莘庄镇", "七宝镇", "颛桥镇", "华漕镇", "虹桥镇",
+                "梅陇镇", "吴泾镇", "马桥镇", "浦江镇"
+        ));
+        DISTRICT_STREETS.put("闵行区", minhangStreets);
+
+        // 宝山区
+        Set<String> baoshanStreets = new HashSet<>(Arrays.asList(
+                "吴淞街道", "友谊路街道", "张庙街道", "罗店镇",
+                "大场镇", "杨行镇", "月浦镇", "罗泾镇", "顾村镇",
+                "高境镇", "庙行镇", "淞南镇"
+        ));
+        DISTRICT_STREETS.put("宝山区", baoshanStreets);
+
+        // 嘉定区
+        Set<String> jiadingStreets = new HashSet<>(Arrays.asList(
+                "新成路街道", "真新街道", "嘉定镇街道", "南翔镇",
+                "安亭镇", "马陆镇", "徐行镇", "华亭镇", "外冈镇",
+                "江桥镇"
+        ));
+        DISTRICT_STREETS.put("嘉定区", jiadingStreets);
+
+        // 浦东新区
+        Set<String> pudongStreets = new HashSet<>(Arrays.asList(
+                "潍坊新村街道", "陆家嘴街道", "周家渡街道", "塘桥街道",
+                "上钢新村街道", "南码头路街道", "沪东新村街道", "金杨新村街道",
+                "洋泾街道", "浦兴路街道", "东明路街道", "花木街道",
+                "川沙新镇", "高桥镇", "北蔡镇", "合庆镇", "唐镇",
+                "曹路镇", "金桥镇", "高东镇", "张江镇", "三林镇",
+                "惠南镇", "周浦镇", "新场镇", "大团镇", "康桥镇",
+                "航头镇", "祝桥镇", "泥城镇", "宣桥镇", "书院镇",
+                "万祥镇", "老港镇", "南汇新城镇"
+        ));
+        DISTRICT_STREETS.put("浦东新区", pudongStreets);
+
+        // 金山区
+        Set<String> jinshanStreets = new HashSet<>(Arrays.asList(
+                "石化街道", "朱泾镇", "枫泾镇", "张堰镇", "亭林镇",
+                "吕巷镇", "廊下镇", "金山卫镇", "漕泾镇", "山阳镇"
+        ));
+        DISTRICT_STREETS.put("金山区", jinshanStreets);
+
+        // 松江区
+        Set<String> songjiangStreets = new HashSet<>(Arrays.asList(
+                "中山街道", "方松街道", "永丰街道", "岳阳街道",
+                "泗泾镇", "佘山镇", "车墩镇", "新桥镇", "洞泾镇",
+                "九亭镇", "泖港镇", "石湖荡镇", "新浜镇", "叶榭镇",
+                "小昆山镇"
+        ));
+        DISTRICT_STREETS.put("松江区", songjiangStreets);
+
+        // 青浦区
+        Set<String> qingpuStreets = new HashSet<>(Arrays.asList(
+                "夏阳街道", "盈浦街道", "香花桥街道", "朱家角镇",
+                "练塘镇", "金泽镇", "赵巷镇", "徐泾镇", "华新镇",
+                "重固镇", "白鹤镇"
+        ));
+        DISTRICT_STREETS.put("青浦区", qingpuStreets);
+
+        // 奉贤区
+        Set<String> fengxianStreets = new HashSet<>(Arrays.asList(
+                "西渡街道", "奉浦街道", "南桥镇", "庄行镇", "金汇镇",
+                "柘林镇", "青村镇", "奉城镇", "四团镇", "海湾镇"
+        ));
+        DISTRICT_STREETS.put("奉贤区", fengxianStreets);
+
+        // 崇明区
+        Set<String> chongmingStreets = new HashSet<>(Arrays.asList(
+                "城桥镇", "堡镇", "新河镇", "庙镇", "竖新镇",
+                "向化镇", "三星镇", "港沿镇", "中兴镇", "陈家镇",
+                "绿华镇", "港西镇", "建设镇", "新海镇", "东平镇"
+        ));
+        DISTRICT_STREETS.put("崇明区", chongmingStreets);
+    }
+
+
+    /***
+     * 根据地名地址返回到街镇一级分词,
+     * @param address 上海市松江区车墩镇乐都路590号
+     * @return 上海市,松江区,车墩镇,乐都路590号
+     */
+    public static String[] parseAddressJZ(String address) {
+        String[] result = new String[4];
+        result[0] = "上海市";
+
+        // 去除地址中的“上海”和“上海市”
+        address = address.replaceAll("上海(市)?", "");
+
+        // 查找区
+        String foundDistrict = null;
+        for (String district : SHANGHAI_DISTRICTS) {
+            if (address.contains(district)) {
+                foundDistrict = district;
+                address = address.replace(district, "");
+                break;
+            }
+        }
+        result[1] = foundDistrict;
+
+        // 查找街镇
+        String foundStreet = null;
+        if (foundDistrict != null) {
+            Set<String> streets = DISTRICT_STREETS.get(foundDistrict);
+            if (streets != null) {
+                for (String street : streets) {
+                    if (address.contains(street)) {
+                        foundStreet = street;
+                        address = address.replace(street, "");
+                        break;
+                    } else if (address.contains(street.replace("镇", "")) || address.contains(street.replace("街道", ""))) {
+                        foundStreet = street;
+                        address = address.replace(street.replace("镇", ""), "").replace(street.replace("街道", ""), "");
+                        break;
+                    }
+                }
+            }
+        }
+        result[2] = foundStreet;
+
+        // 剩余部分为其他信息
+        address = address.trim();
+        result[3] = address;
+
+        return result;
+    }
+
+    /***
+     * 根据地名地址返回到村居一级分词,村居不是很准确
+     * @param address 上海市松江区车墩镇乐都村乐都路590号
+     * @return  上海市,松江区,车墩镇,乐都村,乐都路590号
+     */
+    public static String[] parseAddressCJ(String address) {
+        String[] result = new String[5];
+        result[0] = "上海市";
+
+        // 去除地址中的“上海”和“上海市”
+        address = address.replaceAll("上海(市)?", "");
+
+        // 先尝试通过村居信息定位
+        String foundVillageOrCommunity = null;
+        String foundStreet = null;
+        String foundDistrict = null;
+        for (Map.Entry<String, Set<String>> streetEntry : STREET_VILLAGES_COMMUNITIES.entrySet()) {
+            String street = streetEntry.getKey();
+            Set<String> villagesCommunities = streetEntry.getValue();
+            for (String villageCommunity : villagesCommunities) {
+                if (address.contains(villageCommunity)) {
+                    foundVillageOrCommunity = villageCommunity;
+                    foundStreet = street;
+                    address = address.replace(villageCommunity, "");
+                    break;
+                } else {
+                    String shortName = villageCommunity.replace("村", "").replace("社区居委会", "").replace("居委会", "");
+                    // 避免与街镇简称冲突
+                    String streetShortName = street.replace("镇", "").replace("街道", "");
+                    if (!shortName.equals(streetShortName) && address.contains(shortName)) {
+                        foundVillageOrCommunity = villageCommunity;
+                        foundStreet = street;
+                        address = address.replace(shortName, "");
+                        break;
+                    }
+                }
+            }
+            if (foundVillageOrCommunity != null) {
+                break;
+            }
+        }
+
+        // 如果通过村居定位到了街镇,再定位区
+        if (foundStreet != null) {
+            for (Map.Entry<String, Set<String>> districtEntry : DISTRICT_STREETS.entrySet()) {
+                String district = districtEntry.getKey();
+                Set<String> streets = districtEntry.getValue();
+                if (streets.contains(foundStreet)) {
+                    foundDistrict = district;
+                    break;
+                }
+            }
+        }
+
+        // 如果没有通过村居定位到信息,再按常规流程查找区、街镇、村居
+        if (foundDistrict == null) {
+            // 查找区
+            for (String district : SHANGHAI_DISTRICTS) {
+                if (address.contains(district)) {
+                    foundDistrict = district;
+                    address = address.replace(district, "");
+                    break;
+                }
+            }
+        }
+
+        if (foundStreet == null && foundDistrict != null) {
+            // 查找街镇
+            Set<String> streets = DISTRICT_STREETS.get(foundDistrict);
+            if (streets != null) {
+                for (String street : streets) {
+                    if (address.contains(street)) {
+                        foundStreet = street;
+                        address = address.replace(street, "");
+                        break;
+                    } else if (address.contains(street.replace("镇", "")) || address.contains(street.replace("街道", ""))) {
+                        foundStreet = street;
+                        address = address.replace(street.replace("镇", ""), "").replace(street.replace("街道", ""), "");
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (foundVillageOrCommunity == null && foundStreet != null) {
+            // 查找村或居委
+            Set<String> villagesCommunities = STREET_VILLAGES_COMMUNITIES.get(foundStreet);
+            if (villagesCommunities != null) {
+                for (String villageCommunity : villagesCommunities) {
+                    if (address.contains(villageCommunity)) {
+                        foundVillageOrCommunity = villageCommunity;
+                        address = address.replace(villageCommunity, "");
+                        break;
+                    } else {
+                        String shortName = villageCommunity.replace("村", "").replace("社区居委会", "").replace("居委会", "");
+                        // 避免与街镇简称冲突
+                        String streetShortName = foundStreet.replace("镇", "").replace("街道", "");
+                        if (!shortName.equals(streetShortName) && address.contains(shortName)) {
+                            foundVillageOrCommunity = villageCommunity;
+                            address = address.replace(shortName, "");
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        // 处理别名残留问题
+        if (foundVillageOrCommunity != null) {
+            String[] aliases = {"居委", "居委会", "村", "新村"};
+            for (String alias : aliases) {
+                if (address.startsWith(alias)) {
+                    address = address.substring(alias.length());
+                    break;
+                }
+            }
+        }
+
+        // 移除剩余地址中可能残留的区和街镇信息
+        if (foundDistrict != null) {
+            address = address.replace(foundDistrict, "");
+        }
+        if (foundStreet != null) {
+            address = address.replace(foundStreet, "");
+        }
+
+        // 去除多余的空白字符
+        address = address.trim();
+
+        result[1] = foundDistrict;
+        result[2] = foundStreet;
+        result[3] = foundVillageOrCommunity;
+        result[4] = address;
+
+        return result;
+    }
+
+    /***
+     * 获取array中,指定字段与address匹配值最高的数据,特定方法,指定的jsonarray使用
+     * @param address 上海市松江区乐都路590号
+     * @param array 地名地址接口返回的jsonarray数据
+     * @param param jaonarray中地名地址字段的key
+     * @return
+     */
+    public JSONObject findBestMatch(String address, JSONArray array, String param) {
+        JSONObject bestMatch = null;
+        double maxTotalScore = 0;
+
+        // 处理输入地址的分词和数字前文本
+        AddressInfo addressInfo = processAddress(address);
+
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject obj = array.getJSONObject(i);
+            String addr = obj.getString(param);
+            AddressInfo addrInfo = processAddress(addr);
+
+            // 第一步:全词匹配比例
+            double score1 = calculateFullWordMatchScore(address, addr);
+
+            // 第二步:数字匹配得分
+            double score2 = calculateNumberMatchScore(addressInfo.firstNumber, addrInfo.firstNumber);
+
+            // 第三步:数字前文本匹配得分
+            double score3 = calculatePrefixTextMatchScore(addressInfo.prefixText, addrInfo.prefixText);
+
+            double totalScore = score1 + score2 + score3;
+
+            if (totalScore > maxTotalScore) {
+                maxTotalScore = totalScore;
+                bestMatch = obj;
+                bestMatch.put("计分1", score1);
+                bestMatch.put("计分2", score2);
+                bestMatch.put("计分3", score3);
+                bestMatch.put("总分", totalScore);
+            }
+        }
+
+        return bestMatch;
+    }
+
+    /***
+     * 其他方法的引用方法,不用管
+     * @param input
+     * @return
+     */
+    private AddressInfo processAddress(String input) {
+        String prefixText = "";
+        String firstNumber = null;
+        List<String> tokens = new ArrayList<>();
+        Pattern pattern = Pattern.compile("\\d+|[^\\d]+");
+        Matcher matcher = pattern.matcher(input);
+        boolean foundNumber = false;
+        while (matcher.find()) {
+            String token = matcher.group();
+            tokens.add(token);
+            if (!foundNumber && token.matches("\\d+")) {
+                firstNumber = token;
+                foundNumber = true;
+            }
+        }
+        if (tokens.size() > 0 && !foundNumber) {
+            prefixText = input;
+        } else if (tokens.size() > 0 && firstNumber != null) {
+            int index = tokens.indexOf(firstNumber);
+            for (int i = 0; i < index; i++) {
+                prefixText += tokens.get(i);
+            }
+        }
+        return new AddressInfo(prefixText, firstNumber);
+    }
+
+    /***
+     * 其他方法的引用方法,不用管
+     * @param inputAddr
+     * @param shortAddr
+     * @return
+     */
+    private double calculateFullWordMatchScore(String inputAddr, String shortAddr) {
+        int totalLength = Math.max(inputAddr.length(), shortAddr.length());
+        int commonCount = 0;
+        for (char c : inputAddr.toCharArray()) {
+            if (shortAddr.indexOf(c) != -1) {
+                commonCount++;
+            }
+        }
+        return (double) commonCount / totalLength;
+    }
+
+    /***
+     * 其他方法的引用方法,不用管
+     * @param addressNumber
+     * @param addrNumber
+     * @return
+     */
+    private double calculateNumberMatchScore(String addressNumber, String addrNumber) {
+        if (addressNumber == null || addrNumber == null) {
+            return 1; // 都没有数字或其中一个没有,认为这一步匹配满分
+        }
+        if (addressNumber.equals(addrNumber)) {
+            return 1;
+        }
+        try {
+            int num1 = Integer.parseInt(addressNumber);
+            int num2 = Integer.parseInt(addrNumber);
+            int diff = Math.abs(num1 - num2);
+            if (diff <= 200) {
+                return 1 - (double) diff / 200;
+            }
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+        return 0;
+    }
+
+    /***
+     * 其他方法的引用方法,不用管
+     * @param addressPrefix
+     * @param addrPrefix
+     * @return
+     */
+    private double calculatePrefixTextMatchScore(String addressPrefix, String addrPrefix) {
+        if (addressPrefix.isEmpty() || addrPrefix.isEmpty()) {
+            return 0;
+        }
+        double matchScore = calculateFullWordMatchScore(addressPrefix, addrPrefix);
+        return matchScore >= 0.65 ? matchScore : 0;
+    }
+
+    private static class AddressInfo {
+        String prefixText;
+        String firstNumber;
+
+        AddressInfo(String prefixText, String firstNumber) {
+            this.prefixText = prefixText;
+            this.firstNumber = firstNumber;
+        }
+    }
+
+
+    /***
+     * 去除特殊字符,仅保留中文、数字、字母
+     * @param address
+     * @return
+     */
+    public String deleteStr(String address){
+        if (address == null) {
+            return null;
+        }
+        // 使用正则表达式替换所有非中文和非数字的字符为空字符串
+        return address.replaceAll("[^\\u4e00-\\u9fa5\\da-zA-Z]", "");
+    }
+
+
+    // 静态资源:中国所有省份、地级市和县级市的名称
+    private static final Set<String> PROVINCES = new HashSet<>(Arrays.asList(
+            "北京市", "天津市", "上海市", "重庆市",
+            "河北省", "山西省", "辽宁省", "吉林省", "黑龙江省",
+            "江苏省", "浙江省", "安徽省", "福建省", "江西省",
+            "山东省", "河南省", "湖北省", "湖南省", "广东省",
+            "海南省", "四川省", "贵州省", "云南省", "陕西省",
+            "甘肃省", "青海省", "台湾省",
+            "内蒙古自治区", "广西壮族自治区", "西藏自治区",
+            "宁夏回族自治区", "新疆维吾尔自治区",
+            "香港特别行政区", "澳门特别行政区"
+    ));
+
+    private static final Set<String> CITIES = new HashSet<>(Arrays.asList(
+            // 这里只列举部分示例,实际需要完整的地级市和县级市列表
+            "石家庄市", "唐山市", "秦皇岛市", "邯郸市", "邢台市",
+            "保定市", "张家口市", "承德市", "沧州市", "廊坊市",
+            "衡水市", "太原市", "大同市", "阳泉市", "长治市",
+            "晋城市", "朔州市", "晋中市", "运城市", "忻州市",
+            "临汾市", "吕梁市", "沈阳市", "大连市", "鞍山市",
+            "抚顺市", "本溪市", "丹东市", "锦州市", "营口市",
+            "阜新市", "辽阳市", "盘锦市", "铁岭市", "朝阳市",
+            "葫芦岛市", "长春市", "吉林市", "四平市", "辽源市",
+            "通化市", "白山市", "松原市", "白城市", "延边朝鲜族自治州",
+            "哈尔滨市", "齐齐哈尔市", "鸡西市", "鹤岗市", "双鸭山市",
+            "大庆市", "伊春市", "佳木斯市", "七台河市", "牡丹江市",
+            "黑河市", "绥化市", "大兴安岭地区", "南京市", "无锡市",
+            "徐州市", "常州市", "苏州市", "南通市", "连云港市",
+            "淮安市", "盐城市", "扬州市", "镇江市", "泰州市",
+            "宿迁市", "杭州市", "宁波市", "温州市", "嘉兴市",
+            "湖州市", "绍兴市", "金华市", "衢州市", "舟山市",
+            "台州市", "丽水市", "合肥市", "芜湖市", "蚌埠市",
+            "淮南市", "马鞍山市", "淮北市", "铜陵市", "安庆市",
+            "黄山市", "滁州市", "阜阳市", "宿州市", "六安市",
+            "亳州市", "池州市", "宣城市", "福州市", "厦门市",
+            "莆田市", "三明市", "泉州市", "漳州市", "南平市",
+            "龙岩市", "宁德市", "南昌市", "景德镇市", "萍乡市",
+            "九江市", "新余市", "鹰潭市", "赣州市", "吉安市",
+            "宜春市", "抚州市", "上饶市", "济南市", "青岛市",
+            "淄博市", "枣庄市", "东营市", "烟台市", "潍坊市",
+            "济宁市", "泰安市", "威海市", "日照市", "临沂市",
+            "德州市", "聊城市", "滨州市", "菏泽市", "郑州市",
+            "开封市", "洛阳市", "平顶山市", "安阳市", "鹤壁市",
+            "新乡市", "焦作市", "濮阳市", "许昌市", "漯河市",
+            "三门峡市", "南阳市", "商丘市", "信阳市", "周口市",
+            "驻马店市", "武汉市", "黄石市", "十堰市", "宜昌市",
+            "襄阳市", "鄂州市", "荆门市", "孝感市", "荆州市",
+            "黄冈市", "咸宁市", "随州市", "恩施土家族苗族自治州",
+            "长沙市", "株洲市", "湘潭市", "衡阳市", "邵阳市",
+            "岳阳市", "常德市", "张家界市", "益阳市", "郴州市",
+            "永州市", "怀化市", "娄底市", "湘西土家族苗族自治州",
+            "广州市", "韶关市", "深圳市", "珠海市", "汕头市",
+            "佛山市", "江门市", "湛江市", "茂名市", "肇庆市",
+            "惠州市", "梅州市", "汕尾市", "河源市", "阳江市",
+            "清远市", "东莞市", "中山市", "潮州市", "揭阳市",
+            "云浮市", "海口市", "三亚市", "三沙市", "儋州市",
+            "成都市", "自贡市", "攀枝花市", "泸州市", "德阳市",
+            "绵阳市", "广元市", "遂宁市", "内江市", "乐山市",
+            "南充市", "眉山市", "宜宾市", "广安市", "达州市",
+            "雅安市", "巴中市", "资阳市", "阿坝藏族羌族自治州",
+            "甘孜藏族自治州", "凉山彝族自治州", "贵阳市", "六盘水市",
+            "遵义市", "安顺市", "毕节市", "铜仁市", "黔西南布依族苗族自治州",
+            "黔东南苗族侗族自治州", "黔南布依族苗族自治州", "昆明市", "曲靖市",
+            "玉溪市", "保山市", "昭通市", "丽江市", "普洱市", "临沧市",
+            "楚雄彝族自治州", "红河哈尼族彝族自治州", "文山壮族苗族自治州",
+            "西双版纳傣族自治州", "大理白族自治州", "德宏傣族景颇族自治州",
+            "怒江傈僳族自治州", "迪庆藏族自治州", "西安市", "铜川市", "宝鸡市",
+            "咸阳市", "渭南市", "延安市", "汉中市", "榆林市", "安康市", "商洛市",
+            "兰州市", "嘉峪关市", "金昌市", "白银市", "天水市", "武威市",
+            "张掖市", "平凉市", "酒泉市", "庆阳市", "定西市", "陇南市",
+            "临夏回族自治州", "甘南藏族自治州", "西宁市", "海东市",
+            "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州",
+            "果洛藏族自治州", "玉树藏族自治州", "海西蒙古族藏族自治州",
+            "台北市", "新北市", "桃园市", "台中市", "台南市", "高雄市",
+            "基隆市", "新竹市", "嘉义市", "澳门市", "香港市"
+    ));
+
+    /***
+     * 去除地名地址的前缀,一直到镇/街道
+     * @param address
+     * @return
+     */
+    public static String quchuqianzhui(String address) {
+        // 先去除 "中国"
+        address = address.replace("中国", "");
+
+        // 去除省份
+        for (String province : PROVINCES) {
+            if (address.startsWith(province)) {
+                address = address.substring(province.length());
+            }
+        }
+
+        // 去除市
+        for (String city : CITIES) {
+            if (address.startsWith(city)) {
+                address = address.substring(city.length());
+            } else {
+                // 处理别名情况,例如 "安庆" 代表 "安庆市"
+                String alias = city.replace("市", "");
+                if (address.startsWith(alias)) {
+                    address = address.substring(alias.length());
+                }
+            }
+        }
+
+        // 去除区、镇、街道
+        address = address.replaceAll("^.*?(区|镇|街道)", "");
+
+        // 处理错误数据情况
+        if (address.trim().isEmpty()) {
+            // 尝试从原始地址中提取最后一个有效的市名称
+            for (int i = CITIES.size() - 1; i >= 0; i--) {
+                String city = CITIES.toArray(new String[0])[i];
+                if (address.contains(city)) {
+                    return city;
+                }
+                String alias = city.replace("市", "");
+                if (address.contains(alias)) {
+                    return city;
+                }
+            }
+            // 如果没有找到市名称,检查是否有省份名称
+            for (String province : PROVINCES) {
+                if (address.contains(province)) {
+                    return province;
+                }
+            }
+        }
+
+        return address.trim();
+    }
+
+    private static final String ADDRESS_REGEX = "^[^市]+市[^区]+区(?:[^镇]+镇|[^街道]+街道).+$";
+    private static final Pattern ADDRESS_PATTERN = Pattern.compile(ADDRESS_REGEX);
+
+    /**
+     *  验证地址格式的正则表达式
+     */
+    public static boolean validateAddress(String address) {
+        if (address == null || address.trim().isEmpty()) {
+            return false;
+        }
+        return ADDRESS_PATTERN.matcher(address).matches();
+    }
+
+}

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

@@ -47,8 +47,8 @@ public class AddressNetTools {
     @Async
     public ResponseEntity requestGetOrPost(HttpMethod httpMethod, String url, JSONObject params, Map<String, String> headerMap, Integer ifReloadSize) {
         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
-        requestFactory.setConnectTimeout(3 * 1000);
-        requestFactory.setReadTimeout(3 * 1000);
+        requestFactory.setConnectTimeout(10 * 1000);
+        requestFactory.setReadTimeout(10 * 1000);
         RestTemplate client = new RestTemplate(requestFactory);
         client.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
         HttpHeaders headers = new HttpHeaders();

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

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