소스 검색

调整端口和添加接口

DESKTOP-6LTVLN7\Liumouren 3 달 전
부모
커밋
92a319adb7

+ 1 - 23
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -95,28 +95,6 @@ public class AddressQueryEngine {
         }
     }
 
-    /***
-     * 市四中心地名搜索
-     * @param address
-     * @return
-     */
-    public AddressResult szxSearchByName(String address) {
-        ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, Constant.SZX_URL + "&region=" + Constant.getAMAP_CITY_CODE() + "&query=" + address, null, null, 10);
-        if (response != null) {
-            String body = response.getBody() + "";
-            if (!StringUtils.hasText(body))
-                return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
-            try {
-                return TransfromDataTool.szxResultToResult(JSONObject.parseObject(body),address);
-            } catch (Exception e) {
-                System.err.println(e);
-                return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
-            }
-        } else {
-            System.out.println("地址[" + address + "]未查询到数据!");
-            return null;
-        }
-    }
 
     public String getSigns(String timestamp, String appCode, String UUid, String appSecret) {
 //        先拼接
@@ -423,7 +401,7 @@ public class AddressQueryEngine {
         for (String town : towns) {
             address = address.replaceAll(town, "");
         }
-        return address.replaceAll("号", "0").replaceAll("弄", "0").replaceAll("室", "0").replaceAll("户", "0").replaceAll("单元", "0").replaceAll("幢", "0");
+        return address.replaceAll("小区", "0").replaceAll("号", "0").replaceAll("弄", "0").replaceAll("室", "0").replaceAll("户", "0").replaceAll("单元", "0").replaceAll("幢", "0");
     }
 
     /**

+ 6 - 1
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -132,9 +132,14 @@ public class TransfromDataTool {
             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.setLocation(points[0] + "," + points[1]);
             content.setLon(points[1]);
             content.setLat(points[0]);
+            if (jsonObject.get("point_x") != null && jsonObject.get("point_y") != null) {
+//                content.setLat(jsonObject.getDouble("point_x"));
+//                content.setLon(jsonObject.getDouble("point_y"));
+                content.setLocation(jsonObject.getDouble("point_x") + "," + jsonObject.getDouble("point_y"));
+            }
             if (jsonObject.containsKey("ext_data")) {
                 JSONObject extData = jsonObject.getJSONObject("ext_data");
                 if (extData.containsKey("address") && !extData.getString("address").isEmpty()) {

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

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

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

@@ -17,7 +17,7 @@ public class DbConnection {
 
     public static DbConnection getInstance() {
         if (dbConnection == null) {
-            return new DbConnection();
+            dbConnection = new DbConnection();
         }
         return dbConnection;
     }
@@ -50,7 +50,6 @@ public class DbConnection {
     }
 
     public int updateSql(String sqlStr) throws SQLException {
-//        System.out.println("执行更新操作sql:" + sqlStr);
         return stmt.executeUpdate(sqlStr);
     }
 

+ 48 - 4
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -1,15 +1,18 @@
 package com.skyversation.poiaddr.controller;
 
+import com.skyversation.poiaddr.entity.YyskAddressStandardization;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
+import com.skyversation.poiaddr.util.ExcelReaderUtils;
+import com.skyversation.poiaddr.util.SerializationUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 法人库处理类
@@ -43,4 +46,45 @@ public class CorporateLibraryController {
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
 
+    /**
+     * 1、解析xlsx得到所有数据
+     * 2、根据主键address和标准化地址standardAddress直接跑规则,属于rule_4的要替换掉同时添加updateTag
+     * 3、标准化地址还要做一层去空和街镇异常处理,有变动的也添加updateTag
+     *
+     * @return
+     */
+    @PostMapping(value = "/dataQingXi", produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object dataQingXi() {
+        // 记录程序开始时间
+        long startTime = System.currentTimeMillis();
+        SerializationUtils.test();
+        long endTime = System.currentTimeMillis();
+        return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
+    }
+
+
+    @PostMapping(value = "/updateByTag", produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object updateByTag() {
+        // 记录程序开始时间
+        long startTime = System.currentTimeMillis();
+        try {
+            List<Map<String, Object>> fileDatas = ExcelReaderUtils.readExcel("output/yysk_new_wcb_address_standardization.xlsx");
+            List<YyskAddressStandardization> sjArrDzbzhSjWcbryDzxxList = new ArrayList<>();
+            for (Map<String, Object> item : fileDatas) {
+                if (item.get("updateTag") != null && Boolean.parseBoolean(item.get("updateTag").toString())) {
+                    YyskAddressStandardization yyskAddressStandardization = new YyskAddressStandardization();
+                    yyskAddressStandardization.setAddress(item.get("address").toString());
+                    yyskAddressStandardization.setMatchLevel(item.get("match_level").toString());
+                    yyskAddressStandardization.setStandardAddress(item.get("standard_address").toString());
+                    sjArrDzbzhSjWcbryDzxxList.add(yyskAddressStandardization);
+                }
+            }
+            System.out.println("要处理的数据条数:" + sjArrDzbzhSjWcbryDzxxList.size());
+            yyskAddressStandardizationService.updateDatas2(sjArrDzbzhSjWcbryDzxxList, "yysk_wcb_address_standardization");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        long endTime = System.currentTimeMillis();
+        return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
+    }
 }

+ 13 - 83
src/main/java/com/skyversation/poiaddr/controller/PoiAddressController.java

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -57,85 +58,6 @@ public class PoiAddressController {
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
 
-    /**
-     * 自定义处理逻辑,用完要删除
-     * 1、读取xlsx数据
-     * 2、得到查询地址列集合
-     * 3、使用四中心的地名地址接口跑一下地址
-     * 4、调整返回的数据结构
-     * 5、保存新的规范性地址和所属街镇
-     *
-     * @return
-     */
-    @PostMapping(value = "/diyCode", produces = MediaType.APPLICATION_JSON_VALUE)
-    public Object diyCode() {
-        // 记录程序开始时间
-        long startTime = System.currentTimeMillis();
-//        1、读取xlsx数据
-        try {
-            List<Map<String, Object>> fileDatas = ExcelReaderUtils.readExcel("output/松江26487数据治理结果数据.xlsx");
-//          得到所属街镇为空的数据
-            for (Map<String, Object> item : fileDatas) {
-                if (item.get("所属街镇") == null || item.get("所属街镇").toString().isEmpty()) {
-//                   2、得到查询地址列集合
-                    List<String> addrList = new ArrayList<>();
-                    if (item.get("sk_hjdx(实口户籍)") != null && !item.get("sk_hjdx(实口户籍)").toString().isEmpty() && item.get("sk_hjdx(实口户籍)").toString().length() > 3 && AddressTools.isOtherDistrictThanSongJiang(item.get("sk_hjdx(实口户籍)").toString())) {
-                        //  实口户籍地址
-                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.get("sk_hjdx(实口户籍)").toString()));
-                    }
-                    if (item.get("sk_jzdz(实口居住)") != null && !item.get("sk_jzdz(实口居住)").toString().isEmpty() && item.get("sk_jzdz(实口居住)").toString().length() > 3 && AddressTools.isOtherDistrictThanSongJiang(item.get("sk_jzdz(实口居住)").toString())) {
-                        //  实口居住地址
-                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.get("sk_jzdz(实口居住)").toString()));
-                    }
-                    if (item.get("jc_hjdz(基层户籍)") != null && !item.get("jc_hjdz(基层户籍)").toString().isEmpty() && item.get("jc_hjdz(基层户籍)").toString().length() > 3 && AddressTools.isOtherDistrictThanSongJiang(item.get("jc_hjdz(基层户籍)").toString())) {
-                        //  基层户籍地址
-                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.get("jc_hjdz(基层户籍)").toString()));
-                    }
-                    if (item.get("jc_jzdz(基层居住)") != null && !item.get("jc_jzdz(基层居住)").toString().isEmpty() && item.get("jc_jzdz(基层居住)").toString().length() > 3 && AddressTools.isOtherDistrictThanSongJiang(item.get("jc_jzdz(基层居住)").toString())) {
-                        //  基层居住地址
-                        addrList.add("上海市" + Constant.getArea() + "区" + AddressQueryEngine.addressReplaceAll(item.get("jc_jzdz(基层居住)").toString()));
-                    }
-
-                    if (addrList.size() > 0) {
-                        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList);
-                        if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
-                            for (AddressResult.ContentBean contentBean : addressResult.getData()) {
-                                String resultAddrKey = contentBean.getAddress();
-                                if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null && AddressTools.isOtherDistrictThanSongJiang(resultAddrKey)) {
-                                    if (contentBean.getAdname() != null && !contentBean.getAdname().isEmpty()) {
-                                        item.put("所属街镇", contentBean.getAdname());
-                                    } else if (contentBean.getTownJson().getString("name") != null) {
-                                        item.put("所属街镇", contentBean.getTownJson().getString("name"));
-                                    }
-                                    item.put("参考地址", resultAddrKey);
-                                    //  开始规范化地址(把查询地址的市、区、街镇替换为空,然后把得到的区、街镇拼接上去)(得到区、街镇)
-                                    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.put("规范化地名地址", "上海市松江区" + item.get("所属街镇") + oldAddress);
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-//          保存新的数据文件
-            ExcelReaderUtils.writeToExcel(fileDatas, "output/松江26487数据治理结果数据_new.xlsx");
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        long endTime = System.currentTimeMillis();
-        System.out.println("处理完成!用时" + (endTime - startTime) / 1000 + "秒!");
-        return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
-    }
-
     /**
      * 全量查询表数据并将处理后的结果序列化到本地(待测试)
      *
@@ -150,10 +72,10 @@ public class PoiAddressController {
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
 
-    @GetMapping(value = "/uploadDataBase", produces = MediaType.APPLICATION_JSON_VALUE)
-    public Object uploadDataBase() {
+    @PostMapping(value = "/uploadDataBase", produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object uploadDataBase(@RequestParam(name = "columnName") String columnName,@RequestParam(name = "tableName") String tableName) {
         long startTime = System.currentTimeMillis();
-        testDataService.uploadDataBase();
+        testDataService.uploadDataBase(columnName,tableName);
         long endTime = System.currentTimeMillis();
         return "处理完成!用时" + (endTime - startTime) / 1000 + "秒!";
     }
@@ -183,6 +105,14 @@ public class PoiAddressController {
      */
     @GetMapping(value = "/searchAddr")
     public Object searchByAddrStr(@RequestParam(name = "address") String address) {
-        return AddressQueryEngine.getInstance().sj_szxSearchByName(address);
+        String[] addressList = address.split(",");
+        List<Map<String,AddressResult>> requestDatas = new ArrayList<>();
+        for(String addr: addressList){
+            Map<String,AddressResult> requestItem = new HashMap<>();
+            AddressResult addressResult = AddressQueryEngine.getInstance().sj_szxSearchByName(addr);
+            requestItem.put(addr,addressResult);
+            requestDatas.add(requestItem);
+        }
+        return requestDatas;
     }
 }

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

@@ -6,7 +6,7 @@ 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.service.impl.SjArrDzbzhSjWcbryDzxxServiceImpl;
+import com.skyversation.poiaddr.config.DbConnection;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
 import org.locationtech.jts.geom.Geometry;
@@ -18,7 +18,6 @@ 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;
@@ -26,9 +25,6 @@ import java.util.List;
 @Service
 public class AreaService {
 
-    @Resource
-    private SjArrDzbzhSjWcbryDzxxServiceImpl sjArrDzbzhSjWcbryDzxxService;
-
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -79,13 +75,12 @@ public class AreaService {
             System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
         }
 //      TODO 数据库连通性测试
-        /*try {
+        try {
             System.out.println("<<<<<<<<------开始数据库连通性测试");
-            List<SjArrDzbzhSjWcbryDzxx> listData = sjArrDzbzhSjWcbryDzxxService.getAllDataPage(1);
-            System.out.println(">>>>>>>>------数据库连通性测试结果:" + listData.toString());
+            System.out.println(">>>>>>>>------数据库连通性测试结果:" + DbConnection.getInstance().runSqlStr("select count(*) from yysk_wcb_address_standardization").toString());
         } catch (Exception e) {
             System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
-        }*/
+        }
     }
 
     public void initPolygons() {

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

@@ -23,14 +23,14 @@ import java.util.concurrent.Future;
 @Service
 public class SjArrDzbzhSjWcbryDzxxServiceImpl {
 
-    public void uploadDataBase() {
+    public void uploadDataBase(String columnName, String tableName) {
         try {
-            List<Map<String, Object>> oldDbData = DbConnection.getInstance().runSqlStr("select * FROM sj_zrr_dzbzh_sj_wcbry_dzxx");
+            List<Map<String, Object>> oldDbData = DbConnection.getInstance().runSqlStr("select * FROM " + tableName + " where update_time is not null");
 //          去重
             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);
+                if (item.get(columnName) != null) {
+                    newRequestData.put(item.get(columnName).toString(), item);
                 }
             }
             List<Map<String, Object>> dbData = new ArrayList<>();
@@ -38,7 +38,7 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
                 dbData.add(newRequestData.get(id));
             }
 //          直接保存数据到xlsx
-            ExcelReaderUtils.writeToExcel(dbData, "output/allData.xlsx");
+            ExcelReaderUtils.writeToExcel(dbData, "output/" + tableName + ".xlsx");
         } catch (Exception e) {
             System.err.println("下载失败!" + e);
         }
@@ -243,12 +243,12 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
     }
 
 
