From 20ab1a89880e5c6041707e5866260d5ab7ecd983 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期六, 23 八月 2025 22:10:55 +0800
Subject: [PATCH] 增加工控网rec文件夹移动到temp功能

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java           |    9 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java |    8 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirClearTask.java           |  235 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 245 insertions(+), 7 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java
index 8cfa102..036fe3c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java
@@ -201,5 +201,11 @@
 		return this.lambdaQuery().eq(Machine::getCode, machineCode).one();
 	}
 
-
+	/**
+	 * 鑾峰彇鎵�鏈夊惎鐢ㄧ姸鎬佺殑鏈哄簥鍒楄〃
+	 * @return 鏈哄簥鍒楄〃
+	 */
+    public List<Machine> getEnableMachines() {
+		return lambdaQuery().eq(Machine::getStatus,Machine.STATUS_ENABLE).list();
+    }
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java
index 572b22c..a573dd5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java
@@ -3,8 +3,6 @@
 import com.alibaba.excel.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
-import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.mdm.basesetting.machine.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.service.ParamService;
@@ -14,8 +12,6 @@
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
-
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
@@ -39,9 +35,10 @@
 	// 姣�5绉掓墽琛屼竴娆�
 	//@Scheduled(fixedRate = 1000000)
 	//@Scheduled(cron = "0 1 0 * * ?") // 姣忓ぉ涓婂崍0鐐�1鍒嗘墽琛�
-	@Scheduled(cron = "0 */5 * * * ?")
+	//@Scheduled(cron = "0 */5 * * * ?")
 	//@Scheduled(cron = "0 15 19 * * ?") //test
