From 26f07223e1b33a8eb5ee184041575e9b204cfebe Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期五, 27 六月 2025 23:26:44 +0800
Subject: [PATCH] 上传程序文件

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml                           |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java               |   50 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java                             |   16 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java                            |   44 --
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java                        |   50 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java                                |   48 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java                         |   20 +
 doc/sql/mdm/mdm.mysql.all.create.sql                                                                                   |   62 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java                        |   69 ++++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java                     |   15 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java                      |   61 ----
 blade-service/blade-mdm/pom.xml                                                                                        |    6 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java                                   |   28 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java                                   |   50 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java                          |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java         |   37 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java                              |   39 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java                      |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java                                     |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java                  |   24 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java          |   14 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml                              |   14 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java                           |   39 +++
 24 files changed, 558 insertions(+), 140 deletions(-)

diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml
index 49dd25d..a5cf71e 100644
--- a/blade-service/blade-mdm/pom.xml
+++ b/blade-service/blade-mdm/pom.xml
@@ -70,7 +70,11 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-flow-api</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.tika</groupId>
+            <artifactId>tika-core</artifactId>
+            <version>3.2.0</version>
+        </dependency>
         <!--<dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
index 97d3793..547b47c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -48,8 +48,6 @@
 		if (StringUtil.isNoneBlank(processInstanceId, comment)) {
 			taskService.addComment(taskId, processInstanceId, comment);
 		}