-    public void uploadAllData(String reAddr,Boolean updateBase) {
+    public void uploadAllData(String reAddr, Boolean updateBase) {
         List<SjArrDzbzhSjWcbryDzxx> listData = getAllData(reAddr);
         if (listData != null && listData.size() > 0) {
-            if(updateBase){
+            if (updateBase) {
                 updateDatas(runExecutorService(listData));
-            }else{
+            } else {
                 SerializationUtils.serialize(runExecutorService(listData), "output/testDataBase_all.ser");
             }
 //            PageSize++;

+ 50 - 12
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationServiceImpl.java

@@ -4,6 +4,7 @@ import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.config.DbConnection;
 import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.util.AddressTools;
 import com.skyversation.poiaddr.util.ExcelReaderUtils;
 import org.springframework.stereotype.Service;
 
@@ -61,7 +62,7 @@ public class YyskAddressStandardizationServiceImpl {
             for (Map<String, Object> item : dbData) {
                 YyskAddressStandardization YyskAddressStandardization = new YyskAddressStandardization();
                 if (item.get("address") != null) {
-                    YyskAddressStandardization.setAddress(item.getOrDefault("address", "").toString().trim());
+                    YyskAddressStandardization.setAddress(item.getOrDefault("address", "").toString());
                 }
                 requestData.add(YyskAddressStandardization);
             }
@@ -127,7 +128,7 @@ public class YyskAddressStandardizationServiceImpl {
                     if (entity.getUpdateTime() == null) {
                         preparedStatement.setNull(10, Types.DATE);
                     } else {
-                        preparedStatement.setDate(10, new java.sql.Date(entity.getUpdateTime().getTime()));
+                        preparedStatement.setLong(10, entity.getUpdateTime().getTime());
                     }
                     preparedStatement.setString(11, entity.getAddress());
                     // 将当前的 SQL 语句添加到批量操作中
@@ -144,6 +145,38 @@ public class YyskAddressStandardizationServiceImpl {
         }
     }
 
+
+    //   批量修改地址表
+    public void updateDatas2(List<YyskAddressStandardization> sjArrDzbzhSjWcbryDzxxList, String tableName) {
+        String sqls = "update " + tableName + " set standard_address = ? ,match_level = ? where address = ?";
+        try (PreparedStatement preparedStatement = DbConnection.getInstance().connection.prepareStatement(sqls)) {
+            for (YyskAddressStandardization entity : sjArrDzbzhSjWcbryDzxxList) {
+                if (entity.getAddress() != null) {
+                    if (entity.getStandardAddress() == null) {
+                        preparedStatement.setNull(1, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(1, entity.getStandardAddress());
+                    }
+                    if (entity.getMatchLevel() == null) {
+                        preparedStatement.setNull(2, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(2, entity.getMatchLevel());
+                    }
+                    preparedStatement.setString(3, entity.getAddress());
+                    // 将当前的 SQL 语句添加到批量操作中
+                    preparedStatement.addBatch();
+                }
+            }
+            // 执行批量操作
+            int[] updateCounts = preparedStatement.executeBatch();
+            System.out.println("总条数:" + sjArrDzbzhSjWcbryDzxxList.size() + ";更新的记录数: " + updateCounts.length);
+        } catch (SQLException throwables) {
+            System.err.println("------updateError--------------------------------------" + sqls + "更新异常!");
+            throwables.printStackTrace();
+            System.err.println("更新异常" + throwables);
+        }
+    }
+
     /**
      * 首先要得到一个Page<T>对象,然后判断是否还有别的数据,有的话接着请求并返回新的Page<T>对象并迭代处理数据
      * init [0:批量处理;1:初始化]
@@ -204,32 +237,36 @@ public class YyskAddressStandardizationServiceImpl {
                                 String resultAddrKey = contentBean.getAddress();
 //                                && AddressTools.isOtherDistrictThanShangHai(resultAddrKey)
                                 if (resultAddrKey != null && contentBean.getLon() != null && contentBean.getLat() != null) {
-                                    String lng = contentBean.getLon() + "";
-                                    String lat = contentBean.getLat() + "";
+                                    resultAddrKey = AddressTools.getInstance().deleteStr(contentBean.getAddress()) ;
                                     if (contentBean.getAdname() != null && !contentBean.getAdname().isEmpty()) {
                                         item.setStreetTown(contentBean.getAdname());
-                                    } else if (contentBean.getTownJson().getString("name") != null) {
+                                    } else if (contentBean.getTownJson() != null && contentBean.getTownJson().getString("name") != null) {
                                         item.setStreetTown(contentBean.getTownJson().getString("name"));
                                     } else {
                                         item.setStreetTown("");
                                     }
+                                    item.setMarket(AddressTools.isOtherDistrictThanShangHai(resultAddrKey));
                                     if (contentBean.getCityname() != null && !contentBean.getCityname().isEmpty()) {
-                                        item.setMarket(contentBean.getCityname());
+                                        item.setDistinguish(contentBean.getCityname());
                                     } else if (contentBean.getAdJson().getString("name") != null) {
-                                        item.setMarket(contentBean.getAdJson().getString("name"));
+                                        item.setDistinguish(contentBean.getAdJson().getString("name"));
                                     } else {
-                                        item.setMarket("");
+                                        item.setDistinguish("");
+                                    }
+                                    if (contentBean.getLocation() != null && !contentBean.getLocation().trim().isEmpty()) {
+                                        String[] latLonStr = contentBean.getLocation().split(",");
+                                        item.setLat(latLonStr[0]);
+                                        item.setLon(latLonStr[1]);
                                     }
-                                    item.setLat(lat);
-                                    item.setLon(lng);
                                     item.setReturnAddress(resultAddrKey);
                                     item.setMatchLevel(contentBean.getScore());
                                     String oldAddress = contentBean.getSearchAddress().replaceAll(item.getMarket(), "").replaceAll(item.getDistinguish(), "").replaceAll(item.getStreetTown(), "");
                                     if (contentBean.getCjJson() != null && contentBean.getCjJson().containsKey("所属居委")) {
                                         item.setResidentialCommittee(contentBean.getCjJson().getString("所属居委"));
-                                        oldAddress = contentBean.getCjJson().getString("所属居委") + oldAddress;
+                                    } else {
+                                        item.setResidentialCommittee("");
                                     }
-                                    item.setStandardAddress(item.getMarket() + item.getDistinguish() + item.getStreetTown() + oldAddress);
+                                    item.setStandardAddress(item.getMarket() + item.getDistinguish() + item.getStreetTown() + AddressTools.parseAddressCJ(oldAddress)[4]);
                                     break;
                                 } else {
                                     item.setMatchLevel("异常");
@@ -238,6 +275,7 @@ public class YyskAddressStandardizationServiceImpl {
                             }
                         } catch (Exception e) {
                             item.setMatchLevel("异常");
+                            e.printStackTrace();
                             System.err.println("查询结果处理异常:" + e);
                         }
                     }

+ 14 - 11
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -493,22 +493,25 @@ public class AddressTools {
                 String addr = obj.getString(param);
 //              规则4判断
 //              TODO 添加校验逻辑(首先使用第4校验规则匹配,匹配不到使用第二规则,还匹配不到的话就使用打分规则)
-                Set<String> addressString = AddressQueryEngine.tokenizeString(addr).get(0);
-                Set<String> addressNumber = AddressQueryEngine.tokenizeString(addr).get(1);
-                Set<String> address2String = AddressQueryEngine.tokenizeString(address).get(0);
-                Set<String> address2Number = AddressQueryEngine.tokenizeString(address).get(1);
+                Set<String> addressString = AddressQueryEngine.tokenizeString(parseAddressCJ(addr)[4]).get(0);
+                Set<String> addressNumber = AddressQueryEngine.tokenizeString(parseAddressCJ(addr)[4]).get(1);
+                Set<String> address2String = AddressQueryEngine.tokenizeString(parseAddressCJ(address)[4]).get(0);
+                Set<String> address2Number = AddressQueryEngine.tokenizeString(parseAddressCJ(address)[4]).get(1);
                 if (addressString != null && addressString.size() > 1) {
                     int addressStrSize = addressString.size();
                     for (String addr2str : address2String) {
                         if (addressString.contains(addr2str)) {
                             addressStrSize--;
-                            if (addressStrSize == 0) {
+                            if (addressNumber.size() == 0) {
+                                obj.put("总分", "rule_4");
+                                return obj;
+                            } else {
                                 int addressNumSize = addressNumber.size();
                                 for (String addr2Num : address2Number) {
                                     if (addressNumber.contains(addr2Num)) {
                                         addressNumSize--;
                                         if (addressNumSize == 0) {
-                                            obj.put("总分", "role_4");
+                                            obj.put("总分", "rule_4");
                                             return obj;
                                         }
                                     }
@@ -521,7 +524,7 @@ public class AddressTools {
                 String role2address = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(addr));
                 String role2address2 = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(address));
                 if (AddressQueryEngine.isNotEmptyOrBlank(role2address) && role2address.contains(role2address2)) {
-                    obj.put("总分", "role_2");
+                    obj.put("总分", "rule_2");
                     return obj;
                 }
 
@@ -575,11 +578,11 @@ public class AddressTools {
     }
 
 
-    public static boolean isOtherDistrictThanShangHai(String address) {
+    public static String isOtherDistrictThanShangHai(String address) {
         // 将地址字符串转换为小写,以便进行不区分大小写的比较
         String lowerCaseAddress = address.toLowerCase();
         // 列出上海市的其他区(已补充完整)
-        String[] otherDistricts = {"北京市", "天津市", "重庆市",
+        String[] otherDistricts = {"上海市", "北京市", "天津市", "重庆市",
                 "河北省", "山西省", "辽宁省", "吉林省", "黑龙江省",
                 "江苏省", "浙江省", "安徽省", "福建省", "江西省",
                 "山东省", "河南省", "湖北省", "湖南省", "广东省",
@@ -590,10 +593,10 @@ public class AddressTools {
                 "香港特别行政区", "澳门特别行政区"};
         for (String district : otherDistricts) {
             if (lowerCaseAddress.contains(district.toLowerCase()) || lowerCaseAddress.indexOf(district.substring(0, 2)) == 0) {
-                return false;
+                return district;
             }
         }
-        return true;
+        return "";
     }
 
     /***

+ 47 - 0
src/main/java/com/skyversation/poiaddr/util/RequestUtils.java

@@ -1,5 +1,6 @@
 package com.skyversation.poiaddr.util;
 
+import com.alibaba.fastjson.JSONArray;
 import org.apache.http.HttpEntity;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -13,6 +14,7 @@ import org.apache.http.util.EntityUtils;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 
+import java.io.FileWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -42,6 +44,51 @@ public class RequestUtils {
         }
     }
 
+    public static void main(String[] args) {
+        com.alibaba.fastjson.JSONObject AllData = new com.alibaba.fastjson.JSONObject();
+        JSONArray featuresList = new JSONArray();
+        for (int i = 1; i <= 7282; i++) {
+            if (i == 7282) {
+                String requestData = requestWFS(i + "");
+                com.alibaba.fastjson.JSONObject requestJson = com.alibaba.fastjson.JSONObject.parseObject(requestData);
+                if (requestJson.containsKey("features")) {
+                    featuresList.add(requestJson.getJSONArray("features").getJSONObject(0));
+                }
+            }
+        }
+        AllData.put("features", featuresList);
+        AllData.put("type", "FeatureCollection");
+        System.out.println("内容大小:" + featuresList.size());
+        String jsonString = AllData.toJSONString();
+        String filePath = "output/cj_1.geojson";
+        try (FileWriter fileWriter = new FileWriter(filePath)) {
+            fileWriter.write(jsonString);
+            System.out.println("完成!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String requestWFS(String index) {
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            String urlF = "https://data.songjiang.gov.cn:19997/geoscene/rest/services/7unv4vbwqxnq4a7m9h/SHBDC/JWH_3857/MapServer/4/query?where=&text=&objectIds=";
+            String urlE = "&time=&timeRelation=esriTimeRelationOverlaps&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=*&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=&resultRecordCount=&returnExtentOnly=false&sqlFormat=none&datumTransformation=&parameterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=geojson";
+            HttpGet httpGet = new HttpGet(urlF + index + urlE);
+            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+                int statusCode = response.getStatusLine().getStatusCode();
+                if (statusCode == 200) {
+                    HttpEntity entity = response.getEntity();
+                    return EntityUtils.toString(entity);
+                } else {
+                    return "请求失败,状态码: " + statusCode;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return e.getMessage();
+        }
+    }
+
     /**
      * httpPost 请求,参数类型为formData
      *

+ 58 - 15
src/main/java/com/skyversation/poiaddr/util/SerializationUtils.java

@@ -1,10 +1,12 @@
 package com.skyversation.poiaddr.util;
 
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.entity.SjArrDzbzhSjWcbryDzxx;
 
 import java.io.*;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class SerializationUtils {
 
@@ -45,37 +47,78 @@ public class SerializationUtils {
 
     public static void main(String[] args) throws IOException {
         test();
+//        System.out.println(roleUpdate("上海市松江区中山街道东果子弄2号小区", "上海市松江区上海市松江区东果子弄2号"));
         /*List<SjArrDzbzhSjWcbryDzxx> listData = deserialize("output/testDataBase_all.ser");
 //      将序列化的文件转储为xlsx文件
         ExcelReaderUtils.writeClassToExcel(listData, "output/allData.xlsx");*/
     }
 
+    public static boolean roleUpdate(String returnAddress, String address) {
+        boolean roleUpdateTag = false;
+        Set<String> addressString = AddressQueryEngine.tokenizeString(AddressTools.parseAddressCJ(returnAddress)[4]).get(0);
+        Set<String> addressNumber = AddressQueryEngine.tokenizeString(AddressTools.parseAddressCJ(returnAddress)[4]).get(1);
+        Set<String> address2String = AddressQueryEngine.tokenizeString(AddressTools.parseAddressCJ(address)[4]).get(0);
+        Set<String> address2Number = AddressQueryEngine.tokenizeString(AddressTools.parseAddressCJ(address)[4]).get(1);
+        if (addressString != null && addressString.size() > 1) {
+            int addressStrSize = addressString.size();
+            for (String addr2str : address2String) {
+                if (addressString.contains(addr2str)) {
+                    addressStrSize--;
+                    if (addressStrSize == 0) {
+                        if (addressNumber.size() == 0) {
+                            roleUpdateTag = true;
+                            return roleUpdateTag;
+                        } else {
+                            int addressNumSize = addressNumber.size();
+                            for (String addr2Num : address2Number) {
+                                if (addressNumber.contains(addr2Num)) {
+                                    addressNumSize--;
+                                    if (addressNumSize == 0) {
+                                        roleUpdateTag = true;
+                                        return roleUpdateTag;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return roleUpdateTag;
+    }
+
     /**
      * 读取本地xlsx文件得到List<Map<String,Object>>结果,然后得到所有规范化结果地址字段,然后匹配街镇关键字,并将匹配到的街镇关键字放到新的一列
+     * 2、根据主键address和标准化地址standardAddress直接跑规则,属于rule_4的要替换掉同时添加updateTag
+     * 3、标准化地址还要做一层去空和街镇异常处理,有变动的也添加updateTag
      */
     public static void test() {
-//       街镇关键字
-        String[] towns = new String[]{"岳阳街道", "永丰街道", "方松街道", "中山街道", "广富林街道", "九里亭街道", "泗泾镇", "佘山镇", "车墩镇", "新桥镇", "洞泾镇", "九亭镇", "泖港镇", "石湖荡镇", "新浜镇", "叶榭镇", "小昆山镇"};
 //       根据地址读取xlsx数据
         try {
-            List<Map<String, Object>> fileDatas = ExcelReaderUtils.readExcel("C:\\Users\\Liumouren\\Desktop\\松江26487数据治理结果数据-sh2000-20250313(1).xlsx");
-//            得到所有规范化结果地址字段
+            List<Map<String, Object>> fileDatas = ExcelReaderUtils.readExcel("output/yysk_wcb_address_standardization.xlsx");
+            float lecel = 1.4f;
+            int sum = 0;
+            int erSum = 0;
+            int nullSum = 0;
             for (Map<String, Object> item : fileDatas) {
-                if (item.containsKey("规范化地名地址") && item.get("规范化地名地址") != null && !item.get("规范化地名地址").toString().trim().isEmpty()) {
-                    String address = item.get("规范化地名地址").toString().trim();
-//                    匹配街镇关键字,并将匹配到的街镇关键字放到新的一列
-                    String town = "";
-                    for (String tItem : towns) {
-                        if (address.contains(tItem)) {
-                            town = tItem;
-                            break;
+                if (!"异常".equals(item.get("match_level").toString()) && !"否".equals(item.get("match_level").toString())) {
+                    sum++;
+                    if (!"rule_2".equals(item.get("match_level").toString()) && !"rule_4".equals(item.get("match_level").toString())) {
+                        //                  查询地址、主键
+                        float address = Float.parseFloat(item.get("match_level").toString());
+                        if (address < lecel) {
+                            erSum++;
                         }
                     }
-                    item.put("所属街镇", town);
+                } else {
+                    nullSum++;
                 }
             }
-//          将新的数据重新保存为一个新的文件
-            ExcelReaderUtils.writeToExcel(fileDatas, "output/松江26487数据治理结果数据.xlsx");
+            System.out.println("总数据条数:" + fileDatas.size());
+            System.out.println("打分小于" + lecel + "数据条数:" + erSum);
+            System.out.println("异常数据条数:" + nullSum);
+            System.out.println("有效数据条数:" + (sum - erSum));
+            System.out.println("有效数据数据占比:" + (float) (sum - erSum) / fileDatas.size());
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -30,14 +30,14 @@ spring.servlet.multipart.max-request-size=300MB
 #spring.jpa.show-sql=false
 # \u677E\u6C5F\u8857\u9547
 app.area=\u4E0A\u6D77
-app.town=\u5CB3\u9633\u8857\u9053\u3001\u6C38\u4E30\u8857\u9053\u3001\u65B9\u677E\u8857\u9053\u3001\u4E2D\u5C71\u8857\u9053\u3001\u5E7F\u5BCC\u6797\u8857\u9053\u3001\u4E5D\u91CC\u4EAD\u8857\u9053\u3001\u6CD7\u6CFE\u9547\u3001\u4F58\u5C71\u9547\u3001\u8F66\u58A9\u9547\u3001\u65B0\u6865\u9547\u3001\u6D1E\u6CFE\u9547\u3001\u4E5D\u4EAD\u9547\u3001\u6CD6\u6E2F\u9547\u3001\u77F3\u6E56\u8361\u9547\u3001\u65B0\u6D5C\u9547\u3001\u53F6\u69AD\u9547\u3001\u5C0F\u6606\u5C71\u9547
+app.town=\u5CB3\u9633\u8857\u9053,\u6C38\u4E30\u8857\u9053,\u65B9\u677E\u8857\u9053,\u4E2D\u5C71\u8857\u9053,\u5E7F\u5BCC\u6797\u8857\u9053,\u4E5D\u91CC\u4EAD\u8857\u9053,\u6CD7\u6CFE\u9547,\u4F58\u5C71\u9547,\u8F66\u58A9\u9547,\u65B0\u6865\u9547,\u6D1E\u6CFE\u9547,\u4E5D\u4EAD\u9547,\u6CD6\u6E2F\u9547,\u77F3\u6E56\u8361\u9547,\u65B0\u6D5C\u9547,\u53F6\u69AD\u9547,\u5C0F\u6606\u5C71\u9547
 # \u878D\u5408\u7248\uFF1A1736930075105|\u5173\u952E\u5B57\uFF1A1742459783686
 app.search_server_id=1742459783686
 
 app.db.username=dev_sjbdc_kjyy
 app.db.password=30DFBEABYi#5
 app.db.driver=io.transwarp.jdbc.QuarkDriver
-app.db.jdbc_url=jdbc:transwarp2://172.30.75.126:31768/kjyy_dev
+app.db.jdbc_url=jdbc:transwarp2://172.30.75.126:32265/kjyy_dev
 # \u9752\u6D66\u8857\u9547
 #app.area=\u9752\u6D66
 #app.town2=\u6731\u5BB6\u89D2\u9547\u3001\u8D75\u5DF7\u9547\u3001\u5F90\u6CFE\u9547\u3001\u534E\u65B0\u9547\u3001\u91CD\u56FA\u9547\u3001\u767D\u9E64\u9547\u3001\u7EC3\u5858\u9547\u3001\u91D1\u6CFD\u9547\u3001\u590F\u9633\u8857\u9053\u3001\u76C8\u6D66\u8857\u9053\u3001\u9999\u82B1\u6865\u8857\u9053