From ad90205fe702d0238983c693a8effe255c680f27 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期三, 13 八月 2025 17:18:44 +0800
Subject: [PATCH] 机床回传文件导出开发

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/entity/MachineFile.java                     |   27 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java                               |   41 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/MachineBackFileService.java             |   18 +
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java                        |   30 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileController.java       |    1 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/vo/MachineBackFileVO.java                       |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.java               |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/controller/MachineFileController.java       |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/MachineFileService.java             |   48 ++++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java                       |   35 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.xml                |   16 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/NcProgramExportInnerService.java        |  184 ++------------------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameParser.java                            |   56 ++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileHandleController.java |   16 +
 14 files changed, 277 insertions(+), 207 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 b7adfd1..4e93910 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
@@ -11,16 +11,13 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.mdm.gkw.programnode.entity.MachineFile;
 import org.springblade.mdm.gkw.programnode.service.MachineFileService;
-import org.springblade.mdm.gkw.programnode.service.ProgramNodeService;
 import org.springblade.mdm.gkw.programnode.vo.MachineFileQueryVO;
-import org.springblade.mdm.gkw.programnode.vo.ProgramNodeVO;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.io.IOException;
-import java.util.List;
 
 /**
  * 鍏紑缃戠▼搴忚妭鐐�
@@ -42,7 +39,7 @@
 
 		IPage<MachineFile> pageData = machineFileService.lambdaQuery()
 			.eq(MachineFile::getMachineCode,query.getMachineCode())
-			.eq(MachineFile::getDirType,query.getDirType()).page(Condition.getPage(query));
+			.eq(MachineFile::getDirType,query.getDirType()).ne(MachineFile::getStatus,MachineFile.STATUS_REMOVED).page(Condition.getPage(query));
 		return R.data(pageData);
 	}
 
@@ -58,7 +55,7 @@
 	@Operation(summary = "淇濆瓨鏈哄簥鏂囦欢", description = "淇濆瓨鏈哄簥鏂囦欢鍒扮鐩�")
 	public R<Void> machineFileSave(Long id,String content) {
 		try {
-			machineFileService.saveFileConent(id,content);
+			machineFileService.saveFileContent(id,content);
 		} catch (IOException e) {
 			log.error(e.getMessage());
 			return R.fail(e.getMessage());
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 f964b37..9d75d89 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
@@ -19,19 +19,19 @@
 	/**
 	 * 姝e父鐘舵�侊紝鍒氭帴鏀�
 	 */
-	public static final int STATUS_NORMAL = 0;
+	public static final int STATUS_NORMAL = 1;
 	/**
 	 * 鐢ㄦ埛鎺ユ敹浜�
 	 */
-	public static final int STATUS_ACCEPTED = 1;
+	public static final int STATUS_ACCEPTED = 2;
 	/**
 	 * 鐢ㄦ埛鎷掔粷鎺ユ敹
 	 */
-	public static final int STATUS_REJECTED = 2;
+	public static final int STATUS_REJECTED = 3;
 	/**
 	 * 鏂囦欢琚竻闄�(琚畾鏃朵换鍔℃爣璁�)
 	 */
-	public static final int STATUS_REMOVED = 3;
+	public static final int STATUS_REMOVED = 4;
 	/**
 	 * 鑺傜偣绫诲瀷锛� REC鐩綍
 	 */
@@ -71,7 +71,7 @@
 	 */
 	private Date fileCreateTime;
 
-	private Date fileModifyDate;
+	private Date fileModifyTime;
 
 	/**
 	 * 鏂囦欢md5
@@ -82,6 +82,10 @@
 	 */
 	private Long fileSize;
 
