Browse Source

14虚机运行版本,处理人口回流表(jpa多线程版本)

DESKTOP-6LTVLN7\Liumouren 2 weeks ago
parent
commit
8ec6f65dee

+ 16 - 0
pom.xml

@@ -55,6 +55,22 @@
             <version>4.0.1</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.6.0</version> <!-- 你可以根据需要调整版本号 -->
+            <!--            <version>9.4-1206-jdbc42</version>-->
+        </dependency>
+
+        <!-- Spring Data JPA 依赖,用于简化数据库操作 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
 <!--        添加javax依赖,避免打War包时排除内置Tomcat后找不到对应的依赖 end-->
         <dependency>
             <groupId>quark-driver</groupId> <!-- 自定义 -->

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.bean.Address;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
+import com.skyversation.poiaddr.bean.yyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
@@ -94,7 +95,7 @@ public class AddressQueryEngine {
             addressResult.setAddrBean(addrBean);
 
             // 优先进行数据库查询
-            List<Address> dbPois = AreaService.getInstance().getAddressPoisByAddr(splitAddress);
+            List<yyskDmdzAddressStandardization> dbPois = AreaService.getInstance().getAddressPoisByAddr(splitAddress);
             if (dbPois != null && dbPois.size() > 0) {
                 JSONArray pois = new JSONArray();
                 pois.addAll(dbPois);
@@ -115,10 +116,10 @@ public class AddressQueryEngine {
                     addressResult.setAddrBean(addrBean);
                     return addressResult;
                 }
-            } else {
+            /*} else {
                 if (splitAddress.getDistrict() != null && !splitAddress.getDistrict().isEmpty()) {
                     //查询无结果,尝试给出推荐结果
-                    List<Address> recommendPois = AreaService.getInstance().getRecommendAddress(splitAddress);
+                    List<yyskDmdzAddressStandardization> recommendPois = AreaService.getInstance().getRecommendAddress(splitAddress);
                     if (recommendPois != null && recommendPois.size() > 0) {
                         JSONArray pois = new JSONArray();
                         pois.addAll(recommendPois);
@@ -140,7 +141,7 @@ public class AddressQueryEngine {
                             return addressResult;
                         }
                     }
-                }
+                }*/
             }
         }
 
