Selaa lähdekoodia

优化批量处理逻辑。

DESKTOP-6LTVLN7\Liumouren 3 kuukautta sitten
vanhempi
commit
d85dbc092a

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

@@ -50,7 +50,7 @@ public class AddressQueryEngine {
             for (String addr : addrs) {
 //              创建请求
                 addressResult = sj_szxSearchByName(addr);
-                if(addressResult != null){
+                if (addressResult != null) {
                     addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
                     addressResult.setMessage("成功");
                     return getCjWgWgwByLoc(addressResult);
@@ -162,12 +162,12 @@ public class AddressQueryEngine {
             if (!StringUtils.hasText(body))
                 return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
             try {
-                if(body.indexOf("[") != 0){
+                if (body.indexOf("[") != 0) {
                     System.out.println("请求地址:" + address + ";返回结果错误:" + body);
-                    return null;
-                }else{
+                    return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "请求地址:" + address + ";返回结果错误:" + body);
+                } else {
 //                  匹配得到得分最高的结果
-                    JSONObject res = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(address,JSONArray.parseArray(body),"address");
+                    JSONObject res = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(address, JSONArray.parseArray(body), "address");
 //                  将得分最高的结果映射到实体类
                     return TransfromDataTool.szxResultToResult2(res);
                 }

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

@@ -32,7 +32,7 @@ public class TransfromDataTool {
             content.setDistance(jsonObject.getString("lv"));
             content.setName(jsonObject.getString("addr"));
             double[] points = CoordTransform2.getInstance().shcj_to_wgs84(
-                    Double.valueOf(jsonObject.getString("x")), Double.valueOf(jsonObject.getString("y")));
+                    Double.parseDouble(jsonObject.getString("x")), Double.parseDouble(jsonObject.getString("y")));
             content.setLocation(points[0] + "," + points[1]);
             content.setLon(points[0]);
             content.setLat(points[1]);
@@ -89,6 +89,7 @@ public class TransfromDataTool {
         content.setType(jsonObject.getString("type"));
         content.setAddress(jsonObject.getString("address"));
         content.setName(jsonObject.getString("address"));
+        content.setSearchAddress(jsonObject.getString("address"));
         content.setScore(jsonObject.getString("总分"));
         if (jsonObject.containsKey("location") && jsonObject.getJSONObject("location").containsKey("lat") && jsonObject.getJSONObject("location").containsKey("lng")) {
             double[] points = CoordTransform2.getInstance().shcj_to_wgs84(

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

@@ -13,6 +13,7 @@ import java.util.Map;
 @Service
 public class DbConnection {
     private static DbConnection dbConnection;
+    public Connection connection;
 
     public static DbConnection getInstance() {
         if (dbConnection == null) {
@@ -42,8 +43,8 @@ public class DbConnection {
         System.out.println("配置文件中的数据库用户名:" + db_user_name + ";密码:" + db_password);
         String user = db_user_name;
         String password = db_password;
-        Connection conn = DriverManager.getConnection(jdbcURL, user, password);
-        stmt = conn.createStatement();
+        connection = DriverManager.getConnection(jdbcURL, user, password);
+        stmt = connection.createStatement();
 
     }
 

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

@@ -8,6 +8,9 @@ import com.skyversation.poiaddr.entity.SjArrDzbzhSjWcbryDzxx;
 import com.skyversation.poiaddr.util.status.AddressLevel;
 import org.springframework.stereotype.Service;
 
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -99,66 +102,64 @@ public class SjArrDzbzhSjWcbryDzxxServiceImpl {
 
     //   批量修改地址表
     public void updateDatas(List<SjArrDzbzhSjWcbryDzxx> sjArrDzbzhSjWcbryDzxxList) {
-        for (SjArrDzbzhSjWcbryDzxx item : sjArrDzbzhSjWcbryDzxxList) {
-            if (!item.getId().isEmpty()) {
-                StringBuilder sql = new StringBuilder();
-                sql.append("update sj_zrr_dzbzh_sj_wcbry_dzxx set ");
-                if (item.getLat() == null) {
-                    sql.append(" lat = null");
-                } else {
-                    sql.append(" lat = '").append(item.getLat()).append("'");
-                }
-                if (item.getLon() == null) {
-                    sql.append(", lon = null");
-                } else {
-                    sql.append(", lon = '").append(item.getLon()).append("'");
-                }
-                if (item.getLevel() == null) {
-                    sql.append(", level = null");
-                } else {
-                    sql.append(", level = '").append(item.getLevel()).append("'");
-                }
-                if (item.getAdministrativeDivision() == null) {
-                    sql.append(", administrative_division = null");
-                } else {
-                    sql.append(", administrative_division = '").append(item.getAdministrativeDivision()).append("'");
-                }
-                if (item.getInTheArea() == null) {
-                    sql.append(", in_the_area = null");
-                } else {
-                    sql.append(", in_the_area = '").append(item.getInTheArea()).append("'");
-                }
-                if (item.getMarket() == null) {
-                    sql.append(", market = null");
-                } else {
-                    sql.append(", market = '").append(item.getMarket()).append("'");
-                }
-                if (item.getResultAddrKey() == null) {
-                    sql.append(", result_addr_key = null");
-                } else {
-                    sql.append(", result_addr_key = '").append(item.getResultAddrKey()).append("'");
-                }
-                if (item.getStandardizedAddress() == null) {
-                    sql.append(", standardized_address = null");
-                } else {
-                    sql.append(", standardized_address = '").append(item.getStandardizedAddress()).append("'");
-                }
-                if (item.getUpdateTime() == null) {
-                    sql.append(", update_time = null");
-                } else {
-                    sql.append(", update_time = ").append(item.getUpdateTime().getTime());
-                }
-
-                sql.append(" where id = '").append(item.getId()).append("'");
-                try {
-                    int updateDataSum = DbConnection.getInstance().updateSql(sql.toString());
-                    if (updateDataSum < 1) {
-                        System.err.println("------updateError--------------------------------------" + sql + "更新异常!");
+        String sqls = "update sj_zrr_dzbzh_sj_wcbry_dzxx set lat = ?,lon = ?,level = ?, administrative_division = ?, in_the_area = ?, market = ?" +
+                ", result_addr_key = ? , standardized_address = ? , update_time = ? where id = ?";
+        try (PreparedStatement preparedStatement = DbConnection.getInstance().connection.prepareStatement(sqls)) {
+            for (SjArrDzbzhSjWcbryDzxx entity : sjArrDzbzhSjWcbryDzxxList) {
+                if (entity.getId() != null) {
+                    if (entity.getLat() == null) {
+                        preparedStatement.setNull(1, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(1, entity.getLat());
+                    }
+                    if (entity.getLon() == null) {
+                        preparedStatement.setNull(2, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(2, entity.getLon());
+                    }
+                    if (entity.getLevel() == null) {
+                        preparedStatement.setNull(3, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(3, entity.getLevel());
+                    }
+                    if (entity.getAdministrativeDivision() == null) {
+                        preparedStatement.setNull(4, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(4, entity.getAdministrativeDivision());
+                    }
+                    if (entity.getInTheArea() == null) {
+                        preparedStatement.setNull(5, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(5, entity.getInTheArea());
+                    }
+                    if (entity.getMarket() == null) {
+                        preparedStatement.setNull(6, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(6, entity.getMarket());
+                    }
+                    if (entity.getResultAddrKey() == null) {
+                        preparedStatement.setNull(7, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(7, entity.getResultAddrKey());
+                    }
+                    if (entity.getStandardizedAddress() == null) {
+                        preparedStatement.setNull(8, Types.VARCHAR);
+                    } else {
+                        preparedStatement.setString(8, entity.getStandardizedAddress());
                     }
-                } catch (Exception e) {
-                    System.err.println("更新异常" + e);
+                    preparedStatement.setLong(9, entity.getUpdateTime().getTime());
+                    preparedStatement.setString(10, entity.getId());
+                    // 将当前的 SQL 语句添加到批量操作中
+                    preparedStatement.addBatch();
                 }
             }
+            // 执行批量操作
+            int[] updateCounts = preparedStatement.executeBatch();
+            System.out.println("总条数:" + sjArrDzbzhSjWcbryDzxxList.size() + ";更新的记录数: " + updateCounts.length);
+        } catch (SQLException throwables) {
+            System.err.println("------updateError--------------------------------------" + sqls + "更新异常!");
+            throwables.printStackTrace();
+            System.err.println("更新异常" + throwables);
         }
     }
 

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

@@ -2,6 +2,7 @@ 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.bean.AddressResult;
 
 import java.util.*;
@@ -482,7 +483,42 @@ public class AddressTools {
 
         for (int i = 0; i < array.size(); i++) {
             JSONObject obj = array.getJSONObject(i);
+//          得到返回的地址
             String addr = obj.getString(param);
+//          规则4判断
+//          TODO 添加校验逻辑(首先使用第4校验规则匹配,匹配不到使用第二规则,还匹配不到的话就使用打分规则)
+            Set<String> addressString = AddressQueryEngine.tokenizeString(addr).get(0);
+            Set<String> addressNumber = AddressQueryEngine.tokenizeString(addr).get(1);
+            Set<String> address2String = AddressQueryEngine.tokenizeString(address).get(0);
+            Set<String> address2Number = AddressQueryEngine.tokenizeString(address).get(1);
+            if (addressString != null && addressString.size() > 1) {
+                int addressStrSize = addressString.size();
+                for (String addr2str : address2String) {
+                    if (addressString.contains(addr2str)) {
+                        addressStrSize--;
+                        if (addressStrSize == 0) {
+                            int addressNumSize = addressNumber.size();
+                            for (String addr2Num : address2Number) {
+                                if (addressNumber.contains(addr2Num)) {
+                                    addressNumSize--;
+                                    if (addressNumSize == 0) {
+                                        obj.put("总分","role_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("总分","role_2");
+                return obj;
+            }
+
             AddressInfo addrInfo = processAddress(addr);
 
             // 第一步:全词匹配比例
@@ -509,6 +545,8 @@ public class AddressTools {
         return bestMatch;
     }
 
+
+
     /***
      * 其他方法的引用方法,不用管
      * @param input

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

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

+ 0 - 13
src/test/java/com/skyversation/poiaddr/PoiAddrApplicationTests.java

@@ -1,13 +0,0 @@
-package com.skyversation.poiaddr;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class PoiAddrApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}