+	/**
+	 * 纭鏃堕棿锛屾帴鍙楁垨鑰呮嫆缁濈殑鏃堕棿
+	 */
+	private Date determineTime;
 	/**
 	 * 鐢熸垚鏂囦欢澶у皬鐨勬樉绀烘枃鏈�
 	 * @return 鏄剧ず鏂囨湰
@@ -98,4 +102,17 @@
 	public void markFileDeleted() {
 		this.setStatus(STATUS_REMOVED);
 	}
+
+	/**
+	 * 鎺ユ敹鏂囦欢
+	 */
+	public void accept() {
+		setStatus(STATUS_ACCEPTED);
+		this.determineTime = new Date();
+	}
+
+	public void reject() {
+		setStatus(STATUS_REJECTED);
+		this.determineTime = new Date();
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.java
index 2aa818e..002f6fd 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.java
@@ -6,6 +6,7 @@
 import org.springblade.mdm.gkw.programnode.entity.MachineFile;
 import org.springblade.mdm.gkw.programnode.entity.ProgramNode;
 import org.springblade.mdm.gkw.programnode.vo.ProgramNodeVO;
+import org.springblade.mdm.machineback.vo.MachineBackFileHandleQueryVO;
 import org.springblade.mdm.machineback.vo.MachineBackFileQueryVO;
 import org.springblade.mdm.machineback.vo.MachineBackFileVO;
 
@@ -19,4 +20,6 @@
 	 * @return
 	 */
     IPage<MachineBackFileVO> machineBackFilePageQuery(IPage<MachineBackFileVO> page, @Param("query")MachineBackFileQueryVO queryVO);
+
+	IPage<MachineBackFileVO> handlePageQuery(@Param("page")IPage<MachineBackFileVO> page,@Param("query") MachineBackFileHandleQueryVO query);
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.xml
index 70edce2..2a8fe72 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/mapper/MachineFileMapper.xml
@@ -14,7 +14,7 @@
         select f.id,f.name,f.machine_code,f.file_create_time arrived_time,f.md5,f.file_size
         from mdm_machine_file f join mdm_machine m on f.machine_code=m.code and m.is_deleted=0
         <where>
-            f.dir_type='REC' and f.is_deleted=0
+            f.dir_type='REC' and f.status=1 and f.is_deleted=0
 
             <if test="query.machineSpec!=null and query.machineSpec!=''">
                 and m.machine_spec=#{query.machineSpec,jdbcType=VARCHAR}
@@ -27,6 +27,20 @@
             </if>
         </where>
     </select>
+    <select id="handlePageQuery" resultType="org.springblade.mdm.machineback.vo.MachineBackFileVO">
+        select f.id,f.name,f.machine_code,f.file_create_time arrived_time,f.md5,f.file_size,f.determine_time
+        from mdm_machine_file f join mdm_machine m on f.machine_code=m.code and m.is_deleted=0
+        <where>
+            f.dir_type='REC' and f.status=2 and f.is_deleted=0
+
+            <if test="query.confirmTimeBegin!=null">
+                and f.determine_time&gt;=#{query.confirmTimeBegin}
+            </if>
+            <if test="query.confirmTimeEnd!=null">
+                and f.determine_time&lt;=#{query.confirmTimeEnd}
+            </if>
+        </where>
+    </select>
 
 
 </mapper>
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 0997723..33915b3 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
@@ -4,18 +4,16 @@
 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.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.mp.support.Condition;
-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.machineback.vo.MachineBackFileHandleQueryVO;
 import org.springblade.mdm.machineback.vo.MachineBackFileQueryVO;
 import org.springblade.mdm.machineback.vo.MachineBackFileVO;
 import org.springblade.mdm.utils.FileContentUtil;
@@ -25,11 +23,9 @@
 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;
 
 /**
  * 鏈哄簥鏂囦欢
@@ -44,12 +40,14 @@
 	/**
 	 * 妫�娴嬫枃浠舵槸鍚﹀瓨鍦�
 	 * @param name 鏂囦欢鍚�
-	 * @param md5 鏂囦欢md5
+	 * @param dirType 鏂囦欢澶圭被鍨�
 	 * @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;
+	public boolean fileExists(String name, String dirType,String machineCode) {
+		return this.lambdaQuery().eq(MachineFile::getName, name)
+			.eq(MachineFile::getDirType, dirType)
+			.eq(MachineFile::getMachineCode, machineCode).count()>0;
 	}
 
 	@Transactional(readOnly = true)
@@ -102,7 +100,7 @@
 	}
 
 	@Transactional
-	public void saveFileConent(Long id, String content) throws IOException {
+	public void saveFileContent(Long id, String content) throws IOException {
 		MachineFile machineFile = getById(id);
 		Machine machine = machineService.getByCode(machineFile.getMachineCode());
 
@@ -116,8 +114,22 @@
 			log.error("璇诲彇鏂囦欢缂栫爜澶辫触",e);
 			throw new ServiceException("鑾峰彇鏂囦欢缂栫爜澶辫触");
 		}
-
 		FileUtils.writeStringToFile(filePath.toFile(),content,charsetName);
+	}
+
+	/**
+	 * 鑾峰彇鏂囦欢鐨勮緭鍏ユ祦
+	 * @param machineFile
+	 * @return
+	 * @throws IOException
+	 */
+	public InputStream getInputStream(MachineFile machineFile) throws IOException {
+
+		Machine machine = machineService.getByCode(machineFile.getMachineCode());
+
+		String filePathStr = getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName();
+		Path filePath = Paths.get(filePathStr);
+		return Files.newInputStream(filePath);
 
 	}
 
@@ -125,4 +137,20 @@
     public IPage<MachineBackFileVO> machineBackFilePageQuery(MachineBackFileQueryVO query) {
 		return this.baseMapper.machineBackFilePageQuery(Condition.getPage(query),query);
     }
+
+	public MachineFile getExistsFile(String name, String dirType, String machineCode) {
+		return this.lambdaQuery().eq(MachineFile::getName, name)
+			.eq(MachineFile::getDirType, dirType)
+			.eq(MachineFile::getMachineCode, machineCode).list().stream().findFirst().orElse(null);
+	}
+
+	/**
+	 * 鍥炰紶绋嬪簭澶勭悊 鍒嗛〉鏌ヨ
+	 * @param query
+	 * @return
+	 */
+	public IPage<MachineBackFileVO> handlePageQuery(MachineBackFileHandleQueryVO query) {
+		IPage<MachineBackFileVO> page = this.getBaseMapper().handlePageQuery(Condition.getPage(query),query);
+		return page;
+	}
 }
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
new file mode 100644
index 0000000..ebe888b
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
@@ -0,0 +1,35 @@
+package org.springblade.mdm.gkw.programnode.vo;
+
+import lombok.Data;
+
+/**
+ * 瑁呰浇绋嬪簭鍚嶇粨鏋�
+ */
+@Data
+public class ProgramNameVO {
+	/**
+	 * 闆剁粍浠跺彿
+	 */
+	private String drawingNo;
+	/**
+	 * 宸ュ簭鍙�
+	 */
+	private String processNo;
+
+	/**
+	 * 宸ュ簭鐗堟
+	 */
+	private String processEdition;
+	/**
+	 * 娈垫暟
+	 */
+	private int segmentCount;
+	/**
+	 * 娈靛彿
+	 */
+	private int segmentNo;
+
+	public String logicProgramName(){
+		return this.drawingNo+"-"+this.processNo;
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileController.java
index 1218ad1..c3e55ff 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileController.java
@@ -70,7 +70,6 @@
 		IPage<MachineBackFileVO> pages = machineFileService.machineBackFilePageQuery(query);
 		return R.data(pages);
 	}
-
 	/**
 	 * 鍒嗛〉
 	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileHandleController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileHandleController.java
index 9764f3a..4007c82 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileHandleController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/controller/MachineBackFileHandleController.java
@@ -18,6 +18,7 @@
 import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
 import org.springblade.mdm.basesetting.machine.vo.MachineVO;
 import org.springblade.mdm.commons.vo.IdsVO;
+import org.springblade.mdm.gkw.programnode.service.MachineFileService;
 import org.springblade.mdm.machineback.service.MachineBackFileService;
 import org.springblade.mdm.machineback.service.NcProgramExportInnerService;
 import org.springblade.mdm.machineback.vo.MachineBackFileHandleExcelVO;
@@ -40,30 +41,31 @@
 public class MachineBackFileHandleController {
 
 	private final MachineBackFileService service;
+	private final MachineFileService machineFileService;
 	private final NcProgramExportInnerService ncProgramExportInnerService;
 	/**
 	 * 鍒嗛〉
 	 */
-	@Operation(summary = "鍒嗛〉鏌ヨ", description = "鍚嶇О鎴栫紪鐮�")
+	@Operation(summary = "鍒嗛〉鏌ヨ", description = "鍚嶇О鎴栫紪鐮�,宸叉帴鍙楃殑鏂囦欢鍒楄〃")
 	@GetMapping("/page")
 	public R<IPage<MachineBackFileVO>> page(MachineBackFileHandleQueryVO query) {
-		IPage<MachineBackFileVO> pages = service.handlePageQuery(query);
+		IPage<MachineBackFileVO> pages = machineFileService.handlePageQuery(query);
 		return R.data(pages);
 	}
 
 	@GetMapping("export-to-inner")
 	@ApiOperationSupport(order = 13)
 	@Operation(summary = "瀵煎嚭鍒版秹瀵嗙綉", description = "瀵煎嚭鍒版秹瀵嗙綉")
-	public void exportToInner(@RequestBody @Parameter(description = "瀹℃壒琛╥d鏁扮粍") IdsVO vo, HttpServletResponse response) {
+	public void exportToInner(@Parameter(description = "瀹℃壒琛╥d鏁扮粍") String ids, HttpServletResponse response) {
 
-		if(vo.getIds() == null || vo.getIds().length == 0) {
+		if(Func.isBlank(ids)) {
 			throw new ServiceException("鏈�夋嫨鏂囦欢瀵煎嚭");
 		}
 		try {
 			String filename = "toinnerexp-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
 			response.setHeader("Content-Disposition", "attachment; filename="+filename);
 			response.setContentType("application/octet-stream");
-			ncProgramExportInnerService.exportToInner(vo.getIds(),response.getOutputStream());
+			ncProgramExportInnerService.exportToInner(Func.toLongList(ids),response.getOutputStream());
 		} catch (IOException e) {
 			log.error("宸ユ帶缃戝鍑哄洖浼犳枃浠跺紓甯�", e);
 			throw new RuntimeException(e);
@@ -76,8 +78,8 @@
 	public void exportExcel(MachineBackFileHandleQueryVO query, HttpServletResponse response) {
 		query.setCurrent(1);
 		query.setSize(Integer.MAX_VALUE);
-		IPage<MachineBackFileVO> pages = service.handlePageQuery(query);
-
+		//IPage<MachineBackFileVO> pages = service.handlePageQuery(query);
+		IPage<MachineBackFileVO> pages = machineFileService.handlePageQuery(query);
 		List<MachineBackFileHandleExcelVO> list = new ArrayList<>();
 		pages.getRecords().forEach(vo ->{
 			MachineBackFileHandleExcelVO excelVO = new MachineBackFileHandleExcelVO();
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/MachineBackFileService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/MachineBackFileService.java
index 343b7fc..c26cc30 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/MachineBackFileService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/MachineBackFileService.java
@@ -37,14 +37,14 @@
 		MachineFile mf;
 		for(Long id : idList){
 			mf = macineFileService.getById(id);
-			mf.setStatus(MachineFile.STATUS_ACCEPTED);
+			mf.accept();
 			macineFileService.updateById(mf);
-
+			/*
 			MachineBackFile backFile = this.getById(id);
 			backFile.setStatus(MachineBackFile.STATUS_ACCEPTED);
 			backFile.setConfirmTime(DateUtil.now());
 			this.updateById(backFile);
-
+			*/
 		}
 
 	}
@@ -56,12 +56,19 @@
 	public void reject(String ids) {
 		List<Long> idList = Func.toLongList(ids);
 
+		MachineFile mf;
+		for(Long id : idList){
+			mf = macineFileService.getById(id);
+			mf.reject();
+			macineFileService.updateById(mf);
+		}
+		/*
 		for(Long id : idList){
 			MachineBackFile backFile = this.getById(id);
 			backFile.setStatus(MachineBackFile.STATUS_REJECTED);
 			backFile.setConfirmTime(DateUtil.now());
 			this.updateById(backFile);
-		}
+		}*/
 
 	}
 
@@ -81,10 +88,11 @@
 	 * @param query 鏌ヨ鍙傛暟瀵硅薄
 	 * @return 鍒嗛〉鏁版嵁
 	 */
+	/*
 	public IPage<MachineBackFileVO> handlePageQuery(MachineBackFileHandleQueryVO query) {
 		IPage<MachineBackFileVO> page = this.getBaseMapper().handlePageQuery(Condition.getPage(query),query);
 		return page;
 	}
-
+	*/
 
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/NcProgramExportInnerService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/NcProgramExportInnerService.java
index 75b4119..a3d3d32 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/NcProgramExportInnerService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/service/NcProgramExportInnerService.java
@@ -17,6 +17,8 @@
 import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.service.ApproveRecordService;
+import org.springblade.mdm.gkw.programnode.entity.MachineFile;
+import org.springblade.mdm.gkw.programnode.service.MachineFileService;
 import org.springblade.mdm.machineback.entity.MachineBackFile;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgram;
@@ -27,6 +29,7 @@
 import org.springblade.mdm.program.service.NcProgramApprovedService;
 import org.springblade.mdm.program.service.NcProgramService;
 import org.springblade.mdm.program.vo.DncSendBackData;
+import org.springblade.mdm.utils.ProgramFileNameParser;
 import org.springframework.stereotype.Service;
 
 import java.io.ByteArrayInputStream;
@@ -34,8 +37,8 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -50,7 +53,7 @@
 public class NcProgramExportInnerService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
 	private final MachineBackFileService machineBackFileService;
 	private final NcProgramService progService;
-
+	private final MachineFileService machineFileService;
 	private final NcNodeService ncNodeService;
 	private final OssTemplate ossTemplate;
 
@@ -61,182 +64,33 @@
 
 	/**
 	 * 瀵煎嚭鍒版秹瀵嗙綉
-	 * @param backFileIds
+	 * @param machineFileIds
 	 * @param os
 	 * @throws IOException
 	 */
-	public void exportToInner(Long[] backFileIds, ServletOutputStream os) throws IOException {
+	public void exportToInner(List<Long> machineFileIds, ServletOutputStream os) throws IOException {
 		//FileOutputStream fos = new FileOutputStream("d:/exportDnc.zip");
 		try (ZipOutputStream zipOut = new ZipOutputStream(os);) {//os
 
-			ArrayList<Long> programIdList = new ArrayList<Long>();
+			List<MachineFile>  macineFiles = machineFileService.lambdaQuery().in(MachineFile::getId,machineFileIds).list();
+			Map<String,List<MachineFile>> map =  macineFiles.stream()
+				.collect(Collectors.groupingBy(s -> ProgramFileNameParser.parseProgramName(s.getName()).logicProgramName()));
 
-			for (Long backId : backFileIds) {
-				MachineBackFile backFile = machineBackFileService.getById(backId);
-				programIdList.add(backFile.getNcProgramId());
-
-				NcProgram prog = progService.getById(backFile.getNcProgramId());
-
-				//1111锛岄渶瑕佽鍦ㄦ枃浠�
-				String filename = prog.getOssName();
-				InputStream inputStream = ossTemplate.statFileStream(filename);
-
-				addInputStreamToZip(zipOut, inputStream, prog.getName());
+			for (Map.Entry<String, List<MachineFile>> entry : map.entrySet()) {
+				String programName = entry.getKey();
+				List<MachineFile> progMachineFiles = entry.getValue();
+				for (MachineFile mf : progMachineFiles) {
+					try(InputStream ins = machineFileService.getInputStream(mf)) {
+						addInputStreamToZip(zipOut,ins , programName + "/" + mf.getName());
+					}
+				}
 
 			}
-			addDataJson(zipOut, programIdList);
 		}
 
 		os.close();
 	}
 
-
-	/**
-	 * 瀵煎叆鏁版嵁鏂囦欢
-	 * @param zipOut
-	 */
-	void addDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
-		addProgramDataJson(zipOut, programIdList);
-		//addApproveRecordDataJson(zipOut, programIdList);
-
-		addNcNodeDataJson(zipOut, programIdList);
-	}
-
-	/**
-	 * 瀵煎叆绋嬪簭璁板綍
-	 * @param zipOut
-	 * @param programIdList
-	 */
-	void addProgramDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
-		LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.in(NcProgram::getId, programIdList);
-		List<NcProgram> programList = progService.list(queryWrapper);
-		JSONArray jsonArray = new JSONArray();
-		for(NcProgram program : programList){
-			JSONObject recObj = new JSONObject();
-			recObj.put("id", program.getId());
-			recObj.put("code", program.getCode());
-			recObj.put("ossName",program.getOssName());
-			recObj.put("isTextFile",program.getIsTextFile());
-			recObj.put("isLastEdition",program.getIsLastEdition());
-			recObj.put("category",program.getCategory());
-			recObj.put("description",program.getDescription());
-			recObj.put("name",program.getName());
-			recObj.put("drawingNo",program.getDrawingNo());
-			recObj.put("ncNodeId",program.getNcNodeId());
-			recObj.put("bindNcNodeId",program.getBindNcNodeId());
-			recObj.put("url",program.getUrl());
-			recObj.put("isCured",program.getIsCured());
-			recObj.put("isLocked",program.getIsLocked());
-			recObj.put("isTest",program.getIsTest());
-			recObj.put("machineCode",program.getMachineCode());
-			recObj.put("processEdition",program.getProcessEdition());
-			recObj.put("taskAssignTime",program.getTaskAssignTime());
-
-			addSuperProperties(recObj,program);
-
-			jsonArray.add(recObj);
-		}
-		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),PROGRAM_JSON_FILE);
-
-	}
-
-	/**
-	 * 瀵煎叆瀹℃壒璁板綍
-	 * @param zipOut
-	 * @param programIdList 鏁版帶绋嬪簭id鍒楄〃
-	 */
-	/*
-	void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
-		LambdaQueryWrapper<ApproveRecord> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.in(ApproveRecord::getNcProgramId, programIdList);
-		List<ApproveRecord> records = approveRecordService.list(queryWrapper);
-		JSONArray jsonArray = new JSONArray();
-		for(ApproveRecord record : records){
-			JSONObject recObj = new JSONObject();
-			recObj.put("id", record.getId());
-			recObj.put("comment", record.getComment());
-			recObj.put("userId",record.getUserId());
-			recObj.put("userNickname",record.getUserNickname());
-			recObj.put("operateTime",record.getOperateTime());
-			recObj.put("operateResult",record.getOperateResult());
-			recObj.put("taskName",record.getTaskName());
-			recObj.put("ncProgramId",record.getNcProgramId());
-			recObj.put("processInstanceId",record.getProcessInstanceId());
-
-			addSuperProperties(recObj,record);
-
-			jsonArray.add(recObj);
-		}
-		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json");
-
-	}
-	*/
-	/**
-	 * 瀵煎叆鑺傜偣
-	 * @param zipOut
-	 * @param programIdList
-	 */
-	void addNcNodeDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
-		LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.in(NcProgram::getId, programIdList);
-
-		List<NcProgram> programs = progService.list(queryWrapper);
-		JSONArray jsonArray = new JSONArray();
-
-		ArrayList<Long> exportNodeIdList 	= new ArrayList<>();
-		for(NcProgram program : programs){
-			//JSONObject recObj = new JSONObject();
-			if(!exportNodeIdList.contains(program.getBindNcNodeId())){
-				exportNodeIdList.add(program.getBindNcNodeId());
-			}
-			NcNode ncNode = ncNodeService.getById(program.getBindNcNodeId());//浠庣粦瀹氱殑鑺傜偣鏈韩寮�濮嬪鍑�
-
-			if(StringUtils.isNotEmpty(ncNode.getParentIds())){
-				List<Long> pids = Func.toLongList(ncNode.getParentIds());
-				for(Long nodeId : pids){
-					if(!exportNodeIdList.contains(nodeId)){
-						exportNodeIdList.add(nodeId);
-					}
-				}
-
-			}
-
-		}
-
-		LambdaQueryWrapper<NcNode> nodeQueryWrapper = new LambdaQueryWrapper<>();
-		nodeQueryWrapper.in(NcNode::getId, exportNodeIdList);
-		List<NcNode> nodeList =ncNodeService.list(nodeQueryWrapper);
-		for(NcNode node : nodeList){
-			JSONObject recObj = new JSONObject();
-
-			recObj.put("id", node.getId());
-			recObj.put("nodeType", node.getNodeType());
-			recObj.put("machineCode",node.getMachineCode());
-			recObj.put("parentId",node.getParentId());
-			recObj.put("description",node.getDescription());
-			recObj.put("name",node.getName());
-			recObj.put("remark",node.getRemark());
-			recObj.put("drawingNo",node.getDrawingNo());
-			recObj.put("parentIds",node.getParentIds());
-			recObj.put("processName",node.getProcessName());
-
-			addSuperProperties(recObj,node);
-
-			jsonArray.add(recObj);
-		}
-		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_node.json");
-	}
-
-	void addSuperProperties(JSONObject recObj, BizEntity entity){
-		recObj.put("tenantId",entity.getTenantId());
-		recObj.put("createTime",entity.getCreateTime());
-		recObj.put("updateTime",entity.getUpdateTime());
-		recObj.put("createUser",entity.getCreateUser());
-		recObj.put("updateUser",entity.getUpdateUser());
-		recObj.put("status",entity.getStatus());
-		recObj.put("createDept",entity.getCreateDept());
-	}
 
 	public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName)
 		throws IOException {
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/vo/MachineBackFileVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/vo/MachineBackFileVO.java
index 3677c6e..4be3770 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/vo/MachineBackFileVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machineback/vo/MachineBackFileVO.java
@@ -21,4 +21,6 @@
 	private Integer isCured=0;
 	@Schema(description = "鏂囦欢鍒拌揪鏃堕棿")
 	private Date arrivedTime;
+	@Schema(description = "纭鏃堕棿")
+	private Date determineTime;
 }
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 4f95154..6fd8997 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,6 @@
 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.core.secure.utils.AuthUtil;
@@ -35,12 +36,15 @@
 	// 姣�5绉掓墽琛屼竴娆�
 	//@Scheduled(fixedRate = 1000000)
 	//@Scheduled(cron = "0 1 0 * * ?") // 姣忓ぉ涓婂崍0鐐�1鍒嗘墽琛�
-	@Scheduled(cron = "0 15 19 * * ?") //test
+	@Scheduled(cron = "0 */5 * * * ?")
+	//@Scheduled(cron = "0 15 19 * * ?") //test
 	public void executeEvery5Seconds() {
 		scanMachineFile();
 	}
 
-
+	/**
+	 * 鎵弿鎵�鏈夋満搴婄殑閰嶇疆涔嬬洰褰�
+	 */
 	public void scanMachineFile() {
 		List<Machine> machines = machineService.lambdaQuery().eq(Machine::getStatus,Machine.STATUS_ENABLE).list();
 		for (Machine machine : machines) {
@@ -106,10 +110,12 @@
 
 		byte[] buffer = new byte[2048];
 
-		boolean exists;//鏂囦欢鏄惁瀛樺湪浜庢暟鎹簱涓�
+		MachineFile existFileInDb;
+		//boolean exists;//鏂囦欢鏄惁瀛樺湪浜庢暟鎹簱涓�
 		for (Path filePath : files) {
 
-			exists = false;
+			existFileInDb = null;
+			//exists = false;
 
 			MachineFile mf = new MachineFile();
 
@@ -129,7 +135,7 @@
 				mf.setFileCreateTime(creationDate);
 
 				FileTime modifyTime = attrs.lastModifiedTime();
-				mf.setFileModifyDate(new Date(modifyTime.toMillis()));
+				mf.setFileModifyTime(new Date(modifyTime.toMillis()));
 				mf.setFileSize(Files.size(filePath));
 				try (InputStream inputStream = Files.newInputStream(filePath)) {
 					// 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
@@ -140,15 +146,31 @@
 					continue;//鏈夐敊璇�,鎺犺繃
 				}
 
-				exists = machineFileService.fileExists(mf.getName(),mf.getMd5(),machine.getCode());
+				//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(!exists) {
+			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);
+
 			}
 
 		}
@@ -172,6 +194,10 @@
 			return;
 		}
 		Path dirPath = Paths.get(basePath);
+		if(!dirPath.toFile().exists()){
+			log.warn("鎵弿鐩綍:{} 涓嶅瓨鍦�",dirPath);
+			return;
+		}
 
 		List<Path> files = Files.list(dirPath)
 			.filter(Files::isRegularFile).toList();
@@ -180,7 +206,6 @@
 			long findCount = files.stream().filter(filePath -> filePath.toFile().getName().equals(mf.getName())).count();
 			if(findCount == 0){
 				//鏂囦欢澶瑰唴娌℃壘鍒帮紝闇�瑕佸垹闄よ褰�
-				//this.machineFileService.save(mf);
 				mf.markFileDeleted();
 				this.machineFileService.updateById(mf);
 			}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameParser.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameParser.java
new file mode 100644
index 0000000..fa32049
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameParser.java
@@ -0,0 +1,56 @@
+package org.springblade.mdm.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.api.IResultCode;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.flow.service.FlowProgramProperties;
+import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
+import org.springblade.mdm.program.service.NcNodeService;
+
+public class ProgramFileNameParser {
+	/**
+	 * 浠庢枃浠跺悕鍒嗘瀽绋嬪簭鍚嶇О鍚勬
+	 * @param filename 鏂囦欢鍚�
+	 */
+	public static ProgramNameVO parseProgramName(String filename){
+		ProgramNameVO pname = new ProgramNameVO();
+		int idx = filename.lastIndexOf(".");
+		String tempstr = filename.substring(0,idx);//鍘绘帀鎵╁睍鍚�
+
+		idx = tempstr.lastIndexOf("-");
+
+		if(idx != -1){
+			String segNo = tempstr.substring(idx+1);
+			pname.setSegmentNo(Func.toInt(segNo));
+
+			tempstr = tempstr.substring(0,idx);
+		}
+		idx = tempstr.lastIndexOf("-");
+		if(idx != -1){
+			String seg = tempstr.substring(idx+1);
+			pname.setSegmentCount(Func.toInt(seg));
+			tempstr = tempstr.substring(0,idx);
+		}
+
+		//瑙f瀽宸ュ簭鐗堟
+		idx = tempstr.lastIndexOf("-");
+		if(idx != -1){
+			String processEdition = tempstr.substring(idx+1);
+			pname.setProcessEdition(processEdition);
+			tempstr = tempstr.substring(0,idx);
+		}
+
+		//瑙f瀽宸ュ簭濂�
+		String processNo = "";
+		idx = tempstr.lastIndexOf("-");
+		if(idx != -1){
+			processNo = tempstr.substring(idx+1);
+			tempstr = tempstr.substring(0,idx);
+		}
+		pname.setProcessNo(processNo);
+		pname.setDrawingNo(tempstr);
+		return pname;
+	}
+
+}
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
new file mode 100644
index 0000000..c6bff09
--- /dev/null
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
@@ -0,0 +1,30 @@
+package org.springblade.mdm.utils;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
+
+public class ProgramFileNameParserTest {
+
+	@Test
+	public void testParseProgramName() {
+		String fname = "CP1-1-1-A-2-1.txt";
+
+		ProgramNameVO vo = ProgramFileNameParser.parseProgramName(fname);
+		Assertions.assertEquals(2,vo.getSegmentCount());
+		Assertions.assertEquals(1,vo.getSegmentNo());
+		Assertions.assertEquals("A",vo.getProcessEdition());
+
+		Assertions.assertEquals("1",vo.getProcessNo());
+		Assertions.assertEquals("CP1-1",vo.getDrawingNo());
+
+		fname = "T-9-B-5-3.txt";
+		vo = ProgramFileNameParser.parseProgramName(fname);
+		Assertions.assertEquals(5,vo.getSegmentCount());
+		Assertions.assertEquals(3,vo.getSegmentNo());
+		Assertions.assertEquals("B",vo.getProcessEdition());
+
+		Assertions.assertEquals("9",vo.getProcessNo());
+		Assertions.assertEquals("T",vo.getDrawingNo());
+	}
+}

--
Gitblit v1.9.3