From 4d014f9795032d7ef02bcc8050384f7cca1738a8 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期一, 22 九月 2025 22:45:46 +0800
Subject: [PATCH] 优化文件名检查;zip文件解析加入多编码检验

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java     |  119 ++++++++++++++++++++++++---------------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java       |    2 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java |    1 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java       |    2 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java        |    7 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java                  |    3 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java   |    3 +
 7 files changed, 88 insertions(+), 49 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
index 8900f01..90f6a9b 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
@@ -7,7 +7,7 @@
 	/**
 	 * 绋嬪簭鏂囦欢鍚� 姝e垯
 	 */
-	public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9]+)-([0-9a-zA-Z]+)-(\\d+)-(\\d+)-?([Pp]\\d*)?(\\.*[a-zA-Z]*)$");
+	public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9a-zA-Z]+)-([0-9a-zA-Z]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
 
 	//public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("[\\w\\-]+\\-\\w+\\-\\w+");
 	public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("([\\w\\-]+)-[0-9a-zA-Z]+-[0-9a-zA-Z]+");
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
index 9e5d400..7424997 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
@@ -47,6 +47,6 @@
 		return StringUtils.isNotBlank(this.drawingNo)
 			&& StringUtils.isNotBlank(this.processNo)
 			&& StringUtils.isNotBlank(this.processEdition)
-			&& this.segmentCount > 0 && this.segmentNo > 0;
+			&& this.segmentCount > 0 && this.segmentNo > 0 && this.segmentCount>=this.segmentNo;
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
index 5708e6f..8c2509c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -37,11 +37,13 @@
 import org.springblade.mdm.utils.ProgramFileNameParser;
 import org.springblade.mdm.utils.ZipTextFileContentUtil;
 import org.springblade.system.pojo.entity.DictBiz;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
@@ -51,6 +53,7 @@
 import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
 
 /**
  * DNC鍥炰紶鏂囦欢澶勭悊鏈嶅姟
@@ -59,23 +62,27 @@
  */
 @Slf4j
 @Service
-@AllArgsConstructor
 public class DNCSendBackService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
-	private final CureFlowService cureFlowService;
-	private final QinzheFgbService qinzheFbgService;
-	private final NcNodeService ncNodeService;
-	private final OssTemplate ossTemplate;
-	private final BladeRedis bladeRedis;
-	private final FlowCommonService flowCommonService;
-	private final DncBackFileService dncBackFileService;
-	private final MachineService machineService;
-	private final ParamService paramService;
+	@Autowired
+	private CureFlowService cureFlowService;
+	@Autowired
+	private NcNodeService ncNodeService;
+	@Autowired
+	private OssTemplate ossTemplate;
+	@Autowired
+	private BladeRedis bladeRedis;
+	@Autowired
+	private FlowCommonService flowCommonService;
+	@Autowired
+	private DncBackFileService dncBackFileService;
+	@Autowired
+	private MachineService machineService;
 
 	/**
 	 * 鍋忕鍗曟枃浠舵湯灏剧殑妯″紡锛歅+鏁板瓧
 	 */
 	private static final String P_NUMBER_PATTERN = "(?i)P\\d+";
-
+	static String[] encodings = {"UTF-8","GBK", "GB2312", "ISO-8859-1"};
 	private String getFileKey(){
 		return "dncimpfile-"+ AuthUtil.getUserId();
 	}
@@ -112,19 +119,47 @@
 	/**
 	 * 浠庡帇缂╁寘 瑙f瀽鍥炰紶绋嬪簭鍒楄〃锛岃繖閲岃В鏋愮洰褰曞嵆鍙紝鐩綍灏辨槸绋嬪簭鍖呭悕
 	 * @param inputStream 鍘嬬缉鍖呰緭鍏ユ祦
+	 * @return 鏂囦欢鎿嶄綔寮傚父
+	 */
+	List<DncSendBackData> parseProgramListFromZip(InputStream inputStream) throws IOException {
+		List<DncSendBackData> result = null;
+
+		ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
+		for (String encoding : encodings) {
+			try {
+				result = parseProgramListByCharset(byteInsStream,Charset.forName(encoding));
+				log.error("浣跨敤缂栫爜 {} 瑙f瀽鎴愬姛 ",encoding);
+				break;
+			} catch (Exception e) {
+				byteInsStream.reset();
+				log.error("浣跨敤缂栫爜 {} 瑙f瀽澶辫触: ",encoding,e);
+			}
+		}
+		if(result != null) {
+			return result;
+		}else{
+			return Collections.emptyList();
+		}
+	}
+	/**
+	 * 浠庡帇缂╁寘 瑙f瀽鍥炰紶绋嬪簭鍒楄〃锛岃繖閲岃В鏋愮洰褰曞嵆鍙紝鐩綍灏辨槸绋嬪簭鍖呭悕
+	 * @param inputStream 鍘嬬缉鍖呰緭鍏ユ祦
 	 * @return 鍥炰紶绋嬪簭鍒楄〃
 	 * @throws IOException 鏂囦欢鎿嶄綔寮傚父
 	 */
-	List<DncSendBackData> parseProgramListFromZip(InputStream inputStream) throws IOException {
+	List<DncSendBackData> parseProgramListByCharset(InputStream inputStream,Charset charset) throws IOException {
 		List<DncSendBackData> list = new ArrayList<>();
+
 		Path tempZipFile = createTempFile(inputStream);
 
 		List<String> fileEntryNameList = new ArrayList<>();
 		List<String> dirEntryNameList = new ArrayList<>();//绋嬪簭鍖呭悕+宸ュ簭鐗堟 浣滀负鏂囦欢澶瑰悕
-		try (ZipFile zipFile = new ZipFile(tempZipFile.toFile())) {
 
+
+		ZipEntry entry;
+		try (ZipFile zipFile = new ZipFile(tempZipFile.toFile(),charset)) {
 			Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
-			ZipEntry entry;
+
 			//鑾峰彇鎵�鏈夌殑entry鍚嶇О
 			while (zipEntries.hasMoreElements()) {
 				entry = zipEntries.nextElement();
@@ -208,36 +243,7 @@
 		return list;
 	}
 
-	/**
-	 * 淇绋嬪簭鍖呭悕,fanuc涓嶈瘑鍒笅鍒掔嚎锛屼笅鍙戞椂杞崲涓轰簡-锛岃繖閲岄渶瑕佺‘璁ゃ�傚簲璇ユ槸浠庡鍑鸿褰曚腑鏌ユ壘淇敼鍚庣殑鍖呭悕锛屼絾鏄幇鍦虹紪鍒剁殑娌℃湁鍜嬪姙锛�
-	 * @param packageNameInZip
-	 * @return
-	 */
-	/*
-	private String fixProgramPackageName(String packageNameInZip) {
-		Matcher matcher = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher(packageNameInZip);
 
-		String drawingNo = null;
-		if(matcher.find()) {
-			drawingNo = matcher.group(1);
-		}
-		String processNo = null;
-		if(matcher.find()) {
-			processNo = matcher.group(2);
-		}
-
-		String processEdition = null;
-		if(matcher.find()) {
-			processEdition = matcher.group(3);
-		}
-		if(drawingNo != null && processNo != null && processEdition != null) {
-			if(drawingNo.contains("_")) {
-
-			}
-		}
-		return packageNameInZip;
-	}
-	*/
 
 	/**
 	 * 鍏ュ簱鍥炰紶鏂囦欢,骞跺惎鍔ㄥ浐鍖栨祦绋�
@@ -257,7 +263,6 @@
 		cureFlowService.startCureNew(pkgIdFileMap);
 
 	}
-
 	/**
 	 * 澶勭悊鍥炰紶鏂囦欢
 	 * @param ossFileName
@@ -268,12 +273,36 @@
 	private Map<Long, List<FlowProgramFile>> dealWithBackFile(String ossFileName, List<Long> acceptIdList) throws IOException{
 		Map<Long, List<FlowProgramFile>> pkgIdFileMap = new HashMap<>();
 
+		//ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
+		for (String encoding : encodings) {
+			try {
+				pkgIdFileMap = dealWithBackFileWithCharset(ossFileName,acceptIdList,Charset.forName(encoding));
+				log.error("浣跨敤缂栫爜 {} 瑙f瀽鎴愬姛 ",encoding);
+				break;
+			} catch (Exception e) {
+				//byteInsStream.reset();
+				log.error("浣跨敤缂栫爜 {} 瑙f瀽澶辫触: ",encoding,e);
+			}
+		}
+
+		return pkgIdFileMap;
+	}
+
+	/**
+	 * 澶勭悊鍥炰紶鏂囦欢
+	 * @param inputStream
+	 * @param acceptIdList
+	 * @return
+	 * @throws IOException
+	 */
+	private Map<Long, List<FlowProgramFile>> dealWithBackFileWithCharset(String ossFileName, List<Long> acceptIdList,Charset charset) throws IOException{
+		Map<Long, List<FlowProgramFile>> pkgIdFileMap = new HashMap<>();
 		InputStream inputStream = this.ossTemplate.statFileStream(ossFileName);
 		Path tempZipFile = createTempFile(inputStream);
 		List<String> entryNameList = new ArrayList<>();
 
 		ZipEntry entry;
-		try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
+		try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile(),charset)) {
 			Enumeration<? extends ZipEntry> entries = zipFile.entries();
 			while(entries.hasMoreElements()) {
 				entry = entries.nextElement();
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
index 0d46269..93b49a6 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
@@ -104,11 +104,10 @@
 		byte[] buffer = new byte[2048];
 		try {
 			int actRead = inputStream.read(buffer);
-
 			detector.handleData(buffer, 0, actRead);
-
 			//璇嗗埆缁撴潫蹇呴』璋冪敤杩欎釜鏂规硶
 			detector.dataEnd();
+			detector.reset();
 		} catch (IOException e) {
 			throw new RuntimeException(e);
 		}
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
index 863986d..828afeb 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
@@ -64,6 +64,9 @@
 		m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("CP3X296-A-B");
 		Assertions.assertTrue(m.find());
 
+		m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("CS-A-1-1-1-P1.nc");
+		Assertions.assertTrue(m.find());
+
 
 		m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("C_P3X296-A-B");
 
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
index 65f7cc2..5598ca5 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
@@ -5,6 +5,7 @@
 public class DNCSendBackServiceTest {
 	@Test
 	public void testParseZip(){
+		DNCSendBackService service = new DNCSendBackService();
 
 	}
 }
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
index 67ad0a6..34c0bf3 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
@@ -36,4 +36,11 @@
 		Assertions.assertEquals("9",vo.getProcessNo());
 		Assertions.assertEquals("B",vo.getProcessEdition());
 	}
+	@Test
+	public void testIssValidFilename() {
+		ProgramNameVO vo = ProgramFileNameParser.parseProgramName("CS-A-1-1-1-P1.nc");
+
+		Assertions.assertTrue(vo.isValidFilename());
+	}
+
 }

--
Gitblit v1.9.3