-	public void executeEvery5Seconds() {
+	@Scheduled(cron = "${task.cron.machine_file_scan:0 1 * * * ?}")
+	public void execute() {
 		String networkType = paramService.getParamValue(ParamService.NETWORK_TYPE,ParamService.NETWORK_TYPE_SHEMI);
 
 		if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)){
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirClearTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirClearTask.java
new file mode 100644
index 0000000..d3feda8
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirClearTask.java
@@ -0,0 +1,235 @@
+package org.springblade.mdm.task;
+
+import com.alibaba.excel.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.gkw.programnode.entity.MachineFile;
+import org.springblade.mdm.gkw.programnode.service.MachineFileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鏈哄簥鍥炰紶鏂囦欢澶箁ec锛岀洰褰曟枃浠惰秴杩囨満搴婅瀹氱殑鏃堕棿绉诲姩鍒皌emp鏂囦欢澶�
+ */
+@Slf4j
+@Component
+@EnableScheduling
+public class ReceiveDirClearTask {
+	@Autowired
+	private MachineFileService machineFileService;
+	@Autowired
+	private MachineService machineService;
+	@Autowired
+	private ParamService paramService;
+	/**
+	 * 鏂囦欢榛樿淇濆瓨灏忔椂鏁�
+	 */
+	private static final int DEFAULT_HOUR = 8;
+	// 姣�5绉掓墽琛屼竴娆�
+	//@Scheduled(fixedRate = 1000000)
+	//@Scheduled(cron = "0 1 0 * * ?") // 姣忓ぉ涓婂崍0鐐�1鍒嗘墽琛�
+	//@Scheduled(cron = "0 */3 * * * ?")
+	//@Scheduled(cron = "0 15 19 * * ?") //test
+	//@Scheduled(cron = "${task.cron.machine_file_scan}")
+	@Scheduled(cron = "${task.cron.machine_rec_clean:0 3 * * * ?}")
+	public void execute() {
+		String networkType = paramService.getParamValue(ParamService.NETWORK_TYPE,ParamService.NETWORK_TYPE_SHEMI);
+
+		if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)){
+			//闈炴秹瀵嗙綉锛屾墠鎵弿鐩綍鏂囦欢
+			moveOverTimeFiles();
+		}
+
+	}
+
+	/**
+	 * 鎵弿鏁版嵁搴撹褰曪紝瓒呮椂鍒欑Щ鍔ㄦ枃浠�
+	 */
+	public void moveOverTimeFiles() {
+		List<Machine> machines = machineService.getEnableMachines();
+		LocalDateTime now = LocalDateTime.now();
+		for (Machine machine : machines) {
+			int remainHours = machine.getReceiveDirExpiryHours() != null ?machine.getReceiveDirExpiryHours():DEFAULT_HOUR;
+			LocalDateTime earlyTime = now.minusHours(remainHours);
+			List<MachineFile> overTimeFiles = this.machineFileService.lambdaQuery().lt(MachineFile::getFileCreateTime,earlyTime)
+				.eq(MachineFile::getDirType,MachineFile.DIR_TYPE_REC)
+				.eq(MachineFile::getMachineCode,machine.getCode()).list();
+
+			for(MachineFile overTimeFile : overTimeFiles){
+				try {
+					moveFileToTemp(overTimeFile, machine);
+				}catch(Exception e){
+					log.error("绉诲姩rec鏂囦欢澶辫触:"+overTimeFile.getName(),e);
+				}
+			}
+
+		}
+
+	}
+
+	/**
+	 * 鏂囦欢绉诲姩鍒皌emp
+	 * @param overTimeFile
+	 */
+	private void moveFileToTemp(MachineFile overTimeFile,Machine machine) throws IOException {
+		String srcFilepath = MachineFileService.getBasePath(machine,overTimeFile.getDirType())+ File.separator+overTimeFile.getName();
+		Path source = Paths.get(srcFilepath);
+		if(!source.toFile().exists()){
+			return;
+		}
+		String targetFilepath = MachineFileService.getBasePath(machine,MachineFile.DIR_TYPE_TEMP)+ File.separator+overTimeFile.getName();
+		Path target = Paths.get(targetFilepath);
+
+		Path targetDir = target.getParent();
+		if (targetDir != null && !Files.exists(targetDir)) {
+			Files.createDirectories(targetDir);
+		}
+
+		// 浣跨敤 REPLACE_EXISTING 閫夐」鏉ヨ鐩栧凡瀛樺湪鐨勬枃浠�
+		Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
+	}
+
+
+	/**
+	 * 鎵弿鐩綍
+	 * @param machine 鏈哄簥淇℃伅
+	 * @param dirType 鐩綍绫诲瀷
+	 * @throws IOException
+	 */
+	public void scanDir(Machine machine,String dirType) throws IOException {
+		String basePath = MachineFileService.getBasePath(machine,dirType);
+		if(basePath == null) {
+			log.warn("鐩綍绫诲瀷涓嶅尮閰�:{}",dirType);
+			return;
+		}
+		Path dirPath = Paths.get(basePath);
+		if(!dirPath.toFile().exists()){
+			log.warn("鎵弿鐩綍:{} 涓嶅瓨鍦�",dirPath);
+			return;
+		}
+		// 鍙寘鍚櫘閫氭枃浠�
+		List<Path> files = Files.list(dirPath)
+			.filter(Files::isRegularFile).toList();
+
+		byte[] buffer = new byte[2048];
+
+		MachineFile existFileInDb;
+		//boolean exists;//鏂囦欢鏄惁瀛樺湪浜庢暟鎹簱涓�
+		for (Path filePath : files) {
+
+			existFileInDb = null;
+			//exists = false;
+
+			MachineFile mf = new MachineFile();
+
+			mf.setTenantId("000000");
+			mf.setName(filePath.toFile().getName());
+			mf.setDirType(dirType);
+			mf.setMachineCode(machine.getCode());
+
+			try {
+				BasicFileAttributes attrs = Files.readAttributes(
+					filePath,
+					BasicFileAttributes.class
+				);
+
+				FileTime creationTime = attrs.creationTime();
+				Date creationDate = new Date(creationTime.toMillis());
+				mf.setFileCreateTime(creationDate);
+
+				FileTime modifyTime = attrs.lastModifiedTime();
+				mf.setFileModifyTime(new Date(modifyTime.toMillis()));
+				mf.setFileSize(Files.size(filePath));
+				try (InputStream inputStream = Files.newInputStream(filePath)) {
+					// 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+					int bytesRead = inputStream.read(buffer);
+					mf.setMd5(DigestUtils.md5Hex(buffer));
+				} catch (IOException e) {
+					log.error("璇诲彇鏂囦欢md5澶辫触",e);
+					continue;//鏈夐敊璇�,鎺犺繃
+				}
+
+				//exists = machineFileService.fileExists(mf.getName(),dirType,machine.getCode());
+
+				existFileInDb = machineFileService.getExistsFile(mf.getName(),dirType,machine.getCode());
+				System.out.println("鏂囦欢鍒涘缓鏃堕棿: " + creationDate);
+			} catch (IOException e) {
+				log.error("璇诲彇鏂囦欢淇℃伅澶辫触",e);
+			}
+			if(existFileInDb == null) {
+				machineFileService.save(mf);
+			}else{
+				log.info("鏂囦欢宸插瓨鍦ㄦ帬杩�:{}",filePath.getFileName());
+				//宸插瓨鍦ㄥ拫鏁淬��
+				existFileInDb.setFileSize(mf.getFileSize());
+
+				existFileInDb.setFileCreateTime(mf.getFileCreateTime());
+				existFileInDb.setFileModifyTime(mf.getFileModifyTime());
+				if(!StringUtils.equals(existFileInDb.getMd5(),mf.getMd5())){
+					//鏂囦欢鍐呭鍙戠敓鍙樺寲浜�,璁剧疆鐘舵�佷负鍒濆鐘舵��
+					existFileInDb.setStatus(MachineFile.STATUS_NORMAL);
+				}
+				existFileInDb.setMd5(mf.getMd5());
+
+
+				machineFileService.updateById(existFileInDb);
+
+			}
+
+		}
+
+
+	}
+
+	/**
+	 * 娓呯悊宸茬粡鍒犻櫎浜嗘枃浠剁殑璁板綍
+	 * @param machine
+	 * @param dirType
+	 * @throws IOException
+	 */
+	void clearDeletedReccords(Machine machine,String dirType) throws IOException {
+		List<MachineFile> machineFiles =  this.machineFileService.lambdaQuery().eq(MachineFile::getDirType,dirType)
+			.eq(MachineFile::getMachineCode,machine.getCode()).list();
+
+		String basePath = MachineFileService.getBasePath(machine,dirType);
+		if(basePath == null) {
+			log.warn("鐩綍绫诲瀷涓嶅尮閰�:{}",dirType);
+			return;
+		}
+		Path dirPath = Paths.get(basePath);
+		if(!dirPath.toFile().exists()){
+			log.warn("鎵弿鐩綍:{} 涓嶅瓨鍦�",dirPath);
+			return;
+		}
+
+		List<Path> files = Files.list(dirPath)
+			.filter(Files::isRegularFile).toList();
+
+		for(MachineFile mf : machineFiles){
+			long findCount = files.stream().filter(filePath -> filePath.toFile().getName().equals(mf.getName())).count();
+			if(findCount == 0){
+				//鏂囦欢澶瑰唴娌℃壘鍒帮紝闇�瑕佸垹闄よ褰�
+				mf.markFileDeleted();
+				this.machineFileService.updateById(mf);
+			}
+		}
+	}
+}

--
Gitblit v1.9.3