Просмотр исходного кода

补充数据处理和数据重构入库逻辑

DESKTOP-6LTVLN7\Liumouren 1 месяц назад
Родитель
Сommit
5c6d8f8c17

+ 215 - 0
src/main/java/com/skyversation/poiaddr/entity/FusionKjdlTydzWf.java

@@ -0,0 +1,215 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-05-12 10:12:40 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="fusion_kjdl_tydz_wf" , schema = "")
+public class FusionKjdlTydzWf  implements Serializable {
+
+	private static final long serialVersionUID =  8405628305244969230L;
+
+	@Id
+   	@Column(name = "oid" )
+	private Long oid;
+
+   	@Column(name = "code" )
+	private String code;
+
+   	@Column(name = "sourceaddress" )
+	private String sourceaddress;
+
+   	@Column(name = "city" )
+	private String city;
+
+   	@Column(name = "county" )
+	private String county;
+
+   	@Column(name = "town" )
+	private String town;
+
+   	@Column(name = "community" )
+	private String community;
+
+   	@Column(name = "village" )
+	private String village;
+
+   	@Column(name = "squad" )
+	private String squad;
+
+   	@Column(name = "szone" )
+	private String szone;
+
+   	@Column(name = "street" )
+	private String street;
+
+   	@Column(name = "door" )
+	private String door;
+
+   	@Column(name = "resregion" )
+	private String resregion;
+
+   	@Column(name = "building" )
+	private String building;
+
+   	@Column(name = "building_num" )
+	private String buildingNum;
+
+   	@Column(name = "unit" )
+	private String unit;
+
+   	@Column(name = "floor" )
+	private String floor;
+
+   	@Column(name = "room" )
+	private String room;
+
+   	@Column(name = "unique_code" )
+	private String uniqueCode;
+
+   	@Column(name = "room_of_floor" )
+	private Long roomOfFloor;
+
+   	@Column(name = "source" )
+	private String source;
+
+   	@Column(name = "lon" )
+	private BigDecimal lon;
+
+   	@Column(name = "lat" )
+	private BigDecimal lat;
+
+   	@Column(name = "shape" )
+	private String shape;
+
+   	@Column(name = "belong_building" )
+	private String belongBuilding;
+
+   	@Column(name = "address_type" )
+	private Long addressType;
+
+   	@Column(name = "lv" )
+	private Long lv;
+
+   	@Column(name = "is_delete" )
+	private Long isDelete;
+
+   	@Column(name = "is_multi" )
+	private Long isMulti;
+
+   	@Column(name = "createtime" )
+	private Date createtime;
+
+   	@Column(name = "updatetime" )
+	private Date updatetime;
+
+   	@Column(name = "alt" )
+	private BigDecimal alt;
+
+   	@Column(name = "model_type" )
+	private Long modelType;
+
+   	@Column(name = "full_place" )
+	private String fullPlace;
+
+   	@Column(name = "security_grade" )
+	private Long securityGrade;
+
+   	@Column(name = "tydz_jc" )
+	private String tydzJc;
+
+   	@Column(name = "city_code" )
+	private String cityCode;
+
+   	@Column(name = "county_code" )
+	private String countyCode;
+
+   	@Column(name = "town_code" )
+	private String townCode;
+
+   	@Column(name = "community_code" )
+	private String communityCode;
+
+   	@Column(name = "grid_name" )
+	private String gridName;
+
+   	@Column(name = "grid_code" )
+	private String gridCode;
+
+   	@Column(name = "data_type" )
+	private String dataType;
+
+   	@Column(name = "mphid" )
+	private String mphid;
+
+   	@Column(name = "address_code" )
+	private String addressCode;
+
+   	@Column(name = "systemid" )
+	private String systemid;
+
+   	@Column(name = "type" )
+	private String type;
+
+   	@Column(name = "x" )
+	private String X;
+
+   	@Column(name = "y" )
+	private String Y;
+
+   	@Column(name = "label" )
+	private String label;
+
+   	@Column(name = "addr_tag" )
+	private String addrTag;
+
+   	@Column(name = "multiple_unique" )
+	private String multipleUnique;
+
+   	@Column(name = "standardize_task_id" )
+	private String standardizeTaskId;
+
+   	@Column(name = "dlhh" )
+	private String dlhh;
+
+   	@Column(name = "signature_data" )
+	private String signatureData;
+
+   	@Column(name = "signature_check_state" )
+	private Long signatureCheckState;
+
+   	@Column(name = "signature_time" )
+	private Date signatureTime;
+
+   	@Column(name = "signature_check_time" )
+	private Date signatureCheckTime;
+
+   	@Column(name = "is_history" )
+	private Long isHistory;
+
+   	@Column(name = "ylmc" )
+	private String ylmc;
+
+   	@Column(name = "ylbm" )
+	private String ylbm;
+
+   	@Column(name = "address" )
+	private String address;
+}

+ 4 - 0
src/main/java/com/skyversation/poiaddr/entity/YyskAddressStandardization.java

@@ -4,6 +4,10 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
 import java.io.Serializable;
 import java.util.Date;
 

+ 67 - 0
src/main/java/com/skyversation/poiaddr/entity/YyskDmdzAddressStandardization.java

