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

计划收储转接数据导入测试

chenendian 1 день назад
Родитель
Сommit
fd432cad95

+ 4 - 0
siwei-api/siwei-api-spatial/src/main/java/com/siwei/spatial/api/RemoteSpatialFilesDbService.java

@@ -16,6 +16,10 @@ import java.util.Map;
 
 @FeignClient(contextId = "remoteSpatialFilesDbService", value = ServiceNameConstants.SPATIAL_SERVICE, fallbackFactory = RemoteSpatialFilesDbFallbackFactory.class)
 public interface RemoteSpatialFilesDbService {
+
+    @PostMapping("/files/db/read/shpfile")
+    public R<List<Map<String, Object>>> readShpFile(@RequestParam("shpFilePath") String shpFilePath, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
     @PostMapping("/files/db/read/shp")
     public R<TGeomDb> readShp(@RequestParam("shpFileName") String shpFileName, @RequestParam("shpFilePath") String shpFilePath, @RequestParam("fromRoute") String fromRoute, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 

+ 5 - 0
siwei-api/siwei-api-spatial/src/main/java/com/siwei/spatial/api/factory/RemoteSpatialFilesDbFallbackFactory.java

@@ -27,6 +27,11 @@ public class RemoteSpatialFilesDbFallbackFactory implements FallbackFactory<Remo
     public RemoteSpatialFilesDbService create(Throwable throwable) {
         log.error("日志服务调用失败:{}", throwable.getMessage());
         return new RemoteSpatialFilesDbService() {
+            @Override
+            public R<List<Map<String, Object>>> readShpFile( String shpFilePath,String source) {
+                return R.fail("内部调用异常");
+            }
+
             @Override
             public R<TGeomDb> readShp(String shpFileName, String shpFilePath, String fromRoute, String source) {
                 return R.fail("内部调用异常");

+ 14 - 3
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/cadastre/StorageController.java

@@ -599,9 +599,20 @@ public class StorageController extends BaseController {
     }
 
 
-
-
-
+    /**
+     *
+     * 收储文件上传入库
+     * 0 全量更新;1 增量更新
+     */
+    @PostMapping("/schedule/import")
+    public R<String> importSchedule(String shpFilePath,String sourceType,String addType) {
+        try {
+            Map<String, Object>  res = storageServiceImpl.importSchedule(shpFilePath,sourceType,addType);
+            return R.ok("success");
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
 
 
 }

+ 8 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/GjShouchuJihuaMapper.java

@@ -19,4 +19,12 @@ public interface GjShouchuJihuaMapper {
     List<TdgyStatisticsRes> getPlanListByYear(@Param("year") String year,@Param("startYear") String startYear,@Param("endYear") String endYear, @Param("keyWord") String keyWord);
 
     Map<String, Object> getPlanProject(@Param("gid") String gid);
+
+
+    int insertTableData(@Param("tableName") String tableName, @Param("data") Map<String, Object> data, @Param("shpDbSRID") Integer shpDbSRID);
+
+    int deleteByTable(@Param("tableName") String tableName, @Param("gid") String gid,@Param("sourceType") String sourceType);
+
+
+
 }

+ 114 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/StorageServiceImpl.java

@@ -8,16 +8,25 @@ import com.siwei.apply.domain.vo.LandSupplyProjectVO;
 import com.siwei.apply.mapper.GjShijiShouchuMapper;
 import com.siwei.apply.mapper.GjShouchuJihuaMapper;
 import com.siwei.apply.mapper.TdgyMapper;
+import com.siwei.common.core.constant.SecurityConstants;
+import com.siwei.common.core.domain.R;
+import com.siwei.common.core.exception.ServiceException;
 import com.siwei.common.core.utils.StringUtils;
+import com.siwei.spatial.api.RemoteSpatialFilesDbService;
+import com.siwei.spatial.api.domain.file.TGeomDb;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class StorageServiceImpl {
 
@@ -31,6 +40,11 @@ public class StorageServiceImpl {
     private TdgyMapper tdgyMapper;
 
 
+    @Autowired
+    private RemoteSpatialFilesDbService remoteSpatialFilesDbService;
+
+
+
     public LandStorageInOutReportDTO inOutDetails() {
         LandStorageInOutReportDTO report = new LandStorageInOutReportDTO();
         report.setTitle("收储出入库分析报表");
@@ -664,4 +678,104 @@ public class StorageServiceImpl {
             return 0;
         }
     }
+
+
+    public Map<String, Object> importSchedule(String shpFilePath,String sourceType , String addType) {
+        Map<String, Object> retMap = new LinkedHashMap<>();
+        if(StringUtils.isBlank(shpFilePath)){
+            throw new  ServiceException("文件不存在请重新上传!");
+        }
+        File file = new File(shpFilePath);
+        if (!file.exists()) {
+            throw new  ServiceException("文件不存在请重新上传!");
+        }
+
+
+        R<List<Map<String, Object>>> shpGeomResult  = remoteSpatialFilesDbService.readShpFile(shpFilePath, SecurityConstants.INNER);
+        List<Map<String, Object>> shpDataList = shpGeomResult.getData();
+        log.info("远程调用geom获取,返回结果:{}", shpDataList);
+
+        //数据字段进行校验
+        int count = 1;
+        for (Map<String, Object> shpData : shpDataList){
+            String sccb = shpData.get("sccb").toString();
+            String scfs = shpData.get("scnf").toString();
+            String ghyt = shpData.get("ghyt").toString();
+            String mj_m = shpData.get("mj_m").toString();
+            if(StringUtils.isBlank(sccb)|| StringUtils.isBlank(scfs) || StringUtils.isBlank(ghyt) || StringUtils.isBlank(mj_m)){
+                throw new  ServiceException("关键字段不能为空(sccb,scnf,ghyt,mj_m),请检查第"+count+"条数据");
+            }
+            count++;
+        }
+
+        if("0".equals(addType)){
+            //这里把当前表清空,重新写入;
+            gjShouchuJihuaMapper.deleteByTable("gj_shouchu_xiangmu","",sourceType);
+        }
+
+        // 收储项目表 geom 列的 SRID(参考建表语句 vector.gj_shouchu_xiangmu)
+        int shpDbSRID = 4326;
+        // 日期字段:shp 读取出来是 ISO8601 字符串(例如 2025-12-24T00:00:00.000+08:00),入库仅保留到 "T" 之前
+        Set<String> dateFields = new HashSet<>(Arrays.asList("scsj", "ngysj", "qdrq"));
+        // 数值字段:建表语句中为 numeric(18,4)
+        Set<String> numericFields = new HashSet<>(Arrays.asList(
+                "sccb", "mj_m", "jhxzmj", "yscmj", "bndscmj", "bndkfmj", "ngymj", "yjgysr", "mj_12"));
+
+        for (Map<String, Object> shpData : shpDataList) {
+            Map<String, Object> insertData = new LinkedHashMap<>();
+            for (Map.Entry<String, Object> e : shpData.entrySet()) {
+                String key = e.getKey();
+                Object val = e.getValue();
+                if (val == null) {
+                    continue;
+                }
+                // 字符串做一次清洗:空白置为 null
+                if (val instanceof String) {
+                    String s = ((String) val).trim();
+                    if (s.isEmpty()) {
+                        continue;
+                    }
+                    if (dateFields.contains(key)) {
+                        int t = s.indexOf('T');
+                        if (t > 0) {
+                            s = s.substring(0, t);
+                        }
+                        insertData.put(key, s);
+                        continue;
+                    }
+                    if (numericFields.contains(key)) {
+                        try {
+                            insertData.put(key, new BigDecimal(s));
+                        } catch (NumberFormatException ex) {
+                            log.warn("字段 {} 数值转换失败,原值:{}", key, s);
+                        }
+                        continue;
+                    }
+                    insertData.put(key, s);
+                } else {
+                    insertData.put(key, val);
+                }
+            }
+            if (MapUtils.isEmpty(insertData)) {
+                continue;
+            }
+            //区分收储和转接
+            if(sourceType.equals("0")){
+                insertData.put("source_type","0");
+            }else {
+                insertData.put("source_type","1");
+            }
+            gjShouchuJihuaMapper.insertTableData(
+                    "gj_shouchu_xiangmu", insertData, shpDbSRID);
+        }
+        retMap.put("status","success");
+        retMap.put("path",shpFilePath);
+        return retMap;
+    }
+
+
+
+
+
+
 }

+ 80 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/GjShouchuJihuaMapper.xml

@@ -120,4 +120,84 @@
         LIMIT 1
     </select>
 
+
+
+    <insert id="insertTableData" parameterType="map">
+        INSERT INTO vector.${tableName}
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="data.xmmc != null">xmmc,</if>
+            <if test="data.sccb != null">sccb,</if>
+            <if test="data.scsj != null">scsj,</if>
+            <if test="data.scnf != null">scnf,</if>
+            <if test="data.tdyyt != null">tdyyt,</if>
+            <if test="data.ghyt != null">ghyt,</if>
+            <if test="data.mj_m != null">mj_m,</if>
+            <if test="data.scfs != null">scfs,</if>
+            <if test="data.dkmc != null">dkmc,</if>
+            <if test="data.xzqmc != null">xzqmc,</if>
+            <if test="data.wz != null">wz,</if>
+            <if test="data.jhxzmj != null">jhxzmj,</if>
+            <if test="data.yscmj != null">yscmj,</if>
+            <if test="data.bndscmj != null">bndscmj,</if>
+            <if test="data.qqkf != null">qqkf,</if>
+            <if test="data.bndkfmj != null">bndkfmj,</if>
+            <if test="data.bndwccb != null">bndwccb,</if>
+            <if test="data.ngymj != null">ngymj,</if>
+            <if test="data.ngysj != null">ngysj,</if>
+            <if test="data.gyfs != null">gyfs,</if>
+            <if test="data.yjgysr != null">yjgysr,</if>
+            <if test="data.mj_12 != null">mj_12,</if>
+            <if test="data.xzqdm != null">xzqdm,</if>
+            <if test="data.dzjgh != null">dzjgh,</if>
+            <if test="data.htbh != null">htbh,</if>
+            <if test="data.htmc != null">htmc,</if>
+            <if test="data.qdrq != null">qdrq,</if>
+            <if test="data.the_geom != null">geom,</if>
+            <if test="data.source_type != null">source_type,</if>
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="data.xmmc != null">#{data.xmmc}::varchar,</if>
+            <if test="data.sccb != null">#{data.sccb}::numeric(18,4),</if>
+            <if test="data.scsj != null">#{data.scsj}::date,</if>
+            <if test="data.scnf != null">#{data.scnf}::varchar,</if>
+            <if test="data.tdyyt != null">#{data.tdyyt}::varchar,</if>
+            <if test="data.ghyt != null">#{data.ghyt}::varchar,</if>
+            <if test="data.mj_m != null">#{data.mj_m}::numeric(18,4),</if>
+            <if test="data.scfs != null">#{data.scfs}::varchar,</if>
+            <if test="data.dkmc != null">#{data.dkmc}::varchar,</if>
+            <if test="data.xzqmc != null">#{data.xzqmc}::varchar,</if>
+            <if test="data.wz != null">#{data.wz}::varchar,</if>
+            <if test="data.jhxzmj != null">#{data.jhxzmj}::numeric(18,4),</if>
+            <if test="data.yscmj != null">#{data.yscmj}::numeric(18,4),</if>
+            <if test="data.bndscmj != null">#{data.bndscmj}::numeric(18,4),</if>
+            <if test="data.qqkf != null">#{data.qqkf}::varchar,</if>
+            <if test="data.bndkfmj != null">#{data.bndkfmj}::numeric(18,4),</if>
+            <if test="data.bndwccb != null">#{data.bndwccb}::varchar,</if>
+            <if test="data.ngymj != null">#{data.ngymj}::numeric(18,4),</if>
+            <if test="data.ngysj != null">#{data.ngysj}::date,</if>
+            <if test="data.gyfs != null">#{data.gyfs}::varchar,</if>
+            <if test="data.yjgysr != null">#{data.yjgysr}::numeric(18,4),</if>
+            <if test="data.mj_12 != null">#{data.mj_12}::numeric(18,4),</if>
+            <if test="data.xzqdm != null">#{data.xzqdm}::varchar,</if>
+            <if test="data.dzjgh != null">#{data.dzjgh}::varchar,</if>
+            <if test="data.htbh != null">#{data.htbh}::varchar,</if>
+            <if test="data.htmc != null">#{data.htmc}::varchar,</if>
+            <if test="data.qdrq != null">#{data.qdrq}::date,</if>
+            <if test="data.the_geom != null">public.st_transform(public.st_geomfromewkt(#{data.the_geom}), #{shpDbSRID}),</if>
+            <if test="data.source_type != null">#{data.source_type}::varchar,</if>
+        </trim>
+    </insert>
+
+    <!-- 根据gid删除记录 -->
+    <delete id="deleteByTable" parameterType="String">
+        DELETE FROM vector.${tableName}
+        WHERE 1=1
+        <if test="gid != null and gid !=''">
+            and gid = #{gid}
+        </if>
+        <if test="sourceType != null and sourceType !=''">
+            and source_type = #{sourceType}
+        </if>
+    </delete>
+
 </mapper>

+ 5 - 0
siwei-modules/siwei-spatial/src/main/java/com/siwei/spatial/controller/file/SpatialFilesDbController.java

@@ -36,6 +36,11 @@ public class SpatialFilesDbController extends BaseController {
     @Autowired
     private ITGeomDbService itGeomDbService;
 
+    @PostMapping("/read/shpfile")
+    public R<List<Map<String, Object>>> readShpFile(String shpFilePath) throws IOException {
+        return R.ok(iSpatialFilesDbService.readShpFileByPath(shpFilePath));
+    }
+
     @PostMapping("/read/shp")
     // @InnerAuth
     public R<TGeomDb> readShp(String shpFileName, String shpFilePath, String fromRoute) throws IOException {

+ 1 - 1
siwei-modules/siwei-spatial/src/main/java/com/siwei/spatial/service/file/ISpatialFilesDbService.java

@@ -35,8 +35,8 @@ public interface ISpatialFilesDbService {
 
     void writeShapefileByTable(String tableName, String filePath, String fileName) throws Exception ;
 
-
     TGeomDb excelImportGeom(List<String> gdIdList);
 
+    List<Map<String, Object>> readShpFileByPath(String shpFilePath) throws IOException;
 
 }

+ 31 - 0
siwei-modules/siwei-spatial/src/main/java/com/siwei/spatial/service/file/impl/SpatialFilesDbServiceImpl.java

@@ -89,6 +89,34 @@ public class SpatialFilesDbServiceImpl implements ISpatialFilesDbService {
     @Autowired
     private TGeomDbDetailsMapper tGeomDbDetailsMapper;
 
+    @Override
+    public List<Map<String, Object>> readShpFileByPath(String shpFilePath) throws IOException {
+        if (StringUtils.isEmpty(shpFilePath)) {
+            log.error("读取SHP文件路径失败");
+            return null;
+        }
+        String shpDir = shpFilePath.substring(0, shpFilePath.lastIndexOf(".zip"));
+        FileUtils.unzipAutoCharset(shpFilePath, shpDir);
+        List<Map<String, String>> shpFiles = FileUtils.readShpFiles(shpDir);
+
+        if (shpFiles.isEmpty()) {
+            log.error("读取SHP文件失败");
+            return null;
+        }
+        // TODO 目前只用了一个.shp文件,后续如果有多个shp文件,可能需要处理
+        Map<String, String> shpFileMap = shpFiles.get(0);
+        File shpFile = new File(shpFileMap.get("shp"));
+        File dbfFile = new File(shpFileMap.get("dbf"));
+        File shxFile = new File(shpFileMap.get("shx"));
+        File prjFile = new File(shpFileMap.get("prj"));
+        if (!shpFile.exists() || !dbfFile.exists() || !shxFile.exists()) {
+            log.error("读取SHP文件缺失");
+            return null;
+        }
+        List<Map<String, Object>> shpFeaturesList = readShapeFile(shpFile);
+        return shpFeaturesList;
+    }
+
 
 
 
@@ -159,6 +187,9 @@ public class SpatialFilesDbServiceImpl implements ISpatialFilesDbService {
         return dto;
     }
 
+
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public TGeomDb readGeom(String shpFileName, String geom, String fromRoute) {