From c0ccbb980be6975389f09ad13dcabd7d3156dae3 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期一, 22 九月 2025 19:03:56 +0800
Subject: [PATCH] 更新提醒-》只提醒编程员;工控网显示临时更改单号

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java |  421 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 302 insertions(+), 119 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
index ec40485..f5ac1a9 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -1,25 +1,31 @@
 
 package org.springblade.mdm.program.service;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipFile;
-import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BizServiceImpl;
-import org.springblade.core.tool.utils.FileUtil;
+import org.springblade.core.oss.OssTemplate;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.IoUtil;
-import org.springblade.mdm.flow.service.CureFlowService;
-import org.springblade.mdm.program.entity.NcProgram;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.commons.contants.RegExpConstants;
+import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
+import org.springblade.mdm.machinefile.entity.FileSendRecord;
+import org.springblade.mdm.machinefile.service.FileSendRecordService;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
-import org.springblade.mdm.program.vo.DncSendBackData;
+import org.springblade.mdm.program.service.programannotation.AnnotationProperties;
 import org.springblade.mdm.program.vo.MdmProgramImportVO;
-import org.springblade.mdm.utils.CustomBinaryReader;
+import org.springblade.mdm.utils.FileContentUtil;
+import org.springblade.mdm.utils.ProgramFileNameParser;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -27,157 +33,334 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.time.LocalDateTime;
+import java.time.Duration;
 import java.util.*;
-
+import java.nio.file.*;
+import java.util.regex.Matcher;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 /**
  * MDM绋嬪簭瀵煎叆锛堝伐鎺х綉鍔熻兘锛�
- *
+ * 鐩墠宸ユ帶缃戝睍鐜板舰寮忔湭瀹氾紝鏆傛椂瀹炵幇鏆傚仠
  * @author yangys
  */
 @Slf4j
 @Service
-@AllArgsConstructor
 public class MdmProgramImportService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
-	private final CureFlowService cureFlowService;
-	private final NcProgramService ncProgramService;
+	@Autowired
+	private BladeRedis bladeRedis;
+	@Autowired
+	private ProgramAnnotationService programAnnotationService;
+	@Autowired
+	private MachineService machineService;
+	@Autowired
+	private FileSendRecordService fileSendRecordService;
+	@Autowired
+	private OssTemplate ossTemplate;
+	private String getFileKey(){
+		return "mdmgkwimpfile-"+ AuthUtil.getUserId();
+	}
 	/**
-	 * MDM瀵煎叆鏂囦欢涓婁紶
+	 * 宸ユ帶MDM瀵煎叆鏂囦欢涓婁紶
 	 * @param file MDM娑夊瘑缃戝鍑烘枃浠�
 	 * @return
 	 */
 	public List<MdmProgramImportVO> mdmImportUpload(MultipartFile file) {
 		List<MdmProgramImportVO> list;
 		try {
-			//String fileName = file.getOriginalFilename();
-			//InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
-			InputStream zipFileInputStream = file.getInputStream();//test
-
-			byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
-			list = parseDncZipFromByteArray(bytes);
+			if(file == null || file.isEmpty()){
+				throw new ServiceException("鏂囦欢涓虹┖");
+			}
+			/*
+			if(!StringUtils.endsWith(file.getOriginalFilename(),".zip")){
+				throw new ServiceException("鏂囦欢蹇呴』涓簔ip鍖�");
+			}*/
+			String tempDir = System.getProperty("java.io.tmpdir");
+			Path tempPath = Paths.get(tempDir);
+			Path extractDir = Files.createTempDirectory(tempPath, "unzip_"+System.currentTimeMillis());
+			bladeRedis.setEx(getFileKey(),extractDir.toString(), Duration.ofHours(2));
+			if(StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),".zip")){
+				// 鍒涘缓瑙e帇鐩爣鐩綍锛堝湪涓存椂鐩綍涓嬪垱寤轰竴涓敮涓�瀛愮洰褰曪級
+				Path tempZipFile = Files.createTempFile("mdmimpfile-"+System.currentTimeMillis(), ".zip");
+				file.transferTo(tempZipFile);
+				extractZipToTempDir(tempZipFile,extractDir);
 
 
+			}else{
+				//鏅�氭枃浠讹紝鐩存帴鏀惧叆extract鏂囦欢澶�
+				String basename = FilenameUtils.getBaseName(file.getOriginalFilename());
+				String ext = FilenameUtils.getExtension(file.getOriginalFilename());
+				//Path filepath = Files.createTempFile(extractDir,basename,StringUtils.isEmpty(ext) ? "": "."+ext);
+				//Path filepath = Files.createFile();
+				file.transferTo(Paths.get(extractDir.toString()+File.separator+file.getOriginalFilename()));
+			}
+
+			//璇诲彇鏂囦欢鐩綍
+			list = readTempDir(extractDir);
 		} catch (IOException e) {
-			log.error("涓婁紶dnc鍥炰紶鏂囦欢澶辫触",e);
-			list = Collections.emptyList();
+			log.error("瀵煎叆娑夊瘑缃戞憜娓℃枃浠跺け璐�",e);
+			throw new ServiceException("瑙f瀽DNC鍥炰紶鏁版嵁澶辫触");
 		}
 		return list;