@@ -276,6 +277,28 @@ public class AddressQueryEngine {
             AreaService areaService = AreaService.getInstance();
             for (AddressResult.ContentBean content : result.getData()) {
                 if (content.getLat() != null && content.getLon() != null) {
+//                  判断是否存在村居数据
+                    if (content.getCommunity() == null || content.getCommunity().isEmpty()) {
+                        GeoJsonBean cjBean = areaService.isInResidentialCommitteePolygon(content.getLon(), content.getLat());
+                        if (cjBean != null && cjBean.getProperties() != null) {
+                            content.setPname("上海市");
+                            content.setCityname(cjBean.getProperties().getString("所属区"));
+                            content.setAdname(cjBean.getProperties().getString("所属街"));
+                            content.setCommunityCode(cjBean.getProperties().getString("居委会"));
+                            content.setCommunity(cjBean.getProperties().getString("居委_1"));
+                        }
+                    }
+
+//                  判断是否存在街镇数据
+                    if (content.getAdname() == null || content.getAdname().isEmpty()) {
+                        GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
+                        if (townBean != null && townBean.getProperties() != null) {
+                            content.setPname("上海市");
+                            content.setAdnameCode(townBean.getProperties().getString("area_code"));
+                            content.setAdname(townBean.getProperties().getString("name"));
+                        }
+                    }
+
                     if ((content.getAdname() == null || content.getAdname().isEmpty() || content.getCityname() == null || content.getCityname().isEmpty() || content.getCommunity() == null || content.getCommunity().isEmpty())) {
 //                  判断是否存在行政区划数据
                         if (content.getCityname() == null || content.getCityname().isEmpty()) {
@@ -285,28 +308,8 @@ public class AddressQueryEngine {
                                 content.setCityname(adBean.getProperties().getString("name"));
                             }
                         }
-//                  判断是否存在街镇数据
-                        if (content.getAdname() == null || content.getAdname().isEmpty()) {
-                            GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
-                            if (townBean != null && townBean.getProperties() != null) {
-                                content.setPname("上海市");
-                                content.setAdnameCode(townBean.getProperties().getString("area_code"));
-                                content.setAdname(townBean.getProperties().getString("name"));
-                            }
-                        }
-//                  判断是否存在村居数据
-                        if (content.getCommunity() == null || content.getCommunity().isEmpty()) {
-                            GeoJsonBean cjBean = areaService.isInResidentialCommitteePolygon(content.getLon(), content.getLat());
-                            if (cjBean != null && cjBean.getProperties() != null) {
-                                content.setPname("上海市");
-                                content.setCityname(cjBean.getProperties().getString("所属区"));
-                                content.setAdname(cjBean.getProperties().getString("所属街"));
-                                content.setCommunityCode(cjBean.getProperties().getString("居委会"));
-                                content.setCommunity(cjBean.getProperties().getString("居委_1"));
-                            }
-                        }
                     }
-                    if (!StringUtils.hasText(content.getWgName())) {
+                    /*if (!StringUtils.hasText(content.getWgName())) {
                         GeoJsonBean geoJsonBean = areaService.isInWGPolygon(content.getLon(), content.getLat());
                         if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
                             content.setWgName(geoJsonBean.getProperties().getString("网格名称"));
@@ -326,8 +329,8 @@ public class AddressQueryEngine {
                             content.setZhwgName(geoJsonBean.getProperties().getString("网格名称"));
                             content.setZhwgCode(geoJsonBean.getProperties().getString("网格编码"));
                         }
-                    }
-                }else{
+                    }*/
+                } else {
                     System.err.println("没有经纬度参数,不能根据经纬度落点补充街镇等信息!");
                 }
             }

+ 52 - 0
src/main/java/com/skyversation/poiaddr/bean/ZrrCallback20250609.java

@@ -0,0 +1,52 @@
+package com.skyversation.poiaddr.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "zrr_callback_20250609", schema = "")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ZrrCallback20250609 implements Serializable {
+
+//    @Id
+//    @GeneratedValue(strategy = GenerationType.IDENTITY)
+//    @Column(name = "id", nullable = false)
+//    private Long id;
+
+    @Id
+    @Column(name = "search_address")
+    private String searchAddress;
+
+    @Column(name = "cankao_address")
+    private String cankaoAddress;
+
+    @Column(name = "pname")
+    private String pname;
+
+    @Column(name = "standard_address")
+    private String standardAddress;
+
+    @Column(name = "county")
+    private String county;
+
+    @Column(name = "street_town_name")
+    private String streetTownName;
+
+    @Column(name = "community")
+    private String community;
+
+    @Column(name = "lon")
+    private String lon;
+
+    @Column(name = "lat")
+    private String lat;
+
+}

+ 208 - 0
src/main/java/com/skyversation/poiaddr/bean/yyskDmdzAddressStandardization.java

@@ -0,0 +1,208 @@
+package com.skyversation.poiaddr.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "yysk_dmdz_address_standardization", schema = "")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class yyskDmdzAddressStandardization implements Serializable {
+    private static final long serialVersionUID = -234567890123456789L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "oid", nullable = false)
+    private Integer oid;
+
+    @Column(name = "code", length = 50)
+    private String code;
+
+    @Column(name = "sourceaddress", length = 255)
+    private String sourceaddress;
+
+    @Column(name = "city", length = 50)
+    private String city;
+
+    @Column(name = "county", length = 50)
+    private String county;
+
+    @Column(name = "town", length = 50)
+    private String town;
+
+    @Column(name = "community", length = 50)
+    private String community;
+
+    @Column(name = "village", length = 50)
+    private String village;
+
+    @Column(name = "squad", length = 50)
+    private String squad;
+
+    @Column(name = "szone", length = 50)
+    private String szone;
+
+    @Column(name = "street", length = 50)
+    private String street;
+
+    @Column(name = "door", length = 50)
+    private String door;
+
+    @Column(name = "resregion", length = 50)
+    private String resregion;
+
+    @Column(name = "building", length = 50)
+    private String building;
+
+    @Column(name = "building_num", length = 50)
+    private String building_num;
+
+    @Column(name = "unit", length = 50)
+    private String unit;
+
+    @Column(name = "floor", length = 50)
+    private String floor;
+
+    @Column(name = "room", length = 50)
+    private String room;
+
+    @Column(name = "unique_code", length = 50)
+    private String unique_code;
+
+    @Column(name = "room_of_floor", length = 50)
+    private String room_of_floor;
+
+    @Column(name = "source", length = 50)
+    private String source;
+
+    @Column(name = "lon", precision = 8, scale = 6)
+    private Float lon;
+
+    @Column(name = "lat", precision = 8, scale = 6)
+    private Float lat;
+
+    @Column(name = "shape", length = 255)
+    private String shape;
+
+    @Column(name = "belong_building", length = 50)
+    private String belong_building;
+
+    @Column(name = "address_type")
+    private Integer address_type;
+
+    @Column(name = "lv")
+    private Integer lv;
+
+    @Column(name = "is_delete")
+    private Integer is_delete;
+
+    @Column(name = "is_multi")
+    private Integer is_multi;
+
+    @Column(name = "createtime")
+    private Date createtime;
+
+    @Column(name = "updatetime")
+    private Date updatetime;
+
+    @Column(name = "alt", precision = 8, scale = 6)
+    private Float alt;
+
+    @Column(name = "model_type")
+    private Integer model_type;
+
+    @Column(name = "full_place", length = 255)
+    private String full_place;
+
+    @Column(name = "security_grade")
+    private Integer security_grade;
+
+    @Column(name = "tydz_jc", length = 50)
+    private String tydz_jc;
+
+    @Column(name = "city_code", length = 50)
+    private String city_code;
+
+    @Column(name = "county_code", length = 50)
+    private String county_code;
+
+    @Column(name = "town_code", length = 50)
+    private String town_code;
+
+    @Column(name = "community_code", length = 50)
+    private String community_code;
+
+    @Column(name = "grid_name", length = 50)
+    private String grid_name;
+
+    @Column(name = "grid_code", length = 50)
+    private String grid_code;
+
+    @Column(name = "data_type", length = 50)
+    private String data_type;
+
+    @Column(name = "mphid", length = 50)
+    private String mphid;
+
+    @Column(name = "address_code", length = 50)
+    private String address_code;
+
+    @Column(name = "systemid", length = 50)
+    private String systemid;
+
+    @Column(name = "type", length = 50)
+    private String type;
+
+    @Column(name = "x", length = 50)
+    private String x;
+
+    @Column(name = "y", length = 50)
+    private String y;
+
+    @Column(name = "label", length = 50)
+    private String label;
+
+    @Column(name = "addr_tag", length = 50)
+    private String addr_tag;
+
+    @Column(name = "multiple_unique", length = 50)
+    private String multiple_unique;
+
+    @Column(name = "standardize_task_id", length = 50)
+    private String standardize_task_id;
+
+    @Column(name = "dlhh", length = 50)
+    private String dlhh;
+
+    @Column(name = "signature_data", length = 255)
+    private String signature_data;
+
+    @Column(name = "signature_check_state")
+    private Integer signature_check_state;
+
+    @Column(name = "signature_time")
+    private Date signature_time;
+
+    @Column(name = "signature_check_time")
+    private Date signature_check_time;
+
+    @Column(name = "is_history")
+    private Integer is_history;
+
+    @Column(name = "ylmc", length = 50)
+    private String ylmc;
+
+    @Column(name = "ybdd", length = 50)
+    private String ybdd;
+
+    @Column(name = "address", length = 255)
+    private String address;
+}

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

