From ef4a26bca3552aed5865e5ef3ef2804b8509d31b Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 08 七月 2025 13:57:06 +0800
Subject: [PATCH] 增加param调用接口

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java |  364 +++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 275 insertions(+), 89 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
index 3cfc5de..e2e2241 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
@@ -1,31 +1,50 @@
 
 package org.springblade.mdm.program.service;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.ZipArchiveInputStream;
 import org.apache.commons.compress.archivers.zip.ZipFile;
 import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
+import org.apache.commons.io.IOUtils;
+import org.springblade.core.mp.base.BizEntity;
 import org.springblade.core.mp.base.BizServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+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.FileUtil;
-import org.springblade.mdm.basesetting.machine.vo.MachineVO;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.mdm.flow.entity.ApproveRecord;
+import org.springblade.mdm.flow.service.CureFlowService;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.entity.NcProgram;
 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.utils.CustomBinaryReader;
+import org.springblade.mdm.utils.FileExchangeUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.*;
 
 /**
- * 涓嬪彂/鍥炰紶绋嬪簭缁熻
+ * 绋嬪簭浜ゆ崲锛坉nc瀵煎叆/瀵煎嚭锛�
  *
  * @author yangys
  */
@@ -33,118 +52,285 @@
 @Service
 @AllArgsConstructor
 public class NcProgramExchangeService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
+	private final CureFlowService cureFlowService;
+	private final NcProgramService ncProgramService;
+	private final NcNodeService ncNodeService;
+	private final OssTemplate ossTemplate;
+	private final BladeRedis bladeRedis;
 
+	private String getFileKey(){
+		return "dncexpfile-"+ AuthUtil.getUserId();
+	}
 	/**
-	 * dnc鍥炰紶鏂囦欢涓婁紶
-	 * @param file
+	 * dnc鍥炰紶鏂囦欢涓婁紶锛堣В鏋愬悗淇濆瓨鍏pload琛級
+	 * @param file DNC鍥炰紶鏂囦欢
 	 * @return
 	 */
-	public void dncSendBackUpload(MultipartFile file) {
-		List<DncSendBackData> list=new ArrayList<>();
+	public List<DncSendBackData> dncSendBackUpload(MultipartFile file) {
+		List<DncSendBackData> list;
 		try {
-			String fileName = file.getOriginalFilename();
-			InputStream fileInputStream = file.getInputStream();
+			BladeFile bfile = ossTemplate.putFile(file);//涓婁紶锛屼緵鍚庣画鍏ュ簱浣跨敤
+			//璁剧疆涓�涓紦瀛橈紝2灏忔椂杩囨湡
+			bladeRedis.setEx(getFileKey(),bfile.getName(), Duration.ofHours(2));
 
-			byte[] bytes = FileUtil.copyToByteArray(fileInputStream);
+			//InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
+			InputStream zipFileInputStream = file.getInputStream();//test
+
+			byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
 			list = parseDncZipFromByteArray(bytes);
-			for(DncSendBackData dncSendBackData:list){
-				NcProgramExchange exchange=new NcProgramExchange();
-				exchange.setName(dncSendBackData.getProgramName());
-				exchange.setStatus(1);//宸插鍏�
-				this.save(exchange);
-
-			}
 
 		} catch (IOException e) {
-			log.error("涓婁紶dnc鏂囦欢澶辫触",e);
+			log.error("涓婁紶dnc鍥炰紶鏂囦欢澶辫触",e);
+			list = Collections.emptyList();
 		}
-
+		return list;
 	}
 
-	public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
-		//List<DncSendBackData> datas = new ArrayList<>();
-		List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
+	InputStream convertFileToZip(InputStream inputStream) throws IOException {
+
+		File tempFile = createTempFile();
+		FileOutputStream fos = new FileOutputStream(tempFile);
+		CustomBinaryReader.read(inputStream,fos);
 
 
+		FileInputStream dInstream = new FileInputStream(tempFile);
 
-		/*
-		try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData);
-			 ZipArchiveInputStream zis = new ZipArchiveInputStream(bis)) {
-
-
-			ZipArchiveEntry entry;
-			while ((entry = zis.getNextZipEntry()) != null) {
-				DncSendBackData prog = new DncSendBackData();
-				prog.setProgramName(entry.getName());
-				if (!entry.isDirectory()) {
-					System.out.println("鏂囦欢鍚�: " + entry.getName());
-					System.out.println("澶у皬: " + entry.getSize());
-
-					// 璇诲彇鏂囦欢鍐呭鍒板瓧鑺傛暟缁�
-					ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-					IOUtils.copy(zis, outputStream);
-					byte[] fileContent = outputStream.toByteArray();
-
-					// 澶勭悊鏂囦欢鍐呭...
-					System.out.println("鍐呭闀垮害: " + fileContent.length);
-				}else{
-					//鏂囦欢澶癸紝璇诲唴閮ㄦ枃浠讹紝鑾峰彇鏂囦欢鍒楄〃
-
-					System.out.println("鏂囦欢澶圭▼搴忥細"+entry.getName());
-					List<String> children = new ArrayList<>();
-					prog.setChildren(children);
-				}
-
-				datas.add(prog);
-			}
-
-
-		}*/
-		return datas;
+		return dInstream;
 	}
+
 	/**
-	 * 绋嬪簭涓嬪彂缁熻鍒嗛〉鏌ヨ
-	 * @param query 鏌ヨ鍙傛暟
+	 * 鍒涘缓涓�涓复鏃舵枃浠�
 	 * @return
+	 * @throws IOException
 	 */
-	public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
-
-		IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
-
-		return page;
-
+	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();
 	}