-
-
 		// 闈炵┖鍒ゆ柇
 		if (Func.isEmpty(variables)) {
 			variables = Kv.create();
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 14295ab..c166cec 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
@@ -8,7 +8,9 @@
 import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.flow.excution.AutoAssignUsersService;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
+import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgram;
+import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NcProgramService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -32,6 +34,8 @@
 	@Autowired
 	private NcProgramService ncProgramService;
 	@Autowired
+	private NcNodeService ncNodeService;
+	@Autowired
 	private MachineService machineService;
 	/**
 	 * 鍥哄寲娴佺▼鐨刱ey
@@ -44,44 +48,16 @@
 	 */
 	public void start(long programId){
 		Map<String, Object> vars = new HashMap<>();
-		NcProgram prog = ncProgramService.getById(programId);
-		Machine machine = machineService.getByCode(prog.getMachineCode());
+		//NcProgram prog = ncProgramService.getById(programId);
+		NcNode progNode = ncNodeService.getById(programId);
+		Machine machine = machineService.getByCode(progNode.getMachineCode());
 		vars.put("machineCode",machine.getCode());
 		vars.put("machineMode",machine.getName());
-		vars.put("processEdition",prog.getProcessEdition());
-		vars.put("programId",prog.getProcessEdition());
-		vars.put("program",prog);
+		vars.put("processEdition",progNode.getProcessEdition());
+		vars.put("programId",programId);
+		vars.put("program",progNode);
 
 
-		//vars.put("processNo",startVO.getProcessNo());prog.getProcessEdition()
-		//vars.put("processName",startVO.getProcessName());
-		/*
-		Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO.getProducePlanId());
-		Map<String, Object> vars = new HashMap<>(preAssignee);
-
-		vars.put("machineCode",startVO.getMachineCode());
-		vars.put("machineMode",startVO.getMachineMode());
-
-		vars.put("processNo",startVO.getProcessNo());
-		vars.put("processName",startVO.getProcessName());
-		vars.put("processEdition",startVO.getProcessEdition());
-
-		vars.put("craftEdition",startVO.getCraftEdition());
-		vars.put("planStartTime",startVO.getPlanStartTime());
-		vars.put("drawingNo",startVO.getDrawingNo());
-		vars.put("drawingNoEdition",startVO.getDrawingNoEdition());
-		vars.put("planLockDays",startVO.getPlanLockDays());
-
-		//闆剁粍浠朵唬鐮�
-		String partNo = generatePartNo(startVO);
-		vars.put("partNo",partNo);
-
-		NcProgram curedNcProgram = ncProgramService.getCuredNcProgram(partNo,startVO.getMachineCode());
-		vars.put("curedNcProgram",curedNcProgram);
-
-		//璁剧疆鏄惁鏈夊浐鍖栫▼搴忔爣璁�
-		vars.put("hasCuredProgram",curedNcProgram != null ? "Y":"N");
-		*/
 		String businessKey = "0";//涓氬姟琛╧ey
 
 		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java
new file mode 100644
index 0000000..0e0d44f
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java
@@ -0,0 +1,50 @@
+package org.springblade.mdm.flow.service;
+
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.runtime.ProcessInstance;
+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.flow.excution.AutoAssignUsersService;
+import org.springblade.mdm.flow.vo.TaskAssignVO;
+import org.springblade.mdm.program.entity.NcProgram;
+import org.springblade.mdm.program.service.NcProgramService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鍥哄寲娴佺▼鏈嶅姟
+ */
+@Service
+public class DispatchFlowService {
+
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private AutoAssignUsersService autoAssignUsersService;
+	@Autowired
+	private IdentityService identityService;
+
+	@Autowired
+	private NcProgramService ncProgramService;
+	@Autowired
+	private MachineService machineService;
+	/**
+	 * 鍥哄寲娴佺▼鐨刱ey
+	 */
+	private static final String PROCESS_KEY = "program-cure";
+
+	/**
+	 * 缂栧埗鑺傜偣閫氳繃鍓嶏紝妫�鏌ョ▼搴忔槸鍚﹀瓨鍦�
+	 * @param processInstanceId 娴佺▼瀹炰緥id
+	 */
+	public boolean programExists(String processInstanceId) {
+
+		return false;
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java
index cf6ab9e..43839e2 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java
@@ -15,7 +15,7 @@
 	private NcProgramService ncProgramService;
 	public void execute(DelegateExecution execution) {
 		//绌哄崌鐗堬紝鏂板姞鍏ヤ竴鏉$▼搴忔暟鎹紝骞朵笖灏嗗伐搴忕増娆rocessEdition璁剧疆涓虹敤鎴疯緭鍏ョ殑鏂扮増鏈�
-
+		/*
 		NcProgram ncProgram =  (NcProgram)execution.getVariable("curedNcProgram");
 		//灏嗙幇鏈夌▼搴忚缃负闈炴渶鏂扮殑
 		ncProgram.setIsLastEdition(0);
@@ -28,5 +28,7 @@
 		ncProgramService.save(newNcProgram);
 
 		log.info("绌哄崌鐗堝畬鎴愶紝鏂扮殑绋嬪簭id涓簕}",newNcProgram.getId());
+
+		 */
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java
index e368e8c..7eaf422 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java
@@ -1,6 +1,7 @@
 
 package org.springblade.mdm.program.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
@@ -11,7 +12,11 @@
 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.vo.MachineQueryVO;
+import org.springblade.mdm.basesetting.machine.vo.MachineVO;
 import org.springblade.mdm.program.service.NcNodeService;
+import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
+import org.springblade.mdm.program.vo.NcNodeProgramVO;
 import org.springblade.mdm.program.vo.NcNodeVO;
 import org.springframework.web.bind.annotation.*;
 
@@ -63,4 +68,14 @@
 		List<NcNodeVO> list = ncNodeService.lazyList(parentId);
 		return R.data(list);
 	}
+
+	/**
+	 * 鍒嗛〉
+	 */
+	@Operation(summary = "绋嬪簭鍒嗛〉鏌ヨ", description = "鐢ㄤ簬鍦ㄧ紪鍒惰妭鐐归�夋嫨娴佺▼瀵瑰簲鐨勭▼搴�")
+	@GetMapping("/programpickpage")
+	public R<IPage<NcNodeProgramVO>> page(NcNodeProgramQueryVO query) {
+		IPage<NcNodeProgramVO> pages = ncNodeService.programPageQuery(query);
+		return R.data(pages);
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
index a155b7e..6980c61 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
@@ -7,6 +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.program.entity.NcProgram;
 import org.springblade.mdm.program.service.NcProgramService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -30,9 +31,30 @@
 	@Operation(summary = "涓婁紶", description = "涓婁紶绋嬪簭/闄勪欢鏂囦欢")
 	public R<Boolean> upload(@RequestParam MultipartFile file,Long nodeId,
 							 @RequestParam String category) {
-		ncProgramService.uploadNcFile(file,nodeId,category);
+		ncProgramService.uploadProgramFile(file,nodeId,category);
 		return R.<Boolean>status(true);
 	}
 
+	@PostMapping("/remove")
+	@Operation(summary = "鍒犻櫎绋嬪簭鏂囦欢", description = "")
+	public R<Boolean> removeFile(Long id) {
+		try {
+			ncProgramService.removeProgram(id);
+			return R.success();
+		}catch(Exception e) {
+			log.error("鍒犻櫎鏂囦欢澶辫触",e);
+			return R.fail(e.getMessage());
+		}
+	}
 
+	@GetMapping("/content")
+	@Operation(summary = "鑾峰彇鏂囦欢鍐呭", description = "浠呴檺鏂囨湰鏍煎紡鐨勫唴瀹癸紝浜岃繘鍒舵枃浠跺皢杩斿洖绌轰覆")
+	public R<String> fileContent(Long id) {
+		try {
+			return R.data(ncProgramService.getFileContent(id));
+		}catch(Exception e) {
+			log.error("鍒犻櫎鏂囦欢澶辫触",e);
+			return R.fail(e.getMessage());
+		}
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
index a56ce57..21e2572 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
@@ -30,18 +30,4 @@
 
 	private final NcProgramService ncProgramService;
 
-	@PostMapping("/export-dnc")
-	@Operation(summary = "鏁版帶绋嬪簭瀵煎嚭dnc", description = "鏁版帶绋嬪簭瀵煎嚭鍒板伐鎺х綉")
-	public void exportDnc(Long nodeId, HttpServletResponse response) {
-
-		//return R.<Boolean>status(true);
-	}
-	/*
-	@PostMapping("/import-dnc-file")
-	@Operation(summary = "涓婁紶宸ユ帶缃戝洖浼犳枃浠�", description = "涓婁紶绋嬪簭/闄勪欢鏂囦欢")
-	public R<Boolean> importDncFile(@RequestParam MultipartFile file) {
-		ncProgramService.uploadNcPkgFile(file);
-		return R.<Boolean>status(true);
-
-	}*/
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
new file mode 100644
index 0000000..f16180d
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -0,0 +1,37 @@
+
+package org.springblade.mdm.program.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.mdm.program.service.NcProgramService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 绋嬪簭娑夊瘑缃�-宸ユ帶缃戜氦鎹㈡帴鍙�
+ *
+ * @author yangys
+ */
+@NonDS
+@RestController
+@RequestMapping("/program/exchange")
+@AllArgsConstructor
+@Tag(name = "瀵煎嚭DNC", description = "娑夊瘑缃戞矇鐥煎鍑篋NC")
+@Slf4j
+public class NcProgramExportDNCController {
+
+	private final NcProgramService ncProgramService;
+
+	@PostMapping("/export-dnc")
+	@Operation(summary = "鏁版帶绋嬪簭瀵煎嚭dnc", description = "鏁版帶绋嬪簭瀵煎嚭鍒板伐鎺х綉")
+	public void exportDnc(Long nodeId, HttpServletResponse response) {
+
+		//return R.<Boolean>status(true);
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
index 65c0136..6931e08 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -14,6 +14,55 @@
 public class NcNode extends BizEntity {
 	private String name;
 	private Long parentId;
+
+	/**
+	 * 涓婄骇鐖秈d闆嗗悎
+	 */
+	private String parentIds;
+	/**
+	 * 璁惧缂栧彿
+	 */
+	private String machineCode;
+	/**
+	 * 鍥惧彿
+	 */
+	private String drawingNo;
+	/**
+	 * 鍥惧彿鐗堟
+	 */
+	private String drawingNoEdition;
+
+	/**
+	 * 宸ュ簭锛屽鈥滅簿閾b��
+	 */
+	private String processName;
+
+	/**
+	 * 宸ュ簭鐗堟
+	 */
+	private String processEdition;
+
+	/**
+	 * 宸ヨ壓鐗堟
+	 */
+	private String craftEdition;
+	/**
+	 * 闆剁粍浠跺彿
+	 */
+	private String partNo;
+
+	/**
+	 * 鏄惁鍥哄寲
+	 */
+	private Integer isCured;
+	/**
+	 * 杩囨湡鏃ユ湡
+	 */
+	private LocalDate expireDate;
+	/**
+	 * 鏄惁閿佸畾
+	 */
+	private Integer isLocked;
 	/**
 	 * 鑺傜偣绫诲瀷锛氬瓧鍏�
  	 */
@@ -22,4 +71,5 @@
 	private String description;
 	private String remark;
 
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
index 1587ad0..f874cc5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
@@ -12,37 +12,69 @@
 @Getter
 @TableName("mdm_nc_program")
 public class NcProgram extends BizEntity {
+	/**
+	 * 鏂囦欢鍚�
+	 */
 	private String name;
+	/**
+	 * 瀵硅薄瀛樺偍涓殑鍚嶇О
+	 */
+	private String ossName;
 	private String code;
+	/**
+	 * 鎵�灞炶妭鐐筰d锛屽繀椤绘湭鈥滅▼搴忓寘鍚�"鐨勮妭鐐�
+	 */
+	private long ncNodeId;
 	/**
 	 * 绋嬪簭鍖呭悕
  	 */
-	private String packageName;
+	//private String packageName;
+	/**
+	 * 鏂囦欢鍦板潃
+	 */
+	private String url;
+	/**
+	 * 鏂囦欢绫诲瀷
+	 */
+	private String category;
+
+	/**
+	 * 鏄惁涓烘枃鏈被鍨�
+	 */
+	private Boolean isTextFile;
+	/**
+	 * 宸ュ簭锛屽鈥滅簿閾b��
+	 */
+	//private String processName;
+	/**
+	 * 澶囨敞
+	 */
+	//private String remark;
 	/**
 	 * 璁惧锛堟満搴婏級缂栫爜
 	 */
-	private String machineCode;
+	//private String machineCode;
 	/**
 	 * 闆剁粍浠跺彿
 	 */
-	private String partNo;
+	//private String partNo;
 
 	/**
 	 * 鏄惁鍥哄寲
 	 */
-	private Integer isCured;
+	//private Integer isCured;
 	/**
 	 * 杩囨湡鏃ユ湡
 	 */
-	private LocalDate expireDate;
+	//private LocalDate expireDate;
 	/**
 	 * 宸ュ簭鐗堟
 	 */
-	private String processEdition;
+	//private String processEdition;
 	/**
 	 * 鏄惁鏈�鏂扮増娆★紝1锛氭渶鏂扮増娆★紱0:鍘嗗彶鐗堟
 	 */
-	private Integer isLastEdition;
+	//private Integer isLastEdition;
 	/**
 	 * 鏄惁閿佸畾
 	 */
@@ -65,4 +97,6 @@
 		//
 		return taskAssignTime.plusMonths(effectiveMonths).isBefore(LocalDateTime.now());
 	}
+
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java
index 206910b..9e25e5d 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java
@@ -1,9 +1,12 @@
 package org.springblade.mdm.program.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.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgram;
+import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
+import org.springblade.mdm.program.vo.NcNodeProgramVO;
 import org.springblade.mdm.program.vo.NcNodeVO;
 
 import java.util.List;
@@ -11,11 +14,12 @@
 public interface NcNodeMapper extends BladeMapper<NcNode> {
     List<NcNodeVO> lazyList(Long parentId);
 
-    /**
-	 * 鑾峰彇鏈�鏂板浐鍖栫▼搴�
-	 * @param partNo 闆剁粍浠跺彿
-	 * @param machineGroupCode 鏈哄簥缁勪唬鐮�
-	 * @return
+    IPage<NcNodeProgramVO> programPageQuery(@Param("page")IPage<NcNodeProgramVO> page, @Param("query") NcNodeProgramQueryVO query);
+
+	/**
+	 * 鏍规嵁鍚嶇О鑾峰彇鏈�鏂扮殑绋嬪簭鍖呰妭鐐�
+	 * @param name 绋嬪簭鍚嶇О锛堢▼搴忓寘鍚嶇О锛�
+	 * @return 绋嬪簭鑺傜偣
 	 */
-	//NcProgram getCuredNcProgram(@Param("partNo")String partNo,@Param("machineGroupCode")String machineGroupCode);
+	NcNode getLastProgramNode(String name);
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
index af78919..bc00658 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
@@ -45,4 +45,18 @@
         parent_id = n.id and is_deleted = 0
         ) AS "has_children" from mdm_nc_node n where is_deleted=0 and parent_id=#{parentId}
     </select>
+    <select id="programPageQuery" resultType="org.springblade.mdm.program.vo.NcNodeProgramVO">
+        select id,parent_id,machine_code,drawing_no,drawing_no_edition,part_no,process_name,craft_edition from mdm_nc_node n
+        <where>
+            <if test="query.name!=null and query.name!=''">
+                and n.name like CONCAT('%', #{query.name,jdbcType=VARCHAR},'%')
+            </if>
+        </where>
+    </select>
+
+    <!--鑾峰彇 鏈�鏂扮増鏈殑绋嬪簭锛堝嵆绋嬪簭鍖呭悕 鑺傜偣 node_type=60锛�-->
+    <select id="getLastProgramNode" resultType="org.springblade.mdm.program.entity.NcNode">
+        select <include refid="all_columns"/> from mdm_nc_node
+        where is_deleted=0 and node_type='60' and is_last_edition=1 order by create_time desc limit 1
+    </select>
 </mapper>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
index c788397..06d74da 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
@@ -24,5 +24,5 @@
 	 * @param name 绋嬪簭鍚嶇О
 	 * @return nc绋嬪簭
 	 */
-	NcProgram getLastNcProgram(String name);
+	//NcProgram getLastNcProgram(String name);
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
index ab4bfa9..d555c0c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
@@ -43,8 +43,10 @@
         order by create_time desc
         limit 1
     </select>
+    <!--
     <select id="getLastNcProgram" resultType="org.springblade.mdm.program.entity.NcProgram">
         select <include refid="all_columns"/> from mdm_nc_program
         where is_deleted=0 and is_last_edition=1 order by create_time desc limit 1
     </select>
+    -->
 </mapper>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java
index cfe41ef..8e4d686 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java
@@ -1,56 +1,15 @@
-/**
- * BladeX Commercial License Agreement
- * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
- * <p>
- * Use of this software is governed by the Commercial License Agreement
- * obtained after purchasing a license from BladeX.
- * <p>
- * 1. This software is for development use only under a valid license
- * from BladeX.
- * <p>
- * 2. Redistribution of this software's source code to any third party
- * without a commercial license is strictly prohibited.
- * <p>
- * 3. Licensees may copyright their own code but cannot use segments
- * from this software for such purposes. Copyright of this software
- * remains with BladeX.
- * <p>
- * Using this software signifies agreement to this License, and the software
- * must not be used for illegal purposes.
- * <p>
- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
- * not liable for any claims arising from secondary or illegal development.
- * <p>
- * Author: Chill Zhuang (bladejava@qq.com)
- */
+
 package org.springblade.mdm.program.service;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
-import org.apache.commons.compress.archivers.zip.ZipFile;
-import org.apache.commons.compress.utils.IOUtils;
-import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
-import org.flowable.engine.*;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.flow.service.CureFlowService;
-import org.springblade.mdm.program.entity.NcProgram;
+import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
-import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
 
 /**
@@ -62,11 +21,7 @@
 @Service
 @AllArgsConstructor
 public class DncSendBackService  {
-
-	//private final RepositoryService repositoryService;
-	//private final RuntimeService runtimeService;
-	//private final HistoryService historyService;
-	//private final ProcessEngine processEngine;
+	private final NcNodeService ncNodeService;
 	private final NcProgramService ncProgramService;
 	private final CureFlowService cureFlowService;
 	private final NcProgramExchangeMapper ncProgramExchangeMapper;
@@ -81,16 +36,18 @@
 	public void dncFileAccept(String ids) {
 		List<Long> idList = Func.toLongList(ids);
 		NcProgramExchange exchange;
-		NcProgram program;
+		//NcProgram program;
+		NcNode programNode;
+
 		for (Long id : idList) {
 			exchange = ncProgramExchangeMapper.selectById(id);
 			exchange.setStatus(2);//宸插叆搴撶姸鎬�
-			program = ncProgramService.getLastNcProgram(exchange.getName());
+			programNode = ncNodeService.getLastProgramNode(exchange.getName());
 
 			//濡傛灉鏄凡缁忓浐鍖栫殑鍒欎笉闇�瑕佸惎鍔ㄦ祦绋�
 			//鍚姩鍥哄寲娴佺▼
-			if(program.getIsCured() !=1) {//鏈浐鍖栫殑绋嬪簭锛屽惎鍔ㄥ浐鍖栨祦绋�
-				cureFlowService.start(program.getId());
+			if(programNode.getIsCured() !=1) {//鏈浐鍖栫殑绋嬪簭锛屽惎鍔ㄥ浐鍖栨祦绋�
+				cureFlowService.start(programNode.getId());
 			}
 		}
 
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 cee231b..50aaa5b 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
@@ -1,12 +1,17 @@
 
 package org.springblade.mdm.program.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 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.core.tool.utils.Func;
+import org.springblade.mdm.basesetting.machine.vo.MachineVO;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.mapper.NcNodeMapper;
+import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
+import org.springblade.mdm.program.vo.NcNodeProgramVO;
 import org.springblade.mdm.program.vo.NcNodeVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -29,10 +34,24 @@
 
 		BeanUtils.copyProperties(vo, ncNode);
 		ncNode.setId(null);
+		ncNode.setParentIds(buildParentIds(vo.getParentId()));
 
 		this.save(ncNode);
 	}
 
+	/**
+	 * 鏋勫缓鐖秈d鑺傜偣
+	 * @param nodeId 鑺傜偣id
+	 * @return
+	 */
+	String buildParentIds(long nodeId){
+		if(nodeId == 0L){
+			return "0";
+		}
+		NcNode pNode = this.baseMapper.selectById(nodeId);
+
+		return pNode.getParentIds()+","+pNode.getId();
+	}
 	/**
 	 * 鏇存柊鑺傜偣
 	 * @param vo
@@ -43,6 +62,7 @@
 		ncNode.setNodeType(vo.getNodeType());
 		ncNode.setDescription(vo.getDescription());
 		ncNode.setRemark(vo.getRemark());
+		ncNode.setMachineCode(vo.getMachineCode());
 		this.updateById(ncNode);
 	}
 
@@ -59,4 +79,23 @@
 
 		return baseMapper.lazyList(parentId);
 	}
+
+	/**
+	 * 绋嬪簭鑺傜偣
+	 * @param query
+	 * @return
+	 */
+	public IPage<NcNodeProgramVO> programPageQuery(NcNodeProgramQueryVO query) {
+		return this.getBaseMapper().programPageQuery(Condition.getPage(query),query);
+	}
+
+	/**
+	 * 鏌ヨ鐜版湁鍥哄寲鐨勭▼搴忥紝鏆傚畾鏉′欢锛氶浂缁勪欢鍙风浉鍚岋紝涓旀槸鍚屼竴鏈哄簥缁�
+	 * 	 * @param name 绋嬪簭鍚嶇О
+	 * @param name
+	 * @return
+	 */
+	public NcNode getLastProgramNode(String name) {
+		return this.getBaseMapper().getLastProgramNode(name);
+	}
 }
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
new file mode 100644
index 0000000..88f5aa2
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -0,0 +1,50 @@
+
+package org.springblade.mdm.program.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipFile;
+import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
+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.tool.utils.FileUtil;
+import org.springblade.mdm.program.entity.NcProgramExchange;
+import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
+import org.springblade.mdm.program.vo.DncSendBackData;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ * 涓嬪彂/鍥炰紶绋嬪簭缁熻
+ *
+ * @author yangys
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class NcProgramExportDNCService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
+
+
+	/**
+	 * 鍒嗛〉鏌ヨ
+	 * @param query 鏌ヨ鍙傛暟
+	 * @return
+	 */
+	public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
+
+		IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
+
+		return page;
+
+	}
+}
+
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 c089431..b8a8a03 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,18 +28,23 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
 import org.flowable.engine.*;
 import org.springblade.core.mp.base.BizServiceImpl;
+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.program.mapper.NcProgramMapper;
 import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.vo.DncSendBackData;
+import org.springblade.mdm.utils.FileContentUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -53,13 +58,9 @@
 @AllArgsConstructor
 public class NcProgramService  extends BizServiceImpl<NcProgramMapper, NcProgram> {
 
-	private final ObjectMapper objectMapper;
-	private final RepositoryService repositoryService;
-	private final RuntimeService runtimeService;
-	private final HistoryService historyService;
-	private final TaskService taskService;
-	private final ProcessEngine processEngine;
 	private final MachineService machineService;
+
+	private final OssTemplate ossTemplate;
 	/**
 	 * 鏌ヨ鐜版湁鍥哄寲鐨勭▼搴忥紝鏆傚畾鏉′欢锛氶浂缁勪欢鍙风浉鍚岋紝涓旀槸鍚屼竴鏈哄簥缁�
 	 * @param partNo
@@ -71,21 +72,57 @@
 		return this.getBaseMapper().getCuredNcProgram(partNo,machine.getMachineGroupCode());
 	}
 
-	/**
-	 * 鏌ヨ鐜版湁鍥哄寲鐨勭▼搴忥紝鏆傚畾鏉′欢锛氶浂缁勪欢鍙风浉鍚岋紝涓旀槸鍚屼竴鏈哄簥缁�
-	 * @param name 绋嬪簭鍚嶇О
-	 * @return
-	 */
-	public NcProgram getLastNcProgram(String name) {
-		return this.getBaseMapper().getLastNcProgram(name);
-	}
 
 	/**
 	 * 涓婁紶绋嬪簭鏂囦欢鍒版寚瀹氳妭鐐�
 	 * @param file
 	 * @param nodeId
-	 * @param category
+	 * @param category 鏂囦欢鍒嗙被锛堢▼搴忔枃浠�/鍏朵粬鏂囦欢锛�
 	 */
-	public void uploadNcFile(MultipartFile file, Long nodeId, String category) {
+	public void uploadProgramFile(MultipartFile file, Long nodeId, String category) {
+		BladeFile bfile = ossTemplate.putFile(file);
+		String link = bfile.getLink();
+		//淇濆瓨profame
+		NcProgram prog = new NcProgram();
+		prog.setName(file.getOriginalFilename());
+		prog.setNcNodeId(nodeId);
+		prog.setOssName(bfile.getName());
+		boolean isTextFile = false;
+		try {
+			isTextFile = FileContentUtil.isTextFile(file.getInputStream());
+		} catch (IOException e) {
+			log.warn("鍒ゆ柇鏄惁鏂囨湰鏂囦欢寮傚父",e);
+		}
+		prog.setIsTextFile(isTextFile);
+		prog.setUrl(link);
+		prog.setCategory(category);
+
+		this.save(prog);
+	}
+
+	/**
+	 * 鍒犻櫎涓�涓▼搴�
+	 * @param id
+	 */
+	public String getFileContent(Long id) {
+		String result  ="";
+
+		NcProgram prog = this.getById(id);
+		String fileName = prog.getOssName();
+		try (InputStream inputStream = ossTemplate.statFileStream(fileName)) {
+			result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return result;
+	}
+	/**
+	 * 鍒犻櫎涓�涓▼搴�
+	 * @param id
+	 */
+	public void removeProgram(Long id) {
+		NcProgram prog = this.getById(id);
+		ossTemplate.removeFile(prog.getOssName());
+		this.getBaseMapper().deleteById(id);
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java
new file mode 100644
index 0000000..5ad6c99
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java
@@ -0,0 +1,20 @@
+package org.springblade.mdm.program.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.core.mp.support.Query;
+
+/**
+ * 鍒嗛〉鎷嗙嚎鍛�
+ */
+
+@Schema(description = "鏈哄簥鍥炰紶鏂囦欢鏌ヨ瀵硅薄")
+@Setter
+@Getter
+public class NcNodeProgramQueryVO extends Query {
+	@Schema(description = "绋嬪簭鍚嶇О")
+	private String name;
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java
new file mode 100644
index 0000000..4a5ac4d
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java
@@ -0,0 +1,39 @@
+package org.springblade.mdm.program.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.mdm.commons.vo.BaseVO;
+
+@Setter
+@Getter
+public class NcNodeProgramVO extends BaseVO {
+	@Schema(description = "鑺傜偣鍚嶇О")
+	private String name;
+	@Schema(description = "鐖禝D,鏍硅妭鐐圭埗id=0")
+	private Long parentId;
+	@Schema(description = "璁惧缂栧彿")
+	private String machineCode;
+	@Schema(description = "鑺傜偣绫诲瀷锛屽瓧鍏�(绋嬪簭鑺傜偣绫诲瀷nc_node_type)")
+	private String nodeType;
+	@Schema(description = "鎻忚堪")
+	private String description;
+	@Schema(description = "澶囨敞")
+	private String remark;
+
+
+	@Schema(description = "鍥惧彿")
+	private String drawingNo;
+
+	@Schema(description = "鍥惧彿鐗堟")
+	private String drawingNoEdition;
+
+	@Schema(description = "宸ュ簭锛屽鈥滅簿閾b��")
+	private String processName;
+
+	@Schema(description = "宸ヨ壓鐗堟")
+	private String craftEdition;
+
+	@Schema(description = "闆剁粍浠跺彿")
+	private String partNo;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
index 44f4d73..38418c9 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
@@ -12,6 +12,8 @@
 	private String name;
 	@Schema(description = "鐖禝D,鏍硅妭鐐圭埗id=0")
 	private Long parentId;
+	@Schema(description = "璁惧缂栧彿")
+	private String machineCode;
 	@Schema(description = "鑺傜偣绫诲瀷锛屽瓧鍏�(绋嬪簭鑺傜偣绫诲瀷nc_node_type)")
 	private String nodeType;
 	@Schema(description = "鏄惁鏈夊瓙鑺傜偣")
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
new file mode 100644
index 0000000..48fb510
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
@@ -0,0 +1,28 @@
+package org.springblade.mdm.utils;
+
+import org.apache.tika.Tika;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class FileContentUtil {
+
+	/**
+	 * 鍒ゆ柇鏄惁鏂囨湰绫诲瀷
+	 * @param inputStream
+	 * @return
+	 */
+	public static boolean isTextFile(InputStream inputStream) {
+		Tika tika = new Tika();
+		try {
+			String mimeType = tika.detect(inputStream);
+			//String mimeType = tika.detect(file);
+			return mimeType.startsWith("text/")
+				|| mimeType.equals("application/xml")
+				|| mimeType.equals("application/json");
+		} catch (IOException e) {
+			e.printStackTrace();
+			return false;
+		}
+	}
+}
diff --git a/doc/sql/mdm/mdm.mysql.all.create.sql b/doc/sql/mdm/mdm.mysql.all.create.sql
index f5fb596..cd3db16 100644
--- a/doc/sql/mdm/mdm.mysql.all.create.sql
+++ b/doc/sql/mdm/mdm.mysql.all.create.sql
@@ -65,9 +65,17 @@
    `id` bigint NOT NULL,
    `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
    `name` varchar(100) NOT NULL COMMENT '鑺傜偣鍚嶇О',
+   `drawing_no` varchar(40) NULL COMMENT '鍥惧彿',
+   `process_name` varchar(20) NULL COMMENT '宸ュ簭鍚嶇О',
+   `machine_code` varchar(100) DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
+   `part_no` varchar(100) NULL COMMENT '闆剁粍浠剁紪鍙�',
+   `is_cured` int DEFAULT NULL COMMENT '鏄惁鍥哄寲,1鏄�;0鍚�',
+   `expire_date` date DEFAULT NULL COMMENT '鍒版湡鏃堕棿,鏍规嵁鏈夋晥鏈熸椂闀胯绠楄�屾潵',
+   `process_edition` varchar(40) DEFAULT NULL COMMENT '宸ュ簭鐗堟锛屽崌鐗堝氨鏄彉鏇存敼璇ュ瓧娈碉紝闇�瑕佷繚鐣欏巻鍙茶褰�',
    `description` varchar(100) NOT NULL COMMENT '鎻忚堪',
    `remark` varchar(200) NOT NULL COMMENT '澶囨敞',
-   `parent_id` bigint DEFAULT NULL COMMENT '鎵�灞炴満搴婄粍ID',
+   `parent_id` bigint DEFAULT NULL COMMENT '涓婄骇鑺傜偣ID',
+   `parent_ids` varchar(100) DEFAULT NULL COMMENT '涓婄骇鑺傜偣ID闆嗗悎锛宨d閫楀彿鍒嗛殧',
    `node_type` varchar(20) DEFAULT NULL COMMENT '鑺傜偣绫诲瀷锛氫笟鍔″瓧鍏稿畾涔�',
    `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
    `create_dept` bigint DEFAULT NULL COMMENT '鍒涘缓鍗曚綅',
@@ -79,17 +87,42 @@
    PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='绋嬪簭鑺傜偣鐩綍';
 
+/**娴佺▼瀹炰緥涓庤妭鐐瑰叧鑱旇〃锛岃褰曞垱寤烘椂鏈猴細鐢ㄦ埛鍦ㄧ▼搴忕紪鍒惰妭鐐规墜鍔ㄥ叧鑱�*/
+DROP TABLE IF EXISTS `mdm_process_node_ref`;
+CREATE TABLE `mdm_process_node_ref` (
+  `id` bigint NOT NULL,
+  `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+  `nc_node_id` bigint DEFAULT NULL COMMENT '鑺傜偣id锛屽搴� 绋嬪簭鍖呭悕 鑺傜偣id',
+  `process_instance_id` varchar(100) NOT NULL COMMENT '娴佺▼瀹炰緥id',
+  `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_nc_program`;
 CREATE TABLE `mdm_nc_program` (
   `id` bigint NOT NULL,
   `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
-  `nc_node_id` bigint DEFAULT NULL COMMENT '鎵�灞炶妭鐐筰d',
+  `nc_node_id` bigint DEFAULT NULL COMMENT '鎵�灞炶妭鐐筰d锛屽簲璇ュ睘浜庢煇涓暟鎺х▼搴忚妭鐐�',
   `code` varchar(100) NOT NULL COMMENT '绋嬪簭缂栧彿',
   `name` varchar(100) NOT NULL COMMENT '绋嬪簭鍚嶇О',
-  `package_name` varchar(100) NOT NULL COMMENT '绋嬪簭鍖呭悕',
+  `oss_name` varchar(100) NULL COMMENT 'oss涓殑鏂囦欢鍚�',
+  `category` varchar(2) NULL COMMENT '鏂囦欢鍒嗙被',
+
+  `drawing_no` varchar(40) NULL COMMENT '鍥惧彿',
+  `process_name` varchar(20) NULL COMMENT '宸ュ簭鍚嶇О',
+  `remark` varchar(100) NULL COMMENT '澶囨敞',
+  `is_text_file` int DEFAULT NULL COMMENT '鏄惁鏂囨湰鏂囦欢',
   `url` varchar(400) NOT NULL COMMENT '鏂囦欢鍦板潃',
-  `machine_code` bigint DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
-  `part_no` varchar(100) NOT NULL COMMENT '闆剁粍浠剁紪鍙�',
+  `machine_code` varchar(100) DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
+  `part_no` varchar(100) NULL COMMENT '闆剁粍浠剁紪鍙�',
   `is_cured` int DEFAULT NULL COMMENT '鏄惁鍥哄寲,1鏄�;0鍚�',
   `expire_date` date DEFAULT NULL COMMENT '鍒版湡鏃堕棿,鏍规嵁鏈夋晥鏈熸椂闀胯绠楄�屾潵',
   `process_edition` varchar(40) DEFAULT NULL COMMENT '宸ュ簭鐗堟锛屽崌鐗堝氨鏄彉鏇存敼璇ュ瓧娈碉紝闇�瑕佷繚鐣欏巻鍙茶褰�',
@@ -107,6 +140,25 @@
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='鏁版帶绋嬪簭';
 
 
+DROP TABLE IF EXISTS `mdm_nc_program_approved`;
+CREATE TABLE `mdm_nc_program_approved` (
+   `id` bigint NOT NULL,
+   `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+   `program_name` varchar(100) NOT NULL COMMENT '绋嬪簭鍚嶇О',
+   `program_id` bigint NOT NULL COMMENT '绋嬪簭id,鎸囧悜鏈�鏂扮殑绋嬪簭璁板綍',
+   `status` int DEFAULT NULL COMMENT '涓氬姟鐘舵��',
+   `exchange_type` int DEFAULT NULL COMMENT '浜ゆ崲绫诲瀷,1:涓嬪彂;2:鍥哄寲(dnc鍥炰紶)',
+   `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_nc_program_exchange`;
 CREATE TABLE `mdm_nc_program_exchange` (
   `id` bigint NOT NULL,

--
Gitblit v1.9.3