Parcourir la source

档案文件查找替换

cr il y a 1 mois
Parent
commit
c8669a53da

+ 80 - 66
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -29,6 +29,8 @@ import org.springframework.web.bind.annotation.RestController;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 
@@ -361,81 +363,93 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         List<ArchiveFile> archiveFiles = dto1.getList();
         FindAndReplaceDto dto = dto1.getDto();
         List<ArchiveFile> updates = new ArrayList<>();
+
         for (ArchiveFile archiveFile : archiveFiles) {
-            ArchiveFile auto = new ArchiveFile();
-            if (dto.getType() == 1) {
-                if (StringUtils.isNotEmpty(dto.getQuery()) && StringUtils.isNotEmpty(dto.getReplace())) {
-                    String name = archiveFile.getFileName();
-                    if (StringUtils.isNotEmpty(name) && name.contains(dto.getQuery())) {
-                        StringBuilder sb = new StringBuilder();
-                        int lastIndex = 0;
-                        // 查找所有匹配的位置
-                        int index = name.indexOf(dto.getQuery());
-                        while (index != -1) {
-                            // 添加未处理部分(从上一个 lastIndex 到当前 index)
-                            sb.append(name, lastIndex, index);
-
-                            // 根据位置插入替换内容
-                            if (dto.getPosition() != null) {
-                                switch (dto.getPosition()) {
-                                    case 1: // 在查询内容前插入
-                                        sb.append(dto.getReplace());
-                                        sb.append(dto.getQuery());
-                                        break;
-                                    case 2: // 在查询内容后插入
-                                        sb.append(dto.getQuery());
-                                        sb.append(dto.getReplace());
-                                        break;
-                                    default:
-                                        throw new ServiceException("请选择正确的定位条件");
-                                }
-                            } else {
-                                sb.append(dto.getQuery()); // 没有指定位置时保留原内容
-                            }
-                            // 更新 lastIndex 到当前匹配结束位置
-                            lastIndex = index + dto.getQuery().length();
-                            // 继续查找下一个匹配项
-                            index = name.indexOf(dto.getQuery(), lastIndex);
-                        }
-                        // 添加剩余的部分
-                        sb.append(name.substring(lastIndex));
-                        // 更新名称
-                        archiveFile.setFileName(sb.toString());
-                        auto.setId(archiveFile.getId());
-                        auto.setFileName(archiveFile.getFileName());
-                        updates.add(auto);
-                    }
-                }
-            } else if (dto.getType() == 2) {
-                if (StringUtils.isNotEmpty(dto.getQuery()) && StringUtils.isNotEmpty(dto.getReplace())) {
-                    String name = archiveFile.getFileName();
-                    if (StringUtils.isNotEmpty(name) && name.contains(dto.getQuery())) {
-                        String newName = name.replaceAll(dto.getQuery(), dto.getReplace());
-                        archiveFile.setFileName(newName);
-                        auto.setId(archiveFile.getId());
-                        auto.setFileName(archiveFile.getFileName());
-                        updates.add(auto);
-                    }
-                }
-            } else {
-                if (StringUtils.isNotEmpty(dto.getQuery())) {
-                    String name = archiveFile.getFileName();
-                    if (StringUtils.isNotEmpty(name) && name.contains(dto.getQuery())) {
-                        String newName = name.replaceAll(dto.getQuery(), "");
-                        archiveFile.setFileName(newName);
-                        auto.setId(archiveFile.getId());
-                        auto.setFileName(archiveFile.getFileName());
-                        updates.add(auto);
-                    }
-                }
+            String originalName = archiveFile.getFileName();
+            if (StringUtils.isEmpty(originalName) || StringUtils.isEmpty(dto.getQuery())) {
+                continue;
+            }
+
+            if (!originalName.contains(dto.getQuery())) {
+                continue;
+            }
+
+            String newName = processFileName(originalName, dto);
+            if (!originalName.equals(newName)) {
+                ArchiveFile update = new ArchiveFile();
+                update.setId(archiveFile.getId());
+                update.setFileName(newName);
+                updates.add(update);
             }
         }
+
         if (!updates.isEmpty()) {
             return iArchiveFileService.updateBatchById(updates);
         }
         return true;
     }
 
+    private String processFileName(String fileName, FindAndReplaceDto dto) {
+        String query = dto.getQuery();
+        String replace = dto.getReplace();
+
+        switch (dto.getType()) {
+            case 1: // 在指定位置插入
+                return handleInsertAtPosition(fileName, query, replace, dto.getPosition());
+
+            case 2: // 普通替换
+                return handleReplace(fileName, query, replace, false);
+
+            default: // 删除匹配内容
+                return handleReplace(fileName, query, "", true);
+        }
+    }
+
+    private String handleInsertAtPosition(String fileName, String query, String replace, Integer position) {
+        if (position == null) {
+            return fileName; // 没有指定位置时保持原样
+        }
+
+        StringBuilder sb = new StringBuilder();
+        int lastIndex = 0;
+        int index = fileName.indexOf(query);
+
+        while (index != -1) {
+            // 添加未处理部分
+            sb.append(fileName, lastIndex, index);
+
+            // 根据位置插入内容
+            switch (position) {
+                case 1: // 在查询内容前插入
+                    sb.append(replace).append(query);
+                    break;
+                case 2: // 在查询内容后插入
+                    sb.append(query).append(replace);
+                    break;
+                default:
+                    throw new ServiceException("请选择正确的定位条件");
+            }
+
+            lastIndex = index + query.length();
+            index = fileName.indexOf(query, lastIndex);
+        }
+
+        // 添加剩余部分
+        sb.append(fileName.substring(lastIndex));
+        return sb.toString();
+    }
+
+    private String handleReplace(String fileName, String query, String replacement, boolean isLiteral) {
+        if (isLiteral) {
+            // 字面量替换(避免正则表达式特殊字符问题)
+            return fileName.replace(query, replacement);
+        } else {
+            // 使用正则表达式替换,需要转义特殊字符
+            String escapedQuery = Pattern.quote(query); // 自动转义所有特殊字符
+            return fileName.replaceAll(escapedQuery, Matcher.quoteReplacement(replacement));
+        }
+    }
+
     @Override
     public List<ArchiveFile> getAllArchiveFileByIds(List<String> strList) {
         return fileMapper.getAllArchiveFileByIds(strList);