-}
-
-
-class ZipFileDirectoryScanner {
-
-	public static List<DncSendBackData> getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException {
+	public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
 		List<DncSendBackData> list = new ArrayList<>();
+		//List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
 
-		if (!dirPath.endsWith("/")) {
-			dirPath += "/";
-		}
-
+		Map<String,String> fileMd5Map = new HashMap<>();
+		Map<String,DncSendBackData> fileDataMap = new HashMap<>();
 		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
 			 ZipFile zipFile = new ZipFile(channel)) {
 
+			ZipArchiveEntry entry;
 			Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
 			while (entries.hasMoreElements()) {
-				ZipArchiveEntry entry = entries.nextElement();
+			//while ((entry = zis.getNextZipEntry()) != null) {
+				entry = entries.nextElement();
+				DncSendBackData prog = new DncSendBackData();
 				String entryName = entry.getName();
-				DncSendBackData d = new DncSendBackData();
-				d.setProgramName(entryName);
-				if(entry.isDirectory()){
-					d.setHasChildren(true);
-				}
-				list.add(d);
 
-				//if (entryName.startsWith(dirPath) && !entry.isDirectory()) {
-				//	fileList.add(entryName);
-				//}
+				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);
+								DncSendBackData d = new DncSendBackData();
+								d.setProgramName(jsonObject.getString("name"));
+								d.setId(jsonObject.getLong("id"));
+								d.setProgramNo(jsonObject.getString("code"));
+								d.setFileBackTime(LocalDateTime.now());//鍒拌揪鏃堕棿
+
+								fileDataMap.put(d.getProgramName(),d);
+								list.add(d);
+							}
+
+						}
+					}else{
+						try (InputStream inputStream = zipFile.getInputStream(entry)) {
+							fileMd5Map.put(entryName,DigestUtils.md5Hex(inputStream));//鑾峰彇鏂囦欢MD5
+						}
+
+					}
+
+				}
+
+			}
+
+		}
+		//璁剧疆md5鍊�
+		fileDataMap.forEach((k,v)->{
+			if(fileMd5Map.containsKey(k)){
+				v.setMd5(fileMd5Map.get(k));
+			}
+		});
+		return list;
+	}
+
+
+	/**
+	 * 鍏ュ簱鍥炰紶鏂囦欢,骞跺惎鍔ㄥ浐鍖栨祦绋�
+	 * @param ids id鍒楄〃閫楀彿鍒嗛殧
+	 * @return
+	 */
+	public void dncFileAccept(String ids) throws IOException {
+		List<Long> idList = Func.toLongList(ids);
+		//
+		NcProgramExchange exchange;
+		String pkgFileName = bladeRedis.get(getFileKey());
+		updateProgramData(pkgFileName,idList);
+		List<NcProgram> progList = ncProgramService.listByIds(idList);
+		for(NcProgram prog:progList){
+			exchange = new NcProgramExchange();
+			exchange.setName(prog.getName());
+			exchange.setExchangeType(2);//鍥炰紶
+			exchange.setNcProgramId(prog.getId());
+
+			this.save(exchange);
+
+		}
+
+		cureFlowService.startCure(progList);
+	}
+
+	void updateProgramData(String pkgFileName,List<Long> idList) throws IOException {
+		InputStream inputStream = this.ossTemplate.statFileStream(pkgFileName);
+		byte[] bytes = FileUtil.copyToByteArray(inputStream);
+
+		List<NcNode> nodeList = new ArrayList<>();
+		List<NcProgram> progList = new ArrayList<>();
+
+		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
+			 ZipFile zipFile = new ZipFile(channel)) {
+
+			ZipArchiveEntry entry;
+			Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
+			while (entries.hasMoreElements()) {
+				entry = entries.nextElement();
+
+				String entryName = entry.getName();
+
+				if (entry.isDirectory()) {
+					continue;
+				}
+				if(entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)){
+
+					try (InputStream insJson = zipFile.getInputStream(entry)) {
+						String jsonStr = IoUtil.readToString(insJson);
+
+						JSONArray jsonArray = JSONArray.parseArray(jsonStr);
+						for(int i=0;i<jsonArray.size();i++){
+							JSONObject jsonObject = jsonArray.getJSONObject(i);
+							NcProgram program = new NcProgram();
+							program.setId(jsonObject.getLong("id"));
+							if(!idList.contains(program.getId())){//涓嶆槸閫夊畾鍏ュ簱鐨�
+								continue;
+							}
+							program.setName(jsonObject.getString("name"));
+
+							program.setCode(jsonObject.getString("code"));
+							program.setDescription(jsonObject.getString("description"));
+							program.setCategory(jsonObject.getString("category"));
+							program.setBindNcNodeId(jsonObject.getLong("bindNcNodeId"));
+							program.setIsLastEdition(jsonObject.getInteger("isLastEdition"));
+							program.setIsLocked(jsonObject.getInteger("isLocked"));
+							program.setIsTest(jsonObject.getInteger("isTest"));
+							program.setMachineCode(jsonObject.getString("machineCode"));
+							program.setNcNodeId(jsonObject.getLong("ncNodeId"));
+							program.setPartNo(jsonObject.getString("partNo"));
+							program.setProcessEdition(jsonObject.getString("processEdition"));
+
+							setBaseProperties(program,jsonObject);
+
+							progList.add(program);
+						}
+
+					}
+				}else if(entryName.equals(NcProgramExportDNCService.NODE_JSON_FILE)){
+					try (InputStream insJson = zipFile.getInputStream(entry)) {
+						String jsonStr = IoUtil.readToString(insJson);
+						JSONArray jsonArray = JSONArray.parseArray(jsonStr);
+						for (int i = 0; i < jsonArray.size(); i++) {
+							JSONObject jsonObject = jsonArray.getJSONObject(i);
+							NcNode node = new NcNode();
+							node.setId(jsonObject.getLong("id"));
+							node.setName(jsonObject.getString("name"));
+							node.setDescription(jsonObject.getString("description"));
+							node.setNodeType(jsonObject.getString("nodeType"));
+							node.setProcessName(jsonObject.getString("processName"));
+							node.setPartNo(jsonObject.getString("partNo"));
+							node.setMachineCode(jsonObject.getString("machineCode"));
+							node.setParentId(jsonObject.getLong("parentId"));
+							node.setParentIds(jsonObject.getString("parentIds"));
+							node.setIsCured(jsonObject.getInteger("isCured"));
+
+							setBaseProperties(node,jsonObject);
+
+							nodeList.add(node);
+						}
+					}
+				}
+
+			}
+
+		}
+
+		//涓婁紶鍘嬬缉鍖呭唴鐨勭▼搴忓苟鏇存柊绋嬪簭鏂囦欢鍦板潃
+		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
+			 ZipFile zipFile = new ZipFile(channel)) {
+
+			ZipArchiveEntry entry;
+			Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
+			while (entries.hasMoreElements()) {
+				entry = entries.nextElement();
+
+				String entryName = entry.getName();
+
+				if (!entry.isDirectory() && !NcProgramExportDNCService.isDataFile(entryName)) {
+
+					for(NcProgram prog:progList){
+						if(prog.getName().equals(entryName)){
+							try (InputStream ncFileStream = zipFile.getInputStream(entry)) {
+								BladeFile bfile = this.ossTemplate.putFile(prog.getName(),ncFileStream);
+								prog.setOssName(bfile.getName());
+								prog.setUrl(bfile.getLink());
+							}
+							break;
+						}
+					}
+
+				}
 			}
 		}
-		return list;
+
+		for(NcNode node:nodeList){
+			NcNode nodeTemp = this.ncNodeService.getById(node.getId());
+			if(nodeTemp == null){
+				ncNodeService.save(node);
+			}else{
+				ncNodeService.updateById(node);
+			}
+		}
+
+		for(NcProgram prog:progList){
+			NcProgram ncTemp = ncProgramService.getById(prog.getId());
+			if(ncTemp == null){
+				ncProgramService.save(prog);
+			}else{
+				ncProgramService.updateById(prog);
+			}
+		}
+
+	}
+
+	void setBaseProperties(BizEntity entity, JSONObject jsonObject){
+		entity.setCreateTime(jsonObject.getDate("createTime"));
+		entity.setUpdateTime(jsonObject.getDate("updateTime"));
+		entity.setStatus(jsonObject.getInteger("status"));
+		entity.setCreateUser(jsonObject.getLong("createUser"));
+		entity.setUpdateUser(jsonObject.getLong("updateUser"));
 	}
 }

--
Gitblit v1.9.3