1
0
chenendian 2 месяцев назад
Родитель
Сommit
b235986835

+ 1 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/CadastreFile.java

@@ -25,7 +25,7 @@ public class CadastreFile extends BaseId {
     private String storage;
 
     private String status;
-    //0 为全量,1为矢
+    //1 为全量,2 为增
     private String readStatus;
     private String readMessage;
     private String fileStorageTime;

+ 1 - 2
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/CadastreFileMapper.java

@@ -69,11 +69,9 @@ public interface CadastreFileMapper {
      */
     List<String> selectAllTableNoView();
 
-
     int insertTableData(@Param("tableName") String tableName, @Param("data") Map<String, Object> data, @Param("shpDbSRID") Integer shpDbSRID);
 
 
-
     String selectGeoms(String tableName);
 
     /**
@@ -92,6 +90,7 @@ public interface CadastreFileMapper {
 
     List<Map<String,Object>> selectTableData(@Param("validFlag") String validFlag, @Param("tableName") String tableName);
 
+    Map<String,Object> selectExistsSameData(@Param("validFlag") String validFlag, @Param("data") Map<String, Object> data, @Param("tableName") String tableName);
 
 
 }

+ 91 - 12
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/CadastreManageServiceImpl.java

@@ -12,6 +12,7 @@ import com.siwei.apply.utils.FileExtractUtil;
 import com.siwei.common.core.exception.ServiceException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
 import org.gdal.ogr.*;
@@ -106,10 +107,17 @@ public class CadastreManageServiceImpl implements CadastreManageService {
                         (existing, replacement) -> existing // 如果有重复键,保留第一个值
                 ));
                 List<Map<String, Object>> theValueList = getValueList(layer,dbFieldNameAndTypeMap, haveGeom);
+
                 //这里直接数据入库,区分增量或者全量
-                Boolean addRes = fullDataStorage(layerName, theValueList);
+                Boolean addRes;
+                if("2".equalsIgnoreCase(cadastreFile.getReadStatus())){
+                    //增量更新
+                    addRes = incrementDataStorage(layerName, theValueList);
+                }else {
+                    addRes = fullDataStorage(layerName, theValueList);
+                }
+
                 log.error("当前图层{},入库结果 {}", layerName, addRes);
-                //Boolean checkRes2 = incrementalDataStorage(layer);
             }
         } catch (Exception e) {
             log.error("矢量数据入库异常,uploadId: {}", uploadId, e);
@@ -120,12 +128,6 @@ public class CadastreManageServiceImpl implements CadastreManageService {
 
 
 
-
-
-
-
-
-
     /**
      * 获取比较数据
      *
@@ -608,19 +610,96 @@ public class CadastreManageServiceImpl implements CadastreManageService {
     }
 
 
+
+
     /**
+     * 判断两个Map中的数据是否完全一致(排除geom字段的比较方式,或根据业务需求处理)
+     */
+    private boolean isSameData(Map<String, Object> map1, Map<String, Object> map2) {
+        if (map1 == map2) return true;
+        if (map1 == null || map2 == null) return false;
+        List<String> compareFields = new ArrayList<>(map1.keySet());
+        for (String field : compareFields) {
+            Object val1 = map1.get(field);
+            Object val2 = map2.get(field);
+            
+            if (val1 == null && val2 == null) continue;
+            if (val1 == null || val2 == null) return false;
+            
+            // 处理数值类型的比较(numeric/decimal在Java中可能是BigDecimal)
+            if (val1 instanceof Number && val2 instanceof Number) {
+                if (Double.compare(((Number) val1).doubleValue(), ((Number) val2).doubleValue()) != 0) {
+                    return false;
+                }
+            } else if (!val1.equals(val2)) {
+                return false;
+            }
+        }
+
+        Object geom1 = map1.get("geom");
+        Object geom2 = map2.get("geom");
+        if (geom1 != null && geom2 != null && !geom1.equals(geom2)) return false;
+        return true;
+    }
+
+
+    /**
+     * 这里需要开启事务
      * 数据增量入库
      *
-     * @param layer
+     * @param tableName
+     * @param theValueList
      * @return
      */
-    private Boolean incrementalDataStorage(Layer layer) {
-        boolean haveGeom = false;
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    public Boolean incrementDataStorage(String tableName, List<Map<String, Object>> theValueList) {
+        /**
+         * 1。查询出当前表所有数据。
+         * 2.修改当前数据的valid_flag为1,表示历史版本
+         * 3.把当前数据和数据库数据进行对比,获取新增数据和修改数据。
+         * 4.新增数据直接插入,修改数据根据主键进行更新。
+         * 任务标识码相同,并且geom数据有相交则认为数据相同。
+         */
+        boolean addRes = false;
+        Integer shpDbSRID = 4326;
+        if (!CollectionUtils.isEmpty(theValueList)) {
+            //先删除数据
+            cadastreFileMapper.deleteByValidFlag("1",tableName);
+            //查询出当前表所有数据。
+            List<Map<String, Object>> dbDataList = cadastreFileMapper.selectTableData("0",tableName);
+            //筛选出需要更新的数据
+            List<Map<String, Object>> dbExistsList = new ArrayList<>();
+            for (Map<String, Object> map : theValueList) {
+                Map<String, Object> dbExistsMap = cadastreFileMapper.selectExistsSameData("0",map,tableName);
+                if(MapUtils.isNotEmpty(dbExistsMap)){
+                    dbExistsList.add(dbExistsMap);
+                }
+            }
 
-        return haveGeom;
+            // 在dbDataList 中找出 dbExistsMap中各个字段完全一致的数据 并从dbDataList移除
+            if(CollectionUtils.isNotEmpty(dbExistsList)){
+                for (Map<String, Object> dbExistsMap : dbExistsList) {
+                    dbDataList.removeIf(dbData -> isSameData(dbData, dbExistsMap));
+                }
+            }
+
+            //这里合并两个list 最终写入数据表
+            if(CollectionUtils.isNotEmpty(dbDataList)){
+                theValueList.addAll(dbDataList);
+            }
+
+            //先把当前版本都修改为历史版本
+            cadastreFileMapper.updateValidFlag("1","0",tableName);
+            for (Map<String, Object> map : theValueList) {
+                map.put("valid_flag", 0);//有效数据标识
+                cadastreFileMapper.insertTableData(tableName,map,shpDbSRID);
+            }
+        }
+        return addRes;
     }
 
 
+
     /**
      * 获取列表
      */

+ 5 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/ThematicMapper.xml

@@ -13,12 +13,17 @@
         <if test="id != null and id != ''">
             and id = #{id}
         </if>
+
+        ORDER BY cjsj DESC
+
         <if test="limit != null">
             limit ${limit}
         </if>
         <if test="offset != null">
             offset ${offset}
         </if>
+
+
     </select>
 
     <select id="count" resultType="java.lang.Integer">

+ 37 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/cadastre/CadastreFileMapper.xml

@@ -153,6 +153,30 @@
          )
     </insert>
 
+    <insert id="batchInsertTableData">
+        INSERT INTO vector.${tableName} (
+        <foreach collection="keys" item="key" separator=",">
+            ${key}
+        </foreach>
+        )
+        VALUES
+        <foreach collection="dataList" item="data" separator=",">
+            (
+            <foreach collection="keys" item="key" separator=",">
+                <choose>
+                    <!-- 判断 geom 是否为空,并进行转换 -->
+                    <when test="key == 'geom' and data[key] != null">
+                        public.st_transform(public.st_geomfromewkt(#{data[${key}]}), #{shpDbSRID})
+                    </when>
+                    <otherwise>
+                        #{data[${key}]}
+                    </otherwise>
+                </choose>
+            </foreach>
+            )
+        </foreach>
+    </insert>
+
     <select id="selectGeoms"  resultType="string">
         SELECT array_to_string(array_agg(ST_AsEWKT(gd.geom)), '|') as "geoms"
         from vector.${tableName} gd
@@ -237,5 +261,18 @@
         WHERE valid_flag = ${validFlag}
     </select>
 
+    <select id="selectExistsSameData"   resultType="Map">
+        SELECT * FROM vector.${tableName}
+        WHERE valid_flag = ${validFlag}
+        <if test="data.rwbsm != null and data.rwbsm!=''  ">
+            AND  rwbsm = #{data.rwbsm}
+        </if>
+        <if test="data.geom != null and data.geom!=''  ">
+            AND public.ST_Equals(geom,public.st_geomfromewkt(#{data.geom}))
+        </if>
+        LIMIT 1
+    </select>
+
+
 
 </mapper>