From 8d0e7fbcb0748c95cc27b632eb723603bc7db8cb Mon Sep 17 00:00:00 2001 From: yujh Date: Fri, 28 Mar 2025 11:35:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=B1=9E=E6=80=A7=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E5=AD=97=E7=AC=A6=E4=BC=98=E5=8C=96=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=89=8B=E5=86=8C=E9=99=84=E4=BB=B6=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pal/pal/output/util/OutputWordUtil.java | 33 ++++++++++++++++-- .../repository/util/CoeProcessLevelUtil.java | 34 +++++++++++++++++++ .../repository/web/CoeProcessLevelWeb.java | 2 ++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/output/util/OutputWordUtil.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/output/util/OutputWordUtil.java index 5ace0614..e7df11e8 100755 --- a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/output/util/OutputWordUtil.java +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/output/util/OutputWordUtil.java @@ -61,6 +61,8 @@ import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.List; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static com.sini.com.spire.doc.documents.HorizontalAlignment.*; @@ -236,10 +238,10 @@ public class OutputWordUtil { PALRepositoryModel repositoryModel = PALRepositoryQueryAPIManager.getInstance().queryPalRepositoryModelByPalId(repositoryId); DCContext dcContextModel = null; List search = upFileDao.searchByRepositoryId(repositoryModel.getId(), "f"); - //读取模型附件插入手册中文档对象 if (search != null && search.size() > 0) { - + //插入前,附件名先排序先排序 + sortFilesByNumber(search); //附件如果为空,不插入附件标题 CharacterFormat format4 = new CharacterFormat(); //创建字体格式 @@ -423,6 +425,8 @@ public class OutputWordUtil { boolean isPPT = false; //如果为PPT,则生成PPT手册 if (search != null && search.size() > 0) { + //插入前,附件名先排序先排序 + sortFilesByNumber(search); long b1 = System.currentTimeMillis(); // 复制附件 for (UpfileModel upfileModel : search) { @@ -494,6 +498,8 @@ public class OutputWordUtil { if (search != null && search.size() > 0) { + //插入前,附件名先排序先排序 + sortFilesByNumber(search); long b1 = System.currentTimeMillis(); // 复制附件 for (UpfileModel upfileModel : search) { @@ -1685,6 +1691,8 @@ public class OutputWordUtil { DCContext dcContextModel = null; UserContext userContext = DispatcherRequest.getUserContext(); if (search != null && search.size() > 0) { + //插入前,附件名先排序先排序 + sortFilesByNumber(search); // 复制附件 for (UpfileModel upfileModel : search) { DCPluginProfile dcProfile = DCProfileManager.getDCProfile(CoEConstant.APP_ID, CoeFileConstant.COE_UPFILE); @@ -2814,4 +2822,25 @@ public class OutputWordUtil { e.printStackTrace(); } } + + public static void sortFilesByNumber(List fileList) { + fileList.sort( + Comparator.comparing( + OutputWordUtil::extractLeadingNumber, + Comparator.nullsLast(Comparator.naturalOrder()) + ) + ); + } + // 精准提取附件后的第一个连续数字 + private static Integer extractLeadingNumber(UpfileModel file) { + // 增强版正则表达式(核心改进点) + Pattern FILE_NUMBER_PATTERN = + Pattern.compile("^附件\\s*(\\d+)\\s*[::、,_\\-]"); // ^开头匹配防止中途匹配 + try { + Matcher matcher = FILE_NUMBER_PATTERN.matcher(file.getFileName()); + return matcher.find() ? Integer.parseInt(matcher.group(1)) : null; + } catch (Exception e) { + return null; + } + } } diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/util/CoeProcessLevelUtil.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/util/CoeProcessLevelUtil.java index 61244805..2d202d7b 100755 --- a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/util/CoeProcessLevelUtil.java +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/util/CoeProcessLevelUtil.java @@ -1929,6 +1929,40 @@ public class CoeProcessLevelUtil { return false; } + /** + * 转义文本中的特殊字符 + * @param input + * @return + */ + public static String escapeHtml(String input) { + if (input == null) { + return null; + } + StringBuilder result = new StringBuilder(); + for (char c : input.toCharArray()) { + switch (c) { + case '<': + result.append("<"); + break; + case '>': + result.append(">"); + break; + case '&': + result.append("&"); + break; + case '"': + result.append("""); + break; + case '\'': + result.append("'"); + break; + default: + result.append(c); + } + } + return result.toString(); + } + /** * 批量调整模型的文件/形状默认属性至自定义属性中 */ diff --git a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/web/CoeProcessLevelWeb.java b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/web/CoeProcessLevelWeb.java index 518f1a5f..1ec659dd 100755 --- a/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/web/CoeProcessLevelWeb.java +++ b/com.actionsoft.apps.coe.pal/src/com/actionsoft/apps/coe/pal/pal/repository/web/CoeProcessLevelWeb.java @@ -2901,6 +2901,8 @@ public class CoeProcessLevelWeb extends ActionWeb { inputValue = inputValue.replaceAll("'", "'"); inputValue = inputValue.replaceAll("\"", """); + //处理特殊字符 + inputValue = CoeProcessLevelUtil.escapeHtml(inputValue); boolean isRequired = attributeModel.getIsRequired(); String desc = attributeModel.getDesc();