Эх сурвалжийг харах

内网68服务器稳定运行版本

DESKTOP-6LTVLN7\Liumouren 1 өдөр өмнө
parent
commit
0215bf5d5f

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

@@ -48,14 +48,27 @@ public class AddressQueryEngine {
         AddressResult addressResult = new AddressResult();
         for (String addr : addrs) {
             //  创建请求
-            addressResult = sj_szxSearchByName(addr, 3);
-            if (addressResult != null) {
-                addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
-                addressResult.setMessage("成功");
-                SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
-                return getCjWgWgwByLoc(addressResult, splitAddress);
+            String addr_ = addr + "";
+            if(StringUtils.hasText(addr_)){
+                addressResult = sj_szxSearchByName(addr, 3);
+                if (addressResult != null) {
+                    addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
+                    addressResult.setMessage("成功");
+                    try{
+                        SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr_);
+                        return getCjWgWgwByLoc(addressResult, splitAddress);
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                    addressResult = null;
+                }
+            }else{
+                addressResult = null;
             }
         }
+        if (addressResult == null) {
+            addressResult = new AddressResult();
+        }
         addressResult.setCode(AddressResultEnum.RESULT_NULL);
         addressResult.setMessage("失败");
         return addressResult;
@@ -108,20 +121,24 @@ public class AddressQueryEngine {
                 JSONArray pois = new JSONArray();
                 pois.addAll(dbPois);
                 SplitAddress splitAddress1 = ShanghaiAddressSplitUtil.splitBestAddress(addr);
+//              打分排序
                 addressResult = new TransfromDataTool().dbResultToResult(splitAddress1, addr, pois);
-                addressResult.setAddrBean(addrBean);
                 if (addressResult.getData() != null && addressResult.getData().size() > 0) {
                     getCjWgWgwByLoc(addressResult, splitAddress);
                     addressResult.setCode(AddressResultEnum.DB_SUCCESS);
                     addressResult.setMessage("成功");
-                    AddressResult.ContentBean content = addressResult.getData().get(0);
-                    addrBean.setPname(content.getPname());
-                    addrBean.setCityname(content.getCityname());
-                    addrBean.setAdname(content.getAdname());
-                    addrBean.setDistance(content.getDistance());
-                    addrBean.setCommunity(content.getCommunity());
-                    addrBean.setStandAddr(content.getStandAddr());
-                    addressResult.setAddrBean(addrBean);
+                    for (AddressResult.ContentBean content : addressResult.getData()) {
+                        //                  地址库中可能存在外地脏数据
+                        if (content.getCityname() != null && content.getAdname() != null) {
+                            addrBean.setPname(content.getPname());
+                            addrBean.setCityname(content.getCityname());
+                            addrBean.setAdname(content.getAdname());
+                            addrBean.setCommunity(content.getCommunity());
+                            addrBean.setStandAddr(content.getStandAddr());
+                            addressResult.setAddrBean(addrBean);
+                            break;
+                        }
+                    }
                     return addressResult;
                 }
             }
@@ -490,7 +507,6 @@ public class AddressQueryEngine {
         // 初始化两个集合,一个用于存储非数字字符串,一个用于存储数字字符串
         Set<String> nonNumberSet = new HashSet<>();
         Set<String> numberSet = new HashSet<>();
-
         StringBuilder currentToken = new StringBuilder();
         for (int i = 0; i < input.length(); i++) {
             char c = input.charAt(i);
@@ -514,7 +530,6 @@ public class AddressQueryEngine {
                 }
             }
         }
-
         // 处理最后一个 token
         if (currentToken.length() > 0) {
             if (Character.isDigit(currentToken.charAt(0))) {
@@ -523,12 +538,10 @@ public class AddressQueryEngine {
                 nonNumberSet.add(currentToken.toString());
             }
         }
-
         // 将两个集合添加到列表中
         List<Set<String>> result = new ArrayList<>();
         result.add(nonNumberSet);
         result.add(numberSet);
-
         return result;
     }
 }

+ 78 - 32
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -8,9 +8,48 @@ import com.skyversation.poiaddr.util.SplitAddress;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
 
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
 
 public class TransfromDataTool {
 
+    public static void main(String[] args) {
+//      搜索地址
+        String searchAddress = "四村村701号102室";
+        System.out.println("》》搜索地址:" + searchAddress);
+        System.out.println();
+//      返回的参考地址列表
+        Set<String> arrayAddress = new HashSet<>();
+        arrayAddress.add("上海市青浦区盈浦街道淀湖路88号");
+        arrayAddress.add("上海市松江区叶榭镇五村村701号102室");
+        arrayAddress.add("上海市松江区叶榭镇四村村701号102室");
+        arrayAddress.add("上海市松江区叶榭镇四村村404号");
+        arrayAddress.add("上海市松江区叶榭镇四村村685号");
+        arrayAddress.add("四村村701号102室");
+        arrayAddress.add("叶榭镇四村村684号");
+        arrayAddress.add("四村村684号");
+        arrayAddress.add("四村村701号121室");
+        arrayAddress.add("四村村701号101室");
+        arrayAddress.add("淀湖路699弄");
+        arrayAddress.add("四村村");
+        System.out.println("》》返回参考地址列表:" + arrayAddress);
+        System.out.println();
+//      新建JSONArray对象
+        JSONArray array = new JSONArray();
+//      把Set对象转换为接口接收的JSONArray对象
+        for (String key : arrayAddress) {
+            JSONObject item_ = new JSONObject();
+            item_.put("sourceaddress", key);
+            array.add(item_);
+        }
+        JSONArray reData = AddressTools.getInstance().findBestMatch2(searchAddress, array, "sourceaddress");
+        System.out.println("------------------打分后从高到低显示》》》》》》》》》》》》");
+        System.out.println();
+        for (int i = 0; i < reData.size(); i++) {
+            JSONObject jo = reData.getJSONObject(i);
+            System.out.println("返回参考地址:" + jo.getString("sourceaddress") + "\t打分:" + jo.getString("总分"));
+        }
+    }
 
     public AddressResult dbResultToResult(SplitAddress SplitAddress, String searchAddress, JSONArray array) {
         AddressResult result = new AddressResult();
@@ -20,10 +59,12 @@ public class TransfromDataTool {
                 addressResult.setCode(AddressResultEnum.RESULT_NULL);
                 return result;
             }
+//          打分(应该从大到小)
             JSONArray resultArray = AddressTools.getInstance().findBestMatch2(searchAddress, array, "sourceaddress");
-            for(int i = 0; i < resultArray.size(); i ++){
+            for (int i = 0; i < resultArray.size(); i++) {
                 JSONObject jsonObject = resultArray.getJSONObject(i);
                 if (jsonObject != null && jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
+//                  TODO 映射输出
                     AddressResult.ContentBean content = AddressTools.getInstance().addressToContentBean(SplitAddress, jsonObject);
                     if (result.getData() == null) {
                         result.setData(new ArrayList<>());
@@ -47,43 +88,48 @@ public class TransfromDataTool {
             result.setCode(AddressResultEnum.RESULT_NULL);
             return result;
         }
-        JSONObject jsonObject = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(searchAddress, array, "address");
-        if (jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
-            AddressResult.ContentBean content = new AddressResult.ContentBean();
-            content.setScore(jsonObject.getString("总分"));
-            content.setSearchAddress(jsonObject.getString("searchAddress"));
-            content.setType(jsonObject.getString("type_name"));
-            content.setAddress(jsonObject.getString("address"));
-            content.setName(jsonObject.getString("name"));
+        JSONArray jsonArray = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch2(searchAddress, array, "address");
+        if (jsonArray.size() > 0) {
+            JSONObject jsonObject = jsonArray.getJSONObject(0);
+            if (jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
+                AddressResult.ContentBean content = new AddressResult.ContentBean();
+                content.setScore(jsonObject.getString("总分"));
+                content.setSearchAddress(jsonObject.getString("searchAddress"));
+                content.setType(jsonObject.getString("type_name"));
+                content.setAddress(jsonObject.getString("address"));
+                content.setName(jsonObject.getString("name"));
 //          使用分词方法得到区名是镇名
-            content.setCityname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[1]);
-            double[] points = new double[]{jsonObject.getJSONObject("location").getDouble("lng"),
-                    jsonObject.getJSONObject("location").getDouble("lat")};
-            content.setLon(points[0]);
-            content.setLat(points[1]);
-            if (jsonObject.get("point_x") != null && jsonObject.get("point_y") != null) {
-                content.setLocation(jsonObject.getDouble("point_x") + "," + jsonObject.getDouble("point_y"));
-            }
-            content.setAdname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[2]);
-            if (jsonObject.containsKey("ext_data")) {
-                JSONObject extData = jsonObject.getJSONObject("ext_data");
-                if (extData.containsKey("region_jw") && !extData.getString("region_jw").isEmpty()) {
-                    content.setCommunity(extData.getString("region_jw"));
+                content.setCityname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[1]);
+                double[] points = new double[]{jsonObject.getJSONObject("location").getDouble("lng"),
+                        jsonObject.getJSONObject("location").getDouble("lat")};
+                content.setLon(points[0]);
+                content.setLat(points[1]);
+                if (jsonObject.get("point_x") != null && jsonObject.get("point_y") != null) {
+                    content.setLocation(jsonObject.getDouble("point_x") + "," + jsonObject.getDouble("point_y"));
                 }
+                content.setAdname(AddressTools.parseAddressCJ(jsonObject.getString("address"))[2]);
+                if (jsonObject.containsKey("ext_data")) {
+                    JSONObject extData = jsonObject.getJSONObject("ext_data");
+                    if (extData.containsKey("region_jw") && !extData.getString("region_jw").isEmpty()) {
+                        content.setCommunity(extData.getString("region_jw"));
+                    }
 //              如果评分大于1.6,那么就使用接口返回的街镇,否则使用源搜索地址的街镇
-                if (jsonObject.getString("总分").contains("rule_") || Float.parseFloat(jsonObject.getString("总分")) > 1.6) {
-                    if (extData.containsKey("region_jd") && !extData.getString("region_jd").isEmpty()) {
-                        content.setAdname(extData.getString("region_jd"));
+                    if (jsonObject.getString("总分").contains("rule_") || Float.parseFloat(jsonObject.getString("总分")) > 1.6) {
+                        if (extData.containsKey("region_jd") && !extData.getString("region_jd").isEmpty()) {
+                            content.setAdname(extData.getString("region_jd"));
+                        }
+                    } else if (AddressTools.parseAddressCJ(searchAddress)[2] != null && !AddressTools.parseAddressCJ(searchAddress)[2].isEmpty()) {
+                        content.setAdname(AddressTools.parseAddressCJ(searchAddress)[2]);
                     }
-                } else if (AddressTools.parseAddressCJ(searchAddress)[2] != null && !AddressTools.parseAddressCJ(searchAddress)[2].isEmpty()) {
-                    content.setAdname(AddressTools.parseAddressCJ(searchAddress)[2]);
                 }
+                if (result.getData() == null) {
+                    result.setData(new ArrayList<>());
+                }
+                result.getData().add(content);
+                result.setCode(AddressResultEnum.SZX_SUCCESS);
             }
-            if (result.getData() == null) {
-                result.setData(new ArrayList<>());
-            }
-            result.getData().add(content);
-            result.setCode(AddressResultEnum.SZX_SUCCESS);
+        } else {
+            result.setCode(AddressResultEnum.RESULT_NULL);
         }
         return result;
     }

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

@@ -53,6 +53,10 @@ public class AddressResult {
         private Double lat;
         // 经度(wgs84)
         private Double lon;
+        // x坐标(上海2000)
+        private Double x;
+        // y坐标(上海2000)
+        private Double y;
         // 网格名称
         private String wgName;
         // 网格编码

+ 6 - 0
src/main/java/com/skyversation/poiaddr/bean/GovernanceResultsTable.java

@@ -51,6 +51,12 @@ public class GovernanceResultsTable implements Serializable {
     //    纬度
     @Column(name = "lat")
     private Double lat;
+    //    x(上海2000)
+    @Column(name = "x")
+    private Double x;
+    //    y(上海2000)
+    @Column(name = "y")
+    private Double y;
     //    批次号
     @Column(name = "batch_number")
     private String batchNumber;

+ 1 - 1
src/main/java/com/skyversation/poiaddr/bean/YyskDmdzAddressStandardization.java

@@ -21,7 +21,7 @@ public class YyskDmdzAddressStandardization implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "oid", nullable = false)
-    private Integer oid;
+    private Long oid;
 
     @Column(name = "code", length = 50)
     private String code;

+ 21 - 52
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -5,14 +5,12 @@ import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.*;
-import com.skyversation.poiaddr.config.DbConnection;
 import com.skyversation.poiaddr.entity.AddrBean;
 import com.skyversation.poiaddr.service.impl.GrTableRepository;
 import com.skyversation.poiaddr.service.impl.PgTableRepository;
 import com.skyversation.poiaddr.service.impl.TAddressCallbackRepository;
 import com.skyversation.poiaddr.service.impl.YyszAddressRepository;
 import com.skyversation.poiaddr.util.AddrSplitLmrMap;
-import com.skyversation.poiaddr.util.MessageManage;
 import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
 import com.skyversation.poiaddr.util.tasks.ScheduledTasks;
@@ -24,8 +22,6 @@ import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
@@ -40,7 +36,6 @@ public class AreaService {
 
     private static AreaService instance;
 
-
     @Resource
     private YyszAddressRepository yyszAddressRepository;
 
@@ -108,19 +103,6 @@ public class AreaService {
         System.out.println("<<<<<<<<------结果总表:" + Constant.getGrTable());
         System.out.println("<<<<<<<<------中间表:" + Constant.getPgiTable());
         System.out.println("<<<<<<<<------回匹表:" + Constant.getRpTable());
-//      TODO 网络连通性测试,可以请求一下测试的市中心地址
-        try {
-            System.out.println("电脑最大线程数:" + Runtime.getRuntime().availableProcessors());
-            System.out.println("<<<<<<<<------开始网络连通性测试");
-            long startTime = System.currentTimeMillis();
-            List<String> addrs = new ArrayList<>();
-            addrs.add("上海市松江区乐都路339号");
-            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs);
-            long endTime = System.currentTimeMillis();
-            System.out.println(">>>>>>>>------网络连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!结果:" + addressResult);
-        } catch (Exception e) {
-            System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
-        }
         //          查询callback表中最大的id和添加到callBackAllErrorAddrs列表中
         try {
             long startTime = System.currentTimeMillis();
@@ -186,32 +168,13 @@ public class AreaService {
         System.out.println("<<<<<<<<------run geo data complete------>>>>>>>>>");
     }
 
-    public void putAllDmdzData(String addr, YyskDmdzAddressStandardization item) {
-        if (addr.contains("号")) {
-            addr = addr.substring(0, addr.indexOf("号"));
-        }
-        if (addr.contains("弄")) {
-            addr = addr.substring(0, addr.indexOf("弄"));
-        }
-        addr = addr.replaceAll("(?<=[^\\d])\\d+$", "");
-        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() < 100) {
-                ScheduledTasks.allDmdzData.get(addr).add(item);
-            }
-        }
-    }
-
     /**
      * 缓存地址库数据
      */
     public void getAllDmdzAddressDatas() {
         long startTime = System.currentTimeMillis();
 //      先查询到所有数据
-        getDmdzDataByPage(0, 10000);
+        getDmdzDataByPage(0L, 10000);
         System.out.println("ScheduledTasks.allDmdzData初始化完成,有" + ScheduledTasks.allDmdzData.size() + "条记录保存到缓存中,用时" + (System.currentTimeMillis() - startTime) / 1000 + "秒");
     }
 
@@ -222,25 +185,29 @@ public class AreaService {
      * @param pageSize
      */
     @Transactional(readOnly = true)
-    public void getDmdzDataByPage(int maxOid, int pageSize) {
+    public void getDmdzDataByPage(Long maxOid, int pageSize) {
         System.out.println("maxOid:" + maxOid + "pageSize:" + pageSize);
         long sTime = System.currentTimeMillis();
         List<YyskDmdzAddressStandardization> dataList = yyszAddressRepository.getAllByOidPage(maxOid, pageSize);
         System.out.println("当前OID" + maxOid + "查询完成,用时:" + (System.currentTimeMillis() - sTime) + "毫秒!");
         //      TODO 经测试发现一次性读全表,内存根本吃不消
         for (YyskDmdzAddressStandardization item : dataList) {
-            if (item.getAddress() != null && StringUtils.hasText(item.getAddress())) {
-                SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(item.getAddress());
-                putAllDmdzData(splitAddress.getAddr(), item);
-                if (item.getSourceaddress() != null && StringUtils.hasText(item.getSourceaddress())) {
-                    SplitAddress splitAddress2 = ShanghaiAddressSplitUtil.splitBestAddress(item.getSourceaddress());
-                    if (!splitAddress.getAddr().equals(splitAddress2.getAddr())) {
-                        putAllDmdzData(splitAddress2.getAddr(), item);
+            if (item.getSourceaddress() != null && StringUtils.hasText(item.getSourceaddress())) {
+                SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(item.getSourceaddress());
+                if(splitAddress.getAddr().length() > 2){
+                    ScheduledTasks.putAllDmdzData(splitAddress.getAddr(), item);
+                }else{
+                    ScheduledTasks.putAllDmdzData(item.getSourceaddress(), item);
+                }
+                if (item.getAddress() != null && StringUtils.hasText(item.getAddress()) && !item.getSourceaddress().contains(item.getAddress())) {
+                    SplitAddress splitAddress2 = ShanghaiAddressSplitUtil.splitBestAddress(item.getAddress());
+                    if(splitAddress2.getAddr().length() > 2){
+                        ScheduledTasks.putAllDmdzData(splitAddress2.getAddr(), item);
+                    }else{
+                        ScheduledTasks.putAllDmdzData(item.getAddress(), item);
                     }
+
                 }
-            } else if (item.getSourceaddress() != null && StringUtils.hasText(item.getSourceaddress())) {
-                SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(item.getSourceaddress());
-                putAllDmdzData(splitAddress.getAddr(), item);
             }
             if (item.getOid() > maxOid) {
                 maxOid = item.getOid();
@@ -292,6 +259,8 @@ public class AreaService {
                         governanceResultsTable.setCommunity(contentBean.getCommunity());
                         governanceResultsTable.setLon(contentBean.getLon());
                         governanceResultsTable.setLat(contentBean.getLat());
+                        governanceResultsTable.setX(contentBean.getX());
+                        governanceResultsTable.setY(contentBean.getY());
                         governanceResultsTable.setMatchLevel(contentBean.getScore());
                     }
                     governanceResultsTables.add(governanceResultsTable);
@@ -388,14 +357,14 @@ public class AreaService {
                     returnDatas2.add(item);
                 }
             }
-            return returnDatas2;
+            return returnDatas2.size() > 0 ? returnDatas2 : returnDatas;
         } else {
             return returnDatas;
         }
     }
 
-    public List<TAddressCallback> getCallbackDataByTag(Integer tag) {
-        return tAddressCallbackRepository.getCallbackByTag(tag);
+    public List<TAddressCallback> getCallbackDataByTag() {
+        return tAddressCallbackRepository.getCallbackByTag();
     }
 
     public List<TAddressCallback> updateCallbackData(List<TAddressCallback> datas) {

+ 2 - 2
src/main/java/com/skyversation/poiaddr/service/impl/TAddressCallbackRepository.java

@@ -11,6 +11,6 @@ import java.util.List;
 @Resource
 public interface TAddressCallbackRepository extends JpaRepository<TAddressCallback, String> {
     // 执行自定义的SQL查询
-    @Query(value = "SELECT * FROM t_address_callback_demo WHERE status_tag = :statusTag ", nativeQuery = true)
-    List<TAddressCallback> getCallbackByTag(@Param("statusTag") Integer statusTag);
+    @Query(value = "SELECT * FROM t_address_callback WHERE status_tag is null or status_tag = '0' ", nativeQuery = true)
+    List<TAddressCallback> getCallbackByTag();
 }

+ 1 - 1
src/main/java/com/skyversation/poiaddr/service/impl/YyszAddressRepository.java

@@ -34,5 +34,5 @@ public interface YyszAddressRepository extends JpaRepository<YyskDmdzAddressStan
     List<YyskDmdzAddressStandardization> getNearbySearch(@Param("lat") double lat, @Param("lon") double lon, @Param("radius") int radius);
 
     @Query(value = "SELECT * FROM yysk_dmdz_address_standardization where \"type\" = 'zl_v4' and oid >:oid order by oid limit :pageSize", nativeQuery = true)
-    List<YyskDmdzAddressStandardization> getAllByOidPage(@Param("oid") int oid,@Param("pageSize") int pageSize);
+    List<YyskDmdzAddressStandardization> getAllByOidPage(@Param("oid") Long oid,@Param("pageSize") int pageSize);
 }

+ 57 - 93
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -3,7 +3,6 @@ package com.skyversation.poiaddr.util;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
-import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 
 import java.util.*;
@@ -473,90 +472,6 @@ public class AddressTools {
         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);
-            obj.put("searchAddress", address);
-            if (obj.containsKey(param) && obj.get(param) != null && !obj.getString(param).trim().isEmpty()) {
-//              得到返回的地址
-                String addr = obj.getString(param);
-//              规则4判断
-//              TODO 添加校验逻辑(首先使用第4校验规则匹配,匹配不到使用第二规则,还匹配不到的话就使用打分规则)
-                Set<String> addressString = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(addr)).get(0);
-                Set<String> addressNumber = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(addr)).get(1);
-                Set<String> address2String = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(address)).get(0);
-                Set<String> address2Number = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(address)).get(1);
-                if (addressString != null && addressString.size() > 0) {
-                    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("总分", "rule_4");
-                                                return obj;
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-//              规则2判断
-                String role2address = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(addr));
-                String role2address2 = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(address));
-                if (AddressQueryEngine.isNotEmptyOrBlank(role2address) && role2address.contains(role2address2)) {
-                    obj.put("总分", "rule_2");
-                    return obj;
-                }
-
-                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;
-    }
-
     public static boolean isOtherDistrictThanSongJiang(String address) {
         // 将地址字符串转换为小写,以便进行不区分大小写的比较
         String lowerCaseAddress = address.toLowerCase();
@@ -902,13 +817,13 @@ public class AddressTools {
      */
     public JSONArray findBestMatch2(String address, JSONArray array, String param) {
         JSONArray resultArray = new JSONArray();
-
         double maxTotalScore = 0;
         // 处理输入地址的分词和数字前文本
         AddressInfo addressInfo = processAddress(address);
         for (int i = 0; i < array.size(); i++) {
             JSONObject obj = array.getJSONObject(i);
             obj.put("searchAddress", address);
+            boolean hasValue = false;
             if (obj.containsKey(param) && obj.get(param) != null && !obj.getString(param).trim().isEmpty()) {
 //              得到返回的地址
                 String addr = obj.getString(param);
@@ -921,20 +836,20 @@ public class AddressTools {
                 if (addressString != null && addressString.size() > 0) {
                     int addressStrSize = addressString.size();
                     for (String addr2str : address2String) {
-                        if (addressString.contains(addr2str)) {
+                        if (!hasValue && addressString.contains(addr2str)) {
                             addressStrSize--;
                             if (addressStrSize == 0) {
-                                if (addressNumber.size() == 0) {
-                                    obj.put("总分", "rule_4");
-                                    resultArray.add(obj);
+                                if (addressNumber.size() == 0 && address2Number.size() == 0) {
+                                    hasValue = true;
+                                    break;
                                 } else {
                                     int addressNumSize = addressNumber.size();
                                     for (String addr2Num : address2Number) {
                                         if (addressNumber.contains(addr2Num)) {
                                             addressNumSize--;
                                             if (addressNumSize == 0) {
-                                                obj.put("总分", "rule_4");
-                                                resultArray.add(obj);
+                                                hasValue = true;
+                                                break;
                                             }
                                         }
                                     }
@@ -943,12 +858,18 @@ public class AddressTools {
                         }
                     }
                 }
+                if (hasValue) {
+                    obj.put("总分", "400");
+                    resultArray.add(obj);
+                    continue;
+                }
 //              规则2判断
                 String role2address = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(addr));
                 String role2address2 = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(address));
                 if (AddressQueryEngine.isNotEmptyOrBlank(role2address) && role2address.contains(role2address2)) {
-                    obj.put("总分", "rule_2");
+                    obj.put("总分", "200");
                     resultArray.add(obj);
+                    continue;
                 }
 
                 AddressInfo addrInfo = processAddress(addr);
@@ -974,9 +895,36 @@ public class AddressTools {
                 }
             }
         }
+//      添加排序应该根据总分是从大到小排序
+        sortByTotalScoreDescending(resultArray);
         return resultArray;
     }
 
+    public static void sortByTotalScoreDescending(JSONArray array) {
+        // 将 JSONArray 转换为 List<JSONObject>
+        List<JSONObject> list = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            list.add(array.getJSONObject(i));
+        }
+
+        // 使用 Comparator 进行排序
+        list.sort((a, b) -> {
+            try {
+                // 将字符串转换为 float 进行比较
+                float scoreA = Float.parseFloat(a.getString("总分"));
+                float scoreB = Float.parseFloat(b.getString("总分"));
+                // 从大到小排序
+                return Float.compare(scoreB, scoreA);
+            } catch (Exception e) {
+                e.printStackTrace();
+                return 0;
+            }
+        });
+        // 清空原 JSONArray 并添加排序后的元素
+        array.clear();
+        array.addAll(list);
+    }
+
     /**
      * 将数据库结果映射为AddressResult.ContentBean
      *
@@ -1001,6 +949,14 @@ public class AddressTools {
         content.setLocation(json.get("lon") + "," + json.get("lat"));
         content.setLat(json.getDoubleValue("lat"));
         content.setLon(json.getDoubleValue("lon"));
+        if (json.get("x") != null && json.get("y") != null) {
+            content.setX(Double.parseDouble(json.getString("x")));
+            content.setY(Double.parseDouble(json.getString("y")));
+        } else if (content.getLon() != null && content.getLat() != null) {
+            double[] xy = Coordinate.wgs84_to_shcj(json.getDoubleValue("lon"), json.getDoubleValue("lat"));
+            content.setX(xy[0]);
+            content.setY(xy[1]);
+        }
         content.setScore("rule_3");
 
         String city = json.getString("city") == null ? "" : json.getString("city");
@@ -1010,4 +966,12 @@ public class AddressTools {
         content.setStandAddr(city + county + town + community + splitAddress.getAddr());
         return content;
     }
+
+    //    测试两个坐标系转换,结果
+    public static void main(String[] args) {
+        double testLon = Double.parseDouble("121.3197545220033");
+        double testLat = Double.parseDouble("31.152147246991994");
+        System.out.println(Arrays.toString(Coordinate.wgs84_to_shcj(testLon, testLat)));
+        System.out.println(Arrays.toString(CoordTransform2.getInstance().wgs84_to_shcj(testLon, testLat)));
+    }
 }

+ 194 - 163
src/main/java/com/skyversation/poiaddr/util/ShanghaiAddressSplitUtil.java

@@ -1,5 +1,7 @@
 package com.skyversation.poiaddr.util;
 
+import com.skyversation.poiaddr.addquery.AddressQueryEngine;
+import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.service.AreaService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -14,7 +16,7 @@ import java.util.stream.Collectors;
 @Service
 public class ShanghaiAddressSplitUtil {
     @AllArgsConstructor
-    static class threeLevelAddress{
+    static class threeLevelAddress {
         String district;
         String street;
         String community;
@@ -26,11 +28,12 @@ public class ShanghaiAddressSplitUtil {
         String communityCode;
 
     }
-    private static Map<String,List<threeLevelAddress>> All_STREET_IN_SHANGHAI;
-    private static Map<String,List<threeLevelAddress>> All_COMMUNITY_IN_SHANGHAI;
-    private static Map<String,List<String>> DISTRICT_TO_STREET_MAP;
-    private static Map<String,List<String>> STREET_TO_COMMUNITY_MAP;
-    private static Map<String,List<String>> DISTRICT_TO_COMMUNITY_MAP;
+
+    private static Map<String, List<threeLevelAddress>> All_STREET_IN_SHANGHAI;
+    private static Map<String, List<threeLevelAddress>> All_COMMUNITY_IN_SHANGHAI;
+    private static Map<String, List<String>> DISTRICT_TO_STREET_MAP;
+    private static Map<String, List<String>> STREET_TO_COMMUNITY_MAP;
+    private static Map<String, List<String>> DISTRICT_TO_COMMUNITY_MAP;
 
     private static final Pattern LEVEL_1_SUFFIX_PATTERN = Pattern.compile("^(?:区|新区)");
 
@@ -42,22 +45,23 @@ public class ShanghaiAddressSplitUtil {
 
     private static final Pattern UN_ADDRESS_PATTERN = Pattern.compile("http");
 
-    private static final Pattern OVER_SPLIT=Pattern.compile("^(?:[0123456789-\\-一二三四五六七八九十大A-za-z]{0,4}[街队组栋号站弄]|(?:车站|工业区|市场|农贸市场)(?![东南西北中一二三四五六七八九十公大小支新老环]路)|[A-za-z]?[0123456789-\\-])");
+    private static final Pattern OVER_SPLIT = Pattern.compile("^(?:[0123456789-\\-一二三四五六七八九十大A-za-z]{0,4}[街队组栋号站弄]|(?:车站|工业区|市场|农贸市场)(?![东南西北中一二三四五六七八九十公大小支新老环]路)|[A-za-z]?[0123456789-\\-])");
 
     private static final Pattern MULTI_ADDRESS = Pattern.compile("(?<=[0-9])[号弄]?[、—/\\\\-][0-9]+(?=[号弄])");
+
     @PostConstruct
-    private void init(){
+    private void init() {
         System.out.println("开始初始化分词器");
-        Map<String,threeLevelAddress> districtMap= new HashMap<>();
-        Map<String,List<threeLevelAddress>> streetMap= new HashMap<>();
-        Map<String,List<threeLevelAddress>> communityMap= new HashMap<>();
-        Map<String,List<String>> districtToStreetMap=new HashMap<>();
-        Map<String,List<String>> streetToCommunityMap=new HashMap<>();
+        Map<String, threeLevelAddress> districtMap = new HashMap<>();
+        Map<String, List<threeLevelAddress>> streetMap = new HashMap<>();
+        Map<String, List<threeLevelAddress>> communityMap = new HashMap<>();
+        Map<String, List<String>> districtToStreetMap = new HashMap<>();
+        Map<String, List<String>> streetToCommunityMap = new HashMap<>();
 
         String file = "上海市县乡记录.xlsx";
         InputStream is = ShanghaiAddressSplitUtil.class.getResourceAsStream(file);
-        if (is==null) is= ShanghaiAddressSplitUtil.class.getResourceAsStream("/"+file);
-        if (is==null) throw new RuntimeException("无法找到"+file);
+        if (is == null) is = ShanghaiAddressSplitUtil.class.getResourceAsStream("/" + file);
+        if (is == null) throw new RuntimeException("无法找到" + file);
         try {
             for (Map<String, Object> row : ExcelReaderUtils.readExcel(is)) {
                 String district = Optional.ofNullable(row.get("县级市简称")).map(Object::toString).orElse("");
@@ -69,23 +73,23 @@ public class ShanghaiAddressSplitUtil {
                 String districtCode = Optional.ofNullable(row.get("县级市编码")).map(Object::toString).orElse("");
                 String streetCode = Optional.ofNullable(row.get("街道编码")).map(Object::toString).orElse("");
                 String communityCode = Optional.ofNullable(row.get("居委编码")).map(Object::toString).orElse("");
-                initData(district, street, community, districtFullName, streetFullName, communityFullName,districtCode, streetCode, communityCode, districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
+                initData(district, street, community, districtFullName, streetFullName, communityFullName, districtCode, streetCode, communityCode, districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
             }
             //自贸区
-            initData("浦东",  "试验区","", "浦东新区", "自由贸易试验区","","310115","","",  districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
+            initData("浦东", "试验区", "", "浦东新区", "自由贸易试验区", "", "310115", "", "", districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
             //松江镇特别处理
-            initData("松江",  "松江","", "松江区", "","","310117","","",  districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
+            initData("松江", "松江", "", "松江区", "", "", "310117", "", "", districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
             //金山工业区
-            initData("金山",  "金山工业区","", "金山区", "金山工业区","","310116","","",  districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
+            initData("金山", "金山工业区", "", "金山区", "金山工业区", "", "310116", "", "", districtMap, streetMap, communityMap, districtToStreetMap, streetToCommunityMap);
 
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
         All_STREET_IN_SHANGHAI = Collections.unmodifiableMap(streetMap);
         All_COMMUNITY_IN_SHANGHAI = Collections.unmodifiableMap(communityMap);
-        DISTRICT_TO_STREET_MAP=Collections.unmodifiableMap(districtToStreetMap);
-        STREET_TO_COMMUNITY_MAP=Collections.unmodifiableMap(streetToCommunityMap);
-        DISTRICT_TO_COMMUNITY_MAP=Collections.unmodifiableMap(DISTRICT_TO_STREET_MAP.entrySet().stream()
+        DISTRICT_TO_STREET_MAP = Collections.unmodifiableMap(districtToStreetMap);
+        STREET_TO_COMMUNITY_MAP = Collections.unmodifiableMap(streetToCommunityMap);
+        DISTRICT_TO_COMMUNITY_MAP = Collections.unmodifiableMap(DISTRICT_TO_STREET_MAP.entrySet().stream()
                 .collect(Collectors.toMap(
                         Map.Entry::getKey,
                         entry -> entry.getValue().stream()
@@ -93,83 +97,100 @@ public class ShanghaiAddressSplitUtil {
                                 .collect(Collectors.toList())
                 )));
         System.out.println("分词器初始化完成");
+//      TODO 网络连通性测试,可以请求一下测试的市中心地址
+        try {
+            System.out.println("电脑最大线程数:" + Runtime.getRuntime().availableProcessors());
+            System.out.println("<<<<<<<<------开始网络连通性测试");
+            long startTime = System.currentTimeMillis();
+            List<String> addrs = new ArrayList<>();
+            addrs.add("上海市松江区乐都路339号");
+            AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrs);
+            long endTime = System.currentTimeMillis();
+            System.out.println(">>>>>>>>------网络连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!结果:" + addressResult);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
+        }
         System.out.println("<<<<<<<<------开始缓存ScheduledTasks.allDmdzData对象");
         AreaService.getInstance().getAllDmdzAddressDatas();
     }
 
-    private static void initData(String district, String street, String community, String districtFullName, String streetFullName, String communityFullName,String districtCode, String streetCode, String communityCode, Map<String, threeLevelAddress> districtMap, Map<String, List<threeLevelAddress>> streetMap, Map<String, List<threeLevelAddress>> communityMap, Map<String, List<String>> districtToStreetMap, Map<String, List<String>> streetToCommunityMap) {
-        threeLevelAddress add = new threeLevelAddress(district, street, community, districtFullName, streetFullName, communityFullName, districtCode ,streetCode, communityCode);
-        districtMap.put(district,add);
-        if (!streetMap.containsKey(street)) streetMap.put(street,new ArrayList<>());
+    private static void initData(String district, String street, String community, String districtFullName, String streetFullName, String communityFullName, String districtCode, String streetCode, String communityCode, Map<String, threeLevelAddress> districtMap, Map<String, List<threeLevelAddress>> streetMap, Map<String, List<threeLevelAddress>> communityMap, Map<String, List<String>> districtToStreetMap, Map<String, List<String>> streetToCommunityMap) {
+        threeLevelAddress add = new threeLevelAddress(district, street, community, districtFullName, streetFullName, communityFullName, districtCode, streetCode, communityCode);
+        districtMap.put(district, add);
+        if (!streetMap.containsKey(street)) streetMap.put(street, new ArrayList<>());
         streetMap.get(street).add(add);
-        if (!communityMap.containsKey(community)) communityMap.put(community,new ArrayList<>());
+        if (!communityMap.containsKey(community)) communityMap.put(community, new ArrayList<>());
         communityMap.get(community).add(add);
-        if (!districtToStreetMap.containsKey(district)) districtToStreetMap.put(district,new ArrayList<>());
+        if (!districtToStreetMap.containsKey(district)) districtToStreetMap.put(district, new ArrayList<>());
         districtToStreetMap.get(district).add(street);
-        if (!streetToCommunityMap.containsKey(street)) streetToCommunityMap.put(street,new ArrayList<>());
+        if (!streetToCommunityMap.containsKey(street)) streetToCommunityMap.put(street, new ArrayList<>());
         streetToCommunityMap.get(street).add(community);
     }
 
-    private static class splittingAddress{
+    private static class splittingAddress {
         SplitAddress splitAddress;
 
-        int street=-1;
-        int community=-1;
+        int street = -1;
+        int community = -1;
 
-        Map<Integer,String> streetMap =new HashMap<>();
-        Map<Integer,String> communityMap=new HashMap<>();
+        Map<Integer, String> streetMap = new HashMap<>();
+        Map<Integer, String> communityMap = new HashMap<>();
         threeLevelAddress threeLevelAddress;
 
         String targetString;
 
-        void findStreet(){
-            Map<Integer,String> results =null;
-            int completeMatchIndex=-1;
+        void findStreet() {
+            Map<Integer, String> results = null;
+            int completeMatchIndex = -1;
             //首先尝试在一选下匹配
-            if (splitAddress.getDistrict()!=null){
-                results  = contain(this.targetString,DISTRICT_TO_STREET_MAP.get(splitAddress.getDistrict()),0);
-                completeMatchIndex = washResult(this.targetString,results,LEVEL_2_SUFFIX_PATTERN,LEVEL_3_SUFFIX_PATTERN,LEVEL_1_SUFFIX_PATTERN);
+            if (splitAddress.getDistrict() != null) {
+                results = contain(this.targetString, DISTRICT_TO_STREET_MAP.get(splitAddress.getDistrict()), 0);
+                completeMatchIndex = washResult(this.targetString, results, LEVEL_2_SUFFIX_PATTERN, LEVEL_3_SUFFIX_PATTERN, LEVEL_1_SUFFIX_PATTERN);
             }
             //一选不存在或匹配无结果,直接搜全国
-            if (results==null||results.isEmpty()){
-                results = contain(this.targetString,All_STREET_IN_SHANGHAI.keySet(),0);
-                if (completeMatchIndex==-1)completeMatchIndex = washResult(this.targetString,results,LEVEL_2_SUFFIX_PATTERN,LEVEL_3_SUFFIX_PATTERN,LEVEL_1_SUFFIX_PATTERN);
+            if (results == null || results.isEmpty()) {
+                results = contain(this.targetString, All_STREET_IN_SHANGHAI.keySet(), 0);
+                if (completeMatchIndex == -1)
+                    completeMatchIndex = washResult(this.targetString, results, LEVEL_2_SUFFIX_PATTERN, LEVEL_3_SUFFIX_PATTERN, LEVEL_1_SUFFIX_PATTERN);
 
             }
 
             streetMap.putAll(results);
-            street=completeMatchIndex;
+            street = completeMatchIndex;
             //仅有一个选择时当成一选
-            if (streetMap.size()==1){
-                street = (int)streetMap.keySet().toArray()[0];
+            if (streetMap.size() == 1) {
+                street = (int) streetMap.keySet().toArray()[0];
             }
 
         }
 
-        void findCommunity(){
-            Map<Integer,String> results = null;
-            int completeMatchCommunity=-1;
-            String sub=targetString;
+        void findCommunity() {
+            Map<Integer, String> results = null;
+            int completeMatchCommunity = -1;
+            String sub = targetString;
             //尝试一选
-            if (street!=-1){
-                sub = targetString.substring(street+streetMap.get(street).length());
+            if (street != -1) {
+                sub = targetString.substring(street + streetMap.get(street).length());
                 Matcher m = LEVEL_2_SUFFIX_PATTERN.matcher(sub);
-                if (m.find()){
-                    sub=sub.substring(m.end());
+                if (m.find()) {
+                    sub = sub.substring(m.end());
                 }
-                results= contain(sub,STREET_TO_COMMUNITY_MAP.get(streetMap.get(street)),targetString.length()-sub.length());
-                completeMatchCommunity=washResult(targetString,results,LEVEL_3_SUFFIX_PATTERN,LEVEL_1_SUFFIX_PATTERN,LEVEL_2_SUFFIX_PATTERN);
+                results = contain(sub, STREET_TO_COMMUNITY_MAP.get(streetMap.get(street)), targetString.length() - sub.length());
+                completeMatchCommunity = washResult(targetString, results, LEVEL_3_SUFFIX_PATTERN, LEVEL_1_SUFFIX_PATTERN, LEVEL_2_SUFFIX_PATTERN);
 
             }
             //一选不存在或匹配无结果,先搜全区
-            if ((results == null || results.isEmpty()) && splitAddress.getDistrict()!=null) {
-                results = contain(sub, DISTRICT_TO_COMMUNITY_MAP.get(splitAddress.getDistrict()),targetString.length()-sub.length());
-                if (completeMatchCommunity==-1)completeMatchCommunity=washResult(targetString,results,LEVEL_3_SUFFIX_PATTERN,LEVEL_1_SUFFIX_PATTERN,LEVEL_2_SUFFIX_PATTERN);
+            if ((results == null || results.isEmpty()) && splitAddress.getDistrict() != null) {
+                results = contain(sub, DISTRICT_TO_COMMUNITY_MAP.get(splitAddress.getDistrict()), targetString.length() - sub.length());
+                if (completeMatchCommunity == -1)
+                    completeMatchCommunity = washResult(targetString, results, LEVEL_3_SUFFIX_PATTERN, LEVEL_1_SUFFIX_PATTERN, LEVEL_2_SUFFIX_PATTERN);
             }
             //最后全市
             if (results == null || results.isEmpty()) {
-                results = contain(sub, All_COMMUNITY_IN_SHANGHAI.keySet(),targetString.length()-sub.length());
-                if (completeMatchCommunity==-1)completeMatchCommunity=washResult(targetString,results,LEVEL_3_SUFFIX_PATTERN,LEVEL_1_SUFFIX_PATTERN,LEVEL_2_SUFFIX_PATTERN);
+                results = contain(sub, All_COMMUNITY_IN_SHANGHAI.keySet(), targetString.length() - sub.length());
+                if (completeMatchCommunity == -1)
+                    completeMatchCommunity = washResult(targetString, results, LEVEL_3_SUFFIX_PATTERN, LEVEL_1_SUFFIX_PATTERN, LEVEL_2_SUFFIX_PATTERN);
             }
             Iterator<Integer> iterator = results.keySet().iterator();
             while (iterator.hasNext()) {
@@ -179,7 +200,7 @@ public class ShanghaiAddressSplitUtil {
                     iterator.remove();
                 }
                 if (key > 0 && name.equals("镇江")) {
-                    String sub1 = targetString.substring(key+2);
+                    String sub1 = targetString.substring(key + 2);
                     if (LEVEL_3_SUFFIX_PATTERN.matcher(sub1).matches()) {
                         iterator.remove();
                     }
@@ -187,62 +208,64 @@ public class ShanghaiAddressSplitUtil {
             }
             communityMap.putAll(results);
             //仅有一个选择时当成一选
-            if (communityMap.size()==1){
-                int index = (int)communityMap.keySet().toArray()[0];
-                if (street!=index)community=index;
+            if (communityMap.size() == 1) {
+                int index = (int) communityMap.keySet().toArray()[0];
+                if (street != index) community = index;
             }
 
         }
 
-        void matchThreeLevelAdd(){
-            int handingPoint=0;
-            threeLevelAddress handingTLA=new threeLevelAddress("","","","","","","","","");
-            for (String communityName: new HashSet<>(communityMap.values())){
-                if (communityName.isEmpty())continue;
-                for(threeLevelAddress t:All_COMMUNITY_IN_SHANGHAI.get(communityName)){
+        void matchThreeLevelAdd() {
+            int handingPoint = 0;
+            threeLevelAddress handingTLA = new threeLevelAddress("", "", "", "", "", "", "", "", "");
+            for (String communityName : new HashSet<>(communityMap.values())) {
+                if (communityName.isEmpty()) continue;
+                for (threeLevelAddress t : All_COMMUNITY_IN_SHANGHAI.get(communityName)) {
                     int point = checkTLA(t);
-                    if (point>handingPoint){
-                        handingPoint=point;
-                        handingTLA=t;
+                    if (point > handingPoint) {
+                        handingPoint = point;
+                        handingTLA = t;
                     }
                 }
             }
-            for (String streetName:new HashSet<>(streetMap.values())){
-                if (streetName.isEmpty())continue;
-                for(threeLevelAddress t:All_STREET_IN_SHANGHAI.get(streetName)){
+            for (String streetName : new HashSet<>(streetMap.values())) {
+                if (streetName.isEmpty()) continue;
+                for (threeLevelAddress t : All_STREET_IN_SHANGHAI.get(streetName)) {
                     int point = checkTLA(t);
-                    if (point>handingPoint){
-                        handingPoint=point;
-                        handingTLA=t;
+                    if (point > handingPoint) {
+                        handingPoint = point;
+                        handingTLA = t;
                     }
                 }
             }
             threeLevelAddress = handingTLA;
         }
-        int checkTLA(threeLevelAddress t){
-            int output=0;
-            if (t.district.equals(splitAddress.getDistrict()))output+=1;
-            if (streetMap.containsValue(t.street))output+=10;
-            if (street!=-1&&streetMap.get(street).equals(t.street))output+=1000;
-            if (communityMap.containsValue(t.community))output+=100;
-            if (community!=-1&&communityMap.get(community).equals(t.community))output+=1000;
-            if (community!=-1&&Pattern.matches(".*\\d$",communityMap.get(community)))output-=1000;
+
+        int checkTLA(threeLevelAddress t) {
+            int output = 0;
+            if (t.district.equals(splitAddress.getDistrict())) output += 1;
+            if (streetMap.containsValue(t.street)) output += 10;
+            if (street != -1 && streetMap.get(street).equals(t.street)) output += 1000;
+            if (communityMap.containsValue(t.community)) output += 100;
+            if (community != -1 && communityMap.get(community).equals(t.community)) output += 1000;
+            if (community != -1 && Pattern.matches(".*\\d$", communityMap.get(community))) output -= 1000;
             return output;
         }
-        void guessFirstMatch(){
+
+        void guessFirstMatch() {
             //先街道
-            if (!streetMap.isEmpty()&&street==-1) {
-                for (int i :streetMap.keySet()){
-                    if (streetMap.get(i).equals(threeLevelAddress.street)&&(i<street||street==-1)) {
-                        street=i;
+            if (!streetMap.isEmpty() && street == -1) {
+                for (int i : streetMap.keySet()) {
+                    if (streetMap.get(i).equals(threeLevelAddress.street) && (i < street || street == -1)) {
+                        street = i;
                     }
                 }
             }
             //再居委
-            if (community==-1&& !communityMap.isEmpty()){
-                for (int i :communityMap.keySet()){
-                    if (communityMap.get(i).equals(threeLevelAddress.community)&&street!=i&&(i<community||community==-1)){
-                        community=i;
+            if (community == -1 && !communityMap.isEmpty()) {
+                for (int i : communityMap.keySet()) {
+                    if (communityMap.get(i).equals(threeLevelAddress.community) && street != i && (i < community || community == -1)) {
+                        community = i;
                     }
                 }
 
@@ -250,27 +273,28 @@ public class ShanghaiAddressSplitUtil {
 
         }
     }
-    static int washResult(String sourceAddress, Map<Integer, String> result, Pattern should, Pattern... never){
-        Map<Integer,String> output=new HashMap<>();
+
+    static int washResult(String sourceAddress, Map<Integer, String> result, Pattern should, Pattern... never) {
+        Map<Integer, String> output = new HashMap<>();
         int outputInt = -1;
         for (int index : result.keySet()) {
             String name = result.get(index);
-            String sub =sourceAddress.substring(index + name.length());
+            String sub = sourceAddress.substring(index + name.length());
             //匹配到后缀时直接保留
             if (should.matcher(sub).find()) {
-                outputInt=index;
+                outputInt = index;
             } else {
                 //去除南京路,北京大道型选手
                 if (ROAD_SUFFIX_PATTERN.matcher(sub).find()) {
                     continue;
                 }
-                boolean skip =false;
-                for (Pattern p :never){
-                    if (p.matcher(sub).find())skip=true;
+                boolean skip = false;
+                for (Pattern p : never) {
+                    if (p.matcher(sub).find()) skip = true;
                 }
                 if (skip) continue;
             }
-            output.put(index,name);
+            output.put(index, name);
         }
         result.clear();
         result.putAll(output);
@@ -279,33 +303,35 @@ public class ShanghaiAddressSplitUtil {
 
     /**
      * 检查字符串含有哪些字符,输出这些匹配字符的位置和字符的map
-     * @param s 被检查字符串
+     *
+     * @param s        被检查字符串
      * @param nameList 检查范围
      */
-    private static Map<Integer,String> contain(String s,Iterable<String> nameList,int offset){
-        Map<Integer,String> output = new HashMap<>();
-        if (nameList==null){
+    private static Map<Integer, String> contain(String s, Iterable<String> nameList, int offset) {
+        Map<Integer, String> output = new HashMap<>();
+        if (nameList == null) {
             return output;
         }
-        for (String name:nameList){
-            if (name.isEmpty())continue;
+        for (String name : nameList) {
+            if (name.isEmpty()) continue;
             int index = -1;
-            while ((index = s.indexOf(name, index + 1)) != -1){
-                output.put(index+offset,name);
+            while ((index = s.indexOf(name, index + 1)) != -1) {
+                output.put(index + offset, name);
             }
         }
         return output;
     }
-    private static SplitAddress split(String sourceAddress){
+
+    private static SplitAddress split(String sourceAddress) {
         //事前准备
-        String beautyAddress = sourceAddress.replaceAll("[\\s]+","");
+        String beautyAddress = sourceAddress.replaceAll("[\\s]+", "");
 
         SplitAddress splitAddress = new SplitAddress();
         splitAddress.setFullAddress(sourceAddress);
 
 
         splittingAddress splittingAddress = new splittingAddress();
-        splittingAddress.splitAddress=splitAddress;
+        splittingAddress.splitAddress = splitAddress;
 
 
         String[] result = AddressSplitUtil.splitAddress(beautyAddress);
@@ -316,18 +342,18 @@ public class ShanghaiAddressSplitUtil {
         splitAddress.setDistrict(result[2]);
         //检查是否在外省,未找到省市或者在省市中找到上海,或者找到上海的区都算作省内
         Map<Integer, String> districtContainResult = contain(beautyAddress, DISTRICT_TO_COMMUNITY_MAP.keySet(), 0);
-        int  disIndex= washResult(beautyAddress, districtContainResult,LEVEL_1_SUFFIX_PATTERN);
+        int disIndex = washResult(beautyAddress, districtContainResult, LEVEL_1_SUFFIX_PATTERN);
         Map<Integer, String> streetContainResult = contain(beautyAddress, STREET_TO_COMMUNITY_MAP.keySet(), 0);
-        int  streetIndex= washResult(beautyAddress, districtContainResult,LEVEL_2_SUFFIX_PATTERN);
+        int streetIndex = washResult(beautyAddress, districtContainResult, LEVEL_2_SUFFIX_PATTERN);
         splitAddress.setAddr(result[3]);
-        if (!((result[0].isEmpty()|| result[0].equals("上海市")) && (result[1].isEmpty()  || result[1].equals("上海市"))||
-                !districtContainResult.isEmpty()||!streetContainResult.isEmpty())) {
+        if (!((result[0].isEmpty() || result[0].equals("上海市")) && (result[1].isEmpty() || result[1].equals("上海市")) ||
+                !districtContainResult.isEmpty() || !streetContainResult.isEmpty())) {
             splitAddress.setStatus(2);
             return splitAddress;
         }
-        if (!districtContainResult.isEmpty()){
-            if (disIndex!=-1){
-                String district=districtContainResult.get(disIndex);
+        if (!districtContainResult.isEmpty()) {
+            if (disIndex != -1) {
+                String district = districtContainResult.get(disIndex);
                 threeLevelAddress disTLA = All_COMMUNITY_IN_SHANGHAI.get(DISTRICT_TO_COMMUNITY_MAP.get(district).get(0)).get(0);
                 splitAddress.setDistrict(disTLA.districtFullName);
                 splitAddress.setDistrictCode(disTLA.districtCode);
@@ -344,14 +370,14 @@ public class ShanghaiAddressSplitUtil {
         splittingAddress.guessFirstMatch();
 
 
-        if (splittingAddress.street!=-1||splittingAddress.community!=-1){
+        if (splittingAddress.street != -1 || splittingAddress.community != -1) {
             splitAddress.setStreet(splittingAddress.threeLevelAddress.streetFullName);
             splitAddress.setStreetCode(splittingAddress.threeLevelAddress.streetCode);
             splitAddress.setDistrict(splittingAddress.threeLevelAddress.districtFullName);
             splitAddress.setDistrictCode(splittingAddress.threeLevelAddress.districtCode);
 
         }
-        if (splittingAddress.community!=-1){
+        if (splittingAddress.community != -1) {
             splitAddress.setCommunity(splittingAddress.threeLevelAddress.communityFullName);
             splitAddress.setCommunityCode(splittingAddress.threeLevelAddress.communityCode);
 
@@ -359,111 +385,116 @@ public class ShanghaiAddressSplitUtil {
 
 
         //检查是否能够分离
-        if(splittingAddress.community==-1&&splittingAddress.street==-1){
+        if (splittingAddress.community == -1 && splittingAddress.street == -1) {
             //检查是否是非地址
-            if (UN_ADDRESS_PATTERN.matcher(splitAddress.getFullAddress()).find()){
+            if (UN_ADDRESS_PATTERN.matcher(splitAddress.getFullAddress()).find()) {
                 splitAddress.setStatus(3);
                 return splitAddress;
             }
 
-            if (disIndex!=-1){
-                String sub = beautyAddress.substring(disIndex+districtContainResult.get(disIndex).length());
+            if (disIndex != -1) {
+                String sub = beautyAddress.substring(disIndex + districtContainResult.get(disIndex).length());
                 Matcher m = LEVEL_1_SUFFIX_PATTERN.matcher(sub);
-                if (m.find()){
+                if (m.find()) {
                     sub = sub.substring(m.end());
                 }
                 splitAddress.setAddr(sub);
             }
 
             splitAddress.setStatus(1);
-            if (result[0].isEmpty()&&result[1].isEmpty()&&districtContainResult.isEmpty())splitAddress.setStatus(4);
+            if (result[0].isEmpty() && result[1].isEmpty() && districtContainResult.isEmpty())
+                splitAddress.setStatus(4);
             return splitAddress;
-        }else if (splittingAddress.street> splittingAddress.community){
-            String sub = beautyAddress.substring(splittingAddress.street+splittingAddress.streetMap.get(splittingAddress.street).length());
+        } else if (splittingAddress.street > splittingAddress.community) {
+            String sub = beautyAddress.substring(splittingAddress.street + splittingAddress.streetMap.get(splittingAddress.street).length());
             Matcher m = LEVEL_2_SUFFIX_PATTERN.matcher(sub);
-            if (m.find()){
+            if (m.find()) {
                 sub = sub.substring(m.end());
             }
             splitAddress.setAddr(sub);
-        }else {
+        } else {
             String sub = beautyAddress.substring(
-                    splittingAddress.community+
+                    splittingAddress.community +
                             splittingAddress.communityMap.
                                     get(splittingAddress.community).length());
             Matcher m = LEVEL_3_SUFFIX_PATTERN.matcher(sub);
-            if (m.find()){
+            if (m.find()) {
                 sub = sub.substring(m.end());
             }
             splitAddress.setAddr(sub);
         }
 
         splitAddress.setStatus(0);
-        if (result[0].isEmpty()&&result[1].isEmpty()&&districtContainResult.isEmpty())splitAddress.setStatus(4);
-        if (splitAddress.getStreet().equals("自由贸易试验区"))splitAddress.setStatus(0);
+        if (result[0].isEmpty() && result[1].isEmpty() && districtContainResult.isEmpty()) splitAddress.setStatus(4);
+        if (splitAddress.getStreet().equals("自由贸易试验区")) splitAddress.setStatus(0);
         return splitAddress;
     }
 
-    private static SplitAddress beautyResult(SplitAddress splitAddress){
+    private static SplitAddress beautyResult(SplitAddress splitAddress) {
         //检查过度分割
-        if (splitAddress.getAddr().isEmpty() ||OVER_SPLIT.matcher(splitAddress.getAddr()).find()){
-            if (splitAddress.getCommunity().isEmpty()){
-                if (splitAddress.getStreet().isEmpty()){
-                    if (splitAddress.getDistrict().isEmpty()){
-                        splitAddress.setAddr("上海市"+splitAddress.getAddr());
-                    }else {
-                        splitAddress.setAddr(splitAddress.getDistrict()+splitAddress.getAddr());
+        if (splitAddress.getAddr().isEmpty() || OVER_SPLIT.matcher(splitAddress.getAddr()).find()) {
+            if (splitAddress.getCommunity().isEmpty()) {
+                if (splitAddress.getStreet().isEmpty()) {
+                    if (splitAddress.getDistrict().isEmpty()) {
+                        splitAddress.setAddr("上海市" + splitAddress.getAddr());
+                    } else {
+                        splitAddress.setAddr(splitAddress.getDistrict() + splitAddress.getAddr());
                     }
-                }else {
-                    splitAddress.setAddr(splitAddress.getStreet()+splitAddress.getAddr());
+                } else {
+                    splitAddress.setAddr(splitAddress.getStreet() + splitAddress.getAddr());
                 }
-            }else {
-                splitAddress.setAddr(splitAddress.getCommunity()+splitAddress.getAddr());
+            } else {
+                splitAddress.setAddr(splitAddress.getCommunity() + splitAddress.getAddr());
             }
         }
         //检查多号,多弄
-        splitAddress.setAddr(splitAddress.getAddr().replaceAll(String.valueOf(MULTI_ADDRESS),""));
+        splitAddress.setAddr(splitAddress.getAddr().replaceAll(String.valueOf(MULTI_ADDRESS), ""));
 
         return splitAddress;
     }
+
     /**
      * 工具入口,返回所有数据
+     *
      * @param sourceAddress 任意形式的地址,请注意,上海市外的地址仅分词到县,上海市内分词到居委
      */
-    public static List<SplitAddress> splitAddresses(String sourceAddress){
+    public static List<SplitAddress> splitAddresses(String sourceAddress) {
         Matcher matcher = Pattern.compile("\\(([^()]*|\\([^()]*\\))*\\)|\\[([^\\[\\]]*|\\[[^\\[\\]]*])*]|(([^()]*|([^()]*))*)").matcher(sourceAddress);
-        List<SplitAddress> addressList =new ArrayList<>();
-        String beautyString = sourceAddress.replaceAll("\\(([^()]*|\\([^()]*\\))*\\)|\\[([^\\[\\]]*|\\[[^\\[\\]]*])*]|(([^()]*|([^()]*))*)","");
+        List<SplitAddress> addressList = new ArrayList<>();
+        String beautyString = sourceAddress.replaceAll("\\(([^()]*|\\([^()]*\\))*\\)|\\[([^\\[\\]]*|\\[[^\\[\\]]*])*]|(([^()]*|([^()]*))*)", "");
         StringBuilder sb = new StringBuilder();
         for (char c : beautyString.toCharArray()) {
             // 检查是否为全角数字
             if (c >= '0' && c <= '9') {
                 // 转换为半角数字
                 sb.append((char) (c - '0' + '0'));
-            } else if (c=='\uE5CE'){
+            } else if (c == '\uE5CE') {
                 // 奇妙的乱码,跳过
-            }else {
+            } else {
                 // 保持原字符
                 sb.append(c);
             }
         }
         beautyString = sb.toString();
         addressList.add(beautyResult(split(beautyString)));
-        while (matcher.find()){
-            String address=matcher.group();
-            if (address.length()<=2)continue;
-            addressList.addAll(splitAddresses(address.substring(1,address.length()-1)));
+        while (matcher.find()) {
+            String address = matcher.group();
+            if (address.length() <= 2) continue;
+            addressList.addAll(splitAddresses(address.substring(1, address.length() - 1)));
         }
-        for (SplitAddress s :addressList)s.setSourceAddress(sourceAddress);
+        for (SplitAddress s : addressList) s.setSourceAddress(sourceAddress);
         return addressList;
     }
 
     /**
      * 工具入口,仅返回最优
+     *
      * @param sourceAddress 任意形式的地址,请注意,上海市外的地址仅分词到县,上海市内分词到居委
      */
-    public static SplitAddress splitBestAddress(String sourceAddress){
+    public static SplitAddress splitBestAddress(String sourceAddress) {
         return splitAddresses(sourceAddress).stream().max(SplitAddress::compareTo).orElse(new SplitAddress());
     }
+
     public static void main(String[] args) throws Exception {
         new ShanghaiAddressSplitUtil().init();
         System.out.println(splitBestAddress("上海市松江区乐都路339"));

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

@@ -47,7 +47,7 @@ public class AddressNetTools {
         return EntityUtils.toString(entity);
     }
 
-//    @Async
+    @Async
     public ResponseEntity requestGetOrPost(HttpMethod httpMethod, String url, JSONObject params, Map<String, String> headerMap, Integer ifReloadSize) {
         SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
         requestFactory.setConnectTimeout(5000);

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

@@ -5,8 +5,12 @@ import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.TAddressCallback;
 import com.skyversation.poiaddr.bean.YyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.config.DbConnection;
+import com.skyversation.poiaddr.entity.AddrBean;
 import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
+import com.skyversation.poiaddr.service.impl.YyszAddressRepository;
+import com.skyversation.poiaddr.util.AddrSplitLmrMap;
+import com.skyversation.poiaddr.util.ExcelReaderUtils;
 import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
 import com.skyversation.poiaddr.util.status.AddressResultEnum;
@@ -75,6 +79,9 @@ public class ScheduledTasks {
     private YyskAddressStandardizationServiceImpl yyskAddressStandardizationService;
 
 
+    @Resource
+    private YyszAddressRepository yyszAddressRepository;
+
     /**
      * 每5分钟请求一次数据库,防止jdbc断开链接
      */
@@ -110,68 +117,193 @@ public class ScheduledTasks {
     }
 
     /**
-     * (先不整
+     * (测试
      * 回流表数据查询并更新
-     * 查询callback表中state为0的数据
+     * 查询callback表中state为null或为0的数据
      * 根据address字段查询市中心接口
-     * 如果返回了正确的数据,入到地址库表中,并更新state为2
+     * 如果返回了正确的数据,入到地址库表中,并更新state为2(同时添加到地址库中)
      * 否则更新状态为1
      */
 //    @Scheduled(cron = "0 30 2 * * ?")
     public void dbdataCallBackTask() {
-        System.out.println("开始回流表查询并更新任务!");
-        if (callBackRunStatus != 1) {
-//          首先查询数据列表
-            callBackRunStatus = 1;
-            List<TAddressCallback> tAddressCallbacks = AreaService.getInstance().getCallbackDataByTag(0);
-//          然后调用市中心接口
-            for (TAddressCallback item : tAddressCallbacks) {
-                try {
-                    if (item.getSearchAddress() != null && item.getSearchAddress().length() > 2) {
-                        String addr = item.getSearchAddress();
-                        AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(addr);
-                        AddressResult.ContentBean contentBean = new AddressResult.ContentBean();
-                        if (addressResult != null && addressResult.getCode() == AddressResultEnum.DB_SUCCESS && addressResult.getData() != null && addressResult.getData().size() > 0) {
-                            contentBean = addressResult.getData().get(0);
-                        } else {
-                            addressResult = AddressQueryEngine.getInstance().sj_szxSearchByName(addr, 3);
-                            if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
-                                contentBean = addressResult.getData().get(0);
-                            }
-                        }
-                        if (contentBean != null && contentBean.getLon() != null) {
-                            SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
-                            AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult, splitAddress);
-                            item.setLat(contentBean.getLat().toString());
-                            item.setLon(contentBean.getLon().toString());
-                            item.setPname(contentBean.getPname());
-                            item.setCounty(contentBean.getCityname());
-                            item.setStreetTownName(contentBean.getAdname());
-                            item.setCommunity(contentBean.getCommunity());
-                            item.setStandardAddress(contentBean.getStandAddr());
-                            if (!StringUtils.hasText(contentBean.getPname())) {
-                                contentBean.setPname(splitAddress.getCity());
-                            }
-                            if (!StringUtils.hasText(contentBean.getPname())) {
-                                contentBean.setPname("上海市");
+        try {
+//          根据当前日期生成开始id
+            int startOid = 0;
+            long startTime = System.currentTimeMillis();
+            System.out.println("《《《《《《《《《《《《《开始回流表查询并更新任务!Oid前缀为:" + getCurrentDateTimeByPatern("yyyyddMMhhmm"));
+            if (callBackRunStatus != 1) {
+                Map<String, Object> infoItem = new HashMap<>();
+                infoItem.put("操作", "查询回流表中的数据");
+                infoItem.put("开始时间", System.currentTimeMillis());
+//              首先查询数据列表
+                callBackRunStatus = 1;
+                List<TAddressCallback> tAddressCallbacks = AreaService.getInstance().getCallbackDataByTag();
+                infoItem.put("结束时间", System.currentTimeMillis());
+                infoItem.put("备注", "数据条数" + tAddressCallbacks.size());
+                List<TAddressCallback> updateCallBackDatas = new ArrayList<>();
+                List<YyskDmdzAddressStandardization> addDmdzDataList = new ArrayList<>();
+//              然后调用市中心接口
+                ScheduledTasks.logInfos.add(infoItem);
+                for (TAddressCallback item : tAddressCallbacks) {
+                    try {
+                        Map<String, Object> infoItem2 = new HashMap<>();
+                        infoItem2.put("操作", "判断地址并调用市中心接口");
+                        infoItem2.put("开始时间", System.currentTimeMillis());
+//                      首先判断查询地址是否为非上海数据,以及异常数据
+                        if (item.getSearchAddress() != null && item.getSearchAddress().length() > 2) {
+                            String addr = item.getSearchAddress();
+                            AddrBean lmrAddrBean = AddrSplitLmrMap.outAddrMapInAddr(addr);
+                            if (lmrAddrBean.getRule() != null && Integer.parseInt(lmrAddrBean.getRule()) <= 0) {
+                                item.setStatusTag(-1);
+                            } else {
+                                AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(addr);
+                                AddressResult.ContentBean contentBean = new AddressResult.ContentBean();
+                                if (addressResult != null && addressResult.getCode() == AddressResultEnum.DB_SUCCESS && addressResult.getData() != null && addressResult.getData().size() > 0) {
+                                    contentBean = addressResult.getData().get(0);
+                                } else {
+                                    addressResult = AddressQueryEngine.getInstance().sj_szxSearchByName(addr, 3);
+                                    if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
+                                        contentBean = addressResult.getData().get(0);
+                                    }
+                                }
+                                if (contentBean != null && contentBean.getLon() != null) {
+                                    SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
+                                    AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult, splitAddress);
+                                    item.setLat(contentBean.getLat().toString());
+                                    item.setLon(contentBean.getLon().toString());
+                                    item.setPname(contentBean.getPname());
+                                    item.setCounty(contentBean.getCityname());
+                                    item.setStreetTownName(contentBean.getAdname());
+                                    item.setCommunity(contentBean.getCommunity());
+                                    item.setStandardAddress(contentBean.getStandAddr());
+                                    if (!StringUtils.hasText(contentBean.getPname())) {
+                                        contentBean.setPname(splitAddress.getCity());
+                                    }
+                                    if (!StringUtils.hasText(contentBean.getPname())) {
+                                        contentBean.setPname("上海市");
+                                    }
+                                    item.setCankaoAddress(contentBean.getAddress());
+                                    item.setPname(contentBean.getPname());
+                                    item.setStandardAddress(contentBean.getPname() + contentBean.getCityname() +
+                                            contentBean.getAdname() + contentBean.getCommunity() + splitAddress.getAddr());
+                                    item.setStatusTag(2);
+//                                  添加数据到地址库和缓存
+                                    if (StringUtils.hasText(item.getLat()) && StringUtils.hasText(item.getLon())) {
+                                        startOid++;
+                                        addDmdzDataList.add(TAddressCallbackToYyskDmdzAddressStandardization(item, Long.valueOf(getCurrentDateTimeByPatern("yyyyddMMhhmm") + startOid)));
+                                    }
+                                } else {
+                                    item.setStatusTag(1);
+                                }
                             }
-                            item.setCankaoAddress(contentBean.getAddress());
-                            item.setPname(contentBean.getPname());
-                            item.setStandardAddress(contentBean.getPname() + contentBean.getCityname() +
-                                    contentBean.getAdname() + contentBean.getCommunity() + splitAddress.getAddr());
-                            item.setStatusTag(2);
                         } else {
-                            item.setStatusTag(1);
+                            item.setStatusTag(-1);
                         }
+                        infoItem2.put("结束时间", System.currentTimeMillis());
+                        infoItem2.put("备注", "搜索地址" + item.getSearchAddress());
+                        ScheduledTasks.logInfos.add(infoItem2);
+                        updateCallBackDatas.add(item);
+                        if (updateCallBackDatas.size() == 1000) {
+                            Map<String, Object> infoItem3 = new HashMap<>();
+                            infoItem3.put("操作", "将治理的数据入库更新callBack表");
+                            long inBaseTime = System.currentTimeMillis();
+                            infoItem3.put("开始时间", inBaseTime);
+                            AreaService.getInstance().updateCallbackData(updateCallBackDatas);
+                            updateCallBackDatas.clear();
+                            long outBaseTime = System.currentTimeMillis();
+                            infoItem3.put("结束时间", outBaseTime);
+                            infoItem3.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) / 1000 + "秒!");
+                            ScheduledTasks.logInfos.add(infoItem3);
+                            ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
                     }
-                } catch (Exception e) {
-                    e.printStackTrace();
+                }
+                if (addDmdzDataList.size() > 0) {
+                    yyszAddressRepository.saveAll(addDmdzDataList);
+                }
+                if (updateCallBackDatas.size() > 0) {
+                    infoItem.put("操作", "将治理的数据入库更新callBack表");
+                    long inBaseTime = System.currentTimeMillis();
+                    infoItem.put("开始时间", inBaseTime);
+                    AreaService.getInstance().updateCallbackData(updateCallBackDatas);
+                    updateCallBackDatas.clear();
+                    long outBaseTime = System.currentTimeMillis();
+                    infoItem.put("结束时间", outBaseTime);
+                    infoItem.put("备注", "1000条数据入库用时" + (outBaseTime - inBaseTime) / 1000 + "秒!");
+                    ScheduledTasks.logInfos.add(infoItem);
+                    ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
+                }
+                System.out.println("》》》》》》》》》》》》回流表数据查询并更新结束");
+                callBackRunStatus = 0;
+            } else {
+                System.out.println("上一次定时任务未结束!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            System.out.println("loginfos:" + ScheduledTasks.logInfos);
+            try {
+                ExcelReaderUtils.writeToExcel(ScheduledTasks.logInfos, "./logInfos_" + System.currentTimeMillis() + ".xlsx");
+            } catch (Exception e2) {
+                e2.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 回流表对象转地址库对象
+     *
+     * @param tAddressCallback
+     * @return
+     */
+    public static YyskDmdzAddressStandardization TAddressCallbackToYyskDmdzAddressStandardization(TAddressCallback tAddressCallback, Long Oid) {
+        YyskDmdzAddressStandardization yyskDmdzAddressStandardization = new YyskDmdzAddressStandardization();
+        yyskDmdzAddressStandardization.setSourceaddress(tAddressCallback.getStandardAddress());
+        yyskDmdzAddressStandardization.setAddress(tAddressCallback.getSearchAddress());
+        yyskDmdzAddressStandardization.setLon(Float.parseFloat(tAddressCallback.getLon()));
+        yyskDmdzAddressStandardization.setLat(Float.parseFloat(tAddressCallback.getLat()));
+        yyskDmdzAddressStandardization.setCity(tAddressCallback.getPname());
+        yyskDmdzAddressStandardization.setCounty(tAddressCallback.getCounty());
+        yyskDmdzAddressStandardization.setTown(tAddressCallback.getStreetTownName());
+        yyskDmdzAddressStandardization.setCommunity(tAddressCallback.getCommunity());
+        yyskDmdzAddressStandardization.setData_type("zl_v3");
+        yyskDmdzAddressStandardization.setType("callBack");
+        yyskDmdzAddressStandardization.setOid(Oid);
+//      把请求到的数据放到缓存中
+        if (yyskDmdzAddressStandardization.getAddress() != null && StringUtils.hasText(yyskDmdzAddressStandardization.getAddress())) {
+            SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(yyskDmdzAddressStandardization.getAddress());
+            putAllDmdzData(splitAddress.getAddr(), yyskDmdzAddressStandardization);
+            if (yyskDmdzAddressStandardization.getSourceaddress() != null && StringUtils.hasText(yyskDmdzAddressStandardization.getSourceaddress())) {
+                SplitAddress splitAddress2 = ShanghaiAddressSplitUtil.splitBestAddress(yyskDmdzAddressStandardization.getSourceaddress());
+                if (!splitAddress.getAddr().equals(splitAddress2.getAddr())) {
+                    putAllDmdzData(splitAddress2.getAddr(), yyskDmdzAddressStandardization);
                 }
             }
-            AreaService.getInstance().updateCallbackData(tAddressCallbacks);
-            callBackRunStatus = 0;
-        } else {
-            System.out.println("上一次定时任务未结束!");
+        } else if (yyskDmdzAddressStandardization.getSourceaddress() != null && StringUtils.hasText(yyskDmdzAddressStandardization.getSourceaddress())) {
+            SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(yyskDmdzAddressStandardization.getSourceaddress());
+            putAllDmdzData(splitAddress.getAddr(), yyskDmdzAddressStandardization);
+        }
+        return yyskDmdzAddressStandardization;
+    }
+
+    public static void putAllDmdzData(String addr, YyskDmdzAddressStandardization item) {
+        if (addr.contains("号")) {
+            addr = addr.substring(0, addr.indexOf("号"));
+        }
+        if (addr.contains("弄")) {
+            addr = addr.substring(0, addr.indexOf("弄"));
+        }
+        addr = addr.replaceAll("(?<=[^\\d])\\d+$", "");
+        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() < 100) {
+                ScheduledTasks.allDmdzData.get(addr).add(item);
+            }
         }
     }
 
@@ -249,4 +381,15 @@ public class ScheduledTasks {
         return sdf.format(new Date());
     }
 
+    /**
+     * 根据格式返回当前时间的字符串
+     * 标准格式:yyyy-dd-MM hh:mm:ss
+     *
+     * @return
+     */
+    public static String getCurrentDateTimeByPatern(String pattern) {
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        return sdf.format(new Date());
+    }
+
 }