-	}
-
-	InputStream convertFileToZip(InputStream inputStream) throws IOException {
-
-		File tempFile = createTempFile();
-		FileOutputStream fos = new FileOutputStream(tempFile);
-		CustomBinaryReader.read(inputStream,fos);
-
-
-		FileInputStream dInstream = new FileInputStream(tempFile);
-
-		return dInstream;
 	}
 
 	/**
-	 * 鍒涘缓涓�涓复鏃舵枃浠�
-	 * @return
-	 * @throws IOException
+	 * 瑙e帇zip鍖呭埌涓存椂璺緞
+	 * @param zipFilePath zip鍖呮枃浠舵湇鍔″櫒涓婄殑璺緞
+	 * @param extractDir 鐩爣鐩綍
+	 * @throws IOException 鏂囦欢鎿嶄綔寮傚父
 	 */
-	File createTempFile() throws IOException {
-		Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
-		// 鍦ㄤ复鏃剁洰褰曚腑鍒涘缓鏂囦欢
-		String tfilename = "t"+System.currentTimeMillis();
-		Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp");
-		System.out.println("鍒涘缓鐨勪复鏃舵枃浠�: " + tempFile);
-		return tempFile.toFile();
-	}
-	public static List<MdmProgramImportVO> parseDncZipFromByteArray(byte[] zipData) throws IOException {
-		List<MdmProgramImportVO> list = new ArrayList<>();
-		//List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
+	public void extractZipToTempDir(Path zipFilePath,Path extractDir) throws IOException {
+		// 鑾峰彇绯荤粺涓存椂鐩綍
+		String tempDir = System.getProperty("java.io.tmpdir");
 
-		Map<String,String> fileMd5Map = new HashMap<>();
-		Map<String,MdmProgramImportVO> fileDataMap = new HashMap<>();
-		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
-			 ZipFile zipFile = new ZipFile(channel)) {
+		// 鍒涘缓瑙e帇鐩爣鐩綍锛堝湪涓存椂鐩綍涓嬪垱寤轰竴涓敮涓�瀛愮洰褰曪級
+		try (InputStream fis = Files.newInputStream(zipFilePath);
+			 ZipInputStream zis = new ZipInputStream(fis)) {
 
-			ZipArchiveEntry entry;
-			Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
-			while (entries.hasMoreElements()) {
-			//while ((entry = zis.getNextZipEntry()) != null) {
-				entry = entries.nextElement();
-				DncSendBackData prog = new DncSendBackData();
-				String entryName = entry.getName();
+			ZipEntry zipEntry = zis.getNextEntry();
+			while (zipEntry != null) {
+				Path newPath = zipSlipProtect(zipEntry, extractDir);
 
-				if (!entry.isDirectory()) {
-					//鐩存帴瑙f瀽绋嬪簭鐨刯son鏂囦欢
-					if(entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)){
-
-						try (InputStream inputStream = zipFile.getInputStream(entry)) {
-							String jsonStr = IoUtil.readToString(inputStream);
-
-							JSONArray jsonArray = JSONArray.parseArray(jsonStr);
-							for(int i=0;i<jsonArray.size();i++){
-								JSONObject jsonObject = jsonArray.getJSONObject(i);
-								MdmProgramImportVO d = new MdmProgramImportVO();
-								d.setName(jsonObject.getString("name"));
-								d.setId(jsonObject.getLong("id"));
-								d.setCode(jsonObject.getString("code"));
-								//d.setFileBackTime(LocalDateTime.now());//鍒拌揪鏃堕棿
-
-								fileDataMap.put(d.getName(),d);
-								list.add(d);
-							}
-
-						}
-					}else{
-						try (InputStream inputStream = zipFile.getInputStream(entry)) {
-							fileMd5Map.put(entryName,DigestUtils.md5Hex(inputStream));//鑾峰彇鏂囦欢MD5
-						}
-
+				if (zipEntry.isDirectory()) {
+					Files.createDirectories(newPath);
+				} else {
+					// 纭繚鐖剁洰褰曞瓨鍦�
+					if (newPath.getParent() != null) {
+						Files.createDirectories(newPath.getParent());
 					}
-					System.out.println("鏂囦欢鍚�: " + entry.getName());
-					System.out.println("澶у皬: " + entry.getSize());
 
-					// 璇诲彇鏂囦欢鍐呭鍒板瓧鑺傛暟缁�
-					ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-
+					// 鍐欏叆鏂囦欢
+					try (OutputStream fos = Files.newOutputStream(newPath)) {
+						byte[] buffer = new byte[1024];
+						int len;
+						while ((len = zis.read(buffer)) > 0) {
+							fos.write(buffer, 0, len);
+						}
+					}
 				}
-
+				zipEntry = zis.getNextEntry();
 			}
-
+			zis.closeEntry();
 		}
-		//璁剧疆md5鍊�
-		fileDataMap.forEach((k,v)->{
-			if(fileMd5Map.containsKey(k)){
-				v.setMd5(fileMd5Map.get(k));
+	}
+
+	/**
+	 * 闃叉ZIP Slip鏀诲嚮
+	 * @param zipEntry zip鍐呴儴鏂囦欢璺緞
+	 * @param targetDir 鐩爣鏂囦欢澶�
+	 * @return 鏂囦欢璺緞
+	 * @throws IOException 鎿嶄綔鏂囦欢IO寮傚父
+	 */
+	Path zipSlipProtect(ZipEntry zipEntry, Path targetDir) throws IOException {
+		Path targetDirResolved = targetDir.resolve(zipEntry.getName());
+
+		// 瑙勮寖鍖栬矾寰�
+		Path normalizePath = targetDirResolved.normalize();
+
+		if (!normalizePath.startsWith(targetDir)) {
+			throw new IOException("鎭舵剰ZIP鏉$洰: " + zipEntry.getName());
+		}
+
+		return normalizePath;
+	}
+
+	/**
+	 * 璇诲彇瑙e帇鏂囦欢澶逛笅鎵�鏈夋枃浠� 瑙f瀽鎴恦o鍒楄〃
+	 * @param extractDir 瑙e帇鏂囦欢澶�
+	 * @return vo鍒楄〃
+	 * @throws IOException 瑙f瀽鏂囦欢鐨勫紓甯�
+	 */
+	public List<MdmProgramImportVO> readTempDir(Path extractDir) throws IOException {
+		List<MdmProgramImportVO> list = new ArrayList<>();
+		try (Stream<Path> paths = Files.walk(extractDir)) {
+			List<Path> filePathList = paths
+				.filter(Files::isRegularFile).toList();  // 鍙繚鐣欐櫘閫氭枃浠讹紝鎺掗櫎鐩綍
+				//.collect(Collectors.toList());
+			//System.out.println("鎵�鏈夋枃浠�"+filePathList);
+			for(Path path : filePathList){
+				list.add(readFileToVO(path));
 			}
-		});
+		}
+		/*
+		//璇诲彇鎵�鏈夋枃浠跺す
+		try (DirectoryStream<Path> stream = Files.newDirectoryStream(extractDir)) {
+			for (Path path : stream) {
+				if (Files.isDirectory(path)) {
+					// 濡傛灉鏄瓙鐩綍锛岃鍙栧叾涓殑鏂囦欢
+					try (DirectoryStream<Path> subStream = Files.newDirectoryStream(path)) {
+						for (Path subPath : subStream) {
+							if (Files.isRegularFile(subPath)) {
+								System.out.println("鎵惧埌鏂囦欢: " + subPath);
+							}
+						}
+					}
+				} else if (Files.isRegularFile(path)) {
+					System.out.println("鎵惧埌鏂囦欢2: " + path);
+					//杩欓噷 鎵惧埌鐨勬枃浠朵笉鏄�
+					list.add(readFileToVO(path));
+				}
+			}
+		}*/
 		return list;
 	}
 
+	/**
+	 * 灏嗘枃浠剁粍缁囨垚VO
+	 * @param path 鏂囦欢path
+	 * @return vo
+	 */
+	MdmProgramImportVO readFileToVO(Path path){
+		MdmProgramImportVO vo = new MdmProgramImportVO();
+		vo.setFilename(path.getFileName().toString());
 
+		ProgramNameVO pnmameVO = ProgramFileNameParser.parseProgramName(vo.getFilename());
+		vo.setDrawingNo(pnmameVO.getDrawingNo());
+		//vo.setDrawingNo(parseDrawingNo(vo.getFilename()));
+
+		try (InputStream inputStream = Files.newInputStream(path)) {
+			// 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+			byte[] buffer = new byte[2000];
+			inputStream.read(buffer);
+			vo.setMd5(DigestUtils.md5Hex(buffer));
+		} catch (IOException e) {
+			log.error("璇诲彇鏂囦欢md5澶辫触",e);
+		}
+
+		try (InputStream inputStream = Files.newInputStream(path, StandardOpenOption.READ)) {
+			// 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+			ByteArrayInputStream bas = new ByteArrayInputStream(inputStream.readAllBytes());
+
+			AnnotationProperties defAnnoProperties = AnnotationProperties.getDefault();
+			String sendPathLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getSendPathLineIndex());
+			//bas.mark(0);
+			bas.reset();
+			String statusLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getStatusLineIndex());
+			log.info("sendPathLine={}", sendPathLine);
+
+			Machine matchedMachine = machineService.getMachineBySendPathAnnotation(sendPathLine);
+
+			if (matchedMachine != null) {
+				//vo.setName(parseProgramName(vo.getFilename()));
+				vo.setName(pnmameVO.logicProgramName());
+				vo.setMachineCode(matchedMachine.getCode());
+
+				vo.setFullPath(path.toString());//鏂囦欢鍦板潃
+				vo.setSendPath(matchedMachine.getProgSendDir());
+				vo.setId(vo.getFullPath());
+				vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getControlSystem(),statusLine));
+			}
+		} catch (IOException e) {
+			log.error("璇诲彇鏂囦欢澶辫触",e);
+			throw new ServiceException("瀵煎叆绋嬪簭澶辫触"+path.getFileName().toString()+","+e.getMessage());
+		}
+		return vo;
+	}
+	/**
+	 * 瑙f瀽鍑洪浂缁勪欢濂�
+	 * @param filename
+	 * @return
+	 */
+	/*
+	String parseDrawingNo(String filename){
+
+		/*
+		String drawingNo = "";
+		int idx = filename.lastIndexOf("-");
+		String temp;
+		if(idx != -1){
+			temp = filename.substring(0,idx);
+
+			idx = temp.lastIndexOf("-");
+			if(idx != -1){
+				temp = temp.substring(0,idx);
+
+				//鍘绘帀宸ュ簭鐗堟
+				idx = temp.lastIndexOf("-");
+				if(idx != -1){
+					temp = temp.substring(0,idx);
+
+					//鍘绘帀宸ュ簭鍙�
+					idx = temp.lastIndexOf("-");
+					if(idx != -1){
+						drawingNo = temp.substring(0,idx);
+					}
+				}
+			}
+			//浠ヤ笂鍘绘帀浜嗘渶鍚�2娈垫鏁板拰娈靛彿
+
+
+		}
+		return drawingNo;
+
+
+	}
+
+	String parseProgramName(String filename){
+		String programName = "";
+		int idx = filename.lastIndexOf("-");
+		String temp;
+		if(idx != -1){
+			temp = filename.substring(0,idx);
+
+			idx = temp.lastIndexOf("-");
+			if(idx != -1){
+				temp = temp.substring(0,idx);
+
+				//鍘绘帀宸ュ簭鐗堟
+				idx = temp.lastIndexOf("-");
+				if(idx != -1){
+					programName = temp.substring(0,idx);
+				}
+			}
+			//浠ヤ笂鍘绘帀浜嗘渶鍚�2娈垫鏁板拰娈靛彿
+		}
+		return programName;
+	}
+*/
 	/**
 	 * 鍏ュ簱mdm娑夊瘑缃戞枃浠�
 	 * @param ids id鍒楄〃閫楀彿鍒嗛殧
-	 * @return
 	 */
