From 65af700145ddc008c3cf8d35c4503dc2f5dd645c Mon Sep 17 00:00:00 2001
From: wany <13995595726@qq.com>
Date: Mon, 19 Jan 2026 14:36:58 +0800
Subject: [PATCH] init
---
pom.xml | 19 +
src/main/java/org/example/FileImporter.java | 687 ++++++++++++++++++
.../java/org/example/GetWscdDataImporter.java | 2 +-
.../java/org/example/IaEftsTownImporter.java | 2 +-
.../org/example/IaGlaInfoDataImporter.java | 6 +-
.../org/example/IaHdpPointDataImporter.java | 2 +-
.../org/example/IaRbadInfoDataImporter.java | 2 +-
.../org/example/IaShzhHdpDataImporter.java | 2 +-
.../example/IaShzhHsurfaceDataImporter.java | 2 +-
.../example/IaShzhVsurfaceDataImporter.java | 2 +-
.../java/org/example/IaStHdpDataImporter.java | 2 +-
.../org/example/WatershedDataCleaner.java | 52 +-
12 files changed, 718 insertions(+), 62 deletions(-)
create mode 100644 src/main/java/org/example/FileImporter.java
diff --git a/pom.xml b/pom.xml
index c3b5e46..10b4817 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,5 +46,24 @@
slf4j-simple
1.7.36
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.13
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.13.3
+
\ No newline at end of file
diff --git a/src/main/java/org/example/FileImporter.java b/src/main/java/org/example/FileImporter.java
new file mode 100644
index 0000000..d9010a3
--- /dev/null
+++ b/src/main/java/org/example/FileImporter.java
@@ -0,0 +1,687 @@
+package org.example;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.URLEncoder;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 照片文件导入器 - 先上传后绑定到业务
+ */
+public class FileImporter {
+
+ // 配置常量
+ private static final String UPLOAD_API_URL = "http://223.75.53.141:81/shzh/jcsj/fileAssociations/uploadFile/new";
+ private static final String DEFAULT_USER_ID = "231"; // 上传用户ID
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+ private static Connection conn;
+
+ // 数据库查询SQL
+ private static final String QUERY_HDP_POINT_SQL =
+ "SELECT GUID FROM SHZH_JCSJ.IA_SHZH_HDP_POINT " +
+ "WHERE NAME = ? AND WSCD = ? AND TYPE = ? AND STATUS = '1'";
+
+ private static final String QUERY_RBAD_INFO_SQL =
+ "SELECT GUID FROM SHZH_JCSJ.IA_RBAD_INFO " +
+ "WHERE CD = ? AND WSCD = ? AND STATUS = '1'";
+
+ // FILE_ASSOCIATIONS 表相关SQL
+ private static final String CHECK_FILE_ASSOC_SQL =
+ "SELECT COUNT(*) FROM SHZH_JCSJ.FILE_ASSOCIATIONS " +
+ "WHERE FILE_ID = ? AND TABLE_NAME = ? AND BUSINESS_ID = ? AND DEL = '1'";
+
+ private static final String INSERT_FILE_ASSOC_SQL =
+ "INSERT INTO SHZH_JCSJ.FILE_ASSOCIATIONS (" +
+ "ID, FILE_ID, SORT_ON, TM, TABLE_NAME, DEL, BUSINESS_ID, TYPE" +
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
+
+
+ public static void main(String[] args) {
+ args = new String[]{"E:\\999"};
+ // 命令行参数处理
+ if (args.length == 0) {
+ System.out.println("请提供照片目录路径作为参数");
+ return;
+ }
+
+ String baseDir = args[0];
+ String userId = DEFAULT_USER_ID;
+
+ File baseDirectory = new File(baseDir);
+
+ if (!baseDirectory.exists() || !baseDirectory.isDirectory()) {
+ System.out.println("指定的目录不存在或不是有效目录: " + baseDir);
+ return;
+ }
+
+ System.out.println("开始处理目录: " + baseDir);
+ System.out.println("上传用户ID: " + userId);
+
+ try {
+ // 初始化数据库连接
+ conn = DatabaseUtil.getConnection();
+ System.out.println("数据库连接成功");
+
+ // 处理目录
+ processAllCounties(baseDirectory, userId);
+
+ System.out.println("\n=== 所有目录处理完成 ===");
+ } catch (Exception e) {
+ System.err.println("处理过程中发生错误: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ closeResources();
+ }
+ }
+
+ private static void closeResources() {
+ try {
+ if (conn != null && !conn.isClosed()) {
+ conn.close();
+ System.out.println("数据库连接已关闭");
+ }
+ } catch (Exception e) {
+ System.err.println("关闭资源时出错: " + e.getMessage());
+ }
+ }
+
+ private static void processAllCounties(File baseDir, String userId) {
+ File[] countyDirs = baseDir.listFiles(File::isDirectory);
+ if (countyDirs == null || countyDirs.length == 0) {
+ System.out.println("在基础目录下未找到任何县市文件夹");
+ // 尝试直接处理当前目录(可能是直接包含小流域的目录)
+ try {
+ processDirectoryDirectly(baseDir, userId);
+ } catch (Exception e) {
+ System.err.println("直接处理目录失败: " + e.getMessage());
+ }
+ return;
+ }
+
+ int totalProcessed = 0;
+ int totalSuccess = 0;
+ int totalPhotos = 0;
+ int totalBindings = 0;
+
+ System.out.println("找到 " + countyDirs.length + " 个县市文件夹");
+
+ for (File countyDir : countyDirs) {
+ String countyName = countyDir.getName();
+ System.out.println("\n=== 处理县市: " + countyName + " ===");
+
+ try {
+ ProcessResult result = processCountyData(countyDir, countyName, userId);
+ totalProcessed += result.processed;
+ totalPhotos += result.photosUploaded;
+ totalBindings += result.bindingsCreated;
+ totalSuccess++;
+
+ System.out.println("✓ 成功处理 " + countyName +
+ ",导入 " + result.processed + " 个目录," +
+ result.photosUploaded + " 张照片," +
+ result.bindingsCreated + " 条绑定关系");
+ } catch (Exception e) {
+ System.err.println("✗ 处理县市 " + countyName + " 时出错: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ System.out.println("\n=== 处理完成 ===");
+ System.out.println("成功处理县市: " + totalSuccess + " 个");
+ System.out.println("处理目录: " + totalProcessed + " 个");
+ System.out.println("上传照片: " + totalPhotos + " 张");
+ System.out.println("创建绑定: " + totalBindings + " 条");
+ }
+
+ private static void processDirectoryDirectly(File dir, String userId) throws Exception {
+ System.out.println("直接处理目录: " + dir.getAbsolutePath());
+
+ // 查找小流域目录
+ File watershedDir = findDirectory(dir, "小流域");
+ if (watershedDir != null) {
+ System.out.println("找到小流域目录: " + watershedDir.getName());
+
+ // 查找水系目录
+ File[] sxDirs = findSxDirectories(watershedDir);
+ if (sxDirs != null && sxDirs.length > 0) {
+ ProcessResult totalResult = new ProcessResult(0, 0, 0);
+ for (File sxDir : sxDirs) {
+ System.out.println("处理水系: " + sxDir.getName());
+ ProcessResult result = processSxData(sxDir, userId);
+ totalResult.add(result);
+ }
+ System.out.println("水系处理完成,照片: " + totalResult.photosUploaded +
+ ",绑定: " + totalResult.bindingsCreated);
+ }
+ }
+ }
+
+ private static ProcessResult processCountyData(File countyDir, String countyName, String userId) throws Exception {
+ ProcessResult totalResult = new ProcessResult(0, 0, 0);
+
+ // 查找小流域目录
+ File watershedDir = findDirectory(countyDir, "小流域");
+ if (watershedDir == null) {
+ System.out.println("在 " + countyName + " 下未找到小流域目录");
+ return totalResult;
+ }
+ System.out.println("找到小流域目录: " + watershedDir.getName());
+
+ // 查找所有水系目录
+ File[] sxDirs = findSxDirectories(watershedDir);
+ if (sxDirs == null || sxDirs.length == 0) {
+ System.out.println("在 " + watershedDir.getPath() + " 下未找到水系目录");
+ return totalResult;
+ }
+
+ System.out.println("找到 " + sxDirs.length + " 个水系文件夹:");
+ for (File sxDir : sxDirs) {
+ System.out.println(" - " + sxDir.getName());
+ }
+
+ // 遍历处理每个水系文件夹
+ for (File sxDir : sxDirs) {
+ System.out.println("\n处理水系: " + sxDir.getName());
+ ProcessResult result = processSxData(sxDir, userId);
+ totalResult.add(result);
+ System.out.println("水系 " + sxDir.getName() + " 完成,照片: " +
+ result.photosUploaded + ",绑定: " + result.bindingsCreated);
+ }
+
+ return totalResult;
+ }
+
+ private static File[] findSxDirectories(File watershedDir) {
+ File[] subDirs = watershedDir.listFiles(File::isDirectory);
+ if (subDirs != null) {
+ List sxDirs = new ArrayList<>();
+ for (File subDir : subDirs) {
+ if (subDir.getName().contains("水系") || subDir.getName().matches("^HBW.*")) {
+ sxDirs.add(subDir);
+ }
+ }
+ return sxDirs.toArray(new File[0]);
+ }
+ return null;
+ }
+
+ private static ProcessResult processSxData(File sxDir, String userId) throws Exception {
+ ProcessResult result = new ProcessResult(1, 0, 0); // 至少处理了一个目录
+
+ try {
+ // 查找电子数据目录
+ File eleDataDir = findDirectory(sxDir, "电子数据");
+ if (eleDataDir == null) {
+ System.out.println("在 " + sxDir.getPath() + " 下未找到电子数据目录");
+ return result;
+ }
+ System.out.println("找到电子数据目录: " + eleDataDir.getPath());
+
+ File photoDir = findDirectory(eleDataDir, "照片");
+ if (photoDir == null) {
+ System.out.println("在 " + sxDir.getPath() + " 下未找到照片目录");
+ return result;
+ }
+ System.out.println("找到照片目录: " + photoDir.getPath());
+
+ // 提取流域编码
+ String watershedCode = extractWatershedCode(sxDir.getName());
+ System.out.println("流域编码: " + watershedCode);
+
+ File[] subDirs = photoDir.listFiles(File::isDirectory);
+ if (subDirs != null) {
+ for (File subDir : subDirs) {
+ String subDirName = subDir.getName();
+ try {
+ if (subDirName.contains("弱势群体")) {
+ ProcessResult dirResult = handleData(subDir, "IA_SHZH_HDP_POINT", watershedCode, "1", userId);
+ result.add(dirResult);
+ } else if (subDirName.contains("房屋结构")) {
+ ProcessResult dirResult = handleData(subDir, "IA_SHZH_HDP_POINT", watershedCode, "2", userId);
+ result.add(dirResult);
+ } else if (subDirName.contains("危险地建房")) {
+ ProcessResult dirResult = handleData(subDir, "IA_SHZH_HDP_POINT", watershedCode, "3", userId);
+ result.add(dirResult);
+ } else if (subDirName.contains("跨沟道路和桥涵")) {
+ ProcessResult dirResult = handleRbadData(subDir, "IA_RBAD_INFO", watershedCode, userId);
+ result.add(dirResult);
+ } else {
+ System.out.println("跳过未知类型的目录: " + subDirName);
+ }
+ } catch (Exception e) {
+ System.out.println("处理子目录 " + subDirName + " 失败: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+ }
+ } catch (Exception e) {
+ System.out.println("处理水系 " + sxDir.getName() + " 时发生严重错误: " + e.getMessage());
+ throw e;
+ }
+
+ return result;
+ }
+
+ /**
+ * 根据文件夹类型收集照片文件
+ */
+ private static List collectImageFiles(File dir) {
+ List imgList = new ArrayList<>();
+
+ // 处理危险地建房(特殊:有下一层文件夹)
+ if (dir.getName().contains("危险地建房")) {
+ File[] subDirs = dir.listFiles(File::isDirectory);
+ if (subDirs != null) {
+ for (File subDir : subDirs) {
+ File[] innerImgs = subDir.listFiles((d, name) ->
+ name.toLowerCase().endsWith(".jpg") ||
+ name.toLowerCase().endsWith(".jpeg") ||
+ name.toLowerCase().endsWith(".png"));
+ if (innerImgs != null) {
+ imgList.addAll(Arrays.asList(innerImgs));
+ }
+ }
+ }
+ }
+ // 处理普通照片文件夹(房屋结构、弱势群体)
+ else {
+ File[] imgs = dir.listFiles((d, name) ->
+ name.toLowerCase().endsWith(".jpg") ||
+ name.toLowerCase().endsWith(".jpeg") ||
+ name.toLowerCase().endsWith(".png"));
+ if (imgs != null) {
+ imgList.addAll(Arrays.asList(imgs));
+ }
+ }
+
+ return imgList;
+ }
+
+ private static ProcessResult handleData(File subDir, String groupId, String watershedCode, String type, String userId) throws Exception {
+ String subDirName = subDir.getName();
+ System.out.println("处理文件夹: " + subDirName + " (类型: " + type + ")");
+
+ ProcessResult result = new ProcessResult(1, 0, 0);
+
+ // 收集照片
+ List imgList = collectImageFiles(subDir);
+
+ if (CollectionUtils.isEmpty(imgList)) {
+ System.out.println("文件夹 " + subDirName + " 中没有找到照片");
+ return result;
+ }
+
+ System.out.println("在 " + subDirName + " 中找到 " + imgList.size() + " 张照片");
+
+ // 按照片名称分组处理
+ Map> filesByName = imgList.stream()
+ .collect(Collectors.groupingBy(file -> {
+ String name = file.getName();
+ int dotIndex = name.lastIndexOf('.');
+ return dotIndex > 0 ? name.substring(0, dotIndex) : name;
+ }));
+
+ for (Map.Entry> entry : filesByName.entrySet()) {
+ String fileName = entry.getKey();
+ List files = entry.getValue();
+
+ // 根据文件名+流域编码查询业务数据
+ List businessIds = queryBusinessIds(fileName, watershedCode, type, groupId);
+
+ if (CollectionUtils.isEmpty(businessIds)) {
+ System.out.println("未找到文件名 " + fileName + " 对应的业务数据 (流域编码: " + watershedCode + ", 类型: " + type + ")");
+ continue;
+ }
+
+ System.out.println("找到 " + businessIds.size() + " 条与文件 " + fileName + " 相关的业务记录");
+
+ // 先上传所有照片,再绑定到每个业务
+ List fileIds = new ArrayList<>();
+ for (File file : files) {
+ try {
+ // 上传照片
+ String fileId = uploadPhoto(file, groupId, userId, null); // 不传businessId
+ if (fileId != null) {
+ fileIds.add(fileId);
+ result.photosUploaded++;
+ System.out.println("✓ 上传成功: " + file.getName() + " -> " + fileId);
+ }
+ } catch (Exception e) {
+ System.err.println("✗ 上传失败: " + file.getName() + ", 错误: " + e.getMessage());
+ }
+ }
+
+ // 为每个业务ID绑定所有上传的文件
+ for (String businessId : businessIds) {
+ for (int i = 0; i < fileIds.size(); i++) {
+ String fileId = fileIds.get(i);
+ try {
+ // 绑定文件到业务
+ bindFileToBusiness(fileId, groupId, businessId, null, i + 1);
+ result.bindingsCreated++;
+ System.out.println("✓ 绑定成功: 文件 " + fileId + " -> 业务 " + businessId);
+ } catch (Exception e) {
+ System.err.println("✗ 绑定失败: 文件 " + fileId + " -> 业务 " + businessId + ", 错误: " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * 查询业务数据ID
+ */
+ private static List queryBusinessIds(String fileName, String watershedCode, String type, String groupId) {
+ List businessIds = new ArrayList<>();
+
+ try {
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+
+ if ("IA_SHZH_HDP_POINT".equals(groupId)) {
+ pstmt = conn.prepareStatement(QUERY_HDP_POINT_SQL);
+ pstmt.setString(1, fileName);
+ pstmt.setString(2, watershedCode);
+ pstmt.setString(3, type);
+ } else if ("IA_RBAD_INFO".equals(groupId)) {
+ pstmt = conn.prepareStatement(QUERY_RBAD_INFO_SQL);
+ pstmt.setString(1, fileName);
+ pstmt.setString(2, watershedCode);
+ } else {
+ System.out.println("未知的group ID: " + groupId);
+ return businessIds;
+ }
+
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ businessIds.add(rs.getString("GUID"));
+ }
+
+ if (pstmt != null) pstmt.close();
+ if (rs != null) rs.close();
+
+ } catch (Exception e) {
+ System.err.println("查询业务数据失败: " + e.getMessage());
+ e.printStackTrace();
+ }
+
+ return businessIds;
+ }
+
+ /**
+ * 上传照片到HTTP接口(解决中文文件名问题)
+ */
+ private static String uploadPhoto(File photoFile, String groupId, String userId, String businessId) throws Exception {
+ try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+ HttpPost uploadFile = new HttpPost(UPLOAD_API_URL);
+
+ // 使用自定义的MultipartEntityBuilder,支持中文文件名
+ MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+
+ // 关键:设置字符编码为UTF-8
+ builder.setCharset(java.nio.charset.StandardCharsets.UTF_8);
+ builder.setContentType(ContentType.MULTIPART_FORM_DATA.withCharset(java.nio.charset.StandardCharsets.UTF_8));
+
+ // 获取原始文件名(可能包含中文)
+ String originalFileName = photoFile.getName();
+
+ // 方法1:直接使用原始文件名(推荐)
+ builder.addBinaryBody(
+ "file",
+ new FileInputStream(photoFile),
+ ContentType.APPLICATION_OCTET_STREAM,
+ originalFileName // 使用原始中文文件名
+ );
+
+ // 方法2:对文件名进行URL编码(备选)
+// String encodedFileName = URLEncoder.encode(originalFileName, "UTF-8");
+// builder.addBinaryBody(
+// "file",
+// new FileInputStream(photoFile),
+// ContentType.APPLICATION_OCTET_STREAM,
+// encodedFileName
+// );
+
+ // 其他参数
+ builder.addTextBody("groupId", groupId, ContentType.TEXT_PLAIN.withCharset("UTF-8"));
+ builder.addTextBody("fileName", originalFileName, ContentType.TEXT_PLAIN.withCharset("UTF-8"));
+ builder.addTextBody("userId", userId, ContentType.TEXT_PLAIN.withCharset("UTF-8"));
+
+ HttpEntity multipart = builder.build();
+ uploadFile.setEntity(multipart);
+
+ // 设置请求头
+ uploadFile.setHeader("Accept-Charset", "UTF-8");
+
+ try (CloseableHttpResponse response = httpClient.execute(uploadFile)) {
+ HttpEntity responseEntity = response.getEntity();
+ String responseString = EntityUtils.toString(responseEntity, "UTF-8");
+
+ System.out.println("上传响应状态: " + response.getStatusLine().getStatusCode());
+ System.out.println("上传文件名: " + originalFileName);
+
+ if (response.getStatusLine().getStatusCode() == 200) {
+ JsonNode root = objectMapper.readTree(responseString);
+ int code = root.path("code").asInt();
+
+ if (code == 200) {
+ JsonNode data = root.path("data");
+ String fileId = data.path("fileId").asText();
+ String fileName = data.path("fileName").asText();
+
+ System.out.println("上传成功,文件ID: " + fileId + ", 文件名: " + fileName);
+
+ if (fileId != null && !fileId.isEmpty()) {
+ return fileId;
+ } else {
+ throw new Exception("响应中没有fileId字段");
+ }
+ } else {
+ String msg = root.path("msg").asText();
+ throw new Exception("接口返回错误: " + msg);
+ }
+ } else {
+ throw new Exception("HTTP请求失败,状态码: " + response.getStatusLine().getStatusCode());
+ }
+ }
+ } catch (Exception e) {
+ throw new Exception("上传文件失败: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 绑定文件到业务(插入FILE_ASSOCIATIONS表)
+ */
+ private static void bindFileToBusiness(String fileId, String tableName, String businessId, String type, int sortOrder) throws Exception {
+ // 检查是否已绑定
+ if (isAlreadyBound(fileId, tableName, businessId)) {
+ System.out.println("文件 " + fileId + " 已绑定到业务 " + businessId + ",跳过");
+ return;
+ }
+
+ PreparedStatement pstmt = null;
+
+ try {
+ // 生成主键ID
+ String id = UUID.randomUUID().toString().replace("-", "");
+
+ pstmt = conn.prepareStatement(INSERT_FILE_ASSOC_SQL);
+ pstmt.setString(1, id); // ID
+ pstmt.setString(2, fileId); // FILE_ID
+ pstmt.setInt(3, sortOrder); // SORT_ON
+ pstmt.setTimestamp(4, new Timestamp(System.currentTimeMillis())); // TM
+ pstmt.setString(5, tableName); // TABLE_NAME
+ pstmt.setString(6, "1"); // DEL (1:未删除)
+ pstmt.setString(7, businessId.trim().toUpperCase(Locale.ROOT)); // BUSINESS_ID
+ pstmt.setString(8, type); // TYPE
+
+ int affectedRows = pstmt.executeUpdate();
+ if (affectedRows == 1) {
+ // 成功
+ } else {
+ throw new Exception("插入失败,影响行数: " + affectedRows);
+ }
+ } finally {
+ if (pstmt != null) pstmt.close();
+ }
+ }
+
+
+ /**
+ * 检查是否已绑定
+ */
+ private static boolean isAlreadyBound(String fileId, String tableName, String businessId) throws Exception {
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+
+ try {
+ pstmt = conn.prepareStatement(CHECK_FILE_ASSOC_SQL);
+ pstmt.setString(1, fileId);
+ pstmt.setString(2, tableName);
+ pstmt.setString(3, businessId);
+
+ rs = pstmt.executeQuery();
+ if (rs.next()) {
+ return rs.getInt(1) > 0;
+ }
+ } finally {
+ if (rs != null) rs.close();
+ if (pstmt != null) pstmt.close();
+ }
+
+ return false;
+ }
+
+ public static ProcessResult handleRbadData(File subDir, String groupId, String watershedCode, String userId) throws Exception {
+ ProcessResult result = new ProcessResult(1, 0, 0);
+
+ // 下面还有两层文件夹
+ File[] firDirs = subDir.listFiles(File::isDirectory);
+ if (firDirs != null) {
+ for (File fdir : firDirs) {
+ File[] sdirs = fdir.listFiles(File::isDirectory);
+ if (sdirs != null) {
+ for (File sdir : sdirs) {
+ // 编码
+ String cd = sdir.getName();
+ System.out.println("处理跨沟道路和桥涵编码: " + cd);
+
+ // 查询业务数据
+ List businessIds = queryBusinessIds(cd, watershedCode, null, groupId);
+
+ if (CollectionUtils.isEmpty(businessIds)) {
+ System.out.println("未找到编码为 " + cd + " 的跨沟道路和桥涵数据");
+ continue;
+ }
+
+ // 获取该文件夹下的所有照片
+ List photoFiles = collectImageFiles(sdir);
+ if (!photoFiles.isEmpty()) {
+ System.out.println("找到 " + photoFiles.size() + " 张照片");
+
+ // 先上传所有照片
+ List fileIds = new ArrayList<>();
+ for (int i = 0; i < photoFiles.size(); i++) {
+ File photoFile = photoFiles.get(i);
+ try {
+ String fileId = uploadPhoto(photoFile, groupId, userId, null);
+ if (fileId != null) {
+ fileIds.add(fileId);
+ result.photosUploaded++;
+ System.out.println("✓ 上传成功: " + photoFile.getName() + " -> " + fileId);
+ }
+ } catch (Exception e) {
+ System.err.println("✗ 上传失败: " + photoFile.getName() + ", 错误: " + e.getMessage());
+ }
+ }
+
+ // 为每个业务ID绑定所有照片
+ for (String businessId : businessIds) {
+ for (int i = 0; i < fileIds.size(); i++) {
+ String fileId = fileIds.get(i);
+ try {
+ bindFileToBusiness(fileId, groupId, businessId, null, i + 1);
+ result.bindingsCreated++;
+ System.out.println("✓ 绑定成功: 文件 " + fileId + " -> 业务 " + businessId);
+ } catch (Exception e) {
+ System.err.println("✗ 绑定失败: 文件 " + fileId + " -> 业务 " + businessId + ", 错误: " + e.getMessage());
+ }
+ }
+ }
+ } else {
+ System.out.println("编码 " + cd + " 下没有找到照片");
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private static File findDirectory(File parentDir, String name) {
+ File[] subDirs = parentDir.listFiles(File::isDirectory);
+ if (subDirs != null) {
+ for (File subDir : subDirs) {
+ if (subDir.getName().contains(name)) {
+ return subDir;
+ }
+ }
+ if (subDirs.length > 0) return subDirs[0];
+ }
+ return null;
+ }
+
+ public static String extractWatershedCode(String dirName) {
+ Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+");
+ Matcher matcher = pattern.matcher(dirName);
+ if (matcher.find()) {
+ return matcher.group();
+ } else {
+ System.out.println("小流域编码文件夹有问题: " + dirName);
+ }
+ return dirName;
+ }
+
+ /**
+ * 处理结果类
+ */
+ private static class ProcessResult {
+ int processed; // 处理的目录数
+ int photosUploaded; // 上传的照片数
+ int bindingsCreated; // 创建的绑定关系数
+
+ ProcessResult(int processed, int photosUploaded, int bindingsCreated) {
+ this.processed = processed;
+ this.photosUploaded = photosUploaded;
+ this.bindingsCreated = bindingsCreated;
+ }
+
+ void add(ProcessResult other) {
+ this.processed += other.processed;
+ this.photosUploaded += other.photosUploaded;
+ this.bindingsCreated += other.bindingsCreated;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/example/GetWscdDataImporter.java b/src/main/java/org/example/GetWscdDataImporter.java
index ae1ea39..b86a854 100644
--- a/src/main/java/org/example/GetWscdDataImporter.java
+++ b/src/main/java/org/example/GetWscdDataImporter.java
@@ -15,7 +15,7 @@ public class GetWscdDataImporter {
}
// 测试用的固定路径
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"F:\\04 小流域成果\\2024年度\\第二批次成果\\6666-华科26条1201-已通过初检-空间格式通过-已统一表头-待入库"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/IaEftsTownImporter.java b/src/main/java/org/example/IaEftsTownImporter.java
index 42a476c..7575ae3 100644
--- a/src/main/java/org/example/IaEftsTownImporter.java
+++ b/src/main/java/org/example/IaEftsTownImporter.java
@@ -45,7 +45,7 @@ public class IaEftsTownImporter {
// args = new String[]{"F:\\1111-湖工大50条成果-已通过初检-待入库"};
// args = new String[]{"F:\\3333-2024年度咸宁市8条20251017-已通过初检-待入库"};
// args = new String[]{"F:\\2222-华科-黄石局-14条小流域(10.20)-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
diff --git a/src/main/java/org/example/IaGlaInfoDataImporter.java b/src/main/java/org/example/IaGlaInfoDataImporter.java
index 75c715a..6264a81 100644
--- a/src/main/java/org/example/IaGlaInfoDataImporter.java
+++ b/src/main/java/org/example/IaGlaInfoDataImporter.java
@@ -33,7 +33,7 @@ public class IaGlaInfoDataImporter {
// args = new String[]{"F:\\3333-2024年度咸宁市8条20251017-已通过初检-待入库"};
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
// args = new String[]{"F:\\小流域\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"F:\\04 小流域成果\\2024年度\\第二批次成果\\4444-长江科学院-黄冈28条1201-已通过初检-空间格式通过-已统一表头-待入库"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
@@ -355,8 +355,8 @@ public class IaGlaInfoDataImporter {
try {
// 检查编码(C列)是否为空
- String name = getCellStringValue(row.getCell(2));
- if (name == null || name.trim().isEmpty()) {
+ String name = getCellStringValue(row.getCell(1));
+ if (name == null || name.trim().isEmpty() || "无".equals(name)) {
System.out.println("第 " + (row.getRowNum() + 1) + " 行编码为空,跳过该行");
return null;
}
diff --git a/src/main/java/org/example/IaHdpPointDataImporter.java b/src/main/java/org/example/IaHdpPointDataImporter.java
index 70454bc..ab22d3a 100644
--- a/src/main/java/org/example/IaHdpPointDataImporter.java
+++ b/src/main/java/org/example/IaHdpPointDataImporter.java
@@ -39,7 +39,7 @@ public class IaHdpPointDataImporter {
// args = new String[]{"F:\\2222-华科-黄石局-14条小流域(10.20)-已通过初检-已统一表头-已入库"};
// args = new String[]{"F:\\3333-华科-地大9条-20251021-已通过初检-已统一表头-已入库"};
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/IaRbadInfoDataImporter.java b/src/main/java/org/example/IaRbadInfoDataImporter.java
index 5135f69..13571d1 100644
--- a/src/main/java/org/example/IaRbadInfoDataImporter.java
+++ b/src/main/java/org/example/IaRbadInfoDataImporter.java
@@ -34,7 +34,7 @@ public class IaRbadInfoDataImporter {
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
// args = new String[]{"F:\\3333-华科-地大9条-20251021-已通过初检-已统一表头-待入库"};
// args = new String[]{"F:\\小流域\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/IaShzhHdpDataImporter.java b/src/main/java/org/example/IaShzhHdpDataImporter.java
index 64cb72c..7cf6367 100644
--- a/src/main/java/org/example/IaShzhHdpDataImporter.java
+++ b/src/main/java/org/example/IaShzhHdpDataImporter.java
@@ -56,7 +56,7 @@ public class IaShzhHdpDataImporter {
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
// args = new String[]{"F:\\3333-华科-地大9条-20251021-已通过初检-已统一表头-待入库"};
// args = new String[]{"F:\\小流域\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库\\5555-长江科学院20条10.23-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/IaShzhHsurfaceDataImporter.java b/src/main/java/org/example/IaShzhHsurfaceDataImporter.java
index 27bda78..be2314d 100644
--- a/src/main/java/org/example/IaShzhHsurfaceDataImporter.java
+++ b/src/main/java/org/example/IaShzhHsurfaceDataImporter.java
@@ -58,7 +58,7 @@ public class IaShzhHsurfaceDataImporter {
// args = new String[]{"C:\\Users\\gsiot\\Desktop\\项目资料\\山洪\\小流域\\222"};
// args = new String[]{"F:\\1111-湖工大50条成果-已通过初检-待入库"};--湖工大
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/IaShzhVsurfaceDataImporter.java b/src/main/java/org/example/IaShzhVsurfaceDataImporter.java
index b2d0465..304ad6e 100644
--- a/src/main/java/org/example/IaShzhVsurfaceDataImporter.java
+++ b/src/main/java/org/example/IaShzhVsurfaceDataImporter.java
@@ -50,7 +50,7 @@ public class IaShzhVsurfaceDataImporter {
// args = new String[]{"F:\\3333-2024年度咸宁市8条20251017-已通过初检-待入库"};
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
return;
diff --git a/src/main/java/org/example/IaStHdpDataImporter.java b/src/main/java/org/example/IaStHdpDataImporter.java
index 686df15..2deb1cb 100644
--- a/src/main/java/org/example/IaStHdpDataImporter.java
+++ b/src/main/java/org/example/IaStHdpDataImporter.java
@@ -42,7 +42,7 @@ public class IaStHdpDataImporter {
// 测试用的固定路径
// args = new String[]{"F:\\1111-湖工大50条成果-已通过初检-待入库"};
// args = new String[]{"F:\\4444-长江科学院-黄冈28条-已通过初检-已统一表头-待入库"};
- args = new String[]{"D:\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库\\1111-湖工大-已通过初检-空间格式通过-已统一表头-重新入库"};
+ args = new String[]{"D:\\华科-苦水河2\\华科-苦水河2"};
if (args.length == 0) {
System.out.println("请提供湖工大9.29目录路径作为参数");
diff --git a/src/main/java/org/example/WatershedDataCleaner.java b/src/main/java/org/example/WatershedDataCleaner.java
index 6cc7a99..f045ac6 100644
--- a/src/main/java/org/example/WatershedDataCleaner.java
+++ b/src/main/java/org/example/WatershedDataCleaner.java
@@ -272,57 +272,7 @@ public class WatershedDataCleaner {
*/
public static void main(String[] args) {
// 测试数据
- List testWatershedCodes = Arrays.asList(
- "HBWFF1400123GD0000000",
- "HBWFF1400125D00000000",
- "HBWFF1400126000000000",
- "HBWFF14302PC000000000",
- "HBWFF14303G0000000000",
- "HBWFA861031kA00000000",
- "HBWFA8610l10000000000",
- "HBWFA86206f0000000000",
- "HBWFA8300114M00000000",
- "HBWFA830011GP00000000",
- "HBWFABV3011I000000000",
- "HBWFA85001211FC000000",
- "HBWFA85001231lB000000",
- "HBWFA85001241LC000000",
- "HBWFA85001251IC000000",
- "HBWFA85001261JC000000",
- "HBWFA85001281dBH00000",
- "HBWFA8580500000000000",
- "HBWFA8580C00000000000",
- "HBWFA85001241hBE00000",
- "HBWFA850012A1hB000000",
- "HBWFA850012B1kB000000",
- "HBWFA85405G0000000000",
- "HBWFA8540800000000000",
- "HBWFA7800126000000000",
- "HBWFA7800127000000000",
- "HBWFA85001221IA000001",
- "HBWFA85001241GA000000",
- "HBWFA850012C100000000",
- "HBWFE22001261G0000000",
- "HBWFE2200128100000000",
- "HBWFE2400121000000000",
- "HBWFE240012P000000000",
- "HBWFA85001231SB000001",
- "HBWFA85202D0000000000",
- "HBWFA85206E0000000000",
- "HBWFA8520B00000000000",
- "HBWFAHV00125000000000",
- "HBWFA03002016T0000000",
- "HBWFA03002018Z0000000",
- "HBWFA8200115P00000000",
- "HBWFA820011C000000000",
- "HBWFA85001261RB000000",
- "HBWFA850012A1dB000000",
- "HBWFA85001241lA000000",
- "HBWFF12A0153I00000000",
- "HBWFF12A0155NE0000000",
- "HBWFF12A0156L00000000",
- "HBWFF12A0156N00000000",
- "HBWFF12A0157M00000000"
+ List testWatershedCodes = Arrays.asList("HBWFG290012AZP0000000"
);
System.out.println("开始测试删除操作...");