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

调整优化文件生成助手类

chenendian 3 недель назад
Родитель
Сommit
299ffcdd78

+ 2 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/cadastre/CadastreManageController.java

@@ -245,6 +245,8 @@ public class CadastreManageController extends BaseController {
     @RequestMapping("/testRun")
     public R<Object> testRun() {
         try {
+            String filePath = "C:\\Users\\Administrator\\Desktop\\08\\shp_create\\public_dict";
+            cadastreManageService.testBuildMdbFile("fdcq1", filePath, "public_dict");
             //cadastreManageService.testRun();
             return R.ok(null);
         } catch (Exception e) {

+ 3 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/CadastreManageService.java

@@ -62,5 +62,8 @@ public interface CadastreManageService {
 
     Boolean checkQueryWhere(String tableName, String queryWhere);
 
+    void testBuildMdbFile(String tableName, String filePath, String fileName);
+
+
 
 }

+ 58 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/CadastreManageServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -1418,4 +1419,61 @@ public class CadastreManageServiceImpl implements CadastreManageService {
 
 
 
+//    1.文件名
+//    2.表名
+//    3.文件名称
+    /**
+     *
+     * 生成一个mdb文件
+     *
+     * @param tableName
+     * @param filePath
+     * @param fileName
+     */
+    @Override
+    public void testBuildMdbFile(String tableName, String filePath, String fileName) {
+        try {
+            // 1. 获取表字段及类型信息
+            List<Map<String, String>> columns = cadastreFileMapper.selectTableCollumAndType(tableName);
+            if (columns == null || columns.isEmpty()) {
+                log.warn("无法获取表字段信息: {}", tableName);
+                throw new ServiceException("无法获取表字段信息: "+tableName);
+            }
+
+            if(columns.stream().anyMatch(s->s.get("column_name").equals("geom"))){
+                log.warn("当前为矢量数据,无法生成mdb: {}", tableName);
+                throw new ServiceException("当前为矢量数据,无法生成mdb");
+            }
+
+            // 2. 获取表数据 (获取 valid_flag 为 0 的当前版本数据)
+            List<Map<String, Object>> dataList = cadastreFileMapper.selectTableData("", tableName);
+
+            // 3. 构造完整的文件路径
+            String mdbPath = filePath;
+            if (!mdbPath.endsWith(File.separator)) {
+                mdbPath += File.separator;
+            }
+            mdbPath += fileName;
+            if (!mdbPath.toLowerCase().endsWith(".mdb")) {
+                mdbPath += ".mdb";
+            }
+
+            // 4. 调用工具类生成 MDB 文件并写入数据
+            MdbUtil.writeMdbByTable(mdbPath, tableName, columns, dataList);
+            
+            log.info("MDB 文件生成成功: {}", mdbPath);
+        } catch (Exception e) {
+            log.error("生成 MDB 文件失败: {}", tableName, e);
+            throw new ServiceException("生成 MDB 文件失败: " + e.getMessage());
+        }
+    }
+
+
+
+
+
+
+
+
+
 }

+ 25 - 14
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/ConvergeServiceImpl.java

@@ -47,6 +47,9 @@ import java.io.FileInputStream;
 import java.io.PrintWriter;
 import java.io.Serializable;
 import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -214,21 +217,22 @@ public class ConvergeServiceImpl implements ConvergeService {
                     //地籍子区
                     convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
                     convergeRes.setFileName("03"+ConvergeTableEnum.TABLE_2.getTableName());
-                } else if(ConvergeTableEnum.TABLE_3.getTableName().equals(convergeRes.getTableName())){
-                    //宗地
-                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
-                    convergeRes.setFileName("03"+ConvergeTableEnum.TABLE_3.getTableName());
-                    //todo 这里需要对宗地,根据情况进行拆分,出来一个新的List
-                    convergeRes.setValid(-1);
-                    subConvergeTableList.add(convergeRes);
-                } else if(ConvergeTableEnum.TABLE_4.getTableName().equals(convergeRes.getTableName())){
-                    //房屋
-                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
-                    convergeRes.setFileName("04"+ConvergeTableEnum.TABLE_4.getTableName());
-                }else {
-                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
-                    convergeRes.setFileName("00"+convergeRes.getTableName());
                 }
+//                else if(ConvergeTableEnum.TABLE_3.getTableName().equals(convergeRes.getTableName())){
+//                    //宗地
+//                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
+//                    convergeRes.setFileName("03"+ConvergeTableEnum.TABLE_3.getTableName());
+//                    //todo 这里需要对宗地,根据情况进行拆分,出来一个新的List
+//                    convergeRes.setValid(-1);
+//                    subConvergeTableList.add(convergeRes);
+//                } else if(ConvergeTableEnum.TABLE_4.getTableName().equals(convergeRes.getTableName())){
+//                    //房屋
+//                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
+//                    convergeRes.setFileName("04"+ConvergeTableEnum.TABLE_4.getTableName());
+//                }else {
+//                    convergeRes.setFilePath(basePath+"矢量空间数据/统一坐标");
+//                    convergeRes.setFileName("00"+convergeRes.getTableName());
+//                }
             }
             if(!subConvergeTableList.isEmpty()){
                 convergeTableList.addAll(subConvergeTableList);
@@ -375,6 +379,13 @@ public class ConvergeServiceImpl implements ConvergeService {
             }
         }
 
+        Path file = Paths.get(filePath);
+        if(!Files.exists(file)){
+            //直接创建目录
+            Path path = Paths.get(filePath);
+            Files.createDirectories(path);
+        }
+
         // 5. 写入文件
         File shpFile = new File(filePath + File.separator + fileName + ".shp");
         ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

+ 112 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/MdbUtil.java

@@ -1,7 +1,10 @@
 package com.siwei.apply.utils;
 
+import com.healthmarketscience.jackcess.Database;
+import com.healthmarketscience.jackcess.DatabaseBuilder;
 import com.siwei.common.core.utils.StringUtils;
 
+import java.io.File;
 import java.sql.*;
 import java.util.*;
 
@@ -11,6 +14,115 @@ import java.util.*;
 public class MdbUtil {
 
 
+    /**
+     * 创建或打开 MDB 文件并写入数据
+     *
+     * @param mdbPath   mdb文件地址
+     * @param tableName 表名
+     * @param columns   字段及类型列表
+     * @param dataList  数据列表
+     */
+    public static void writeMdbByTable(String mdbPath, String tableName, List<Map<String, String>> columns, List<Map<String, Object>> dataList) throws Exception {
+        File mdbFile = new File(mdbPath);
+        if (!mdbFile.exists()) {
+            // 创建父目录
+            File parentFile = mdbFile.getParentFile();
+            if (parentFile != null && !parentFile.exists()) {
+                parentFile.mkdirs();
+            }
+            // 创建新的 MDB 文件 (V2000 格式)
+            DatabaseBuilder.create(Database.FileFormat.V2000, mdbFile);
+        }
+
+        Properties prop = new Properties();
+        prop.put("charSet", "UTF-8");
+        String dbUrl = "jdbc:ucanaccess://" + mdbPath;
+        
+        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
+        
+        try (Connection conn = DriverManager.getConnection(dbUrl, prop)) {
+            // 1. 检查表是否存在,如果不存在则创建
+            DatabaseMetaData metaData = conn.getMetaData();
+            try (ResultSet tables = metaData.getTables(null, null, tableName, new String[]{"TABLE"})) {
+                if (!tables.next()) {
+                    StringBuilder createSql = new StringBuilder("CREATE TABLE ").append(tableName).append(" (");
+                    for (int i = 0; i < columns.size(); i++) {
+                        Map<String, String> col = columns.get(i);
+                        String colName = col.get("column_name");
+                        String dataType = col.get("data_type");
+                        
+                        createSql.append("[").append(colName).append("] ");
+                        createSql.append(mapPostgresToMdbType(dataType));
+                        
+                        if (i < columns.size() - 1) {
+                            createSql.append(", ");
+                        }
+                    }
+                    createSql.append(")");
+                    try (Statement stmt = conn.createStatement()) {
+                        stmt.executeUpdate(createSql.toString());
+                    }
+                }
+            }
+
+            // 2. 插入数据
+            if (dataList != null && !dataList.isEmpty()) {
+                StringBuilder insertSql = new StringBuilder("INSERT INTO ").append(tableName).append(" (");
+                StringBuilder valuesPlaceholder = new StringBuilder();
+                
+                List<String> colNames = new ArrayList<>();
+                for (int i = 0; i < columns.size(); i++) {
+                    String colName = columns.get(i).get("column_name");
+                    colNames.add(colName);
+                    insertSql.append("[").append(colName).append("]");
+                    valuesPlaceholder.append("?");
+                    if (i < columns.size() - 1) {
+                        insertSql.append(", ");
+                        valuesPlaceholder.append(", ");
+                    }
+                }
+                insertSql.append(") VALUES (").append(valuesPlaceholder).append(")");
+
+                try (PreparedStatement pstmt = conn.prepareStatement(insertSql.toString())) {
+                    for (Map<String, Object> row : dataList) {
+                        for (int i = 0; i < colNames.size(); i++) {
+                            Object value = row.get(colNames.get(i));
+                            // 处理特殊类型,如 geometry 存为文本
+                            if (value != null && value.toString().contains("SRID")) {
+                                pstmt.setObject(i + 1, value.toString());
+                            } else {
+                                if(Objects.isNull(value)){
+                                    value="";
+                                }
+                                pstmt.setObject(i + 1, value);
+                            }
+                        }
+                        pstmt.addBatch();
+                    }
+                    pstmt.executeBatch();
+                }
+            }
+        }
+    }
+
+    private static String mapPostgresToMdbType(String pgType) {
+        if (pgType == null) return "TEXT(255)";
+        pgType = pgType.toLowerCase();
+        if (pgType.contains("char") || pgType.contains("text")) {
+            return "TEXT(255)";
+        } else if (pgType.contains("int")) {
+            return "INTEGER";
+        } else if (pgType.contains("numeric") || pgType.contains("decimal") || pgType.contains("double") || pgType.contains("float")) {
+            return "DOUBLE";
+        } else if (pgType.contains("date") || pgType.contains("time")) {
+            return "DATETIME";
+        } else if (pgType.contains("geometry")) {
+            return "MEMO"; // 空间数据存为长文本
+        }
+        return "TEXT(255)";
+    }
+
+
     /**
      * 读取.mdb文件下面的所有表名
      *

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

@@ -277,7 +277,7 @@
     </delete>
 
     <select id="selectTableData"   resultType="Map">
-        SELECT *,public.st_asewkt(geom) AS geom2
+        SELECT *
         FROM vector.${tableName} WHERE 1=1
         <if test="validFlag != null and validFlag != ''">
             and valid_flag= #{validFlag}