@@ -0,0 +1,67 @@
+package com.skyversation.poiaddr.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description  
+ * @Author  LiuMengxiang
+ * @Date 2025-05-09 16:40:22 
+ */
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Entity
+@Table ( name ="yysk_dmdz_address_standardization" , schema = "")
+public class YyskDmdzAddressStandardization  implements Serializable {
+
+	private static final long serialVersionUID =  1138816300500135749L;
+
+	@Id
+   	@Column(name = "address" )
+	private String address;
+
+   	@Column(name = "provinces" )
+	private String provinces;
+
+   	@Column(name = "market" )
+	private String market;
+
+   	@Column(name = "distinguish" )
+	private String distinguish;
+
+   	@Column(name = "street_town" )
+	private String streetTown;
+
+   	@Column(name = "residential_committee" )
+	private String residentialCommittee;
+
+   	@Column(name = "return_address" )
+	private String returnAddress;
+
+   	@Column(name = "standard_address" )
+	private String standardAddress;
+
+   	@Column(name = "match_level" )
+	private String matchLevel;
+
+   	@Column(name = "lon" )
+	private String lon;
+
+   	@Column(name = "lat" )
+	private String lat;
+
+   	@Column(name = "update_time" )
+	private Date updateTime;
+
+   	@Column(name = "data_tag" )
+	private String dataTag;
+}

+ 26 - 5
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -7,7 +7,12 @@ import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.bean.AddressResult;
 import com.skyversation.poiaddr.bean.GeoJsonBean;
 import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.entity.FusionKjdlTydzWf;
+import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.entity.YyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.service.impl.AmapAddressV3Service;
+import com.skyversation.poiaddr.service.impl.FusionKjdlTydzWfSerice;
+import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationSerice;
 import com.skyversation.poiaddr.service.impl.YyskAddressStandardizationServiceImpl;
 import com.skyversation.poiaddr.util.AddressMatcher;
 import org.geotools.geojson.geom.GeometryJSON;