-	public void mdmFileAccept(String ids) {
-		/*
-		List<Long> idList = Func.toLongList(ids);
-		List<NcProgram> progList = ncProgramService.listByIds(idList);
-		NcProgramExchange exchange;
-		//NcProgram program;
-		//NcNode programNode;
+	public void mdmFileAccept(String ids) throws IOException {
 
-		for(NcProgram prog:progList){
-			exchange = new NcProgramExchange();
-			exchange.setName(prog.getName());
-			exchange.setExchangeType(2);//鍥炰紶
-			exchange.setNcProgramId(prog.getId());
+		List<String> idList = Func.toStrList(ids);
 
-			this.save(exchange);
-
+		String dictStr = bladeRedis.get(getFileKey());
+		if(dictStr == null){
+			throw new ServiceException("鏂囦欢缂撳瓨宸茶繃鏈燂紝璇烽噸鏂颁笂浼犳枃浠躲��");
 		}
-	//鐩存帴鍏ュ簱锛屾棤娴佺▼
-		*/
+		Path extractDir = Paths.get(dictStr);
+		List<MdmProgramImportVO> list = readTempDir(extractDir);
+
+		String destFileFull;
+		for(String str : idList){
+			Optional<MdmProgramImportVO> optVO = list.stream().filter(vo -> vo.getId().equals(str)).findFirst();
+
+			if(optVO.isEmpty()){
+				continue;
+			}
+
+			MdmProgramImportVO vo = optVO.get();
+
+			destFileFull = vo.getSendPath()+File.separator+vo.getFilename();
+			File destFile = new File(destFileFull);
+			FileUtils.forceMkdirParent(destFile);
+			FileUtils.copyFile(new File(str),destFile);
+
+			FileSendRecord record = new FileSendRecord();
+			record.setName(destFile.getName());
+			Path destPath = Paths.get(destFileFull);
+			record.setMachineCode(vo.getMachineCode());
+			record.setFileSize(Files.size(destPath));
+
+			try(InputStream inputStream = new FileInputStream(destFile)){
+				BladeFile bFile = ossTemplate.putFile(record.getName(), inputStream);
+				record.setOssName(bFile.getName());
+			}
+			fileSendRecordService.save(record);
+		}
 
 	}
 }

--
Gitblit v1.9.3