From 2689c8fec95018952784bd8d032afb5a194a6616 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 02 九月 2025 00:17:45 +0800
Subject: [PATCH] 增加文件监控

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineCollectFileController.java        |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileMonitorRecordController.java         |   60 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileMonitorRecord.java                       |   50 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/MachineFileChangeListener.java            |  108 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java                           |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java                         |   24 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java                               |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineFileController.java               |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/controller/MachineController.java           |   11 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileLockChecker.java                      |   43 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.xml                  |   10 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java          |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java                           |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java                    |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java                   |   16 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileSendRecordService.java                  |   32 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordQueryVO.java                       |   27 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordVO.java                            |   20 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirMoveTask.java                                    |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java                            |   13 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java                       |   13 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileWatcherService.java                   |  101 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java                 |  288 ++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java                          |   42 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileMonitorRecordVO.java                         |   15 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/service/ProgramNodeService.java                 |    6 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineAcceptedFileController.java       |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.java                    |   19 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java                               |    5 
 doc/sql/mdm/mdm.mysql.all.create.sql                                                                                      |   29 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/SendDirCleanTask.java                                      |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java                      |   24 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java                             |    7 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/WatchInfo.java                            |   15 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileService.java                     |   35 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DirectorLockService.java                  |   40 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.java                 |   20 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/MachineFileMapper.xml                        |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java                                            |  101 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java                  |    9 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java                                   |   47 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/ShutdownHook.java                                        |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DynamicDirectoryWatcher.java              |   35 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java                               |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java            |   53 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java                                      |   13 
 /dev/null                                                                                                                 |  211 ------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java             |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java                 |  324 +++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java |    1 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileMonitorRecordService.java               |   25 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineImportService.java           |   16 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.xml                     |   45 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java                              |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java                    |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NodeDeptQueryService.java                       |    2 
 56 files changed, 1,621 insertions(+), 392 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
deleted file mode 100644
index 036fe3c..0000000
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/MachineService.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package org.springblade.mdm.basesetting.machine;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.apache.commons.lang3.StringUtils;
-import org.springblade.core.excel.util.ExcelUtil;
-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.api.R;
-import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.basesetting.machine.mapper.MachineMapper;
-import org.springblade.mdm.basesetting.machine.vo.MachineExcel;
-import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
-import org.springblade.mdm.basesetting.machine.vo.MachineSaveVO;
-import org.springblade.mdm.basesetting.machine.vo.MachineVO;
-import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
-import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
-import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
-import org.springblade.mdm.basesetting.producedivision.vo.DivisionExcel;
-import org.springblade.mdm.basesetting.producedivision.vo.ImportResult;
-import org.springblade.mdm.basesetting.producedivision.vo.QinzheFgbExcel;
-import org.springblade.system.feign.ISysClient;
-import org.springblade.system.pojo.entity.Dept;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.InvalidPathException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-public class MachineService extends BizServiceImpl<MachineMapper, Machine> {
-	@Autowired
-	private ISysClient sysClient;
-	@Autowired
-	private MdmDeptService mdmDeptService;
-	@Transactional
-	public void saveMachine(MachineSaveVO vo){
-		checkMachine(vo);
-		if(existsByCode(vo.getCode(),null)){
-			throw new ServiceException("鏈哄簥缂栫爜宸插瓨鍦�:"+vo.getCode());
-		}
-
-		Machine machine = new Machine();
-		BeanUtil.copyProperties(vo, machine);
-		machine.setId(null);
-		this.save(machine);
-	}
-
-	/**
-	 * 妫�鏌ユ満搴婂綍鍏ユ暟鎹�
-	 * @param vo 褰曞叆鐨勮〃鍗曟暟鎹甐O
-	 */
-	void checkMachine(MachineSaveVO vo){
-		if(Func.isEmpty(vo.getCode())){
-			throw new ServiceException("鏈哄簥缂栫爜涓嶈兘涓虹┖");
-		}
-
-		if(Func.isEmpty(vo.getName())){
-			throw new ServiceException("鏈哄簥绫诲瀷涓嶈兘涓虹┖");
-		}
-
-		if(Func.isEmpty(vo.getMachineGroupCode())){
-			throw new ServiceException("鎵�灞炵粍缁囦笉鑳戒负绌�");
-		}
-
-		if(Func.isEmpty(vo.getMachineSpec())){
-			throw new ServiceException("鏈哄簥绫诲瀷涓嶈兘涓虹┖");
-		}
-	}
-
-	/**
-	 * 鏍规嵁鏈哄簥缂栫爜鍒ゆ柇鏈哄簥鏄惁瀛樺湪
-	 * @param code 鏈哄簥缂栫爜
-	 * @param excludeId 鎺掗櫎id
-	 * @return 鏄惁瀛樺湪
-	 */
-	boolean existsByCode(String code,Long excludeId){
-		return this.lambdaQuery().eq(Machine::getCode, code).ne(excludeId!=null,Machine::getId, excludeId).count()>0;
-	}
-
-	public boolean updateMachine(MachineSaveVO vo) {
-
-		checkMachine(vo);
-		if(existsByCode(vo.getCode(),vo.getId())){
-			throw new ServiceException("鏈哄簥缂栫爜宸插瓨鍦�:"+vo.getCode());
-		}
-
-		Machine machine = this.getById(vo.getId());
-
-		machine.setMachineSpec(vo.getMachineSpec());
-		machine.setCode(vo.getCode());
-		machine.setName(vo.getName());
-		machine.setMachineGroupCode(vo.getMachineGroupCode());
-		machine.setManufacturer(vo.getManufacturer());
-		machine.setOperator(vo.getOperator());
-		machine.setControlSystem(vo.getControlSystem());
-		machine.setOwnerDept(vo.getOwnerDept());
-		machine.setProgSendDir(vo.getProgSendDir());
-		machine.setProgReceiveDir(vo.getProgReceiveDir());
-		machine.setProgTempDir(vo.getProgTempDir());
-		machine.setStatus(vo.getStatus());
-		machine.setRemark(vo.getRemark());
-		machine.setSendDirExpiryHours(vo.getSendDirExpiryHours());
-		machine.setReceiveDirExpiryHours(vo.getReceiveDirExpiryHours());
-
-		return this.updateById(machine);
-	}
-
-
-
-
-	/**
-	 * 鏌ヨ鍒嗛〉
-	 * @param query 鏌ヨ鍙傛暟
-	 * @return 鍒嗛〉鏁版嵁
-	 */
-	public IPage<MachineVO> pageQuery(MachineQueryVO query) {
-
-		if (query.getDeptId() != null) {
-			R<Dept> rs = sysClient.getDept(query.getDeptId());
-			if(rs.isSuccess()){
-				query.setDeptAncestors(rs.getData().getAncestors()+","+rs.getData().getId());
-			}
-		}
-		return this.getBaseMapper().pageQuery(Condition.getPage(query), query);
-	}
-
-	/**
-	 * 鏌ヨ璇︽儏
-	 * @param id 鏈哄簥id
-	 * @return
-	 */
-	public MachineVO detail(long id) {
-		Machine machine = this.getById(id);
-
-		MachineVO vo = new MachineVO();
-		BeanUtil.copyProperties(machine, vo);
-
-		return vo;
-	}
-
-	/**
-	 * 浜х敓鏈哄簥鍥炰紶缁撴瀯鏁版嵁
-	 * @param id
-	 */
-	public void genMachineFileBackDirs(Long id) throws IOException {
-		Machine machine = this.getById(id);
-		if(Func.isNotBlank(machine.getProgReceiveDir())){
-			if(isLegalDirectoryPath(machine.getProgReceiveDir())) {
-				Path path = Paths.get(machine.getProgReceiveDir());
-				Files.createDirectories(path);
-			}else{
-				throw new RuntimeException("闈炴硶鐨勭洰褰曟牸寮�");
-			}
-		}
-	}
-
-	/**
-	 * 鍒ゆ柇鏄惁鏄悎娉曠殑鐩綍鏍煎紡
-	 * @param path
-	 * @return
-	 */
-	static boolean isLegalDirectoryPath(String path) {
-		// 鍩虹妫�鏌�
-		if (path == null || path.trim().isEmpty()) {
-			return false;
-		}
-
-		// 浣跨敤NIO妫�鏌ヨ矾寰勬牸寮�
-		Path nioPath;
-		try {
-			nioPath = Paths.get(path);
-			if (!nioPath.normalize().toString().equals(path)) {
-				return false; // 璺緞涓嶈鑼�
-			}
-		} catch (InvalidPathException ex) {
-			return false;
-		}
-
-		return true;
-
-	}
-
-	/**
-	 * 鏍规嵁鏈哄簥缂栫爜鑾峰彇鏈哄簥
-	 * @param machineCode 鏈哄簥缂栫爜
-	 * @return
-	 */
-	public Machine getByCode(String machineCode) {
-		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/basesetting/machine/controller/MachineController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/controller/MachineController.java
index 1962ee3..c810b36 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/controller/MachineController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/controller/MachineController.java
@@ -12,7 +12,7 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.service.MachineImportService;
 import org.springblade.mdm.basesetting.machine.vo.MachineExcel;
 import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
@@ -64,7 +64,11 @@
 	@Operation(summary = "淇敼", description = "鏈哄簥淇℃伅")
 	@PostMapping("/update")
 	public R<Boolean> update(@RequestBody MachineSaveVO vo) {
-		return R.<Boolean>status(service.updateMachine(vo));
+		try{
+			return R.data(service.updateMachine(vo));
+		}catch(Exception e){
+			return R.fail(e.getMessage());
+		}
 	}
 
 	@Operation(summary = "璇︽儏", description = "鏌ヨ鏈哄簥璇︽儏")
@@ -145,7 +149,7 @@
 			log.error("瀵煎嚭鍒嗘満搴婃ā鏉垮紓甯�", e);
 		}
 	}