@@ -40,6 +45,12 @@ public class AreaService {
     @Autowired
     private AmapAddressV3Service amapAddressV3Service;
 
+    @Autowired
+    private YyskAddressStandardizationSerice yyskAddressStandardizationSerice;
+
+    @Autowired
+    private FusionKjdlTydzWfSerice fusionKjdlTydzWfSerice;
+
     //  暂存数据库中的所有数据
     private Map<String, AmapAddressV3> allAddressData = new ConcurrentHashMap<>();
 
@@ -47,7 +58,7 @@ public class AreaService {
 
     public static AreaService getInstance() {
         if (instance == null) {
-            return new AreaService();
+            instance = new AreaService();
         }
         return instance;
     }
@@ -81,7 +92,7 @@ public class AreaService {
         System.out.println("<<<<<<<<------根据配置文件为AREA赋值:" + Constant.getArea());
         System.out.println("<<<<<<<<------当前AMAP_CITY_CODE:" + Constant.getAMAP_CITY_CODE());
 //      TODO 数据库连通性测试
-        try {
+        /*try {
             long startTime = System.currentTimeMillis();
             System.out.println("<<<<<<<<------开始数据库连通性测试");
             List<AmapAddressV3> amapAddressV3List = amapAddressV3Service.getAllData();
@@ -98,10 +109,10 @@ public class AreaService {
         } catch (Exception e) {
             e.printStackTrace();
             System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
-        }
+        }*/
 
 //      TODO 网络连通性测试,可以请求一下测试的市中心地址
-        try {
+        /*try {
             System.out.println("电脑最大线程数:" + Runtime.getRuntime().availableProcessors());
             System.out.println("<<<<<<<<------开始网络连通性测试");
             long startTime = System.currentTimeMillis();
@@ -113,7 +124,7 @@ public class AreaService {
         } catch (Exception e) {
             e.printStackTrace();
             System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
-        }
+        }*/
     }
 
     public void initPolygons() {
@@ -177,6 +188,16 @@ public class AreaService {
         }
     }
 
+    public void saveYyskAddress(List<YyskDmdzAddressStandardization> datas) {
+        yyskAddressStandardizationSerice.saveDatas(datas);
+        datas.clear();
+    }
+
+    public void saveFktws(List<FusionKjdlTydzWf> datas){
+        fusionKjdlTydzWfSerice.saveDatas(datas);
+        datas.clear();
+    }
+
     public List<AmapAddressV3> getAddressPoisByAddr(String addr) {
         List<AmapAddressV3> resultData = new ArrayList<>();
         String[] strs = AddressMatcher.matchProvinceAndCity(addr);

+ 10 - 0
src/main/java/com/skyversation/poiaddr/service/FusionKjdlTydzWfRepository.java

@@ -0,0 +1,10 @@
+package com.skyversation.poiaddr.service;
+
+import com.skyversation.poiaddr.entity.FusionKjdlTydzWf;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import javax.annotation.Resource;
+
+@Resource
+public interface FusionKjdlTydzWfRepository extends JpaRepository<FusionKjdlTydzWf, String> {
+}

+ 10 - 0
src/main/java/com/skyversation/poiaddr/service/YyskAddressStandardizationRepository.java

@@ -0,0 +1,10 @@
+package com.skyversation.poiaddr.service;
+
+import com.skyversation.poiaddr.entity.YyskDmdzAddressStandardization;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import javax.annotation.Resource;
+
+@Resource
+public interface YyskAddressStandardizationRepository extends JpaRepository<YyskDmdzAddressStandardization, String> {
+}

+ 19 - 0
src/main/java/com/skyversation/poiaddr/service/impl/FusionKjdlTydzWfSerice.java

@@ -0,0 +1,19 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.entity.FusionKjdlTydzWf;
+import com.skyversation.poiaddr.service.FusionKjdlTydzWfRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class FusionKjdlTydzWfSerice {
+
+    @Autowired
+    private FusionKjdlTydzWfRepository fusionKjdlTydzWfRepository;
+
+    public List<FusionKjdlTydzWf> saveDatas(List<FusionKjdlTydzWf> datas) {
+        return fusionKjdlTydzWfRepository.saveAll(datas);
+    }
+}

+ 20 - 0
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationSerice.java

@@ -0,0 +1,20 @@
+package com.skyversation.poiaddr.service.impl;
+
+import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.entity.YyskDmdzAddressStandardization;
+import com.skyversation.poiaddr.service.YyskAddressStandardizationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class YyskAddressStandardizationSerice {
+
+    @Autowired
+    private YyskAddressStandardizationRepository yyskAddressStandardizationRepository;
+
+    public List<YyskDmdzAddressStandardization> saveDatas(List<YyskDmdzAddressStandardization> datas) {
+        return yyskAddressStandardizationRepository.saveAll(datas);
+    }
+}

+ 109 - 68
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationServiceImpl.java

@@ -1,18 +1,20 @@
 package com.skyversation.poiaddr.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.skyversation.poiaddr.addquery.AddressQueryEngine;
 import com.skyversation.poiaddr.bean.AddressResult;
+import com.skyversation.poiaddr.bean.GeoJsonBean;
 import com.skyversation.poiaddr.config.DbConnection;
 import com.skyversation.poiaddr.entity.AmapAddressV3;
+import com.skyversation.poiaddr.entity.FusionKjdlTydzWf;
 import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.entity.YyskDmdzAddressStandardization;
 import com.skyversation.poiaddr.service.AreaService;
-import com.skyversation.poiaddr.util.AddressMatcher;
-import com.skyversation.poiaddr.util.AddressTools;
-import com.skyversation.poiaddr.util.Coordinate;
-import com.skyversation.poiaddr.util.ExcelReaderUtils;
+import com.skyversation.poiaddr.util.*;
 import com.skyversation.poiaddr.util.tasks.ScheduledTasks;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Types;
@@ -59,13 +61,13 @@ public class YyskAddressStandardizationServiceImpl {
     }
 
     //  分页查询地址表
-    public List<YyskAddressStandardization> getAllDataPage(int size, int pageNum, String tableName, String whereStr) {
+    public List<YyskDmdzAddressStandardization> getAllDataPage(int size, int pageNum, String tableName, String whereStr) {
         try {
-            List<YyskAddressStandardization> requestData = new ArrayList<>();
+            List<YyskDmdzAddressStandardization> requestData = new ArrayList<>();
             String sql = "SELECT * FROM " + tableName + " WHERE " + whereStr + " limit " + size * pageNum + "," + size;
             List<Map<String, Object>> dbData = DbConnection.getInstance().runSqlStr(sql);
             for (Map<String, Object> item : dbData) {
-                YyskAddressStandardization YyskAddressStandardization = new YyskAddressStandardization();
+                YyskDmdzAddressStandardization YyskAddressStandardization = new YyskDmdzAddressStandardization();
                 if (item.get("address") != null) {
                     YyskAddressStandardization.setAddress(item.getOrDefault("address", "").toString());
                 }
@@ -79,11 +81,11 @@ public class YyskAddressStandardizationServiceImpl {
     }
 
     //   批量修改地址表
-    public void updateDatas(List<YyskAddressStandardization> sjArrDzbzhSjWcbryDzxxList, String tableName) {
+    public void updateDatas(List<YyskDmdzAddressStandardization> sjArrDzbzhSjWcbryDzxxList, String tableName) {
         String sqls = "update " + tableName + " set lat = ?,lon = ?,market = ?, distinguish = ?, street_town = ?, residential_committee = ?" +
                 ", return_address = ? , standard_address = ? ,match_level = ? , update_time = ? where address = ?";
         try (PreparedStatement preparedStatement = DbConnection.getInstance().connection.prepareStatement(sqls)) {
-            for (YyskAddressStandardization entity : sjArrDzbzhSjWcbryDzxxList) {
+            for (YyskDmdzAddressStandardization entity : sjArrDzbzhSjWcbryDzxxList) {
                 if (entity.getAddress() != null) {
                     if (entity.getLat() == null) {
                         preparedStatement.setNull(1, Types.VARCHAR);
@@ -190,13 +192,13 @@ public class YyskAddressStandardizationServiceImpl {
         System.out.println("<<<<<<<<------iterativeProcessing{pageSize:" + pageSize + ",pageNum:" + pageNum + "}");
         long startTime = System.currentTimeMillis();
         if (init == 0) {
-            List<YyskAddressStandardization> listData = getAllDataPage(pageSize, pageNum, tableName, whereStr);
+            List<YyskDmdzAddressStandardization> listData = getAllDataPage(pageSize, pageNum, tableName, whereStr);
             if (listData != null && listData.size() > 0) {
 //              批量更新处理后的数据
                 if (updateToDataBase == 1) {
                     updateDatas(runExecutorService(listData), tableName);
                 } else if (updateToDataBase == 0) {
-                    List<YyskAddressStandardization> resultDataList = runExecutorService(listData);
+                    List<YyskDmdzAddressStandardization> resultDataList = runExecutorService(listData);
                     if (resultDataList.size() > 0) {
                         ExcelReaderUtils.convertYYListToMapList(resultDataList, "output/yysk_dmdz_address_standardization_" + pageSize + "_" + pageNum + ".xlsx");
                     }
@@ -316,10 +318,8 @@ public class YyskAddressStandardizationServiceImpl {
             long startTime = System.currentTimeMillis();
             int taskId = sort * i + startFileIndex;
             // 任务执行
-            startMutilExecutor(taskId, fileRootPath + "output5\\yysk_dmdz_address_standardization_200000_" + taskId + ".xlsx",
-                    fileRootPath + "output6\\yysk_dmdz_address_standardization_200000_" + taskId + ".xlsx");
-            /*startMutilExecutor(taskId, fileRootPath + "ziranren\\yysk_dmdz_address_standardization_10000_" + taskId + ".xlsx",
-                    fileRootPath + "ziranrenOutput\\yysk_dmdz_address_standardization_10000_" + taskId + ".xlsx");*/
+            startMutilExecutor(taskId, fileRootPath + "output8\\yysk_dmdz_address_standardization_200000_" + taskId + ".xlsx",
+                    fileRootPath + "output9\\yysk_dmdz_address_standardization_200000_" + taskId + ".xlsx");
             long endTime = System.currentTimeMillis();
             ScheduledTasks.taskRunStatus = false;
             System.out.println("单个文件处理完成!用时" + (endTime - startTime) / 1000 + "秒!");
@@ -329,11 +329,12 @@ public class YyskAddressStandardizationServiceImpl {
     public void startMutilExecutor(int startFileIndex, String filePath, String outPath) {
         System.out.println("<<<<<<<<------searchLoadFileData{fileIndex:" + startFileIndex + "}");
         long startTime = System.currentTimeMillis();
-        List<YyskAddressStandardization> listData = new ArrayList<>();
+        List<YyskDmdzAddressStandardization> listData = new ArrayList<>();
+//        List<YyskDmdzAddressStandardization> errorDatas = new ArrayList<>();
         try {
             List<Map<String, Object>> fileData = ExcelReaderUtils.readExcel(filePath);
             for (Map<String, Object> item : fileData) {
-                YyskAddressStandardization yyskAddressStandardization = new YyskAddressStandardization();
+                YyskDmdzAddressStandardization yyskAddressStandardization = new YyskDmdzAddressStandardization();
                 yyskAddressStandardization.setAddress(item.getOrDefault("address", "").toString());
                 yyskAddressStandardization.setDataTag(item.getOrDefault("dataTag", "").toString());
                 yyskAddressStandardization.setMatchLevel(item.getOrDefault("matchLevel", "").toString());
@@ -346,32 +347,86 @@ public class YyskAddressStandardizationServiceImpl {
                 yyskAddressStandardization.setResidentialCommittee(item.getOrDefault("residentialCommittee", "").toString());
                 yyskAddressStandardization.setLon(item.getOrDefault("lat", "").toString());
                 yyskAddressStandardization.setLat(item.getOrDefault("lon", "").toString());
-                listData.add(yyskAddressStandardization);
+                if (!yyskAddressStandardization.getMatchLevel().contains("rule_0") && !yyskAddressStandardization.getMatchLevel().contains("异常") && !yyskAddressStandardization.getDistinguish().contains("[]")) {
+                    listData.add(yyskAddressStandardization);
+                }
             }
         } catch (Exception e) {
             listData = null;
         }
         if (listData != null && listData.size() > 0) {
 //              批量更新处理后的数据
-            List<YyskAddressStandardization> resultDataList = runExecutorService(listData);
+            /*List<YyskAddressStandardization> resultDataList = runExecutorService(listData);
             if (resultDataList.size() > 0) {
                 ExcelReaderUtils.convertYYListToMapList(resultDataList, outPath);
+            }*/
+//          TODO 数据转换
+            List<FusionKjdlTydzWf> returnDatas = YyskDmdzAddressStandardizationToFusionKjdlTydzWf(listData);
+            try {
+                AreaService.getInstance().saveFktws(returnDatas);
+            } catch (Exception e) {
+                System.err.println("第" + startFileIndex + "个文件入库异常:" + e);
             }
+
             long endTime = System.currentTimeMillis();
             System.out.println("处理单批次用时" + (endTime - startTime) / 1000 + "秒!已调用市中心接口个数" + ScheduledTasks.szxRequestSize + ";已調用高德接口个数:" + ScheduledTasks.gdRequestSize);
         } else {
             System.out.println("<<<<<<<<------ 第" + startFileIndex + "个文件 -----任务处理完成!结果为空。。。--->>>>" + outPath);
         }
+//        if (errorDatas.size() > 0) {
+//            ExcelReaderUtils.convertYYListToMapList(errorDatas, outPath);
+//        }
     }
 
-    public List<YyskAddressStandardization> runExecutorService(List<YyskAddressStandardization> listData) {
+    public List<FusionKjdlTydzWf> YyskDmdzAddressStandardizationToFusionKjdlTydzWf(List<YyskDmdzAddressStandardization> datas) {
+        List<FusionKjdlTydzWf> returnDatas = new ArrayList<>();
+        for (YyskDmdzAddressStandardization item : datas) {
+            FusionKjdlTydzWf fusionKjdlTydzWf = new FusionKjdlTydzWf();
+            fusionKjdlTydzWf.setOid(ScheduledTasks.OID_TAG);
+            ScheduledTasks.OID_TAG++;
+            fusionKjdlTydzWf.setSourceaddress(item.getStandardAddress());
+            fusionKjdlTydzWf.setCity(item.getMarket());
+            fusionKjdlTydzWf.setCounty(item.getDistinguish());
+            fusionKjdlTydzWf.setCityCode("3101");
+//          需要查询
+            fusionKjdlTydzWf.setCountyCode("");
+            fusionKjdlTydzWf.setTown(item.getStreetTown());
+//          需要查询
+            fusionKjdlTydzWf.setTownCode("");
+            fusionKjdlTydzWf.setCommunity(item.getResidentialCommittee());
+//          需要查询
+            fusionKjdlTydzWf.setCommunityCode("");
+//          需要转换成wgs84
+            double[] points = CoordTransform2.getInstance().shcj_to_wgs84(
+                    Double.parseDouble(item.getLon()), Double.parseDouble(item.getLat()));
+            fusionKjdlTydzWf.setLon(BigDecimal.valueOf(points[0]));
+//          需要转换成wgs84
+            fusionKjdlTydzWf.setLat(BigDecimal.valueOf(points[1]));
+            fusionKjdlTydzWf.setSource("标准化地址");
+            fusionKjdlTydzWf.setCreatetime(new Date());
+//          需要根据定位查询责任网格
+            fusionKjdlTydzWf.setGridName("");
+//          同上
+            fusionKjdlTydzWf.setGridCode("");
+            fusionKjdlTydzWf.setX(item.getLon());
+            fusionKjdlTydzWf.setY(item.getLat());
+            fusionKjdlTydzWf.setIsHistory(0L);
+            fusionKjdlTydzWf.setAddress(item.getAddress());
+            returnDatas.add(fusionKjdlTydzWf);
+        }
+        datas.clear();
+        return returnDatas;
+    }
+
+    public List<YyskDmdzAddressStandardization> runExecutorService(List<YyskDmdzAddressStandardization> listData) {
         // 创建线程池
         int executorSize = Runtime.getRuntime().availableProcessors() / 2;
         System.out.println("创建线程池个数:" + executorSize);
         ExecutorService executorService = Executors.newFixedThreadPool(executorSize);
+        AreaService areaService = AreaService.getInstance();
         List<Future<?>> futures = new ArrayList<>();
         for (int i = 0; i < listData.size(); i++) {
-            YyskAddressStandardization item = listData.get(i);
+            YyskDmdzAddressStandardization item = listData.get(i);
             int finalI = i;
             futures.add(executorService.submit(() -> {
                 System.out.print(finalI + ">");
@@ -382,54 +437,40 @@ public class YyskAddressStandardizationServiceImpl {
 //              默认不查询
                 boolean ifSearch = false;
 //              首先过滤rule_0
-                if (item.getMatchLevel().contains("rule_0")) {
-                    String[] addr = AddressMatcher.matchProvinceAndCity(item.getAddress());
-//                  然后
-                    if(addr == null){
-                        ifSearch = true;
-                    }else if (!addr[0].contains("上海")) {
-//                      如果查询的地址完全包含省份和市名就不从新擦寻
-                        if ((!addr[0].isEmpty() && (item.getAddress().contains(addr[0]) || addr[0].contains(item.getAddress()))) || (!addr[1].isEmpty() && (item.getAddress().contains(addr[1]) || addr[1].contains(item.getAddress())))) {
-                            ifSearch = false;
-                        }else{
-                            ifSearch = true;
+                if (!item.getMatchLevel().contains("rule_0") && !item.getMatchLevel().contains("异常")) {
+                    String[] addr = new String[]{};
+                    if (item.getDistinguish() == null || item.getDistinguish().isEmpty() || item.getDistinguish().trim().length() == 0) {
+                        addr = AddressTools.parseAddressJZ(item.getStandardAddress());
+                    } else if (item.getDistinguish().equals("[]")) {
+                        addr = AddressTools.parseAddressJZ(item.getAddress());
+                    }
+                    if (addr != null && addr[1] != null && !addr[1].equals("[]")) {
+                        item.setDistinguish(addr[1]);
+                    } else {
+//                        根据经纬度判断落点在哪儿个区
+                        String lon = item.getLon();
+                        String lat = item.getLat();
+                        double[] points = CoordTransform2.getInstance().shcj_to_wgs84(
+                                Double.parseDouble(lon), Double.parseDouble(lat));
+                        GeoJsonBean adBean = areaService.isInadPolygon(points[0], points[1]);
+                        JSONObject properties = adBean.getProperties();
+                        if (properties != null && properties.containsKey("name")) {
+                            item.setDistinguish(properties.getString("name"));
+                        } else {
+                            item.setStandardAddress(null);
                         }
                     }
-                }else if(item.getMatchLevel().contains("异常") && (item.getDistinguish() == null || item.getDistinguish().isEmpty() || item.getDistinguish().contains("[]"))){
-                    ifSearch = true;
-                }else if(item.getStandardAddress().contains("[]")){
-                    ifSearch = true;
-                }
-//                  匹配全国省名
-//                  遍历全国城市名称匹配搜索地址市名
-                /*
-                if (addr != null && !addr[0].contains("上海")) {
-                    addrList.add(item.getAddress());
-                    item.setMatchLevel("rule_0");
-//                  如果查询地址不是完全包含省和市的关键字且属于rule_0,那么就需要重新跑一遍
-                    if ((!addr[0].isEmpty() && item.getAddress().contains(addr[0])) || (!addr[1].isEmpty() && item.getAddress().contains(addr[1]))) {
-                        item.setProvinces(addr[0]);
-                        item.setMarket(addr[1]);
-                        ifSearch = false;
+                    try {
+                        String oldAddress = Objects.requireNonNull(AddressTools.parseAddressJZ(item.getStandardAddress()))[3].
+                                replaceAll(item.getMarket().equals("[]") ? "" : item.getMarket(), "").
+                                replaceAll(item.getDistinguish().equals("[]") ? "" : item.getDistinguish(), "").
+                                replaceAll(item.getStreetTown().equals("[]") ? "" : item.getStreetTown(), "").
+                                replaceAll(item.getResidentialCommittee().equals("[]") ? "" : item.getResidentialCommittee(), "");
+                        item.setStandardAddress(item.getMarket() + item.getDistinguish() + item.getStreetTown() + AddressQueryEngine.townReplace_ct(oldAddress));
+                    } catch (Exception e) {
+                        e.printStackTrace();
                     }
-                } else {
-                    addrList.add(item.getAddress());
-                    ifSearch = false;
-                    String[] strs = AddressTools.parseAddressJZ(item.getAddress());
-//                    if (strs != null) {
-//                        item.setProvinces(strs[0] == null ? "" : strs[0]);
-//                        item.setMarket(strs[0] == null ? "" : strs[0]);
-//                        item.setDistinguish(strs[1] == null ? "" : strs[1]);
-//                        item.setStreetTown(strs[2] == null ? "" : strs[2]);
-//                    }
                 }
-                try {
-                    if (item.getMatchLevel().contains("异常") || item.getDistinguish() == null || item.getDistinguish().isEmpty()  || item.getDistinguish().equals("[]")|| item.getStreetTown() == null || item.getStreetTown().isEmpty()) {
-                        ifSearch = true;
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }*/
                 if (ifSearch && addrList.size() > 0) {
                     //  TODO 开始查询
                     AddressResult addressResult = AddressQueryEngine.getInstance().commonSearchByName(addrList);
@@ -522,9 +563,9 @@ public class YyskAddressStandardizationServiceImpl {
         }
         // 关闭线程池
         executorService.shutdown();
-        List<YyskAddressStandardization> dataList = new ArrayList<>();
-        List<YyskAddressStandardization> errData = new ArrayList<>();
-        for (YyskAddressStandardization item : listData) {
+        List<YyskDmdzAddressStandardization> dataList = new ArrayList<>();
+        List<YyskDmdzAddressStandardization> errData = new ArrayList<>();
+        for (YyskDmdzAddressStandardization item : listData) {
             if (item.getMatchLevel() == null || item.getMatchLevel().isEmpty()) {
                 errData.add(item);
             } else {

+ 1 - 4
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -38,10 +38,7 @@ public class AddressTools {
 
     // 上海市所有的区
     private static final Set<String> SHANGHAI_DISTRICTS = new HashSet<>(Arrays.asList(
-            "黄浦区", "徐汇区", "长宁区", "静安区", "普陀区",
-            "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区",
-            "浦东新区", "金山区", "松江区", "青浦区", "奉贤区",
-            "崇明区"
+            "黄浦区", "徐汇区", "长宁区", "静安区", "普陀区","虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区","浦东新区", "金山区", "松江区", "青浦区", "奉贤区","崇明区"
     ));
 
     // 各区下辖的镇与街道

+ 3 - 5
src/main/java/com/skyversation/poiaddr/util/ExcelReaderUtils.java

@@ -1,10 +1,8 @@
 package com.skyversation.poiaddr.util;
 
-import com.skyversation.poiaddr.addquery.Constant;
 import com.skyversation.poiaddr.entity.SjArrDzbzhSjWcbryDzxx;
-import com.skyversation.poiaddr.entity.YyskAddressStandardization;
+import com.skyversation.poiaddr.entity.YyskDmdzAddressStandardization;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.formula.functions.T;
 import org.apache.poi.ss.usermodel.*;
 
 import java.io.File;
@@ -94,9 +92,9 @@ public class ExcelReaderUtils {
     }
 
 
-    public static void convertYYListToMapList(List<YyskAddressStandardization> list, String filePath) {
+    public static void convertYYListToMapList(List<YyskDmdzAddressStandardization> list, String filePath) {
         List<Map<String, Object>> result = new ArrayList<>();
-        for (YyskAddressStandardization item : list) {
+        for (YyskDmdzAddressStandardization item : list) {
             Map<String, Object> map = new HashMap<>();
             Class<?> clazz = item.getClass();
             Field[] fields = clazz.getDeclaredFields();

+ 254 - 0
src/main/java/com/skyversation/poiaddr/util/tasks/HuidaoTester2.java

@@ -0,0 +1,254 @@
+package com.skyversation.poiaddr.util.tasks;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyFactory;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.cert.X509Certificate;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+
+
+public class HuidaoTester2 {
+
+	private static final String BASE_URL = "https://183.194.243.82/clientgateway/";//网关的测试环境
+
+	private static final String APP_ID = "0fe60a1c-41c0-4fd0-9d08-dcaf32651ff2";
+
+	private static final byte[] SECRET_KEY = "738c20bff4ee46ca819c20703abefaad".getBytes();
+
+	public static void main(String[] args) throws Exception {
+		// 模拟自然人登录产生accessToken第三方使用(上海市一网通办对接单位,如:上海市下面委办局、区县、统一受理平台、用户办件查询、电子证照库等需要使用到一网通办用户信息以及用户认证时使用)
+		String accessToken = getFakeAccessToken("341182199504233319", "张三", "15021790757");
+//		String accessToken = getFakeAccessToken("310109199702016785", "张三", "13038432433");
+		// 模拟法人登录产生accessToken第三方使用(上海市一网通办对接单位,如:上海市下面委办局、区县、统一受理平台、用户办件查询、电子证照库等需要使用到一网通办用户信息以及用户认证时使用)
+//		 String accessToken = getFakeLegalAccessToken();
+		System.out.println("accessToken:" + accessToken);
+		// 获取用户信息
+		JSONObject json = getUserInfo(accessToken);
+		System.out.println(json);
+	}
+
+	/**
+	 * 模拟法人登录产生accessToken第三方使用(上海市一网通办对接单位,如:上海市下面委办局、区县、统一受理平台、用户办件查询、
+	 * 电子证照库等需要使用到一网通办用户信息以及用户认证时使用)
+	 * 
+	 * @author tangjunlin
+	 * @return
+	 * @throws Exception
+	 *             2019年10月19日
+	 */
+	private static String getFakeLegalAccessToken() throws Exception {
+		HttpClient httpclient = getHttpClient(true);
+		HttpPost httpPost = new HttpPost(BASE_URL);
+		String apiName = "00d1e9e4-4c26-4993-a72a-f270e6c8e713";
+		String content = APP_ID + apiName + System.currentTimeMillis() / 1000;
+		String signature = encrypt(content);
+		httpPost.addHeader("appid", APP_ID);
+		httpPost.addHeader("apiname", apiName);
+		httpPost.addHeader("signature", signature);
+		HttpResponse httpResponse = httpclient.execute(httpPost);
+		HttpEntity httpEntity = httpResponse.getEntity();
+		InputStream is = httpEntity.getContent();
+		byte[] bytes = toByteArray(is);
+		is.close();
+		String s = new String(bytes, StandardCharsets.UTF_8);
+		StatusLine statusLine = httpResponse.getStatusLine();
+		httpPost.releaseConnection();
+		if (statusLine.getStatusCode() == 200) {
+			System.out.println("getFakeAccessToken成功");
+			return s;
+		} else {
+			System.out.println("getFakeAccessToken失败:" + statusLine.getStatusCode() + "," + statusLine.getReasonPhrase());
+			throw new RuntimeException(s);
+		}
+	}
+
+	/**
+	 * 模拟自然人登录产生accessToken第三方使用(上海市一网通办对接单位,如:上海市下面委办局、区县、统一受理平台、用户办件查询、
+	 * 电子证照库等需要使用到一网通办用户信息以及用户认证时使用)
+	 * 
+	 * @author tangjunlin
+	 * @param idCardNo
+	 * @param name
+	 * @param mobile
+	 * @return
+	 * @throws Exception
+	 *             2019年10月19日
+	 */
+	public static String getFakeAccessToken(String idCardNo, String name, String mobile) throws Exception {
+		HttpClient httpclient = getHttpClient(true);
+		HttpPost httpPost = new HttpPost(BASE_URL);
+		String apiName = "da067561-7096-4ade-b61e-ea154c50040e";
+		String content = APP_ID + apiName + System.currentTimeMillis() / 1000;
+		String signature = encrypt(content);
+		httpPost.addHeader("appid", APP_ID);
+		httpPost.addHeader("apiname", apiName);
+		httpPost.addHeader("signature", signature);
+		List<NameValuePair> formParams = new ArrayList<NameValuePair>();
+		formParams.add(new BasicNameValuePair("idCard", idCardNo));
+		formParams.add(new BasicNameValuePair("name", name));
+		formParams.add(new BasicNameValuePair("mobile", mobile));
+		UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formParams, "UTF-8");
+		httpPost.setEntity(urlEncodedFormEntity);
+		HttpResponse httpResponse = httpclient.execute(httpPost);
+		HttpEntity httpEntity = httpResponse.getEntity();
+		InputStream is = httpEntity.getContent();
+		byte[] bytes = toByteArray(is);
+		is.close();
+		String s = new String(bytes, StandardCharsets.UTF_8);
+		StatusLine statusLine = httpResponse.getStatusLine();
+		httpPost.releaseConnection();
+		if (statusLine.getStatusCode() == 200) {
+			System.out.println("getFakeAccessToken成功");
+			return s;
+		} else {
+			System.out.println("getFakeAccessToken失败:" + statusLine.getStatusCode() + "," + statusLine.getReasonPhrase());
+			throw new RuntimeException(s);
+		}
+	}
+
+	public static JSONObject getUserInfo(String accessToken) throws Exception {
+		HttpClient httpclient = getHttpClient(true);
+		HttpPost httpPost = new HttpPost(BASE_URL);
+		String apiName = "6bfa95b4-4fec-4d76-89bd-485b7ba97c35";
+		String content = APP_ID + apiName + System.currentTimeMillis() / 1000;
+		String signature = encrypt(content);
+		httpPost.addHeader("appid", APP_ID);
+		httpPost.addHeader("apiname", apiName);
+		httpPost.addHeader("signature", signature);
+		List<NameValuePair> formParams = new ArrayList<NameValuePair>();
+		formParams.add(new BasicNameValuePair("access_token", accessToken));
+		UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formParams, "UTF-8");
+		httpPost.setEntity(urlEncodedFormEntity);
+		HttpResponse httpResponse = httpclient.execute(httpPost);
+		HttpEntity httpEntity = httpResponse.getEntity();
+		InputStream is = httpEntity.getContent();
+		byte[] bytes = toByteArray(is);
+		is.close();
+		String s = new String(bytes, StandardCharsets.UTF_8);
+		StatusLine statusLine = httpResponse.getStatusLine();
+		httpPost.releaseConnection();
+		if (statusLine.getStatusCode() == 200) {
+			System.out.println("getUserInfo成功");
+			return JSONObject.parseObject(s);
+		} else {
+			System.out.println("getUserInfo失败" + statusLine.getStatusCode() + "," + statusLine.getReasonPhrase());
+			throw new RuntimeException(s);
+		}
+	}
+
+	private static SSLContext createIgnoreVerifySSL() {
+		try {
+			SSLContext sc = SSLContext.getInstance("SSL");
+			X509TrustManager trustManager = new X509TrustManager() {
+				@Override
+				public void checkClientTrusted(X509Certificate[] x509Certificates, String paramString) {
+				}
+
+				@Override
+				public void checkServerTrusted(X509Certificate[] x509Certificates, String paramString) {
+				}
+
+				@Override
+				public X509Certificate[] getAcceptedIssuers() {
+					return null;
+				}
+			};
+			sc.init(null, new TrustManager[] { trustManager }, null);
+			return sc;
+		} catch (KeyManagementException | NoSuchAlgorithmException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static HttpClient getHttpClient(boolean isHttps) {
+		if (isHttps) {
+			SSLContext sslContext = createIgnoreVerifySSL();
+			Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.INSTANCE)
+					.register("https", new SSLConnectionSocketFactory(sslContext)).build();
+			PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+			return HttpClients.custom().setConnectionManager(connManager).build();
+		} else {
+			return HttpClients.createDefault();
+		}
+	}
+
+	private static String encrypt(String str) throws Exception {
+		SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY, "AES");
+		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+		cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
+		byte[] bytes = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
+		return new Base64().encodeToString(bytes);
+	}
+
+	private static byte[] encryptByRSA(byte[] pubKeyInByte, byte[] data) throws Exception {
+		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyInByte);
+		PublicKey pubKey = keyFactory.generatePublic(keySpec);
+		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+		int inputLen = data.length;
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		int offSet = 0;
+		byte[] cache;
+		int i = 0;
+		// 对数据分段加密
+		int maxEncryptBlock = 117;
+		while (inputLen - offSet > 0) {
+			if (inputLen - offSet > maxEncryptBlock) {
+				cache = cipher.doFinal(data, offSet, maxEncryptBlock);
+			} else {
+				cache = cipher.doFinal(data, offSet, inputLen - offSet);
+			}
+			out.write(cache, 0, cache.length);
+			i++;
+			offSet = i * maxEncryptBlock;
+		}
+		return out.toByteArray();
+	}
+
+	private static byte[] toByteArray(InputStream is) throws Exception {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		toOutputStream(is, baos);
+		return baos.toByteArray();
+	}
+
+	private static void toOutputStream(InputStream is, OutputStream os) throws Exception {
+		byte[] buffer = new byte[2048];
+		int bytesRead;
+		while ((bytesRead = is.read(buffer, 0, 1024)) != -1) {
+			os.write(buffer, 0, bytesRead);
+		}
+	}
+
+}

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

@@ -20,6 +20,7 @@ public class ScheduledTasks {
 
     public static int szxRequestSize = 0;
     public static int gdRequestSize = 0;
+    public static Long OID_TAG = 0L;
 
     @Resource
     private YyskAddressStandardizationServiceImpl yyskAddressStandardizationService;