|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 获取列表
|
|
|
*/
|