-
+	/*
 	@Operation(summary = "浜х敓鏈哄簥鍥炰紶缁撴瀯鏍�", description = "浜х敓鏈哄簥鍥炰紶缁撴瀯鏍�")
 	@PostMapping("/gen-fileback-dirs")
 	public R<Void> genFileBackDirs(@RequestParam Long id) {
@@ -157,4 +161,5 @@
 		}
 		return R.status(true);
 	}
+	 */
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
index 560accc..66b35a9 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/entity/Machine.java
@@ -1,13 +1,16 @@
 package org.springblade.mdm.basesetting.machine.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BizEntity;
 
 @Setter
 @Getter
+@EqualsAndHashCode(callSuper = false)
 @TableName("mdm_machine")
 public class Machine extends BizEntity {
 	/**
@@ -73,4 +76,25 @@
 	 */
 	private String remark;
 
+	/**
+	 * 娓呴櫎璺緞鏈熬鐨勬枩鏉�
+	 * @param oriDir
+	 * @return
+	 */
+	public static String clearDirEnd(String oriDir){
+		return StringUtils.removeEnd(StringUtils.removeEnd(oriDir, "/"), "\\");
+	}
+
+	/**
+	 * 鐩綍鏄惁鍙樻洿
+	 * @param oriDir
+	 * @param currentDir
+	 * @return
+	 */
+	public static boolean dirChanged(String oriDir,String currentDir){
+		String dir1 = clearDirEnd(oriDir);
+		String dir2 = clearDirEnd(currentDir);
+		return StringUtils.equals(dir1, dir2);
+	}
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineImportService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineImportService.java
index dbf2356..82724a1 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineImportService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineImportService.java
@@ -1,30 +1,19 @@
 package org.springblade.mdm.basesetting.machine.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.jsonwebtoken.lang.Collections;
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.core.excel.util.ExcelUtil;
-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.api.R;
-import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.machine.mapper.MachineMapper;
 import org.springblade.mdm.basesetting.machine.vo.MachineExcel;
-import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
-import org.springblade.mdm.basesetting.machine.vo.MachineSaveVO;
-import org.springblade.mdm.basesetting.machine.vo.MachineVO;
 import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
-import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
 import org.springblade.mdm.basesetting.producedivision.vo.ImportResult;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.feign.ISysClient;
-import org.springblade.system.pojo.entity.Dept;
 import org.springblade.system.pojo.entity.DictBiz;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,11 +21,6 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.InvalidPathException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java
new file mode 100644
index 0000000..7c3f930
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java
@@ -0,0 +1,324 @@
+package org.springblade.mdm.basesetting.machine.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.basesetting.machine.mapper.MachineMapper;
+import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
+import org.springblade.mdm.basesetting.machine.vo.MachineSaveVO;
+import org.springblade.mdm.basesetting.machine.vo.MachineVO;
+import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
+import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.filewatch.DynamicDirectoryWatcher;
+import org.springblade.mdm.machinefile.filewatch.MachineFileChangeListener;
+import org.springblade.mdm.machinefile.filewatch.WatchInfo;
+import org.springblade.mdm.machinefile.service.MachineFileService;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.pojo.entity.Dept;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+@Service
+public class MachineService extends BizServiceImpl<MachineMapper, Machine> {
+	@Autowired
+	private ISysClient sysClient;
+	@Autowired
+	private DynamicDirectoryWatcher dynamicDirectoryWatcher;
+	@Autowired
+	private ParamService paramService;
+	@Transactional(rollbackFor = Exception.class)
+	public void saveMachine(MachineSaveVO vo) throws IOException {
+		checkMachine(vo);
+		if(existsByCode(vo.getCode(),null)){
+			throw new ServiceException("鏈哄簥缂栫爜宸插瓨鍦�:"+vo.getCode());
+		}
+
+		Machine machine = new Machine();
+		BeanUtil.copyProperties(vo, machine);
+		machine.setId(null);
+		this.save(machine);
+		makeMachineDirs(machine);
+		addDirWatcher(machine);
+	}
+
+
+	void makeMachineDirs(Machine machine) throws IOException {
+		Path dir;
+		if(StringUtils.isNotBlank(machine.getProgSendDir())){
+			createDirIsNotExists(machine.getProgSendDir());
+
+		}
+
+		if(StringUtils.isNotBlank(machine.getProgReceiveDir())){
+			createDirIsNotExists(machine.getProgReceiveDir());
+		}
+
+		if(StringUtils.isNotBlank(machine.getProgTempDir())){
+			createDirIsNotExists(machine.getProgTempDir());
+		}
+	}
+
+	void createDirIsNotExists(String pathdir) throws IOException {
+		Path dir = Paths.get(pathdir);
+		if(!Files.exists(dir)){
+			Files.createDirectories(dir);
+		}
+	}
+	void addDirWatcher(Machine machine){
+		String type = paramService.networkType();
+		if(type.equals(ParamService.NETWORK_TYPE_SHEMI)){
+			//娑夊瘑缃戜笉闇�瑕佺洃鎺х洰褰�
+			return;
+		}
+		try {
+			MachineFileService machineFileService = SpringUtil.getBean(MachineFileService.class);
+			ProgramAnnotationService annoService = SpringUtil.getBean(ProgramAnnotationService.class);
+
+			if(StringUtils.isNotBlank(machine.getProgSendDir())) {
+				WatchInfo watchInfoSend = new WatchInfo();
+				watchInfoSend.setMachine(machine);
+				watchInfoSend.setDirType(MachineFile.DIR_TYPE_SEND);
+				watchInfoSend.setPath(machine.getProgSendDir());
+
+				if(!dynamicDirectoryWatcher.containsPath(Paths.get(machine.getProgSendDir()))) {
+					dynamicDirectoryWatcher.addDirectory(Paths.get(machine.getProgSendDir()),
+						new MachineFileChangeListener(machineFileService,
+							annoService,
+							watchInfoSend));
+				}
+			}
+
+			if(StringUtils.isNotBlank(machine.getProgReceiveDir())) {
+				WatchInfo watchInfoRec = new WatchInfo();
+				watchInfoRec.setMachine(machine);
+				watchInfoRec.setDirType(MachineFile.DIR_TYPE_REC);
+				watchInfoRec.setPath(machine.getProgReceiveDir());
+				if(!dynamicDirectoryWatcher.containsPath(Paths.get(machine.getProgReceiveDir()))) {
+					dynamicDirectoryWatcher.addDirectory(Paths.get(machine.getProgReceiveDir()),
+						new MachineFileChangeListener(machineFileService,
+							annoService,
+							watchInfoRec));
+				}
+			}
+
+			if(StringUtils.isNotBlank(machine.getProgTempDir())) {
+				WatchInfo watchInfoTemp = new WatchInfo();
+				watchInfoTemp.setMachine(machine);
+				watchInfoTemp.setDirType(MachineFile.DIR_TYPE_TEMP);
+				watchInfoTemp.setPath(machine.getProgTempDir());
+				if(!dynamicDirectoryWatcher.containsPath(Paths.get(machine.getProgTempDir()))) {
+					dynamicDirectoryWatcher.addDirectory(Paths.get(machine.getProgTempDir()),
+						new MachineFileChangeListener(machineFileService,
+							annoService,
+							watchInfoTemp));
+				}
+			}
+		} catch (Exception e) {
+			log.error("澧炲姞鏈哄簥鐩戞帶寮傚父",e);
+			throw new RuntimeException(e);
+		}
+	}
+	/**
+	 * 妫�鏌ユ満搴婂綍鍏ユ暟鎹�
+	 * @param vo 褰曞叆鐨勮〃鍗曟暟鎹甐O
+	 */
+	void checkMachine(MachineSaveVO vo){
+		if(Func.isEmpty(vo.getCode())){
+			throw new ServiceException("鏈哄簥缂栫爜涓嶈兘涓虹┖");
+		}
+
+		if(Func.isEmpty(vo.getName())){
+			throw new ServiceException("鏈哄簥绫诲瀷涓嶈兘涓虹┖");
+		}
+
+		if(Func.isEmpty(vo.getMachineGroupCode())){
+			throw new ServiceException("鎵�灞炵粍缁囦笉鑳戒负绌�");
+		}
+
+		if(Func.isEmpty(vo.getMachineSpec())){
+			throw new ServiceException("鏈哄簥绫诲瀷涓嶈兘涓虹┖");
+		}
+	}
+
+	/**
+	 * 鏍规嵁鏈哄簥缂栫爜鍒ゆ柇鏈哄簥鏄惁瀛樺湪
+	 * @param code 鏈哄簥缂栫爜
+	 * @param excludeId 鎺掗櫎id
+	 * @return 鏄惁瀛樺湪
+	 */
+	boolean existsByCode(String code,Long excludeId){
+		return this.lambdaQuery().eq(Machine::getCode, code).ne(excludeId!=null,Machine::getId, excludeId).count()>0;
+	}
+
+	/**
+	 * 淇敼鏈哄簥淇℃伅
+	 * @param vo
+	 * @return
+	 */
+	public boolean updateMachine(MachineSaveVO vo) throws Exception {
+
+		checkMachine(vo);
+		if(existsByCode(vo.getCode(),vo.getId())){
+			throw new ServiceException("鏈哄簥缂栫爜宸插瓨鍦�:"+vo.getCode());
+		}
+
+		Machine machine = this.getById(vo.getId());
+
+		Machine machineBak = new Machine();
+		BeanUtil.copyProperties(machine, machineBak);
+
+		machine.setMachineSpec(vo.getMachineSpec());
+		machine.setCode(vo.getCode());
+		machine.setName(vo.getName());
+		machine.setMachineGroupCode(vo.getMachineGroupCode());
+		machine.setManufacturer(vo.getManufacturer());
+		machine.setOperator(vo.getOperator());
+		machine.setControlSystem(vo.getControlSystem());
+		machine.setOwnerDept(vo.getOwnerDept());
+		machine.setProgSendDir(vo.getProgSendDir());
+		machine.setProgReceiveDir(vo.getProgReceiveDir());
+		machine.setProgTempDir(vo.getProgTempDir());
+		machine.setStatus(vo.getStatus());
+		machine.setRemark(vo.getRemark());
+		machine.setSendDirExpiryHours(vo.getSendDirExpiryHours());
+		machine.setReceiveDirExpiryHours(vo.getReceiveDirExpiryHours());
+
+		boolean updateR = this.updateById(machine);
+		removeDirWatcher(machineBak);
+		addDirWatcher(machine);
+
+		return updateR;
+	}
+
+	/**
+	 * 鍘绘帀鐩綍鐩戞帶
+	 * @param machine
+	 * @throws Exception
+	 */
+	private void removeDirWatcher(Machine machine) throws Exception {
+		String type = paramService.networkType();
+		if(type.equals(ParamService.NETWORK_TYPE_SHEMI)){
+			//娑夊瘑缃戜笉闇�瑕佺洃鎺х洰褰�
+			return;
+		}
+		if(StringUtils.isNotBlank(machine.getProgSendDir())) {
+			dynamicDirectoryWatcher.removeDirectory(Paths.get(machine.getProgSendDir()));
+		}
+
+		if(StringUtils.isNotBlank(machine.getProgReceiveDir())) {
+			dynamicDirectoryWatcher.removeDirectory(Paths.get(machine.getProgReceiveDir()));
+		}
+
+		if(StringUtils.isNotBlank(machine.getProgTempDir())) {
+			dynamicDirectoryWatcher.removeDirectory(Paths.get(machine.getProgTempDir()));
+		}
+	}
+
+	/**
+	 * 鏌ヨ鍒嗛〉
+	 * @param query 鏌ヨ鍙傛暟
+	 * @return 鍒嗛〉鏁版嵁
+	 */
+	public IPage<MachineVO> pageQuery(MachineQueryVO query) {
+
+		if (query.getDeptId() != null) {
+			R<Dept> rs = sysClient.getDept(query.getDeptId());
+			if(rs.isSuccess()){
+				query.setDeptAncestors(rs.getData().getAncestors()+","+rs.getData().getId());
+			}
+		}
+		return this.getBaseMapper().pageQuery(Condition.getPage(query), query);
+	}
+
+	/**
+	 * 鏌ヨ璇︽儏
+	 * @param id 鏈哄簥id
+	 * @return
+	 */
+	public MachineVO detail(long id) {
+		Machine machine = this.getById(id);
+
+		MachineVO vo = new MachineVO();
+		BeanUtil.copyProperties(machine, vo);
+
+		return vo;
+	}
+
+	/**
+	 * 浜х敓鏈哄簥鍥炰紶缁撴瀯鏁版嵁
+	 * @param id
+	 */
+	/*
+	public void genMachineFileBackDirs(Long id) throws IOException {
+		Machine machine = this.getById(id);
+		if(Func.isNotBlank(machine.getProgReceiveDir())){
+			if(isLegalDirectoryPath(machine.getProgReceiveDir())) {
+				Path path = Paths.get(machine.getProgReceiveDir());
+				Files.createDirectories(path);
+			}else{
+				throw new RuntimeException("闈炴硶鐨勭洰褰曟牸寮�");
+			}
+		}
+	}*/
+
+	/**
+	 * 鍒ゆ柇鏄惁鏄悎娉曠殑鐩綍鏍煎紡
+	 * @param path
+	 * @return
+	 */
+	static boolean isLegalDirectoryPath(String path) {
+		// 鍩虹妫�鏌�
+		if (path == null || path.trim().isEmpty()) {
+			return false;
+		}
+
+		// 浣跨敤NIO妫�鏌ヨ矾寰勬牸寮�
+		Path nioPath;
+		try {
+			nioPath = Paths.get(path);
+			if (!nioPath.normalize().toString().equals(path)) {
+				return false; // 璺緞涓嶈鑼�
+			}
+		} catch (InvalidPathException ex) {
+			return false;
+		}
+
+		return true;
+
+	}
+
+	/**
+	 * 鏍规嵁鏈哄簥缂栫爜鑾峰彇鏈哄簥
+	 * @param machineCode 鏈哄簥缂栫爜
+	 * @return
+	 */
+	public Machine getByCode(String machineCode) {
+		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/basesetting/machinegroup/controller/MachineGroupController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
index 272cbbd..1b1bd68 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machinegroup/controller/MachineGroupController.java
@@ -11,7 +11,6 @@
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
 import org.springblade.mdm.basesetting.machinegroup.MachineGroupService;
 import org.springblade.mdm.basesetting.machinegroup.entity.MachineGroup;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
index beb8be6..802bc25 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
@@ -106,4 +106,11 @@
 		return getParamValue(
 			APPROVE_TABLE_TEMPLATE,"");
 	}
+
+	public String networkType() {
+		return getParamValue(
+			NETWORK_TYPE,NETWORK_TYPE_SHEMI);
+	}
+
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
index e4d826d..2fbd7d6 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
@@ -3,22 +3,117 @@
 import jakarta.annotation.PostConstruct;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springblade.core.oss.OssTemplate;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.filewatch.*;
+import org.springblade.mdm.machinefile.service.MachineFileScanService;
+import org.springblade.mdm.machinefile.service.MachineFileService;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Component;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
 
 @Slf4j
 @AllArgsConstructor
 @Component
 public class InitBean {
-
-	private final OssTemplate ossTemplate;
+	private final DirectorLockService directorLockService;
+	private final DynamicDirectoryWatcher directoryWatcher;
+	private final MachineService machineService;
+	private final MachineFileService machineFileService;
+	private final ParamService paramService;
+	private final ProgramAnnotationService annotationService;
+	private final MachineFileScanService machineFileScanService;
 	private final ISysClient sysClient;
 
 	@PostConstruct
 	public void init() {
 		log.info("搴旂敤鍚姩鏃舵墽琛屽垵濮嬪寲鎿嶄綔 @PostConstruct");
+		String networkType = paramService.networkType();
+		if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)) {
+			machineFileScanService.scanMachineFile();//鍚姩鎵ц涓�娆℃壂鎻�
+			//宸ユ帶缃戞墠鍚姩鏂囦欢鐩戞帶
+			log.info("宸ユ帶缃戝惎鍔ㄦ枃浠剁洃鎺�");
+			initMachineDirMonitor();
+		}
+	}
+
+	/**
+	 * 鍒濆鍖栫洃鎺х洰褰�
+	 */
+	void initMachineDirMonitor() {
+		boolean locked = directorLockService.acquireLock();
+		if (!locked) {
+			log.info("鍥炰紶鎺ユ敹鐩綍宸茬粡琚叾浠栭儴缃茬偣浣嶉攣瀹氾紝鐩存帴杩斿洖");
+			return;
+		}
+
+		List<Machine> machineList = machineService.getEnableMachines();;
+		List<WatchInfo> monitorInfoList = new ArrayList<>();
+		machineList.forEach(m -> {
+			addToWatchDirList(monitorInfoList,m);
+		});
+		for (WatchInfo info : monitorInfoList) {
+			Path dirPath = Paths.get(info.getPath());
+			try {
+				if(!dirPath.toFile().exists()) {
+					dirPath.toFile().mkdirs();
+				}
+				directoryWatcher.addDirectory(dirPath,getListener(info));
+			} catch (Exception e) {
+				log.error("娣诲姞鐩戞帶鐩綍寮傚父",e);
+			}
+		}
 
 	}
 
+	void addToWatchDirList(List<WatchInfo> monitorDirList,Machine machine){
+		String dir;
+		//鍔犲叆send鏂囦欢澶�
+		if (StringUtils.isNotEmpty(machine.getProgSendDir())) {
+			dir = StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgSendDir(), "/"), "\\");
+			WatchInfo watchInfo = new WatchInfo();
+			watchInfo.setMachine(machine);
+			watchInfo.setDirType(MachineFile.DIR_TYPE_SEND);
+			watchInfo.setPath(dir);
+			if (!monitorDirList.contains(watchInfo)) {
+				monitorDirList.add(watchInfo);
+			}
+		}
+
+		//鍔犲叆rec鏂囦欢澶�
+		if (StringUtils.isNotEmpty(machine.getProgReceiveDir())) {
+			dir = StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgReceiveDir(), "/"), "\\");
+			WatchInfo watchInfo = new WatchInfo();
+			watchInfo.setMachine(machine);
+			watchInfo.setDirType(MachineFile.DIR_TYPE_REC);
+			watchInfo.setPath(dir);
+			if (!monitorDirList.contains(watchInfo)) {
+				monitorDirList.add(watchInfo);
+			}
+		}
+
+		//鍔犲叆temp鏂囦欢澶�
+		if (StringUtils.isNotEmpty(machine.getProgTempDir())) {
+			dir = StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgTempDir(), "/"), "\\");
+			WatchInfo watchInfo = new WatchInfo();
+			watchInfo.setMachine(machine);
+			watchInfo.setDirType(MachineFile.DIR_TYPE_TEMP);
+			watchInfo.setPath(dir);
+			if (!monitorDirList.contains(watchInfo)) {
+				monitorDirList.add(watchInfo);
+			}
+		}
+	}
+
+	FileWatcherService.FileChangeListener getListener(WatchInfo info) {
+		return new MachineFileChangeListener(machineFileService,annotationService,info);
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/ShutdownHook.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/ShutdownHook.java
index 4a98ec6..35bd28a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/ShutdownHook.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/ShutdownHook.java
@@ -2,12 +2,13 @@
 
 import jakarta.annotation.PreDestroy;
 import lombok.AllArgsConstructor;
+import org.springblade.mdm.machinefile.filewatch.DirectorLockService;
 import org.springframework.stereotype.Component;
 
 @AllArgsConstructor
 @Component
 public class ShutdownHook {
-
+	private final DirectorLockService directorLockService;
 	@PreDestroy
 	public void onExit() {
 		System.out.println("鎵ц閫�鍑哄墠娓呯悊鎿嶄綔...");
@@ -15,6 +16,6 @@
 		// 2. 閲婃斁璧勬簮
 		// 3. 淇濆瓨鐘舵��
 		// 4. 閫氱煡鍏朵粬鏈嶅姟
-
+		directorLockService.releaseLock();
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java
index 7aa82e7..72e7726 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java
@@ -2,16 +2,8 @@
 
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.IOUtils;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.springblade.core.oss.OssTemplate;
-import org.springblade.core.oss.model.BladeFile;
-import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
-import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.commons.contants.ParamConstants;
-import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.excution.dispatch.FinishDataHandler;
 import org.springblade.mdm.flow.service.FlowCommonService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
@@ -19,19 +11,11 @@
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeAutoCreateService;
 import org.springblade.mdm.program.service.NcNodeService;
-import org.springblade.mdm.program.service.ProgramAnnotationService;
 import org.springblade.system.feign.ISysClient;
-import org.springblade.system.pojo.entity.DictBiz;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.time.LocalDate;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
 
 @Slf4j
 @Component("cureFinishOperateTask")
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java
index d651e67..d7b6dd4 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java
@@ -1,9 +1,7 @@
 package org.springblade.mdm.flow.excution.cure;
 
 import lombok.extern.slf4j.Slf4j;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
-import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.excution.dispatch.FinishDataHandler;
@@ -11,7 +9,6 @@
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.FlowProgramProperties;
 import org.springblade.mdm.program.entity.NcNode;
-import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.service.NcNodeAutoCreateService;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NcProgramApprovedService;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
index 773f109..231e377 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -7,11 +7,9 @@
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.contants.ParamConstants;
-import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.excution.dispatch.FinishDataHandler;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java
index e6ca386..3ec57b0 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java
@@ -1,22 +1,12 @@
 
 package org.springblade.mdm.flow.service;
 
-import com.itextpdf.text.Chunk;
-import com.itextpdf.text.DocumentException;
-import com.itextpdf.text.Font;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.HistoryService;
 import org.flowable.task.api.history.HistoricTaskInstance;
-import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.DateUtil;
 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.commons.service.ParamService;
-import org.springblade.mdm.commons.support.TemplatedPdfWriter;
-import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.vo.ApproveTableInfo;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgramApproved;
@@ -27,9 +17,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.util.*;
 
 /**
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
index ec17e64..accafb2 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
@@ -5,7 +5,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.service.ParamService;
 import org.springblade.mdm.commons.support.TemplatedPdfWriter;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
index 9a6e195..ba90311 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -2,16 +2,13 @@
 
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.flowable.engine.HistoryService;
 import org.flowable.engine.IdentityService;
 import org.flowable.engine.RuntimeService;
-import org.flowable.engine.TaskService;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
index 8304ada..a79f69a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -4,15 +4,12 @@
 import lombok.AllArgsConstructor;
 import org.flowable.engine.HistoryService;
 import org.flowable.engine.RuntimeService;
-import org.flowable.engine.TaskService;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
-import org.flowable.task.api.Task;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
@@ -22,8 +19,6 @@
 import org.springblade.system.feign.IUserClient;
 import org.springblade.system.pojo.entity.User;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 import java.util.Map;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
index 47a0d67..1db2720 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
@@ -6,19 +6,15 @@
 import org.flowable.engine.runtime.ProcessInstance;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
-import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
-import org.springblade.mdm.program.service.NodeDeptQueryService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
index 07a9bac..23113ee 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
@@ -2,13 +2,11 @@
 package org.springblade.mdm.flow.service;
 
 import com.itextpdf.text.*;
-import com.itextpdf.text.pdf.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.QinzheFgb;
 import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService;
@@ -16,7 +14,6 @@
 import org.springblade.mdm.commons.service.ParamService;
 import org.springblade.mdm.commons.support.TemplatedPdfWriter;
 import org.springblade.mdm.flow.vo.ApproveTableInfo;
-import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.feign.IUserClient;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
index d3123a6..113283f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
@@ -1,27 +1,19 @@
 package org.springblade.mdm.flow.service;
 
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.IdentityService;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
 import org.flowable.engine.runtime.ProcessInstance;
-import org.flowable.task.api.Task;
-import org.simpleframework.xml.core.Replace;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
-import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
-import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
-import org.springblade.mdm.flow.entity.ReplaceProgramFile;
 import org.springblade.mdm.flow.vo.ReplaceFlowStartVO;
 import org.springblade.mdm.flow.vo.ReplaceUploadVO;
-import org.springblade.mdm.flow.vo.TaskAssignVO;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NodeDeptQueryService;
@@ -30,16 +22,13 @@
 import org.springblade.mdm.utils.EntityUtil;
 import org.springblade.mdm.utils.ProgramFileNameCheckUtil;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 @AllArgsConstructor
 @Service
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 55d800c..c592587 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
@@ -4,9 +4,8 @@
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.mp.base.BizServiceImpl;
-import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.contants.ParamConstants;
 import org.springblade.mdm.commons.service.ParamService;
@@ -15,10 +14,7 @@
 import org.springblade.mdm.gkw.programnode.entity.TreeDept;
 import org.springblade.mdm.gkw.programnode.mapper.ProgramNodeMapper;
 import org.springblade.mdm.gkw.programnode.vo.ProgramNodeVO;
-import org.springblade.system.feign.ISysClient;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileMonitorRecordController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileMonitorRecordController.java
new file mode 100644
index 0000000..8c2e365
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileMonitorRecordController.java
@@ -0,0 +1,60 @@
+
+package org.springblade.mdm.machinefile.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
+import org.springblade.mdm.machinefile.entity.FileMonitorRecord;
+import org.springblade.mdm.machinefile.service.FileMonitorRecordService;
+import org.springblade.mdm.machinefile.service.FileSendRecordService;
+import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
+import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * 鏂囦欢涓嬪彂璁板綍
+ *
+ * @author yangys
+ */
+@NonDS
+@RestController
+@RequestMapping("/machinefile/monitorrecord")
+@Tag(name = "鏂囦欢鐩戞帶璁板綍", description = "鏂囦欢鐩戞帶璁板綍")
+@Slf4j
+public class FileMonitorRecordController {
+	@Autowired
+	private MdmDeptService mdmDeptService;
+	@Autowired
+	private FileMonitorRecordService fileMonitorRecordService;
+
+	@GetMapping("/page")
+	@Operation(summary = "宸ユ帶缃戠洰褰曟枃浠跺垪琛�", description = "宸ユ帶缃戠洰褰曟枃浠跺垪琛�")
+	public R<IPage<FileMonitorRecord>> page(FileSendRecordQueryVO query) {
+
+		Date end = null;
+		if(query.getCreateTimeEnd() != null) {
+			end = DateUtil.plusDays(query.getCreateTimeEnd(),1);
+		}
+
+		IPage<FileMonitorRecord> page = fileMonitorRecordService.lambdaQuery()
+			.like(StringUtils.isNotBlank(query.getName()),FileMonitorRecord::getName,query.getName())
+			.ge(query.getCreateTimeBegin()!=null,FileMonitorRecord::getCreateTime,query.getCreateTimeBegin())
+			.le(query.getCreateTimeEnd()!=null,FileMonitorRecord::getCreateTime,end)
+			.page(Condition.getPage(query));
+
+		return R.data(page);
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java
new file mode 100644
index 0000000..0209a43
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java
@@ -0,0 +1,53 @@
+
+package org.springblade.mdm.machinefile.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
+import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
+import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.service.FileSendRecordService;
+import org.springblade.mdm.machinefile.service.MachineFileChangeHisService;
+import org.springblade.mdm.machinefile.service.MachineFileService;
+import org.springblade.mdm.machinefile.vo.*;
+import org.springblade.mdm.program.vo.CompareDataVO;
+import org.springframework.beans.factory.annotation.Autowired;
+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.ArrayList;
+import java.util.List;
+
+/**
+ * 鏂囦欢涓嬪彂璁板綍
+ *
+ * @author yangys
+ */
+@NonDS
+@RestController
+@RequestMapping("/machinefile/sendrecord")
+@Tag(name = "鏂囦欢涓嬪彂璁板綍", description = "鏂囦欢涓嬪彂璁板綍")
+@Slf4j
+public class FileSendRecordController {
+	@Autowired
+	private MdmDeptService mdmDeptService;
+	@Autowired
+	private FileSendRecordService fileSendRecordService;
+
+	@GetMapping("/file-page")
+	@Operation(summary = "宸ユ帶缃戠洰褰曟枃浠跺垪琛�", description = "宸ユ帶缃戠洰褰曟枃浠跺垪琛�")
+	public R<IPage<FileSendRecordVO>> page(FileSendRecordQueryVO query) {
+
+		return R.data(fileSendRecordService.pageQuery(query));
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineAcceptedFileController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineAcceptedFileController.java
index 6c638aa..83942fe 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineAcceptedFileController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineAcceptedFileController.java
@@ -7,7 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
 import org.springblade.mdm.machinefile.service.MachineFileService;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineCollectFileController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineCollectFileController.java
index e6accdd..b9935e3 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineCollectFileController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineCollectFileController.java
@@ -5,7 +5,7 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.tool.api.R;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
 import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineFileController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineFileController.java
index 3734fa7..4265b29 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineFileController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/MachineFileController.java
@@ -7,7 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
 import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileMonitorRecord.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileMonitorRecord.java
new file mode 100644
index 0000000..c3e7b8c
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileMonitorRecord.java
@@ -0,0 +1,50 @@
+package org.springblade.mdm.machinefile.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.io.FileUtils;
+import org.springblade.core.mp.base.BizEntity;
+
+import java.util.Date;
+
+/**
+ * 鏈哄簥鏂囦欢涓嬪彂璁板綍
+ */
+@Setter
+@Getter
+@TableName("mdm_file_monitor_record")
+public class FileMonitorRecord {
+	public static final int EVENT_DELETE = 2;
+	public static final int EVENT_CREATE = 1;
+	/**
+	 * 涓婚敭
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@Schema(description = "涓婚敭")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 鏂囦欢鍚�
+	 */
+	private String name;
+	/**
+	 *鏂囦欢璺緞
+	 */
+	private String dirPath;
+	/**
+	 * 浜嬩欢绫诲瀷锛�1:鍒涘缓;2锛氫慨鏀�;3鍒犻櫎
+	 */
+	private int eventType;
+	/**
+	 * 涓氬姟鐘舵��
+	 */
+	@Schema(description = "鍒涘缓鏃堕棿")
+	private Date createTime;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java
new file mode 100644
index 0000000..2b1287e
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java
@@ -0,0 +1,42 @@
+package org.springblade.mdm.machinefile.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.io.FileUtils;
+import org.springblade.core.mp.base.BizEntity;
+
+import java.util.Date;
+
+/**
+ * 鏈哄簥鏂囦欢涓嬪彂璁板綍
+ */
+@Setter
+@Getter
+@TableName("mdm_file_send_record")
+public class FileSendRecord extends BizEntity {
+
+	/**
+	 * 鏂囦欢鍚�
+	 */
+	private String name;
+
+
+	/**
+	 * 鎵�灞炴満搴�
+	 */
+	private String machineCode;
+	/**
+	 * 鏂囦欢瀛楄妭鏁�
+	 */
+	private Long fileSize;
+	/**
+	 * 鐢熸垚鏂囦欢澶у皬鐨勬樉绀烘枃鏈�
+	 * @return 鏄剧ず鏂囨湰
+	 */
+	public String getFileSizeDisplay(){
+		return FileUtils.byteCountToDisplaySize(fileSize);
+	}
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DirectorLockService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DirectorLockService.java
new file mode 100644
index 0000000..8ba1ae0
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DirectorLockService.java
@@ -0,0 +1,40 @@
+package org.springblade.mdm.machinefile.filewatch;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+
+
+@Slf4j
+@AllArgsConstructor
+@Service
+public class DirectorLockService {
+	private final JdbcTemplate jdbcTemplate;
+
+	public boolean acquireLock() {
+		int affect = 0;
+		try {
+			affect = jdbcTemplate.update(
+				"INSERT INTO mdm_file_locks (lock_id,locked_by, lock_time) " +
+					"VALUES (1,?, CURRENT_TIMESTAMP)",getInstanceId());
+		} catch (Exception e) {
+			log.info("鏂囦欢閿佸畾澶辫触锛屼笉杩涜鐩綍鐩戞帶",e);
+		}
+		return affect > 0;
+	}
+
+	public void releaseLock() {
+		jdbcTemplate.update(
+			"DELETE FROM mdm_file_locks");
+	}
+
+	private String getInstanceId() {
+		// 杩斿洖褰撳墠瀹炰緥鐨勫敮涓�鏍囪瘑
+		return ManagementFactory.getRuntimeMXBean().getName();
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DynamicDirectoryWatcher.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DynamicDirectoryWatcher.java
new file mode 100644
index 0000000..dc78520
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/DynamicDirectoryWatcher.java
@@ -0,0 +1,35 @@
+package org.springblade.mdm.machinefile.filewatch;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.nio.file.Path;
+import java.nio.file.WatchService;
+import java.util.Map;
+import java.util.Set;
+
+@Service
+public class DynamicDirectoryWatcher {
+	private final FileWatcherService fileWatcherService;
+
+	@Autowired
+	public DynamicDirectoryWatcher(FileWatcherService fileWatcherService) {
+		this.fileWatcherService = fileWatcherService;
+	}
+
+	public void addDirectory(Path directory, FileWatcherService.FileChangeListener listener) throws Exception {
+		fileWatcherService.watchDirectory(directory, listener);
+	}
+
+	public void removeDirectory(Path directory) throws Exception {
+		fileWatcherService.stopWatching(directory);
+	}
+
+	public Map<Path, WatchService> getWatchedDirectories() {
+
+		return fileWatcherService.getWatchedDirectories();
+	}
+
+	public boolean containsPath(Path path) {
+		return fileWatcherService.getWatchedDirectories().containsKey(path);
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileLockChecker.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileLockChecker.java
new file mode 100644
index 0000000..daa7033
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileLockChecker.java
@@ -0,0 +1,43 @@
+package org.springblade.mdm.machinefile.filewatch;
+import java.io.*;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.nio.file.Files;
+import java.nio.file.Path;
+/*
+鐩戞帶鏂囦欢鏄惁浼犺緭瀹屾垚锛堜娇鐢ㄥ彲鍚﹂攣瀹氭潵鍒ゆ柇锛�
+ */
+
+public class FileLockChecker {
+	public static boolean isFileCompletelyWritten(Path file) {
+		try (RandomAccessFile raf = new RandomAccessFile(file.toFile(), "rw");
+			 FileChannel channel = raf.getChannel()) {
+
+			// 灏濊瘯鑾峰彇鐙崰閿�
+			FileLock lock = channel.tryLock();
+			if (lock != null) {
+				lock.release();
+				// 濡傛灉鑳借幏鍙栭攣锛岃鏄庢枃浠朵笉鍐嶈鍐欏叆
+				return true;
+			}
+			return false;
+		} catch (Exception e) {
+			// 濡傛灉鍙戠敓寮傚父锛屽彲鑳芥枃浠朵粛鍦ㄨ鍐欏叆
+			return false;
+		}
+	}
+
+	/**
+	 * 鏂囦欢鏄惁浼犺緭瀹屾垚锛堥噰鐢ㄥ墠鍚庢枃浠跺ぇ灏忔瘮瀵规柟娉曪級
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 * @throws InterruptedException
+	 */
+	public static boolean isFileComplete(Path file) throws IOException, InterruptedException {
+		long initialSize = Files.size(file);
+		Thread.sleep(3000); // 绛夊緟1绉�
+		long currentSize = Files.size(file);
+		return initialSize == currentSize;
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileWatcherService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileWatcherService.java
new file mode 100644
index 0000000..ebd3d24
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/FileWatcherService.java
@@ -0,0 +1,101 @@
+package org.springblade.mdm.machinefile.filewatch;
+
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.file.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static java.nio.file.StandardWatchEventKinds.*;
+@Service
+public class FileWatcherService {
+
+	private final ExecutorService executor = Executors.newCachedThreadPool();
+	private final Map<Path, WatchService> watchServices = new HashMap<>();
+	private final Map<Path, FileChangeListener> listeners = new HashMap<>();
+
+	public interface FileChangeListener {
+		void onFileCreated(Path filePath);
+		void onFileModified(Path filePath);
+		void onFileDeleted(Path filePath);
+	}
+
+	public void watchDirectory(Path directory, FileChangeListener listener) throws IOException {
+		if (!Files.isDirectory(directory)) {
+			throw new IllegalArgumentException("Path must be a directory: " + directory);
+		}
+
+		if (watchServices.containsKey(directory)) {
+			throw new IllegalStateException("Directory is already being watched: " + directory);
+		}
+
+		WatchService watchService = FileSystems.getDefault().newWatchService();
+		directory.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
+
+		watchServices.put(directory, watchService);
+		listeners.put(directory, listener);
+
+		executor.submit(() -> {
+			try {
+				while (true) {
+					WatchKey key = watchService.take();
+					for (WatchEvent<?> event : key.pollEvents()) {
+						WatchEvent.Kind<?> kind = event.kind();
+
+						@SuppressWarnings("unchecked")
+						WatchEvent<Path> ev = (WatchEvent<Path>) event;
+						Path fileName = ev.context();
+						Path fullPath = directory.resolve(fileName);
+
+						FileChangeListener currentListener = listeners.get(directory);
+						if (currentListener == null) break;
+
+						if (kind == ENTRY_CREATE) {
+							currentListener.onFileCreated(fullPath);
+						} else if (kind == ENTRY_MODIFY) {
+							currentListener.onFileModified(fullPath);
+						} else if (kind == ENTRY_DELETE) {
+							currentListener.onFileDeleted(fullPath);
+						}
+					}
+					boolean valid = key.reset();
+					if (!valid) {
+						break;
+					}
+				}
+			} catch (InterruptedException e) {
+				Thread.currentThread().interrupt();
+			} catch (ClosedWatchServiceException e) {
+				// Service was closed, exit normally
+			}
+		});
+	}
+
+	public void stopWatching(Path directory) throws IOException {
+		WatchService watchService = watchServices.remove(directory);
+		listeners.remove(directory);
+		if (watchService != null) {
+			watchService.close();
+		}
+	}
+
+	public void shutdown() {
+		executor.shutdownNow();
+		watchServices.values().forEach(watchService -> {
+			try {
+				watchService.close();
+			} catch (IOException e) {
+				// Ignore on shutdown
+			}
+		});
+		watchServices.clear();
+		listeners.clear();
+	}
+
+	public Map<Path, WatchService> getWatchedDirectories(){
+		return this.watchServices;
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/MachineFileChangeListener.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/MachineFileChangeListener.java
new file mode 100644
index 0000000..d248c18
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/MachineFileChangeListener.java
@@ -0,0 +1,108 @@
+package org.springblade.mdm.machinefile.filewatch;
+
+import com.alibaba.excel.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.machinefile.entity.FileMonitorRecord;
+import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.service.FileMonitorRecordService;
+import org.springblade.mdm.machinefile.service.MachineFileScanService;
+import org.springblade.mdm.machinefile.service.MachineFileService;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Date;
+
+@Slf4j
+public class MachineFileChangeListener implements FileWatcherService.FileChangeListener{
+	private final MachineFileService machineFileService;
+	ProgramAnnotationService programAnnotationService;
+	private final Machine machine;
+	private final String dirType;
+	public MachineFileChangeListener(MachineFileService aMachineFileService, ProgramAnnotationService annotationService, WatchInfo info) {
+		this.machineFileService = aMachineFileService;
+		this.machine = info.getMachine();
+		this.dirType = info.getDirType();
+		this.programAnnotationService = annotationService;
+	}
+	@Override
+	public void onFileCreated(Path filePath) {
+
+		try {
+			log.info("鏂囦欢鍒涘缓{},mcode={},dieType={}",filePath,machine.getCode(),dirType);
+			if(FileLockChecker.isFileComplete(filePath)){
+				MachineFileScanService fileScanService = SpringUtil.getBean(MachineFileScanService.class);
+				MachineFile mf = fileScanService.readFileToMachineFile(filePath,this.machine,this.dirType,programAnnotationService.getAnnotionDictList());
+				machineFileService.refreshFileData(mf);
+			}
+			saveMonitor(filePath,FileMonitorRecord.EVENT_CREATE);
+		} catch (InterruptedException e) {
+			log.error("sleep鍑洪敊",e);
+		} catch (IOException e) {
+			log.error("鏈哄簥鏂囦欢鐩戞帶created寮傚父",e);
+		}catch (Exception e) {
+			log.error("鏈哄簥鍥炰紶鏂囦欢澶勭悊寮傚父create",e);
+		}
+	}
+
+
+	@Override
+	public void onFileModified(Path filePath) {
+		//鏂囦欢淇敼
+		log.info("鏂囦欢淇敼:{}",filePath);
+		try {
+			if(FileLockChecker.isFileComplete(filePath)){
+				log.info("鏂囦欢浼犺緭瀹屾垚{}",filePath);
+				MachineFileScanService fileScanService = SpringUtil.getBean(MachineFileScanService.class);
+				MachineFile mf = fileScanService.readFileToMachineFile(filePath,this.machine,this.dirType,programAnnotationService.getAnnotionDictList());
+				machineFileService.refreshFileData(mf);
+			}else{
+				log.warn("鏂囦欢浼犺緭涓紝鍚庣画鍐嶆搷浣渰}",filePath);
+			}
+		} catch (IOException e) {
+			log.error("鍥炰紶鏂囦欢鎿嶄綔IO閿欒",e);
+			throw new RuntimeException(e);
+		} catch (InterruptedException e) {
+			log.error("sleep鍑洪敊",e);
+		} catch (Exception e) {
+			log.error("鏈哄簥鍥炰紶鏂囦欢澶勭悊寮傚父",e);
+		}
+	}
+
+	@Override
+	public void onFileDeleted(Path filePath) {
+		String path = filePath.toString();
+		log.info("鏂囦欢鍒犻櫎{}",filePath);
+
+		try {
+
+			String name = filePath.getFileName().toString();
+
+			saveMonitor(filePath,FileMonitorRecord.EVENT_DELETE);
+
+			MachineFile fileInDb = machineFileService.getExistsFile(name,this.dirType,this.machine.getCode());
+			if(fileInDb != null){
+				fileInDb.markFileDeleted();
+				machineFileService.updateById(fileInDb);
+			}else{
+				log.info("鏁版嵁搴撳唴涓嶅瓨鍦ㄦ枃浠秢}",filePath);
+			}
+		} catch (Exception e) {
+			log.error("鏈哄簥鍥炰紶鏂囦欢onDelete澶勭悊寮傚父",e);
+		}
+	}
+
+	void saveMonitor(Path filePath,int eventType){
+		FileMonitorRecordService fileMonitorRecordService = SpringUtil.getBean(FileMonitorRecordService.class);
+		FileMonitorRecord monitorRecord = new FileMonitorRecord();
+		monitorRecord.setName(filePath.getFileName().toString());
+		monitorRecord.setDirPath(filePath.getParent().toString());
+
+		monitorRecord.setEventType(eventType);
+		monitorRecord.setCreateTime(new Date());
+		fileMonitorRecordService.save(monitorRecord);
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/WatchInfo.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/WatchInfo.java
new file mode 100644
index 0000000..46995bf
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/filewatch/WatchInfo.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.machinefile.filewatch;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+
+@Setter
+@Getter
+@EqualsAndHashCode
+public class WatchInfo {
+	private Machine machine;
+	private String dirType;
+	private String path;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.java
new file mode 100644
index 0000000..9ccb3c6
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.java
@@ -0,0 +1,20 @@
+package org.springblade.mdm.machinefile.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springblade.mdm.machinefile.entity.FileMonitorRecord;
+import org.springblade.mdm.machinefile.entity.FileSendRecord;
+import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
+import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
+
+public interface FileMonitorRecordMapper extends BladeMapper<FileMonitorRecord> {
+	/**
+	 * 鍒嗛〉鎷嗙嚎鍛㈣褰�
+	 * @param page
+	 * @param query
+	 * @return
+	 */
+	//IPage<FileMonitorRecordVO> pageQuery(IPage<FileMonitorRecordVO> page, @Param("query")FileMonitorRecordQueryVO query);
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.xml
new file mode 100644
index 0000000..3e4aed3
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileMonitorRecordMapper.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.mdm.machinefile.mapper.FileMonitorRecordMapper">
+    <resultMap id="BaseResultMap" type="org.springblade.mdm.machinefile.entity.FileMonitorRecord">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="create_time" property="createTime"/>
+    </resultMap>
+
+</mapper>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.java
new file mode 100644
index 0000000..a19ed38
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.java
@@ -0,0 +1,19 @@
+package org.springblade.mdm.machinefile.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springblade.mdm.machinefile.entity.FileSendRecord;
+import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
+import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
+
+public interface FileSendRecordMapper extends BladeMapper<FileSendRecord> {
+	/**
+	 * 鍒嗛〉鎷嗙嚎鍛㈣褰�
+	 * @param page
+	 * @param query
+	 * @return
+	 */
+	IPage<FileSendRecordVO> pageQuery(IPage<FileSendRecordVO> page, @Param("query")FileSendRecordQueryVO query);
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.xml
new file mode 100644
index 0000000..73cd15e
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/FileSendRecordMapper.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.mdm.machinefile.mapper.FileSendRecordMapper">
+    <resultMap id="BaseResultMap" type="org.springblade.mdm.machinefile.entity.FileSendRecord">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="status" property="status"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <!--鏂囦欢璁板綍鏌ヨ-->
+
+    <select id="pageQuery" resultType="org.springblade.mdm.machinefile.vo.FileSendRecordVO">
+        select f.id,f.name,f.machine_code,f.file_size,f.create_time,f.update_time,u.name create_user_name
+        from mdm_file_send_record f left join blade_user u on f.create_user=u.id
+        <where>
+            f.is_deleted=0
+
+            <if test="query.name!=null and query.name!=''">
+                and f.name like CONCAT('%', #{query.name,jdbcType=VARCHAR},'%')
+            </if>
+
+            <if test="query.machineCode!=null and query.machineCode!=''">
+                and   f.machine_code= #{query.machineCode,jdbcType=VARCHAR}
+            </if>
+            <if test="query.createTimeBegin!=null">
+                and h.create_time &gt;=#{query.createTimeBegin}
+            </if>
+            <if test="query.createTimeEnd!=null">
+                and h.create_time &lt;=#{query.createTimeEnd}
+            </if>
+            <!--
+            <if test="query.deptIds!=null and query.deptIds.size()&gt;0">
+                and  m.owner_dept in
+                <foreach item="item" collection="query.deptIds" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            -->
+        </where>
+        order by f.create_time desc
+    </select>
+</mapper>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/MachineFileMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/MachineFileMapper.xml
index 827b5c2..abe01bd 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/MachineFileMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/mapper/MachineFileMapper.xml
@@ -68,7 +68,7 @@
         select f.id,f.name,f.machine_code,f.file_create_time, f.file_modify_time,f.md5,f.file_size,f.create_time,f.update_time
         from mdm_machine_file f join mdm_machine m on f.machine_code=m.code and m.is_deleted=0
         <where>
-            f.is_deleted=0
+            f.is_deleted=0 and f.status &lt;&gt; 4
 
             <if test="query.name!=null and query.name!=''">
                 and f.name like CONCAT('%', #{query.name,jdbcType=VARCHAR},'%')
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileMonitorRecordService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileMonitorRecordService.java
new file mode 100644
index 0000000..7e81c15
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileMonitorRecordService.java
@@ -0,0 +1,25 @@
+
+package org.springblade.mdm.machinefile.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.mp.base.BizServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.mdm.machinefile.entity.FileMonitorRecord;
+import org.springblade.mdm.machinefile.mapper.FileMonitorRecordMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鏈哄簥鏂囦欢
+ *
+ * @author yangys
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class FileMonitorRecordService extends ServiceImpl<FileMonitorRecordMapper, FileMonitorRecord> {
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileSendRecordService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileSendRecordService.java
new file mode 100644
index 0000000..92aa34c
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/FileSendRecordService.java
@@ -0,0 +1,32 @@
+
+package org.springblade.mdm.machinefile.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.mdm.machinefile.entity.FileSendRecord;
+import org.springblade.mdm.machinefile.mapper.FileSendRecordMapper;
+import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
+import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+/**
+ * 鏈哄簥鏂囦欢
+ *
+ * @author yangys
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class FileSendRecordService extends BizServiceImpl<FileSendRecordMapper, FileSendRecord> {
+
+
+	public IPage<FileSendRecordVO> pageQuery(FileSendRecordQueryVO query) {
+		return baseMapper.pageQuery(Condition.getPage(query),query);
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
new file mode 100644
index 0000000..f12198e
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
@@ -0,0 +1,288 @@
+package org.springblade.mdm.machinefile.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.utils.FileContentUtil;
+import org.springblade.system.pojo.entity.DictBiz;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedInputStream;
+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.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Component
+public class MachineFileScanService {
+	@Autowired
+	private MachineFileService machineFileService;
+	@Autowired
+	private MachineService machineService;
+	@Autowired
+	private ParamService paramService;
+	@Autowired
+	private ProgramAnnotationService programAnnotationService;
+
+
+	/**
+	 * 鎵弿鎵�鏈夋満搴婄殑閰嶇疆鐩綍
+	 */
+	public void scanMachineFile() {
+		List<Machine> machines = machineService.getEnableMachines();
+		for (Machine machine : machines) {
+
+			//鎵弿鏂版枃浠�
+			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);
+			}
+
+			//娓呯悊鏁版嵁搴擄紝鍒犻櫎鏂囦欢涓嶅瓨鍦ㄧ殑鏁版嵁
+			try {
+				clearDeletedRecords(machine,MachineFile.DIR_TYPE_REC);
+			}catch(Exception e) {
+				log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
+			}
+			try {
+				clearDeletedRecords(machine,MachineFile.DIR_TYPE_SEND);
+			}catch(Exception e) {
+				log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
+			}
+			try {
+				clearDeletedRecords(machine,MachineFile.DIR_TYPE_TEMP);
+			}catch(Exception e) {
+				log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
+			}
+		}
+
+	}
+
+
+	/**
+	 * 鎵弿鐩綍
+	 * @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;
+		List<DictBiz> annotatiionList = programAnnotationService.getAnnotionDictList();
+		//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 {
+				//璇诲彇鍐呭锛岀‘瀹氱▼搴忕姸鎬�
+				/*int pstatus = readProgramStatus(filePath,machine.getMachineGroupCode(),annotatiionList);
+				mf.setProgramStatus(pstatus);
+				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;//鏈夐敊璇�,鎺犺繃
+				}*/
+
+				MachineFile mf = readFileToMachineFile(filePath,machine,dirType,annotatiionList);
+
+				machineFileService.refreshFileData(mf);
+				/*
+				existFileInDb = machineFileService.getExistsFile(mf.getName(),dirType,machine.getCode());
+				System.out.println("鏂囦欢鍒涘缓鏃堕棿: " + mf.getFileCreateTime());
+
+				if(existFileInDb == null) {
+					machineFileService.save(mf);
+				}else{
+					log.info("鏂囦欢宸插瓨鍦�:{}",filePath.getFileName());
+
+					existFileInDb.setFileSize(mf.getFileSize());
+					existFileInDb.setProgramStatus(mf.getProgramStatus());
+					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);
+
+				}*/
+			} catch (IOException e) {
+				log.error("璇诲彇鏂囦欢淇℃伅澶辫触",e);
+			}
+
+		}
+	}
+
+	/**
+	 * 璇诲彇纾佺洏涓婄殑鏂囦欢淇℃伅
+	 * @param filePath 鏂囦欢璺緞
+	 * @param machine 鏈哄櫒
+	 * @param dirType 鐩綍绫诲瀷
+	 * @param annotatiionList 娉ㄨВ閰嶇疆瀛楀吀 鐢ㄤ簬璇诲彇绋嬪簭鐘舵��
+	 * @return MachineFile 瀹炰緥
+	 * @throws IOException
+	 */
+	public MachineFile readFileToMachineFile(Path filePath,Machine machine,String dirType,List<DictBiz> annotatiionList) throws IOException {
+		MachineFile mf = new MachineFile();
+
+		mf.setTenantId("000000");
+		mf.setName(filePath.toFile().getName());
+		mf.setDirType(dirType);
+		mf.setMachineCode(machine.getCode());
+		mf.setProgramStatus(readProgramStatus(filePath,machine.getMachineGroupCode(),annotatiionList));
+
+		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));
+
+		byte[] buffer = new byte[2048];
+		try (InputStream inputStream = Files.newInputStream(filePath)) {
+			// 浣跨敤杈撳叆娴佽鍙栨枃浠跺唴瀹�
+			inputStream.read(buffer);
+			mf.setMd5(DigestUtils.md5Hex(buffer));
+		} catch (IOException e) {
+			log.error("璇诲彇鏂囦欢md5澶辫触",e);
+			throw new ServiceException("璇诲彇鏂囦欢md5澶辫触"+e.getMessage());
+		}
+
+		return mf;
+	}
+	/**
+	 * 璇诲彇鏂囦欢涓殑绋嬪簭鐘舵��
+	 * @param filePath 鏂囦欢璺緞
+	 * @param machineGroupCode
+	 * @param annotatiionList 娉ㄩ噴閰嶇疆瀛楀吀
+	 * @return 鐘舵�佺殑鏁存暟涔嬪拰
+	 * @throws IOException
+	 */
+	int readProgramStatus(Path filePath,String machineGroupCode,List<DictBiz> annotatiionList) throws IOException {
+		int programStatus = MachineFile.PROGRAM_STATUS_UNKNOWN;
+		try(InputStream ins = Files.newInputStream(filePath);
+			BufferedInputStream bis = new BufferedInputStream(ins)){
+
+			boolean isText= FileContentUtil.isTextFile(bis);
+			if(!isText){
+				return MachineFile.PROGRAM_STATUS_UNKNOWN;
+			}
+			bis.reset();
+			String statusLine = FileContentUtil.readLineAt(ins,ProgramAnnotationService.STATUS_LINE_INDEX);
+			if(programAnnotationService.isAnnotation(statusLine,machineGroupCode,annotatiionList)){
+				String progStatusTxt = programAnnotationService.removeAnnotation(machineGroupCode,statusLine,annotatiionList);
+				if(ProgramAnnotationService.SQ.equals(progStatusTxt)){
+					programStatus = MachineFile.PROGRAM_STATUS_TRY;
+				}else if(ProgramAnnotationService.GH.equals(progStatusTxt)){
+					programStatus = MachineFile.PROGRAM_STATUS_CURED;
+				}else if(ProgramAnnotationService.PL.equals(progStatusTxt)){
+					programStatus = MachineFile.PROGRAM_STATUS_DIVIASTION;
+				}
+			}
+		}
+
+		return programStatus;
+	}
+
+	/**
+	 * 娓呯悊宸茬粡鍒犻櫎浜嗘枃浠剁殑璁板綍
+	 * @param machine
+	 * @param dirType
+	 * @throws IOException
+	 */
+	void clearDeletedRecords(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);
+			}
+		}
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileService.java
index b62643e..d6f7507 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileService.java
@@ -11,15 +11,13 @@
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.model.BladeFile;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.machinefile.entity.MachineFile;
 import org.springblade.mdm.machinefile.entity.MachineFileChangeHis;
 import org.springblade.mdm.machinefile.mapper.MachineFileMapper;
 import org.springblade.mdm.machinefile.vo.MachineFileQueryVO;
-import org.springblade.mdm.machinefile.vo.MachineAcceptedFileHandleQueryVO;
 import org.springblade.mdm.machinefile.vo.MachineBackFileQueryVO;
-import org.springblade.mdm.machinefile.vo.MachineAcceptedFileVO;
 import org.springblade.mdm.program.vo.CompareDataVO;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springframework.stereotype.Service;
@@ -206,4 +204,35 @@
 
 		return vo;
 	}
+
+	/**
+	 * 鍒锋柊鏂囦欢淇℃伅锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄥ垯鏇存柊
+	 * @param mf
+	 */
+	public void refreshFileData(MachineFile mf) {
+		MachineFile existFileInDb = getExistsFile(mf.getName(),mf.getDirType(),mf.getMachineCode());
+		if(existFileInDb == null) {
+			save(mf);
+		}else{
+			log.info("鏂囦欢鍦ㄥ簱涓凡瀛樺湪:{}",mf.getName());
+			existFileInDb.setFileSize(mf.getFileSize());
+			existFileInDb.setProgramStatus(mf.getProgramStatus());
+			existFileInDb.setFileCreateTime(mf.getFileCreateTime());
+			existFileInDb.setFileModifyTime(mf.getFileModifyTime());
+			if(!com.alibaba.excel.util.StringUtils.equals(existFileInDb.getMd5(),mf.getMd5())){
+				//鏂囦欢鍐呭鍙戠敓鍙樺寲浜�,璁剧疆鐘舵�佷负鍒濆鐘舵��
+				existFileInDb.setStatus(MachineFile.STATUS_NORMAL);
+			}
+			existFileInDb.setMd5(mf.getMd5());
+			updateById(existFileInDb);
+		}
+	}
+
+	/**
+	 * 鐗╃悊鍒犻櫎鏂囦欢淇℃伅
+	 * @param id 鏁版嵁id
+	 */
+	public void deleteById(Long id) {
+		baseMapper.deleteById(id);
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileMonitorRecordVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileMonitorRecordVO.java
new file mode 100644
index 0000000..e6ebb08
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileMonitorRecordVO.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.machinefile.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.mdm.commons.vo.BaseVO;
+
+@Schema(description = "鏂囦欢鐩戞帶璁板綍VO")
+@Setter
+@Getter
+public class FileMonitorRecordVO extends BaseVO {
+	@Schema(description = "鏂囦欢鍚嶇О")
+	private String name;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordQueryVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordQueryVO.java
new file mode 100644
index 0000000..d12a7ae
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordQueryVO.java
@@ -0,0 +1,27 @@
+package org.springblade.mdm.machinefile.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.core.mp.support.Query;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍒嗛〉鎷嗙嚎鍛�
+ */
+
+@Schema(description = "鏂囦欢涓嬪彂璁板綍鏌ヨ瀵硅薄")
+@Setter
+@Getter
+public class FileSendRecordQueryVO extends Query {
+	@Schema(description = "鏂囦欢鍚嶇О")
+	private String name;
+	@Schema(description = "鏈哄簥缂栫爜")
+	private String machineCode;
+	@Schema(description = "涓嬪彂鏃堕棿寮�濮�")
+	private Date createTimeBegin;
+	@Schema(description = "涓嬪彂鏃堕棿鎴")
+	private Date createTimeEnd;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordVO.java
new file mode 100644
index 0000000..470158a
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/FileSendRecordVO.java
@@ -0,0 +1,20 @@
+package org.springblade.mdm.machinefile.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.mdm.commons.vo.BaseVO;
+
+import java.util.Date;
+
+@Schema(description = "鏂囦欢涓嬪彂璁板綍VO")
+@Setter
+@Getter
+public class FileSendRecordVO extends BaseVO {
+	@Schema(description = "鏂囦欢鍚嶇О")
+	private String name;
+	@Schema(description = "鏈哄簥缂栧彿/鍥炰紶鏈哄簥")
+	private String machineCode;
+
+
+}
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 29b2d15..92a5183 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
@@ -6,19 +6,17 @@
 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.BizEntity;
 import org.springblade.core.mp.base.BizServiceImpl;
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
 import org.springblade.mdm.program.vo.MdmProgramImportVO;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.support.SimpleTriggerContext;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
index 5d4b143..05a0e8a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -5,7 +5,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.mp.base.BizServiceImpl;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.mapper.NcNodeMapper;
@@ -18,7 +18,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * 绋嬪簭鑺傜偣
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
index 5429e1e..1144346 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -2,28 +2,21 @@
 package org.springblade.mdm.program.service;
 
 import com.alibaba.csp.sentinel.util.StringUtil;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 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.mp.support.Condition;
-import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.OssTemplate;
-import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
-import org.springblade.mdm.flow.service.ApproveRecordService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
-import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springblade.system.feign.IDictClient;
 import org.springblade.system.pojo.entity.DictBiz;
 import org.springframework.stereotype.Service;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
index c105bf8..dfe1fef 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -28,25 +28,21 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.flowable.engine.*;
 import org.springblade.core.mp.base.BizServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.model.BladeFile;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.ProgramSeq;
 import org.springblade.mdm.program.mapper.NcProgramMapper;
 import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.mapper.ProgramSeqMapper;
-import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
 import org.springblade.mdm.program.vo.NcProgramUploadVO;
 import org.springblade.mdm.program.vo.NcProgramVO;
@@ -58,7 +54,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.List;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NodeDeptQueryService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NodeDeptQueryService.java
index e59ed5e..066f0cd 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NodeDeptQueryService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NodeDeptQueryService.java
@@ -5,7 +5,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.pojo.entity.Dept;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java
index 48243f4..ad0c4e5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java
@@ -25,40 +25,16 @@
  */
 package org.springblade.mdm.program.service;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.IOUtils;
 import org.springblade.core.mp.base.BizServiceImpl;
-import org.springblade.core.mp.support.Condition;
-import org.springblade.core.oss.OssTemplate;
-import org.springblade.core.oss.model.BladeFile;
-import org.springblade.mdm.basesetting.machine.MachineService;
-import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.flow.excution.StartDispatcher;
 import org.springblade.mdm.flow.service.FlowCommonService;
-import org.springblade.mdm.program.entity.NcNode;
-import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.entity.ProcessProgRef;
-import org.springblade.mdm.program.entity.ProgramSeq;
-import org.springblade.mdm.program.mapper.NcProgramMapper;
 import org.springblade.mdm.program.mapper.ProcessProgRefMapper;
-import org.springblade.mdm.program.mapper.ProgramSeqMapper;
-import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
-import org.springblade.mdm.program.vo.NcProgramUploadVO;
 import org.springblade.mdm.program.vo.NcProgramVO;
-import org.springblade.mdm.utils.FileContentUtil;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.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 0abac7a..ff090f8 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,29 +1,16 @@
 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.basesetting.machine.service.MachineService;
 import org.springblade.mdm.commons.service.ParamService;
-import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.service.MachineFileScanService;
 import org.springblade.mdm.machinefile.service.MachineFileService;
 import org.springblade.mdm.program.service.ProgramAnnotationService;
-import org.springblade.mdm.utils.FileContentUtil;
-import org.springblade.system.pojo.entity.DictBiz;
 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.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileTime;
-import java.util.Date;
-import java.util.List;
 
 @Slf4j
 @Component
@@ -37,6 +24,8 @@
 	private ParamService paramService;
 	@Autowired
 	private ProgramAnnotationService programAnnotationService;
+	@Autowired
+	private MachineFileScanService machineFileScanService;
 	// 姣�5绉掓墽琛屼竴娆�
 	//@Scheduled(fixedRate = 1000000)
 	//@Scheduled(cron = "0 1 0 * * ?") // 姣忓ぉ涓婂崍0鐐�1鍒嗘墽琛�
@@ -48,7 +37,7 @@
 
 		if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)){
 			//闈炴秹瀵嗙綉锛屾墠鎵弿鐩綍鏂囦欢
-			scanMachineFile();
+			machineFileScanService.scanMachineFile();
 		}
 
 	}
@@ -56,47 +45,48 @@
 	/**
 	 * 鎵弿鎵�鏈夋満搴婄殑閰嶇疆涔嬬洰褰�
 	 */
+	/*
 	public void scanMachineFile() {
 		List<Machine> machines = machineService.lambdaQuery().eq(Machine::getStatus,Machine.STATUS_ENABLE).list();
 		for (Machine machine : machines) {
 
-			//鎵弿鏂伴椈鐣�
+			//鎵弿鏂版枃浠�
 			try {
 				scanDir(machine,MachineFile.DIR_TYPE_REC);
 			}catch(Exception e) {
-				log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 			try {
 				scanDir(machine,MachineFile.DIR_TYPE_SEND);
 			}catch(Exception e) {
-				log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 			try {
 				scanDir(machine,MachineFile.DIR_TYPE_TEMP);
 			}catch(Exception e) {
-				log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 
 			//娓呯悊鏁版嵁搴擄紝鍒犻櫎鏂囦欢涓嶅瓨鍦ㄧ殑鏁版嵁
 			try {
 				clearDeletedReccords(machine,MachineFile.DIR_TYPE_REC);
 			}catch(Exception e) {
-				log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("REC鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 			try {
 				clearDeletedReccords(machine,MachineFile.DIR_TYPE_SEND);
 			}catch(Exception e) {
-				log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("SEND鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 			try {
 				clearDeletedReccords(machine,MachineFile.DIR_TYPE_TEMP);
 			}catch(Exception e) {
-				log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥"+machine.getCode(),e);
+				log.error("TEMP鎵弿鏂囦欢寮傚父,鏈哄簥{}", machine.getCode(), e);
 			}
 		}
 
 	}
-
+	*/
 
 	/**
 	 * 鎵弿鐩綍
@@ -104,6 +94,7 @@
 	 * @param dirType 鐩綍绫诲瀷
 	 * @throws IOException
 	 */
+	/*
 	public void scanDir(Machine machine,String dirType) throws IOException {
 		String basePath = MachineFileService.getBasePath(machine,dirType);
 		if(basePath == null) {
@@ -192,7 +183,7 @@
 
 
 	}
-
+	*/
 	/**
 	 * 璇诲彇鏂囦欢涓殑绋嬪簭鐘舵��
 	 * @param filePath 鏂囦欢璺緞
@@ -201,6 +192,7 @@
 	 * @return 鐘舵�佺殑鏁存暟涔嬪拰
 	 * @throws IOException
 	 */
+	/*
 	int readProgramStatus(Path filePath,String machineGroupCode,List<DictBiz> annotatiionList) throws IOException {
 		int programStatus = MachineFile.PROGRAM_STATUS_UNKNOWN;
 		try(InputStream ins = Files.newInputStream(filePath)){
@@ -219,13 +211,14 @@
 
 		return programStatus;
 	}
-
+	*/
 	/**
 	 * 娓呯悊宸茬粡鍒犻櫎浜嗘枃浠剁殑璁板綍
 	 * @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();
@@ -252,5 +245,5 @@
 				this.machineFileService.updateById(mf);
 			}
 		}
-	}
+	}*/
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirMoveTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirMoveTask.java
index 44b2792..77ecd48 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirMoveTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/ReceiveDirMoveTask.java
@@ -1,7 +1,7 @@
 package org.springblade.mdm.task;
 
 import lombok.extern.slf4j.Slf4j;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.service.ParamService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/SendDirCleanTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/SendDirCleanTask.java
index 6eafc1f..28bb3af 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/SendDirCleanTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/SendDirCleanTask.java
@@ -1,7 +1,7 @@
 package org.springblade.mdm.task;
 
 import lombok.extern.slf4j.Slf4j;
-import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.commons.service.ParamService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
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 801bdb3..2b415e4 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
@@ -10,6 +10,7 @@
 import org.springblade.mdm.commons.service.EmailService;
 import org.springblade.mdm.flow.service.WIthdrawService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
+import org.springblade.mdm.machinefile.service.MachineFileScanService;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.ProgramAnnotationService;
@@ -44,7 +45,8 @@
 	private IDictBizClient bizDictClient;
 	@Autowired
 	private EmailService mailService;
-
+	@Autowired
+	private MachineFileScanService machineFileScanService;
 	@Autowired
 	private WIthdrawService withdrawService;
 	/**
@@ -76,13 +78,13 @@
 
 	}
 
-	@GetMapping("/scan")
+	@GetMapping("/scandir")
 	@Operation(summary = "test鎵弿", description = "test鎵弿")
 	public R<Void> scan() throws IOException {
 		Machine machine = new Machine();
 		machine.setCode("M_01_FN");
 		machine.setProgReceiveDir("d:/data/machine1/rec");
-		machineFileScanTask.scanDir(machine, MachineFile.DIR_TYPE_REC);
+		machineFileScanService.scanDir(machine, MachineFile.DIR_TYPE_REC);
 		return R.success();
 	}
 
@@ -122,6 +124,9 @@
 		return R.success();
 	}
 
-
+	@GetMapping("/scanfile")
+	public void scanFile(){
+		machineFileScanService.scanMachineFile();
+	}
 
 }
diff --git a/doc/sql/mdm/mdm.mysql.all.create.sql b/doc/sql/mdm/mdm.mysql.all.create.sql
index 32638b7..382c69d 100644
--- a/doc/sql/mdm/mdm.mysql.all.create.sql
+++ b/doc/sql/mdm/mdm.mysql.all.create.sql
@@ -478,3 +478,32 @@
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='宸ユ帶缃戞満搴婃枃浠朵慨鏀瑰巻鍙�';
 
+
+
+DROP TABLE IF EXISTS `mdm_file_send_record`;
+CREATE TABLE `mdm_file_send_record` (
+    `id` bigint NOT NULL,
+    `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+    `name` varchar(100) NOT NULL COMMENT '鏂囦欢鍚嶇О',
+    `machine_code` varchar(100) DEFAULT NULL COMMENT '鏈哄簥缂栫爜',
+    `file_size` bigint DEFAULT NULL COMMENT '鏂囦欢瀛楄妭鏁�',
+    `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
+    `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
+    `is_deleted` int DEFAULT NULL,
+    `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+    `create_user` bigint DEFAULT NULL COMMENT '鍒涘缓浜�',
+    `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+    `update_user` bigint DEFAULT NULL COMMENT '鏇存柊浜�',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='宸ユ帶缃戞枃浠朵笅鍙戣褰�';
+
+DROP TABLE IF EXISTS `mdm_file_monitor_record`;
+CREATE TABLE `mdm_file_monitor_record` (
+    `id` bigint NOT NULL,
+    `name` varchar(100) NOT NULL COMMENT '鏂囦欢鍚嶇О',
+    `dir_path` varchar(100) NOT NULL COMMENT '鏂囦欢鐩綍',
+    `event_type` int DEFAULT NULL COMMENT '浜嬩欢绫诲瀷锛�1:鍒涘缓;2锛氫慨鏀�;3鍒犻櫎',
+    `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='宸ユ帶缃戞枃浠剁洃鎺ц褰�';
+

--
Gitblit v1.9.3