@@ -85,6 +85,8 @@ public class DbConnection {
             if (connection == null || connection.isClosed()) {
                 System.out.println("数据库异常断开,尝试重新连接!");
                 connection = DriverManager.getConnection(jdbcURL, db_user_name, db_password);
+                return this.runSqlStr(sqlStr);
+            } else if (stmt == null) {
                 stmt = connection.createStatement();
                 return this.runSqlStr(sqlStr);
             } else {

+ 25 - 5
src/main/java/com/skyversation/poiaddr/controller/CorporateLibraryController.java

@@ -6,6 +6,7 @@ import com.skyversation.poiaddr.addquery.TransfromDataTool;
 import com.skyversation.poiaddr.bean.Address;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
+import com.skyversation.poiaddr.bean.yyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.entity.YyskAddressStandardization;
 import com.skyversation.poiaddr.service.AreaService;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
@@ -41,9 +42,9 @@ public class CorporateLibraryController {
         AddressResult addressResult = new AddressResult();
         String lon = request.getParameter("lon");
         String lat = request.getParameter("lat");
-        if(StringUtils.hasText(lon) && StringUtils.hasText(lat)){
+        if (StringUtils.hasText(lon) && StringUtils.hasText(lat)) {
             GeoJsonBean cjBean = AreaService.getInstance().isInResidentialCommitteePolygon(Double.parseDouble(lon), Double.parseDouble(lat));
-            if(cjBean!= null && cjBean.getProperties() != null){
+            if (cjBean != null && cjBean.getProperties() != null) {
                 addressResult.getAddrBean().setPname("上海市");
                 addressResult.getAddrBean().setCityname(cjBean.getProperties().getString("所属区"));
                 addressResult.getAddrBean().setAdname(cjBean.getProperties().getString("所属街"));
@@ -63,7 +64,7 @@ public class CorporateLibraryController {
             return MessageManage.getInstance().getResultContent(Constant.PARAM_ERROR, "参数错误", "参数错误");
         }
 //      数据库查询
-        List<Address> list = AreaService.getInstance().getAddressPoiOnlyDB(address);
+        List<yyskDmdzAddressStandardization> list = AreaService.getInstance().getAddressPoiOnlyDB(address);
         AddressResult addressResult = null;
         if (list == null || list.size() < 1) {
 //          写入回流表
@@ -90,7 +91,6 @@ public class CorporateLibraryController {
     }
 
 
-
     //    高级地址查询
     @RequestMapping(value = "/searchByNameV3")
     public String searchByNameV3(HttpServletRequest request) {
@@ -146,7 +146,7 @@ public class CorporateLibraryController {
                             dataItem.put("type", "szx");
                         }
                     }
-                    if(contentBean != null && contentBean.getLon() != null){
+                    if (contentBean != null && contentBean.getLon() != null) {
                         AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult);
                         dataItem.put("lat", contentBean.getLat());
                         dataItem.put("lon", contentBean.getLon());
@@ -258,6 +258,26 @@ public class CorporateLibraryController {
         return "处理完成";
     }
 
+    @RequestMapping(value = "/runCallBackTable")
+    public String runCallBackTable(HttpServletRequest request) {
+        try {
+            String page = request.getParameter("page");
+            String endPage = request.getParameter("endPage");
+            String pageSize = request.getParameter("pageSize");
+            AreaService.getInstance().selectLimitData(Integer.parseInt(page), Integer.parseInt(pageSize),Integer.parseInt(endPage));
+        } 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();
+            }
+        }
+        return "处理完成";
+    }
+
 
     /**
      * (开发中)

+ 179 - 16
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -4,12 +4,13 @@ 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.Address;
-import com.skyversation.poiaddr.bean.AddressResult;
-import com.skyversation.poiaddr.bean.GeoJsonBean;
+import com.skyversation.poiaddr.bean.*;
 import com.skyversation.poiaddr.config.DbConnection;
+import com.skyversation.poiaddr.service.impl.YyszAddressRepository;
+import com.skyversation.poiaddr.service.impl.ZrrCallBackRepository;
 import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
 import com.skyversation.poiaddr.util.SplitAddress;
+import com.skyversation.poiaddr.util.status.AddressResultEnum;
 import com.skyversation.poiaddr.util.tasks.ScheduledTasks;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.geometry.jts.JTSFactoryFinder;
@@ -23,14 +24,26 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.io.*;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
 @Service
 public class AreaService {
 
     private static AreaService instance;
 
+
+    @Resource
+    private YyszAddressRepository yyszAddressRepository;
+
+    @Resource
+    private ZrrCallBackRepository zrrCallBackRepository;
+
     public static AreaService getInstance() {
         if (instance == null) {
             return new AreaService();
@@ -90,6 +103,7 @@ public class AreaService {
         try {
             System.out.println("<<<<<<<<------开始数据库连通性测试");
             System.out.println("------数据库连通性测试结果:" + DbConnection.getInstance().runSqlStr("select count(*) from " + searchTableName));
+            initScheduledTasksSetAddress();
         } catch (Exception e) {
             System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
         }
@@ -160,6 +174,121 @@ public class AreaService {
         System.out.println("<<<<<<<<------run geo data complete------>>>>>>>>>");
     }
 
+    public void initScheduledTasksSetAddress() {
+        long startTime = System.currentTimeMillis();
+        List<ZrrCallback20250609> zrrCallback20250609s = zrrCallBackRepository.findAll();
+        if (zrrCallback20250609s.size() > 0) {
+            for (ZrrCallback20250609 zrrCallback20250609 : zrrCallback20250609s) {
+                ScheduledTasks.setAddress.add(zrrCallback20250609.getSearchAddress());
+            }
+        }
+        System.out.println("ScheduledTasks.setAddress初始化完成,共" + ScheduledTasks.setAddress.size() + "条,查询用时:" + (System.currentTimeMillis() - startTime) / 1000 + "秒!");
+    }
+
+    public void selectLimitData(int page, int pageSize, int endPage) {
+        Map<String, Object> loginfoMap = new HashMap<>();
+        loginfoMap.put("page", page);
+        loginfoMap.put("pageSize", pageSize);
+        try {
+            long startTime = System.currentTimeMillis();
+            loginfoMap.put("startTime", startTime);
+            List<Map<String, Object>> callBackDatas = DbConnection.getInstance().runSqlStr("select roomdetailedaddress,hjdz from dws.dws_sjqdsjzx_zrr_hjjzxx_arrange order by ryid limit " + (page * pageSize) + "," + pageSize);
+            System.out.println("数据库查询page:" + page + ",pageSize:" + pageSize + "完成,用时:" + (System.currentTimeMillis() - startTime) / 1000 + "秒!");
+            if (callBackDatas != null && callBackDatas.size() > 0 && page < endPage) {
+                Set<String> address = new HashSet<>();
+                for (Map<String, Object> dataI : callBackDatas) {
+                    if (dataI.get("roomdetailedaddress") != null && StringUtils.hasText(dataI.get("roomdetailedaddress") + "") && !ScheduledTasks.setAddress.contains(dataI.get("roomdetailedaddress") + "")) {
+                        address.add(dataI.get("roomdetailedaddress") + "");
+                        ScheduledTasks.setAddress.add(dataI.get("roomdetailedaddress") + "");
+                    }
+                    if (dataI.get("hjdz") != null && StringUtils.hasText(dataI.get("hjdz") + "") && !ScheduledTasks.setAddress.contains(dataI.get("hjdz") + "")) {
+                        address.add(dataI.get("hjdz") + "");
+                        ScheduledTasks.setAddress.add(dataI.get("hjdz") + "");
+                    }
+                }
+                callBackDatas.clear();
+                List<ZrrCallback20250609> outDatas = new ArrayList<>();
+                int MaxTnumber = Runtime.getRuntime().availableProcessors();
+                System.out.println("共:《" + address.size() + "》条数据!最大可用线程数:" + MaxTnumber);
+                int index = 0;
+                ExecutorService executorService = Executors.newFixedThreadPool(MaxTnumber / 2);
+                List<Future<?>> futures = new ArrayList<>();
+                for (String addrStr : address) {
+                    index++;
+                    int finalIndex = index;
+                    futures.add(executorService.submit(() -> {
+                    System.out.print(">" + finalIndex);
+                    ZrrCallback20250609 zrrCallback20250609 = new ZrrCallback20250609();
+                    zrrCallback20250609.setSearchAddress(addrStr);
+                    AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName_nw(addrStr);
+                    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);
+                    }
+                    if (contentBean != null && contentBean.getLon() != null) {
+                        AddressQueryEngine.getInstance().getCjWgWgwByLoc(addressResult);
+                        zrrCallback20250609.setLat(contentBean.getLat() + "");
+                        zrrCallback20250609.setLon(contentBean.getLon() + "");
+                        zrrCallback20250609.setPname(contentBean.getPname());
+                        zrrCallback20250609.setCounty(contentBean.getCityname());
+                        zrrCallback20250609.setCankaoAddress(contentBean.getAddress());
+                        zrrCallback20250609.setStreetTownName(contentBean.getAdname());
+                        zrrCallback20250609.setCommunity(contentBean.getCommunity());
+                        zrrCallback20250609.setStandardAddress(contentBean.getStandAddr());
+                        SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addrStr);
+                        if (!StringUtils.hasText(contentBean.getPname())) {
+                            contentBean.setPname(splitAddress.getCity());
+                            zrrCallback20250609.setPname(splitAddress.getCity());
+                        }
+                        if (!StringUtils.hasText(contentBean.getPname())) {
+                            contentBean.setPname("上海市");
+                            zrrCallback20250609.setPname("上海市");
+                        }
+                        zrrCallback20250609.setStandardAddress(contentBean.getPname() + contentBean.getCityname() +
+                                contentBean.getAdname() + contentBean.getCommunity() + splitAddress.getAddr());
+                    }
+                    if (zrrCallback20250609.getSearchAddress() != null) {
+                        outDatas.add(zrrCallback20250609);
+                    }
+                    }));
+                }
+
+                // 等待所有任务完成
+                for (Future<?> future : futures) {
+                    try {
+                        future.get();
+                    } catch (InterruptedException | ExecutionException e) {
+                        System.err.println("线程异常:" + e);
+                    }
+                }
+                // 关闭线程池
+                executorService.shutdown();
+                zrrCallBackRepository.saveAll(outDatas);
+                long endTime = System.currentTimeMillis();
+                System.out.println("处理完成!用时" + (endTime - startTime) / 1000 + "秒!");
+                loginfoMap.put("endTime", endTime);
+                loginfoMap.put("message", "成功");
+                page++;
+                selectLimitData(page, pageSize, endPage);
+            } else if (page < endPage) {
+                loginfoMap.put("endTime", System.currentTimeMillis());
+                loginfoMap.put("message", "当前页数据已处理!");
+                page++;
+                selectLimitData(page, pageSize, endPage);
+            } else {
+                System.out.println("所有数据处理完成");
+                loginfoMap.put("endTime", System.currentTimeMillis());
+                loginfoMap.put("message", "所有数据处理完成!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            loginfoMap.put("endTime", System.currentTimeMillis());
+            loginfoMap.put("message", "异常页码:" + page + ",error:" + e);
+        } finally {
+            ScheduledTasks.logInfos.add(loginfoMap);
+        }
+    }
+
     /**
      * 批量插入数据到callback表
      */
@@ -180,13 +309,6 @@ public class AreaService {
         }
     }
 
-    /**
-     *
-     */
-    public void getCallBackDatas(){
-        String Sql = "";
-    }
-
     /**
      * 是否进入callBack表判断
      *
@@ -216,7 +338,7 @@ public class AreaService {
      * @param splitAddress
      * @return
      */
-    public List<Address> getRecommendAddress(SplitAddress splitAddress) {
+    /*public List<Address> getRecommendAddress(SplitAddress splitAddress) {
         if (splitAddress.getCity() == null) {
             splitAddress.setCity("");
         }
@@ -237,10 +359,10 @@ public class AreaService {
         } catch (Exception e) {
             return null;
         }
-    }
+    }*/
 
     //    进行数据库查询
-    public List<Address> getAddressPoisByAddr(SplitAddress splitAddress) {
+    /*public List<Address> getAddressPoisByAddr(SplitAddress splitAddress) {
         if (splitAddress.getAddr().contains("号")) {
             splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().lastIndexOf("号")));
         }
@@ -272,23 +394,64 @@ public class AreaService {
         }
 
         return list;
-    }
+    }*/
 
     /**
      * 根据地址关键字查询数据库结果
      *
-     * @param addr
      * @return
      */
-    public List<Address> getAddressPoiOnlyDB(String addr) {
+    /*public List<Address> getAddressPoiOnlyDB(String addr) {
         try {
             return odsToAddr(DbConnection.getInstance().runSqlStr("select * from " + Constant.getSearchTableName() + " WHERE  sourceaddress LIKE '%" + addr + "%' or address LIKE  '%" + addr + "%' order by updatetime desc LIMIT 20"));
         } catch (Exception e) {
             e.printStackTrace();
         }
         return null;
+    }*/
+    public List<yyskDmdzAddressStandardization> getAddressPoisByAddr(SplitAddress splitAddress) {
+        if (splitAddress.getAddr().contains("号")) {
+            splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().indexOf("号")));
+        }
+        if (splitAddress.getAddr().contains("弄")) {
+            splitAddress.setSearchAddr(splitAddress.getAddr().substring(0, splitAddress.getAddr().indexOf("弄")));
+        }
+
+        if (splitAddress.getSearchAddr() == null) {
+            splitAddress.setSearchAddr(splitAddress.getAddr());
+        }
+        List<yyskDmdzAddressStandardization> list = null;
+        if (StringUtils.hasText(splitAddress.getDistrict())) {
+            list = yyszAddressRepository.getAddressPoisByAddrAQX(splitAddress.getDistrict(), splitAddress.getSearchAddr());
+        }
+        if (list == null) {
+            list = yyszAddressRepository.getAddressPoisByAddr(splitAddress.getSearchAddr());
+        }
+
+        return list;
+    }
+
+    public List<yyskDmdzAddressStandardization> getAddressPoiOnlyDB(String addr) {
+        return yyszAddressRepository.getAddressPoisByAddr(addr);
+    }
+
+    public List<yyskDmdzAddressStandardization> getRecommendAddress(SplitAddress splitAddress) {
+        if (splitAddress.getCity() == null) {
+            splitAddress.setCity("");
+        }
+        if (splitAddress.getDistrict() == null) {
+            splitAddress.setDistrict("");
+        }
+        if (splitAddress.getStreet() == null) {
+            splitAddress.setStreet("");
+        }
+        if (splitAddress.getCommunity() == null) {
+            splitAddress.setCommunity("");
+        }
+        return yyszAddressRepository.getAddressPoisByDivisions(splitAddress.getCity(), splitAddress.getDistrict(), splitAddress.getStreet(), splitAddress.getCommunity());
     }
 
+
     public List<Map<String, Object>> getUniScDatas() {
         try {
             return DbConnection.getInstance().runSqlStr("select * from songjiang_uni_sc_id_v1"); // where real_address is not null and street_town_name is null

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

@@ -0,0 +1,34 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.bean.yyskDmdzAddressStandardization;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Resource
+public interface YyszAddressRepository extends JpaRepository<yyskDmdzAddressStandardization, String> {
+
+    // 执行自定义的SQL查询
+    @Query(value = "SELECT * FROM yysk_dmdz_address_standardization WHERE sourceaddress ILIKE %:addr% or address ILIKE  %:addr% LIMIT 20", nativeQuery = true)
+    List<yyskDmdzAddressStandardization> getAddressPoisByAddr(@Param("addr") String addr);
+
+    // 执行自定义的SQL查询
+    @Query(value = "SELECT * FROM yysk_dmdz_address_standardization WHERE county ILIKE %:adname% and ( sourceaddress ILIKE %:addr% or address ILIKE  %:addr% ) LIMIT 20", nativeQuery = true)
+    List<yyskDmdzAddressStandardization> getAddressPoisByAddrAQX(@Param("adname") String adname, @Param("addr") String addr);
+
+    @Query(value = "SELECT * FROM yysk_dmdz_address_standardization WHERE (city = :city or :city = '') and (county=:county or :county = '') and (town=:town or :town = '') and (community=:community or :community = '') LIMIT 20",nativeQuery = true)
+    List<yyskDmdzAddressStandardization> getAddressPoisByDivisions(@Param("city") String city, @Param("county") String county, @Param("town") String town, @Param("community") String community);
+
+    @Query(value = "SELECT COUNT(*) FROM yysk_dmdz_address_standardization", nativeQuery = true)
+    long countAllUsersNative();
+
+    @Query(value = "WITH input_point AS (SELECT ST_SetSRID(ST_MakePoint(:lon,:lat), 4326) AS location) " +
+            "SELECT * FROM yysk_dmdz_address_standardization " +
+            "JOIN input_point ip ON ST_DistanceSphere(t_yysz_address.location, ip.location) <= :radius " +
+            "LIMIT 20;", nativeQuery = true)
+    List<yyskDmdzAddressStandardization> getNearbySearch(@Param("lat") double lat, @Param("lon") double lon, @Param("radius") int radius);
+
+}

+ 15 - 0
src/main/java/com/skyversation/poiaddr/service/impl/ZrrCallBackRepository.java

@@ -0,0 +1,15 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.bean.ZrrCallback20250609;
+import com.skyversation.poiaddr.bean.yyskDmdzAddressStandardization;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Resource
+public interface ZrrCallBackRepository extends JpaRepository<ZrrCallback20250609, String> {
+
+}

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

@@ -13,6 +13,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Component
 public class ScheduledTasks {
@@ -32,6 +33,10 @@ public class ScheduledTasks {
      */
     public static Integer taskPageNum = 0;
 
+    public static List<Map<String,Object>> logInfos = new ArrayList<>();
+
+    public static List<String> setAddress = new ArrayList<>();
+
     /**
      * 回流地址列表
      * 每秒都检查一下,看看列表里面的数量

+ 10 - 0
src/main/resources/application.properties

@@ -3,6 +3,16 @@ server.servlet.context-path=/poiApi/
 spring.application.name=poiAddr
 spring.servlet.multipart.max-file-size=300MB
 spring.servlet.multipart.max-request-size=300MB
+
+spring.datasource.url=jdbc:postgresql://${DMS_DB_IP:172.30.77.14}:${DMS_DB_PORT:5433}/${ADDRESS_DB_TABLE_NAME:postgres}?stringtype=unspecified&u003fuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false&tinyInt1isBit=false&postgis=true
+spring.datasource.username=${DMS_DB_ACCOUNT:postgres}
+spring.datasource.password=${DMS_DB_PASSWORD:SKYversation0816}
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.datasource.hikari.maximum-pool-size=100
+spring.jpa.show-sql=false
 # \u677E\u6C5F\u8857\u9547
 app.area=\u4E0A\u6D77
 app.town=\u5CB3\u9633\u8857\u9053,\u6C38\u4E30\u8857\u9053,\u65B9\u677E\u8857\u9053,\u4E2D\u5C71\u8857\u9053,\u5E7F\u5BCC\u6797\u8857\u9053,\u4E5D\u91CC\u4EAD\u8857\u9053,\u6CD7\u6CFE\u9547,\u4F58\u5C71\u9547,\u8F66\u58A9\u9547,\u65B0\u6865\u9547,\u6D1E\u6CFE\u9547,\u4E5D\u4EAD\u9547,\u6CD6\u6E2F\u9547,\u77F3\u6E56\u8361\u9547,\u65B0\u6D5C\u9547,\u53F6\u69AD\u9547,\u5C0F\u6606\u5C71\u9547,\u5929\u9A6C\u5C71\u9547