From 8ede6183253248e497d391a0902bb5d41181b3bf Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 12 八月 2025 20:39:18 +0800
Subject: [PATCH] 文件处理
---
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java | 10 ++
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java | 21 +++++
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java | 17 ++-
blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java | 88 +++++++++++++++++++--
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java | 94 +++++++++++++++++++++++
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNodeVO.java | 4
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java | 6 +
7 files changed, 219 insertions(+), 21 deletions(-)
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java
index 1c7a002..b7adfd1 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java
@@ -19,6 +19,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.io.IOException;
import java.util.List;
/**
@@ -49,12 +50,19 @@
@GetMapping("/file-content")
@Operation(summary = "鑾峰彇鏈哄簥鐩綍鏂囦欢鍐呭", description = "宸ユ帶缃戠洰褰曟枃浠跺垪琛�")
public R<String> machineFileContent(Long id) {
- return R.data("涓存椂鍐呭");
+ String content = machineFileService.getMachineFileContent(id);
+ return R.data(content);
}
@PostMapping("/file-save")
@Operation(summary = "淇濆瓨鏈哄簥鏂囦欢", description = "淇濆瓨鏈哄簥鏂囦欢鍒扮鐩�")
public R<Void> machineFileSave(Long id,String content) {
+ try {
+ machineFileService.saveFileConent(id,content);
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ return R.fail(e.getMessage());
+ }
return R.success();
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java
index 3956486..5c08825 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.base.BizEntity;
import java.util.Date;
@@ -54,4 +56,23 @@
private Date fileCreateTime;
private Date fileModifyDate;
+
+ /**
+ * 鏂囦欢md5
+ */
+ private String md5;
+ /**
+ * 鏂囦欢瀛楄妭鏁�
+ */
+ private Long fileSize;
+
+ /**
+ * 鐢熸垚鏂囦欢澶у皬鐨勬樉绀烘枃鏈�
+ * @return 鏄剧ず鏂囨湰
+ */
+ public String getFileSizeDisplay(){
+ String disp = FileUtils.byteCountToDisplaySize(fileSize);
+ //disp = StringUtils.replace(disp,"bytes","瀛楄妭");
+ return disp;
+ }
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java
index faf428c..dbe2c10 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java
@@ -3,12 +3,28 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FileUtils;
+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.Charsets;
import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.gkw.programnode.entity.MachineFile;
import org.springblade.mdm.gkw.programnode.mapper.MachineFileMapper;
+import org.springblade.mdm.utils.FileContentUtil;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
/**
@@ -20,6 +36,84 @@
@Service
@AllArgsConstructor
public class MachineFileService extends BizServiceImpl<MachineFileMapper, MachineFile> {
+ private final MachineService machineService;
+ /**
+ * 妫�娴嬫枃浠舵槸鍚﹀瓨鍦�
+ * @param name 鏂囦欢鍚�
+ * @param md5 鏂囦欢md5
+ * @param machineCode 鎵�灞炴満搴�
+ * @return 鏄惁瀛樺湪浜庡簱鍐�
+ */
+ public boolean fileExists(String name, String md5,String machineCode) {
+ return this.lambdaQuery().eq(MachineFile::getName, name).eq(MachineFile::getMd5, md5).eq(MachineFile::getMachineCode, machineCode).count()>0;
+ }
+ @Transactional(readOnly = true)
+ public String getMachineFileContent(Long id) {
+ MachineFile machineFile = getById(id);
+ Machine machine = machineService.getByCode(machineFile.getMachineCode());
+ String filePathStr = getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName();
+
+ String content;
+
+ Path filePath = Paths.get(filePathStr);
+ if(!filePath.toFile().exists()){
+ return StringUtils.EMPTY;
+ }
+ try (InputStream inputStream = Files.newInputStream(filePath)) {
+ // 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+ content = FileContentUtil.getContentFromStream(inputStream);
+ } catch (IOException e) {
+ log.error("璇诲彇鏂囦欢md5澶辫触",e);
+ return StringUtils.EMPTY;
+ }
+
+ return content;
+ }
+
+ /**
+ * 鑾峰彇鍩烘湰璺緞
+ * @param machine
+ * @param dirType
+ * @return
+ */
+ public static String getBasePath(Machine machine,String dirType){
+ String dirPath;
+ switch (dirType) {
+ case MachineFile.DIR_TYPE_REC:
+ dirPath = machine.getProgReceiveDir();
+ break;
+ case MachineFile.DIR_TYPE_SEND:
+ dirPath = machine.getProgSendDir();
+ break;
+ case MachineFile.DIR_TYPE_TEMP:
+ dirPath = machine.getProgTempDir();
+ break;
+ default:
+ log.warn("鐩綍绫诲瀷涓嶅尮閰�:{}",dirType);
+ return null;//涓嶇鍚堜换浣曠被鍨嬶紝鐩存帴閫�鍑�
+ }
+ return dirPath;
+ }
+
+ @Transactional
+ public void saveFileConent(Long id, String content) throws IOException {
+ MachineFile machineFile = getById(id);
+ Machine machine = machineService.getByCode(machineFile.getMachineCode());
+
+ String filePathStr = getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName();
+ Path filePath = Paths.get(filePathStr);
+ String charsetName = "UTF-8";
+ try (InputStream inputStream = Files.newInputStream(filePath)) {
+ // 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+ charsetName = FileContentUtil.detectFromInputStream(inputStream);
+ } catch (IOException e) {
+ log.error("璇诲彇鏂囦欢缂栫爜澶辫触",e);
+ throw new ServiceException("鑾峰彇鏂囦欢缂栫爜澶辫触");
+ }
+
+ FileUtils.writeStringToFile(filePath.toFile(),content,charsetName);
+
+ }
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java
index 206c136..80dfa5a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java
@@ -10,6 +10,7 @@
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.commons.contants.ParamConstants;
import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.gkw.programnode.entity.MachineFile;
import org.springblade.mdm.gkw.programnode.entity.ProgramNode;
import org.springblade.mdm.gkw.programnode.entity.TreeDept;
import org.springblade.mdm.gkw.programnode.mapper.ProgramNodeMapper;
@@ -63,7 +64,7 @@
for(TreeDept workshop : workshops) {
ProgramNodeVO node = new ProgramNodeVO();
- node.setId(workshop.getId());
+ node.setId(String.valueOf(workshop.getId()));
node.setName(workshop.getDeptName());
roots.add(node);
@@ -73,7 +74,7 @@
.orderByAsc(TreeDept::getSort).list();
for(TreeDept gd : gongduanList){
ProgramNodeVO nodeGd = new ProgramNodeVO();
- nodeGd.setId(nodeGd.getId());
+ nodeGd.setId(String.valueOf(gd.getId()));
nodeGd.setName(gd.getDeptName());
nodeGd.setParentId(gd.getParentId());
@@ -83,7 +84,7 @@
machineService.lambdaQuery().eq(Machine::getOwnerDept,gd.getId()).list().forEach(machine -> {
ProgramNodeVO nodeMachine = new ProgramNodeVO();
nodeMachine.setName(machine.getCode());
- nodeMachine.setId(machine.getId());
+ nodeMachine.setId(String.valueOf(machine.getId()));
nodeMachine.setMachineCode(machine.getCode());
addFolderNodes(nodeMachine);
@@ -102,19 +103,23 @@
void addFolderNodes(ProgramNodeVO nodeMachine){
ProgramNodeVO sendNode = new ProgramNodeVO();
+ sendNode.setId(nodeMachine.getId()+"_"+MachineFile.DIR_TYPE_SEND);
sendNode.setName("SEND");
sendNode.setMachineCode(nodeMachine.getMachineCode());
- sendNode.setDirType("SEND");
+ sendNode.setDirType(MachineFile.DIR_TYPE_SEND);
+ //sendNode.setParentId(nodeMachine.getId());
ProgramNodeVO recNode = new ProgramNodeVO();
+ recNode.setId(nodeMachine.getId()+"_"+MachineFile.DIR_TYPE_REC);
recNode.setName("REC");
recNode.setMachineCode(nodeMachine.getMachineCode());
- recNode.setDirType("REC");
+ recNode.setDirType(MachineFile.DIR_TYPE_REC);
ProgramNodeVO tempNode = new ProgramNodeVO();
+ tempNode.setId(nodeMachine.getId()+"_"+MachineFile.DIR_TYPE_TEMP);
tempNode.setName("TEMP");
tempNode.setMachineCode(nodeMachine.getMachineCode());
- tempNode.setDirType("TEMP");
+ tempNode.setDirType(MachineFile.DIR_TYPE_TEMP);
nodeMachine.setChildren(Arrays.asList(sendNode,recNode,tempNode));
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNodeVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNodeVO.java
index bffaf44..3e23aae 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNodeVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNodeVO.java
@@ -12,7 +12,9 @@
@Setter
@Getter
@EqualsAndHashCode
-public class ProgramNodeVO extends BaseVO {
+public class ProgramNodeVO {
+ @Schema(description = "鑺傜偣id")
+ private String id;
@Schema(description = "鑺傜偣鍚嶇О")
private String name;
@Schema(description = "鐖禝D,鏍硅妭鐐圭埗id=0")
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 ea4cf4a..53a63fd 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
@@ -1,5 +1,8 @@
package org.springblade.mdm.task;
+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;
@@ -12,6 +15,7 @@
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;
@@ -20,6 +24,7 @@
import java.util.Date;
import java.util.List;
+@Slf4j
@Component
@EnableScheduling
public class MachineFileScanTask {
@@ -28,32 +33,77 @@
@Autowired
private MachineService machineService;
// 姣�5绉掓墽琛屼竴娆�
- @Scheduled(fixedRate = 1000000)
+ //@Scheduled(fixedRate = 1000000)
//@Scheduled(cron = "0 1 0 * * ?") // 姣忓ぉ涓婂崍0鐐�1鍒嗘墽琛�
+ @Scheduled(cron = "0 15 19 * * ?") //test
public void executeEvery5Seconds() {
System.out.println("瀹氭椂浠诲姟鎵ц: " + System.currentTimeMillis());
+ scanMachineFile();
}
public void scanMachineFile() {
List<Machine> machines = machineService.lambdaQuery().eq(Machine::getStatus,Machine.STATUS_ENABLE).list();
for (Machine machine : machines) {
- scanReceiveDir(machine);
+ try {
+ scanDir(machine,MachineFile.DIR_TYPE_REC);
+ }catch(Exception e) {
+ log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+ }
+ try {
+ scanDir(machine,MachineFile.DIR_TYPE_SEND);
+ }catch(Exception e) {
+ log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+ }
+ try {
+ scanDir(machine,MachineFile.DIR_TYPE_TEMP);
+ }catch(Exception e) {
+ log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+ }
}
}
- public void scanReceiveDir(Machine machine){
- List<File> files = FileUtil.list(machine.getProgReceiveDir());
- for(File f : files){
+
+ /**
+ * 鎵弿鐩綍
+ * @param machine 鏈哄簥淇℃伅
+ * @param dirType 鐩綍绫诲瀷
+ * @throws IOException
+ */
+ public void scanDir(Machine machine,String dirType) throws IOException {
+ //MachineFile.DIR_TYPE_REC
+
+ 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];
+
+ boolean exists;//鏂囦欢鏄惁瀛樺湪浜庢暟鎹簱涓�
+ for (Path filePath : files) {
+
+ exists = false;
+
MachineFile mf = new MachineFile();
- mf.setName(f.getName());
- mf.setDirType(MachineFile.DIR_TYPE_REC);
+
+ mf.setTenantId("000000");
+ mf.setName(filePath.toFile().getName());
+ mf.setDirType(dirType);
mf.setMachineCode(machine.getCode());
try {
- Path filePath = Paths.get(f.getPath());
BasicFileAttributes attrs = Files.readAttributes(
filePath,
BasicFileAttributes.class
@@ -63,15 +113,31 @@
Date creationDate = new Date(creationTime.toMillis());
mf.setFileCreateTime(creationDate);
- FileTime modifyTime =attrs.lastModifiedTime();
+ FileTime modifyTime = attrs.lastModifiedTime();
mf.setFileModifyDate(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(),mf.getMd5(),machine.getCode());
System.out.println("鏂囦欢鍒涘缓鏃堕棿: " + creationDate);
} catch (IOException e) {
- e.printStackTrace();
+ log.error("璇诲彇鏂囦欢淇℃伅澶辫触",e);
+ }
+ if(!exists) {
+ machineFileService.save(mf);
+ }else{
+ log.info("鏂囦欢宸插鏋滄帬杩�:{}",filePath.getFileName());
}
- machineFileService.save(mf);
}
+
}
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
index da4d788..8f4e033 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
@@ -5,6 +5,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.gkw.programnode.entity.MachineFile;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.task.MachineFileScanTask;
@@ -64,8 +65,9 @@
@Operation(summary = "test鎵弿", description = "test鎵弿")
public R<Void> scan() throws IOException {
Machine machine = new Machine();
- machine.setProgReceiveDir("d:/mdm");
- machineFileScanTask.scanReceiveDir(machine);
+ machine.setCode("M_01_FN");
+ machine.setProgReceiveDir("d:/data/machine1/rec");
+ machineFileScanTask.scanDir(machine, MachineFile.DIR_TYPE_REC);
return R.success();
}
--
Gitblit v1.9.3