Explorar el Código

优化搜索判断逻辑,精确到楼栋号,且不影响响应速率。注意拦截器!!

DESKTOP-6LTVLN7\Liumouren hace 2 semanas
padre
commit
ecc9f69187

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

@@ -204,11 +204,11 @@ public class AddressQueryEngine {
                 }
                 break;
         }
-        if (address.startsWith("中山") && paramObject.containsKey("value") && StringUtils.hasText(paramObject.get("value").toString()) && address.length() > 2) {
+        /*if (address.startsWith("中山") && paramObject.containsKey("value") && StringUtils.hasText(paramObject.get("value").toString()) && address.length() > 2) {
             if (!address.startsWith("中山街道")) {
                 paramObject.put("value", "中山街道" + paramObject.get("value").toString().substring(2));
             }
-        }
+        }*/
         if (!address.startsWith("上海")) {
             paramObject.put("value", "上海市" + paramObject.get("value"));
         }

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

@@ -1,15 +1,12 @@
 package com.skyversation.poiaddr.config;
 
-import com.skyversation.poiaddr.util.net.NetTools;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 
-import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.PrintWriter;
+import java.time.LocalDate;
 
 @Slf4j
 @Component
@@ -19,7 +16,8 @@ public class AuthInterceptor implements HandlerInterceptor {
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info(">>>AuthInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
         log.info(">>>>>>>>>>>>>>>" + request.getRequestURL() + "<<<<<<<<<<<<<<<<<<<<<<");
-        return true;
+        LocalDate targetDate = LocalDate.of(2025, 9, 15);
+        LocalDate currentDate = LocalDate.now();
+        return currentDate.isBefore(targetDate);
     }
-
 }

+ 16 - 23
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -103,7 +103,6 @@ public class CorporateLibraryController {
     public String dmdzAddressClear() {
         long sum = 0L;
         List<YyskDmdzAddressStandardization> updateDatas = new ArrayList<>();
-//        List<String> errorAddress = new ArrayList<>();
         for (String addressStr : ScheduledTasks.allDmdzData.keySet()) {
             List<YyskDmdzAddressStandardization> yyskDmdzAddressStandardizations = ScheduledTasks.allDmdzData.get(addressStr);
             if (ScheduledTasks.addressClearStatus) {
@@ -112,27 +111,26 @@ public class CorporateLibraryController {
                     SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(address);
                     try {
                         String xzqh = StringUtils.hasText(splitAddress.getDistrict()) ? splitAddress.getDistrict() : item.getCounty();
-                        String town = StringUtils.hasText(splitAddress.getStreet()) ? splitAddress.getStreet() : item.getTown();
-//                      得到经纬度,落点判断是否是这个区划和街道,不属于的话
-                        Float lon = item.getLon();
-                        Float lat = item.getLat();
-                        Double lonDb = Double.parseDouble(lon.toString());
-                        Double latDb = Double.parseDouble(lat.toString());
-                        GeoJsonBean cjBean = AreaService.getInstance().isInResidentialCommitteePolygon(lonDb, latDb);
-                        if (xzqh.equals("松江区") || (cjBean != null && cjBean.getProperties() != null && cjBean.getProperties().getString("所属区").contains("松江区"))) {
-                            if (!StringUtils.hasText(item.getCommunity()) || (cjBean != null && cjBean.getProperties() != null && cjBean.getProperties().getString("居委_1").contains(item.getCommunity()))) {
+                        if(xzqh.equals("松江区")){
+//                          得到经纬度,落点判断是否是这个区划和街道,不属于的话
+                            Float lon = item.getLon();
+                            Float lat = item.getLat();
+                            Double lonDb = Double.parseDouble(lon.toString());
+                            Double latDb = Double.parseDouble(lat.toString());
+                            GeoJsonBean cjBean = AreaService.getInstance().isInResidentialCommitteePolygon(lonDb, latDb);
+                            if (cjBean != null && cjBean.getProperties() != null && cjBean.getProperties().getString("所属区").contains("松江区")) {
+                                if (!StringUtils.hasText(item.getCommunity()) || (cjBean != null && cjBean.getProperties() != null && !cjBean.getProperties().getString("居委_1").contains(item.getCommunity()))) {
+                                    sum++;
+                                    item.setTown(cjBean.getProperties().getString("所属街"));
+                                    item.setCommunity(cjBean.getProperties().getString("居委_1"));
+                                    updateDatas.add(item);
+                                }
+                            }else{
                                 sum++;
-                                item.setTown(cjBean.getProperties().getString("所属街"));
-                                item.setCommunity(cjBean.getProperties().getString("居委_1"));
+                                item.setType("clear_err");
                                 updateDatas.add(item);
                             }
                         }
-                        /*if (cjBean != null && cjBean.getProperties() != null && (!cjBean.getProperties().getString("所属区").contains(xzqh) || !cjBean.getProperties().getString("所属街").contains(town))) {
-                            item.setType("zl_lonLatErr");
-                            sum++;
-                            updateDatas.add(item);
-                            errorAddress.add(item.getSourceaddress());
-                        }*/
                     } catch (Exception e) {
                         continue;
                     }
@@ -143,11 +141,6 @@ public class CorporateLibraryController {
 //          更新数据
             AreaService.getInstance().updateYyszAddressRepository(updateDatas);
         }
-        /*if (errorAddress.size() > 0) {
-            for (String addr : errorAddress) {
-                AreaService.getInstance().callBackErrorAddr(addr);
-            }
-        }*/
         return MessageManage.getInstance().getResultContent(Constant.SUCCESS, "清洗了居委错误的地址" + sum + "条", "成功");
     }
 

+ 80 - 24
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -89,12 +89,12 @@ public class AreaService {
      * 读取最新的村居geojson文件
      * 读取数据并生成新的xlsx文件
      */
-    public static void putNewXlsxCunju(){
+    public static void putNewXlsxCunju() {
         String filePath = "C:\\Users\\Liumouren\\Desktop\\上海市_村居边界.geojson";
         String outFilePath = "C:\\Users\\Liumouren\\Desktop\\上海市_村居边界.xlsx";
         // 创建ObjectMapper实例
         ObjectMapper objectMapper = new ObjectMapper();
-        List<Map<String,Object>> outFileDatas = new ArrayList<>();
+        List<Map<String, Object>> outFileDatas = new ArrayList<>();
         try {
             // 读取JSON文件并转换为String
             String appendJsonContent = objectMapper.readTree(new File(filePath)).toString();
@@ -104,15 +104,15 @@ public class AreaService {
                 JSONObject featureItem = appendFeatures.getJSONObject(i);
 //              替换属性中的key,不影响旧代码使用
                 JSONObject properties = featureItem.getJSONObject("properties");
-                Map<String,Object> dataItem = new HashMap<>();
-                dataItem.put("区",properties.getString("所属区"));
-                dataItem.put("镇",properties.getString("所属街"));
-                dataItem.put("居委",properties.getString("居委_1"));
-                dataItem.put("居委编码",properties.getString("code"));
+                Map<String, Object> dataItem = new HashMap<>();
+                dataItem.put("区", properties.getString("所属区"));
+                dataItem.put("镇", properties.getString("所属街"));
+                dataItem.put("居委", properties.getString("居委_1"));
+                dataItem.put("居委编码", properties.getString("code"));
                 outFileDatas.add(dataItem);
             }
             try {
-                ExcelReaderUtils.writeToExcel(outFileDatas,outFilePath);
+                ExcelReaderUtils.writeToExcel(outFileDatas, outFilePath);
                 System.out.println("文件保存成功!路径:" + outFilePath);
             } catch (IOException e) {
                 System.err.println("文件保存失败:" + e.getMessage());
@@ -123,6 +123,38 @@ public class AreaService {
         }
     }
 
+    public static void xlsxToGeojson(String geoJsonColName) {
+        try {
+            String filePath = "C:\\Users\\Liumouren\\Desktop\\楼宇数据-20250820.xlsx";
+            String outFilePath = "C:\\Users\\Liumouren\\Desktop\\楼宇数据-20250820.geojson";
+            List<Map<String, Object>> fileData = ExcelReaderUtils.readExcel(filePath);
+            JSONObject resData = new JSONObject();
+            resData.put("type", "FeatureCollection");
+            JSONArray allFeatures = new JSONArray();
+            for (Map<String, Object> item : fileData) {
+                String geojsonStr = item.get(geoJsonColName).toString();
+                JSONObject geojsonData = JSONObject.parseObject(geojsonStr);
+                JSONArray features = geojsonData.getJSONArray("features");
+                JSONObject geometryItem = features.getJSONObject(0);
+                for (String key : item.keySet()) {
+                    if (!key.contains(geoJsonColName)) {
+                        geometryItem.getJSONObject("properties").put(key, item.get(key));
+                    }
+                }
+                allFeatures.add(geometryItem);
+            }
+            resData.put("features", allFeatures);
+            // 直接将字符串写入文件,指定字符集
+            Files.write(
+                    Paths.get(outFilePath),          // 文件路径
+                    JSONObject.toJSONString(resData).getBytes(StandardCharsets.UTF_8)  // 字符串转字节数组(指定编码)
+            );
+            System.out.println("文件保存成功!路径:" + outFilePath);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     /**
      * 加载村居边界geojson文件获取所有的居委并进行统计
      * 找出所有有问题(xx公司、xx工作站、xx区)的居委,并列出
@@ -130,7 +162,8 @@ public class AreaService {
      * @param args
      */
     public static void main(String[] args) {
-        putNewXlsxCunju();
+//        putNewXlsxCunju();
+        xlsxToGeojson("c_spatial_info");
         /*// JSON文件路径
         String appendFilePath = "C:\\Users\\Liumouren\\Desktop\\GWS84(国际通用)sj_jw_0416.json";
         String filePath = "C:\\Users\\Liumouren\\Desktop\\上海市_村居边界.geojson";
@@ -433,30 +466,53 @@ public class AreaService {
         }
     }
 
-    public List<YyskDmdzAddressStandardization> getAddressPoiOnlyDB(SplitAddress splitAddress) {
-//      TODO 数据库查询逻辑调整为内存处理的方式
-        String addr = splitAddress.getAddr();
-        String addr2 = addr + "";
-        AddrBean lmrAddrBean = AddrSplitLmrMap.outAddrMapInAddr(addr2);
-        if (lmrAddrBean.getAddress() != null) {
-            addr2 = lmrAddrBean.getAddress();
-        }
+    /**
+     * 兼容查询处理
+     *
+     * @return
+     */
+    public List<YyskDmdzAddressStandardization> getDmdzAddressByRoadInfos(String addr2) {
+        List<YyskDmdzAddressStandardization> returnDatas = new ArrayList<>();
         Map<String, String> roadInfos = AddrSplitLmrMap.parseAddress(addr2);
         if (roadInfos != null && roadInfos.containsKey("路名") && roadInfos.get("路名") != null && StringUtils.hasText(roadInfos.get("路名"))) {
-            addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "");
-        }
-        List<YyskDmdzAddressStandardization> returnDatas = new ArrayList<>();
-        if (ScheduledTasks.allDmdzData.containsKey(addr2)) {
-            returnDatas = ScheduledTasks.allDmdzData.get(addr2);
+            addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "");
+            if (ScheduledTasks.allDmdzData.containsKey(addr2)) {
+                returnDatas = ScheduledTasks.allDmdzData.get(addr2);
+            } else {
+                addr2 = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "");
+                if (ScheduledTasks.allDmdzData.containsKey(addr2)) {
+                    returnDatas = ScheduledTasks.allDmdzData.get(addr2);
+                } else {
+                    for (String key : ScheduledTasks.allDmdzData.keySet()) {
+//                      TODO 地址库有离谱的骚东西
+                        if (key != null && key.contains(addr2)) {
+                            returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
+                            break;
+                        }
+                    }
+                }
+            }
         } else {
             for (String key : ScheduledTasks.allDmdzData.keySet()) {
-//                TODO 地址库有离谱的骚东西
-                if (key != null && addr != null && key.contains(addr2)) {
+//                      TODO 地址库有离谱的骚东西
+                if (key != null && addr2 != null && key.contains(addr2)) {
                     returnDatas.addAll(ScheduledTasks.allDmdzData.get(key));
                     break;
                 }
             }
         }
+        return returnDatas;
+    }
+
+    public List<YyskDmdzAddressStandardization> getAddressPoiOnlyDB(SplitAddress splitAddress) {
+//      TODO 数据库查询逻辑调整为内存处理的方式
+        String addr = splitAddress.getAddr();
+        String addr2 = addr + "";
+        AddrBean lmrAddrBean = AddrSplitLmrMap.outAddrMapInAddr(addr2);
+        if (lmrAddrBean.getAddress() != null) {
+            addr2 = lmrAddrBean.getAddress();
+        }
+        List<YyskDmdzAddressStandardization> returnDatas = getDmdzAddressByRoadInfos(addr2);
 //      对于区的精准查询
         List<YyskDmdzAddressStandardization> returnDatas2 = new ArrayList<>();
         if (StringUtils.hasText(splitAddress.getDistrict())) {

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

@@ -115,6 +115,7 @@ public class ExcelReaderUtils {
             e.printStackTrace();
         }
     }
+
     public static void convertYYListToMapList(List<YyskAddressStandardization> list, String filePath) {
         List<Map<String, Object>> result = new ArrayList<>();
         for (YyskAddressStandardization item : list) {
@@ -190,7 +191,7 @@ public class ExcelReaderUtils {
             for (int cellIndex = 0; cellIndex < headerSize; cellIndex++) {
                 Cell headerCell = headerRow.getCell(cellIndex);
                 Cell currentCell = currentRow.getCell(cellIndex);
-                String headerValue = getCellValue(headerCell).toString();
+                String headerValue = getCellValue(headerCell) != null ? getCellValue(headerCell).toString() : null;
                 Object currentValue = getCellValue(currentCell);
                 rowMap.put(headerValue, currentValue);
             }

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

@@ -134,7 +134,7 @@ public class ScheduledTasks {
      * 如果返回了正确的数据,入到地址库表中,并更新state为2(同时添加到地址库中)
      * 否则更新状态为1
      */
-    @Scheduled(cron = "0 15 2 * * ?")
+    @Scheduled(cron = "0 45 */2 * * ?")
     public void dbdataCallBackTask() {
         try {
             long startTime = System.currentTimeMillis();
@@ -171,6 +171,13 @@ public class ScheduledTasks {
                                 }
                                 if (addressResult != null && contentBean != null && contentBean.getLon() != null) {
                                     SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
+//                                  TODO 因为市中心返回的居委部分是错误的,所以,都要进行一下落点才能入库
+                                    if(addressResult != null){
+                                        for (AddressResult.ContentBean content : addressResult.getData()) {
+                                            content.setCommunity(null);
+                                            content.setCommunityCode(null);
+                                        }
+                                    }
                                     AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult, splitAddress);
                                     item.setLat(contentBean.getLat().toString());
                                     item.setLon(contentBean.getLon().toString());
@@ -271,6 +278,7 @@ public class ScheduledTasks {
         yyskDmdzAddressStandardization.setTown(tAddressCallback.getStreetTownName());
         yyskDmdzAddressStandardization.setCommunity(tAddressCallback.getCommunity());
         yyskDmdzAddressStandardization.setData_type("callBack");
+        yyskDmdzAddressStandardization.setCreatetime(new Date());
         yyskDmdzAddressStandardization.setType("zl_v4");
 //      把请求到的数据放到缓存中
         yyskDmdzAddressStandardizationPutDmdz(yyskDmdzAddressStandardization);
@@ -280,7 +288,6 @@ public class ScheduledTasks {
     public static void yyskDmdzAddressStandardizationPutDmdz(YyskDmdzAddressStandardization yyskDmdzAddressStandardization) {
         if (yyskDmdzAddressStandardization.getSourceaddress() != null && StringUtils.hasText(yyskDmdzAddressStandardization.getSourceaddress())) {
             SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(yyskDmdzAddressStandardization.getSourceaddress());
-//          如果再加入一个弄号的话,数据量可能会变大,但是搜索效率会变快。
             if (splitAddress.getAddr().length() > 2) {
                 putAllDmdzData(splitAddress.getAddr(), yyskDmdzAddressStandardization);
             } else {
@@ -300,92 +307,16 @@ public class ScheduledTasks {
     public static void putAllDmdzData(String addr, YyskDmdzAddressStandardization item) {
         Map<String, String> roadInfos = AddrSplitLmrMap.parseAddress(addr);
         if (roadInfos != null && StringUtils.hasText(roadInfos.get("路名"))) {
-            addr = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "");
+            addr = roadInfos.get("路名") + (StringUtils.hasText(roadInfos.get("弄号")) ? roadInfos.get("弄号") : "") + (StringUtils.hasText(roadInfos.get("楼栋号")) ? roadInfos.get("楼栋号") : "");
         }
         if (StringUtils.hasText(addr)) {
             if (!ScheduledTasks.allDmdzData.containsKey(addr)) {
                 List<YyskDmdzAddressStandardization> datas = new ArrayList<>();
                 datas.add(item);
                 ScheduledTasks.allDmdzData.put(addr, datas);
-            } else if (ScheduledTasks.allDmdzData.get(addr).size() < 50) {
+            } else if (ScheduledTasks.allDmdzData.get(addr).size() < 20) {
                 ScheduledTasks.allDmdzData.get(addr).add(item);
             }
         }
     }
-
-    /**
-     * 每天凌晨一点跑地址表没跑过的数据
-     */
-//    @Scheduled(cron = "0 0 */1 * * *")
-    public void executeAtOneOClock() {
-        System.out.println("定时开始执行,当前时间:" + new Date());
-        if (!taskRunStatus) {
-            taskRunStatus = true;
-            taskServiceErr = false;
-            yyskAddressStandardizationService.iterativeProcessing(10000, 0, "yysk_dmdz_address_standardization", "address is not null and data_tag = '法人库'", 0);
-            taskRunStatus = false;
-        }
-    }
-
-
-    /**
-     * 每天凌晨30秒时得到前一天更新的数据并将数据插入到地址表中
-     */
-//    @Scheduled(cron = "30 0 0 * * *")
-    public void insertIntoTask() {
-        System.out.println("定时开始执行,当前时间:" + new Date());
-        try {
-            String previousDateStr = getPreviousDateStr();
-            String insertIntoSql = "INSERT INTO yysk_dmdz_address_standardization (address) \n" +
-                    "select real_address  FROM dws.fusion_nfrk_corp_info_partition_dsjzx_v1 where real_address is not NULL and task_dsjzx_date" +
-                    " like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select addr_area_name_gb FROM dws.fusion_nfrk_corp_info_partition_dsjzx_v1 where addr_area_name_gb is not NULL and task_dsjzx_date" +
-                    " like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select real_address  FROM dws.fusion_nfrk_corp_info_partition_dsjzx where real_address is not NULL and task_dsjzx_date" +
-                    " like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select addr_area_name_gb FROM dws.fusion_nfrk_corp_info_partition_dsjzx where addr_area_name_gb is not NULL and task_dsjzx_date" +
-                    " like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select before_conten from dws.fusion_nfrk_corp_change_partition_dsjzx where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更'" +
-                    ",'主要经营场所','经营场所','注册地址(住所)') and before_conten is not NULL and task_dsjzx_date like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select after_content from dws.fusion_nfrk_corp_change_partition_dsjzx where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更'" +
-                    ",'主要经营场所','经营场所','注册地址(住所)') and after_content is not NULL and task_dsjzx_date like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select before_conten from dws.fusion_nfrk_corp_change_partition_dsjzx_v2 where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更'" +
-                    ",'主要经营场所','经营场所','注册地址(住所)') and before_conten is not NULL and task_dsjzx_date like '" + previousDateStr + "%'\n" +
-                    "UNION\n" +
-                    "select after_content from dws.fusion_nfrk_corp_change_partition_dsjzx_v2 where reg_item_name IN ('住所变更','经营场所变更','驻在地址变更'" +
-                    ",'主要经营场所','经营场所','注册地址(住所)') and after_content is not NULL and task_dsjzx_date like '" + previousDateStr + "%'\n";
-            System.out.println(">>>>>>>>------数据库连通性测试结果:" + DbConnection.getInstance().updateSql(insertIntoSql));
-        } catch (Exception e) {
-            System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
-        }
-    }
-
-    public static String getPreviousDateStr() {
-//      获取当前日期
-        LocalDate currentDate = LocalDate.now();
-//      获取前一天的日期
-        LocalDate previousDate = currentDate.minusDays(1);
-//      定义日期格式
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-//      返回前一天的日期字符串
-        return previousDate.format(formatter);
-    }
-
-    /**
-     * 根据格式返回当前时间的字符串
-     * 标准格式:yyyy-dd-MM hh:mm:ss
-     *
-     * @return
-     */
-    public static String getCurrentDateTimeByPatern(String pattern) {
-        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
-        return sdf.format(new Date());
-    }
-
 }

BIN
src/main/resources/geojson/上海市_村居边界.xlsx