From d0e196b4c6f302b9d571d6220471d15e2b97c527 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期五, 04 七月 2025 01:36:51 +0800
Subject: [PATCH] dnc导出修改&node字段调整

---
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryReaderTest.java                    |   17 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java                    |    4 
 doc/sql/mdm/mdm.mysql.all.create.sql                                                                           |   34 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java        |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java |   22 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/vo/IdsVO.java                                |   15 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java        |  151 ++++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java                            |    1 
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryWriterTest.java                    |   16 +
 blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml                                   |   12 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.java                 |   15 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileExchangeUtil.java                          |   30 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.xml                  |   21 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java               |   27 ++
 blade-service/blade-mdm/pom.xml                                                                                |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java                       |   51 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java                           |   10 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryWriter.java                        |   29 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java              |   38 +++
 /dev/null                                                                                                      |   33 --
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java          |   19 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryReader.java                        |   37 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveRecordVO.java                         |   40 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java               |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java        |   53 +++
 25 files changed, 617 insertions(+), 69 deletions(-)

diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml
index 5e025cd..9c621b1 100644
--- a/blade-service/blade-mdm/pom.xml
+++ b/blade-service/blade-mdm/pom.xml
@@ -80,6 +80,11 @@
             <artifactId>spring-boot-devtools</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-core-test</artifactId>
+            <scope>test</scope>
+        </dependency>
         <!--<dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/vo/IdsVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/vo/IdsVO.java
new file mode 100644
index 0000000..6b63e50
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/vo/IdsVO.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.commons.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Setter
+@Getter
+public class IdsVO {
+	@Schema(description = "id鏁扮粍")
+	private Long[] ids;
+
+}
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 9736baa..f464779 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
@@ -6,12 +6,16 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.flowable.engine.TaskService;
+import org.flowable.task.api.Task;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.excution.StartDispatcher;
+import org.springblade.mdm.flow.service.ApproveRecordService;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
 import org.springblade.mdm.program.service.ProcessProgRefService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,6 +24,8 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -34,6 +40,9 @@
 	private TaskService taskService;
 	@Autowired
 	private ProcessProgRefService processProgRefService;
+
+	@Autowired
+	private ApproveRecordService approveRecordService;
 	/**
 	 * 鏂板
 	 */
@@ -61,9 +70,12 @@
 
 		//鍔犲叆瀹℃壒鐢ㄦ埛
 		variables.put("approveUserNickName",AuthUtil.getNickName());
+
 		if(variables.containsKey("assignee")){
+			addApproveRecord(taskId,processInstanceId,comment,programIds,variables);
 			//鎸囧畾浜嗕笅涓�姝ユ墽琛屼汉
 			taskService.complete(taskId, variables);
+
 			return R.success("娴佺▼鎻愪氦鎴愬姛");
 		}else {
 			// 瀹屾垚浠诲姟,缁欓粯璁ょ敤鎴�
@@ -71,4 +83,30 @@
 		}
 
 	}
+
+	void addApproveRecord(String taskId, String processInstanceId, String comment,String programIds,Map<String, Object> variables){
+		List<Long> programIdList = new ArrayList<>();
+		if(programIds != null){
+			programIdList = Func.toLongList(programIds);
+		}else{
+			programIdList.add(null);
+		}
+		Task task = taskService.createTaskQuery()
+			.taskId(taskId)
+			.singleResult();
+		for(Long programId : programIdList){
+			ApproveRecord rec = new ApproveRecord();
+			rec.setTaskName(task.getName());
+			rec.setComment(comment);
+			rec.setNcProgramId(programId);
+			rec.setOperateResult(variables.get("approve")+"");//瀹℃壒缁撴灉
+			rec.setOperateTime(DateUtil.now());
+			rec.setProcessInstanceId(processInstanceId);
+			rec.setUserId(AuthUtil.getUserId());
+			rec.setUserNickname(AuthUtil.getNickName());
+
+			approveRecordService.save(rec);
+		}
+
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
index cb6f60d..39e093a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -17,6 +17,7 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.mdm.basesetting.machine.vo.MachineExcelVO;
+import org.springblade.mdm.flow.service.ApproveRecordService;
 import org.springblade.mdm.flow.service.FlowBusinessService;
 import org.springblade.mdm.flow.vo.FlowVO;
 import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
@@ -42,6 +43,7 @@
 
 	@Autowired
 	private HistoryService historyService;
+
 
 	@GetMapping("overtime-list")
 	@ApiOperationSupport(order = 3)
@@ -71,7 +73,7 @@
 	}
 
 
-	@Operation(summary = "娴佺▼杞ㄨ抗", description = "娴佺▼杞ㄨ抗")
+	@Operation(summary = "娴佺▼鎵ц杞ㄨ抗", description = "娴佺▼鎵ц杞ㄨ抗")
 	@GetMapping("process-trace")
 	public R<List<TaskTraceVO>> processTrace(String processInstanceId){
 		List<TaskTraceVO> result = new ArrayList<>();
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
new file mode 100644
index 0000000..93f3a6e
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
@@ -0,0 +1,51 @@
+package org.springblade.mdm.flow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.core.mp.base.BizEntity;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * 鏁版帶绋嬪簭瀹℃壒璁板綍
+ */
+@Setter
+@Getter
+@TableName("mdm_approve_record")
+public class ApproveRecord extends BizEntity {
+
+	private String processInstanceId;
+
+	/**
+	 * 浠诲姟鍚嶇О
+	 */
+	private String taskName;
+	/**
+	 * 澶囨敞
+	 */
+	private String comment;
+	/**
+	 * 鏁版帶绋嬪簭id锛岃繖涓彲鑳戒笉闇�瑕侊紝鍙互鏍规嵁鍏宠仈琛╩dm_process_prog_ref鏉ヨ幏鍙�
+	 */
+	private Long ncProgramId;
+
+	private Long userId;
+
+	/**
+	 * 瀹℃壒鐢ㄦ埛濮撳悕
+	 */
+	private String userNickname;
+
+	/**
+	 * 杩囨湡鏃ユ湡
+	 */
+	private Date operateTime;
+
+	/**
+	 * 鑺傜偣绫诲瀷锛氬瓧鍏�
+ 	 */
+	private String operateResult;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.java
new file mode 100644
index 0000000..65b3a2d
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.flow.mapper;
+
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springblade.mdm.flow.entity.ApproveRecord;
+import org.springblade.mdm.flow.vo.ApproveRecordVO;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.vo.NcNodeVO;
+
+import java.util.List;
+
+public interface ApproveRecordMapper extends BladeMapper<ApproveRecord> {
+    List<ApproveRecordVO> listByNcProgramId(Long ncProgramId);
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.xml
new file mode 100644
index 0000000..12d2dad
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.xml
@@ -0,0 +1,21 @@
+<?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.flow.mapper.ApproveRecordMapper">
+    <resultMap id="BaseResultMap" type="org.springblade.mdm.flow.entity.ApproveRecord">
+        <id column="id" property="id"/>
+        <result column="status" property="status"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+
+
+    <sql id="all_columns">id,tenant_id,nc_program_id,process_instances_id,operate_time,operate_result,user_id,user_nickname,status,create_dept,is_deleted,create_time,create_user,update_time,update_user</sql>
+    <select id="listByNcProgramId" resultType="org.springblade.mdm.flow.vo.ApproveRecordVO">
+        select <include refid="all_columns"/> FROM mdm_approve_record
+        WHERE  nc_program_id = ${ncProgramId} and is_deleted = 0 order by create_time desc
+
+    </select>
+
+</mapper>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
new file mode 100644
index 0000000..ae3d979
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
@@ -0,0 +1,27 @@
+
+package org.springblade.mdm.flow.service;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.mp.base.BizServiceImpl;
+import org.springblade.mdm.flow.entity.ApproveRecord;
+import org.springblade.mdm.flow.mapper.ApproveRecordMapper;
+import org.springblade.mdm.flow.vo.ApproveRecordVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 瀹℃壒璁板綍锛岀敤浜庢煡璇㈡墽琛岃建杩�
+ *
+ * @author yangys
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class ApproveRecordService extends BizServiceImpl<ApproveRecordMapper, ApproveRecord> {
+
+	public List<ApproveRecordVO> listByNcProgramId(Long ncProgramId) {
+		return this.getBaseMapper().listByNcProgramId(ncProgramId);
+	}
+}
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 078f02c..15b4550 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
@@ -48,12 +48,12 @@
 	 */
 	public void start(long programId){
 		Map<String, Object> vars = new HashMap<>();
-		//NcProgram prog = ncProgramService.getById(programId);
+		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",progNode.getProcessEdition());
+		vars.put("processEdition",prog.getProcessEdition());
 		vars.put("programId",programId);
 		vars.put("program",progNode);
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveRecordVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveRecordVO.java
new file mode 100644
index 0000000..07e2086
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveRecordVO.java
@@ -0,0 +1,40 @@
+package org.springblade.mdm.flow.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springblade.core.mp.base.BizEntity;
+import org.springblade.mdm.commons.vo.BaseVO;
+
+import java.util.Date;
+
+/**
+ * 鏁版帶绋嬪簭瀹℃壒璁板綍
+ */
+@Setter
+@Getter
+public class ApproveRecordVO extends BaseVO {
+
+	private String processInstanceId;
+	/**
+	 * 鏁版帶绋嬪簭id
+	 */
+	@Schema(description = "鏁版帶绋嬪簭id")
+	private Long ncProgramId;
+	@Schema(description = "鐢ㄦ埛id")
+	private Long userId;
+
+
+	@Schema(description = "瀹℃壒鐢ㄦ埛濮撳悕")
+	private String userNickname;
+
+
+	@Schema(description = "瀹℃壒鏃ユ湡")
+	private Date operateTime;
+
+
+	@Schema(description = "瀹℃壒缁撴灉")
+	private String operateResult;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
index 56794eb..00d029a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
@@ -37,4 +37,5 @@
 	private LocalDate planStartTime;
 	@Schema(description = "涓诲埗鍒嗗伐琛↖D")
 	private long producePlanId;
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
index 970cd82..a5bb5b7 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
@@ -42,7 +42,7 @@
 	 */
 	@PostMapping("upload")
 	@ApiOperationSupport(order = 1)
-	@Operation(summary = "涓婁紶鏂囦欢", description = "涓婁紶DNC鍥炰紶鏂囦欢")
+	@Operation(summary = "DNC鍥炰紶鏂囦欢瀵煎叆锛屼笂浼犳枃浠�", description = "涓婁紶DNC鍥炰紶鏂囦欢")
 	public R<Void> dncSendBackUpload(@RequestParam MultipartFile file) {
 		try {
 			ncProgramExchangeService.dncSendBackUpload(file);
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 4639401..0428131 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,17 +7,25 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.task.Comment;
+import org.flowable.task.api.history.HistoricTaskInstance;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.mdm.flow.service.ApproveRecordService;
+import org.springblade.mdm.flow.vo.ApproveRecordVO;
+import org.springblade.mdm.flow.vo.TaskTraceVO;
 import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.service.NcProgramService;
 import org.springblade.mdm.program.service.ProcessProgRefService;
 import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
 import org.springblade.mdm.program.vo.NcProgramUploadVO;
 import org.springblade.mdm.program.vo.NcProgramVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -35,6 +43,9 @@
 
 	private final NcProgramService ncProgramService;
 	private final ProcessProgRefService ncProcessProgRefService;
+
+	private final ApproveRecordService approveRecordService;
+
 	@PostMapping("/upload")
 	@Operation(summary = "涓婁紶鏂囦欢", description = "涓婁紶绋嬪簭/闄勪欢鏂囦欢")
 	public R<Boolean> upload(NcProgramUploadVO uploadVO) {
@@ -92,4 +103,12 @@
 	public R<List<NcProgramVO>> listByProcess(@Parameter(description="鎵�灞炶妭鐐笽D")@RequestParam String processInstanceId) {
 		return R.data(ncProcessProgRefService.listByProcess(processInstanceId));
 	}
+
+	@Operation(summary = "鎿嶄綔鏃ュ織", description = "绋嬪簭鎿嶄綔鏃ュ織锛屽嵆瀹℃壒璁板綍锛屽湪涓婚〉鐐瑰嚮鏌愪竴涓▼搴忓悗鐨勪笅鏂规爣绛炬樉绀�")
+	@GetMapping("approve-records")
+	public R<List<ApproveRecordVO>> processTrace1(@Parameter(description = "绋嬪簭id") Long ncProgramId){
+		List<TaskTraceVO> result = new ArrayList<>();
+
+		return R.data(approveRecordService.listByNcProgramId(ncProgramId));
+	}
 }
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
deleted file mode 100644
index e6f853e..0000000
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
+++ /dev/null
@@ -1,33 +0,0 @@
-
-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.core.tool.api.R;
-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.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-
-/**
- * 绋嬪簭娑夊瘑缃�-宸ユ帶缃戜氦鎹㈡帴鍙�
- *
- * @author yangys
- */
-@NonDS
-@RestController
-@RequestMapping("/program/exchange")
-@AllArgsConstructor
-@Tag(name = "鏁版帶绋嬪簭瀵煎叆瀵煎嚭", description = "鏁版帶绋嬪簭瀵煎叆瀵煎嚭")
-@Slf4j
-public class NcProgramExchangeController {
-
-	private final NcProgramService ncProgramService;
-
-}
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
index db7406c..90f6c17 100644
--- 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
@@ -3,22 +3,24 @@
 
 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.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.mdm.commons.vo.IdsVO;
 import org.springblade.mdm.program.service.NcProgramApprovedService;
 import org.springblade.mdm.program.service.NcProgramService;
 import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
 import org.springblade.mdm.program.vo.NcProgramExportDncPageVO;
 import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO;
 import org.springblade.mdm.program.vo.NcProgramVO;
-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 org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
 
 /**
  * 绋嬪簭娑夊瘑缃�-宸ユ帶缃戜氦鎹㈡帴鍙�
@@ -44,9 +46,17 @@
 
 	@PostMapping("/export-dnc")
 	@Operation(summary = "鏁版帶绋嬪簭瀵煎嚭dnc", description = "鏁版帶绋嬪簭瀵煎嚭鍒板伐鎺х綉")
-	public void exportDnc(Long nodeId, HttpServletResponse response) {
+	public void exportDnc(@RequestBody @Parameter(description = "瀹℃壒琛╥d鏁扮粍") IdsVO vo, HttpServletResponse response) {
+		if(vo.getIds() == null || vo.getIds().length == 0) {
+			throw new ServiceException("鏈�夋嫨鏂囦欢瀵煎嚭");
+		}
+		try {
+			ncProgramApprovedService.exportDnc(vo.getIds(),response.getOutputStream());
+		} catch (IOException e) {
+			log.error("瀵煎嚭DNC寮傚父", e);
+			throw new RuntimeException(e);
+		}
 
-		//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 6268a00..7e2fbfe 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
@@ -34,12 +34,12 @@
 	/**
 	 * 宸ュ簭鐗堟
 	 */
-	private String processEdition;
+	//private String processEdition;
 
 	/**
 	 * 宸ヨ壓鐗堟
 	 */
-	private String craftEdition;
+	//private String craftEdition;
 	/**
 	 * 闆剁粍浠跺彿/鍥惧彿
 	 */
@@ -47,7 +47,7 @@
 	/**
 	 * 鍥惧彿鐗堟
 	 */
-	private String partNoEdition;
+	//private String partNoEdition;
 
 	/**
 	 * 鏄惁鍥哄寲
@@ -56,11 +56,11 @@
 	/**
 	 * 杩囨湡鏃ユ湡
 	 */
-	private LocalDate expireDate;
+	//private LocalDate expireDate;
 	/**
 	 * 鏄惁閿佸畾
 	 */
-	private Integer isLocked;
+	//private Integer isLocked;
 	/**
 	 * 鑺傜偣绫诲瀷锛氬瓧鍏�
  	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java
index 4a12b5e..46c4b00 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java
@@ -1,18 +1,39 @@
 
 package org.springblade.mdm.program.service;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.archivers.zip.ZipUtil;
+import org.springblade.core.mp.base.BizEntity;
 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.mdm.flow.entity.ApproveRecord;
+import org.springblade.mdm.flow.service.ApproveRecordService;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.entity.NcProgram;
 import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.mapper.NcProgramApprovedMapper;
 import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springblade.mdm.program.vo.NcProgramExportDncPageVO;
 import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO;
+import org.springblade.mdm.utils.CustomBinaryWriter;
 import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 涓嬪彂/鍥炰紶绋嬪簭缁熻
@@ -23,8 +44,10 @@
 @Service
 @AllArgsConstructor
 public class NcProgramApprovedService extends BizServiceImpl<NcProgramApprovedMapper, NcProgramApproved> {
-
-
+	private final NcProgramService progService;
+	private final OssTemplate ossTemplate;
+	private final ApproveRecordService approvedService;
+	private final NcNodeService ncNodeService;
 	/**
 	 * 鍒嗛〉鏌ヨ
 	 * @param query 鏌ヨ鍙傛暟
@@ -37,5 +60,129 @@
 		return page;
 
 	}
+
+	/**
+	 * 瀵煎嚭dnc
+	 * @param approvedIdArr 寰呭鍑哄鎵硅〃id鏁扮粍
+	 */
+	public void exportDnc(Long[] approvedIdArr, OutputStream os) throws IOException {
+		ZipOutputStream zipOut = new ZipOutputStream(os);
+
+		ArrayList<Long> programIdList = new ArrayList<Long>();
+
+		for (Long approvedId : approvedIdArr) {
+			NcProgramApproved approved = this.getById(approvedId);
+			programIdList.add(approved.getNcProgramId());
+
+			NcProgram prog = progService.getById(approved.getNcProgramId());
+
+			String filename = prog.getOssName();
+			InputStream inputStream = ossTemplate.statFileStream(filename);
+
+			addInputStreamToZip(zipOut, inputStream, prog.getName());
+
+		}
+		addDataJson(zipOut, programIdList);
+
+	}
+
+	/**
+	 * 瀵煎叆鏁版嵁鏂囦欢
+	 * @param zipOut
+	 */
+	void addDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
+		//
+		addApproveRecordDataJson(zipOut, programIdList);
+
+		addNcNodeDataJson(zipOut, programIdList);
+	}
+
+	/**
+	 * 瀵煎叆瀹℃壒璁板綍
+	 * @param zipOut
+	 * @param programIdList
+	 */
+	void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
+		LambdaQueryWrapper<ApproveRecord> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.in(ApproveRecord::getNcProgramId, programIdList);
+		List<ApproveRecord> records = approvedService.list(queryWrapper);
+		JSONArray jsonArray = new JSONArray();
+		for(ApproveRecord record : records){
+			JSONObject recObj = new JSONObject();
+			recObj.put("id", record.getId());
+			recObj.put("comment", record.getComment());
+			recObj.put("userId",record.getUserId());
+			recObj.put("userNickname",record.getUserNickname());
+			recObj.put("operateTime",record.getOperateTime());
+			recObj.put("operateResult",record.getOperateResult());
+			recObj.put("taskName",record.getTaskName());
+			recObj.put("ncProgramId",record.getNcProgramId());
+			recObj.put("processInstanceId",record.getProcessInstanceId());
+
+			addSuperProperties(recObj,record);
+
+			jsonArray.add(recObj);
+		}
+		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json");
+
+	}
+
+	/**
+	 * 瀵煎叆鑺傜偣
+	 * @param zipOut
+	 * @param programIdList
+	 */
+	void addNcNodeDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
+		LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.in(NcProgram::getId, programIdList);
+
+		List<NcProgram> programs = progService.list(queryWrapper);
+		JSONArray jsonArray = new JSONArray();
+		ArrayList<NcNode> nodeList 	= new ArrayList<>();
+		for(NcProgram program : programs){
+			JSONObject recObj = new JSONObject();
+			NcNode ncNode = ncNodeService.getById(program.getNcNodeId());
+
+			nodeList.add(ncNode);
+
+		}
+
+		for(NcNode node : nodeList){
+			JSONObject recObj = new JSONObject();
+
+			recObj.put("id", node.getId());
+			recObj.put("nodeType", node.getNodeType());
+			recObj.put("machineCode",node.getMachineCode());
+
+			addSuperProperties(recObj,node);
+		}
+		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_node.json");
+	}
+
+	void addSuperProperties(JSONObject recObj, BizEntity entity){
+		recObj.put("createTime",entity.getCreateTime());
+		recObj.put("updateTime",entity.getUpdateTime());
+		recObj.put("createUser",entity.getCreateUser());
+		recObj.put("updateUser",entity.getUpdateUser());
+		recObj.put("status",entity.getStatus());
+		recObj.put("createDept",entity.getCreateDept());
+	}
+
+	public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName)
+		throws IOException {
+		// 鍒涘缓鏂扮殑 ZIP 鏉$洰
+		ZipEntry zipEntry = new ZipEntry(entryName);
+		zipOut.putNextEntry(zipEntry);
+
+		// 灏嗚緭鍏ユ祦鍐欏叆 ZIP 杈撳嚭娴�
+		byte[] buffer = new byte[1024];
+		int length;
+		while ((length = inputStream.read(buffer)) >= 0) {
+			zipOut.write(buffer, 0, length);
+		}
+
+		// 鍏抽棴褰撳墠鏉$洰
+		zipOut.closeEntry();
+	}
 }
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
index 3cfc5de..d4c2b6a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
@@ -11,21 +11,25 @@
 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.basesetting.machine.vo.MachineVO;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
 import org.springblade.mdm.program.vo.DncSendBackData;
+import org.springblade.mdm.utils.CustomBinaryReader;
+import org.springblade.mdm.utils.FileExchangeUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 
 /**
- * 涓嬪彂/鍥炰紶绋嬪簭缁熻
+ * 绋嬪簭浜ゆ崲锛坉nc瀵煎叆/瀵煎嚭锛�
  *
  * @author yangys
  */
@@ -36,16 +40,16 @@
 
 	/**
 	 * dnc鍥炰紶鏂囦欢涓婁紶
-	 * @param file
+	 * @param file 鏂囦欢
 	 * @return
 	 */
-	public void dncSendBackUpload(MultipartFile file) {
-		List<DncSendBackData> list=new ArrayList<>();
+	public List<DncSendBackData> dncSendBackUpload(MultipartFile file) {
+		List<DncSendBackData> list ;
 		try {
 			String fileName = file.getOriginalFilename();
-			InputStream fileInputStream = file.getInputStream();
-
-			byte[] bytes = FileUtil.copyToByteArray(fileInputStream);
+			//InputStream fileInputStream = file.getInputStream();
+			InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
+			byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
 			list = parseDncZipFromByteArray(bytes);
 			for(DncSendBackData dncSendBackData:list){
 				NcProgramExchange exchange=new NcProgramExchange();
@@ -57,10 +61,36 @@
 
 		} catch (IOException e) {
 			log.error("涓婁紶dnc鏂囦欢澶辫触",e);
+			list = Collections.emptyList();
 		}
-
+		return list;
 	}
 
+	InputStream convertFileToZip(InputStream inputStream) throws IOException {
+
+		File tempFile = createTempFile();
+		FileOutputStream fos = new FileOutputStream(tempFile);
+		CustomBinaryReader.read(inputStream,fos);
+
+
+		FileInputStream dInstream = new FileInputStream(tempFile);
+
+		return dInstream;
+	}
+
+	/**
+	 * 鍒涘缓涓�涓复鏃舵枃浠�
+	 * @return
+	 * @throws IOException
+	 */
+	File createTempFile() throws IOException {
+		Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
+		// 鍦ㄤ复鏃剁洰褰曚腑鍒涘缓鏂囦欢
+		String tfilename = "t"+System.currentTimeMillis();
+		Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp");
+		System.out.println("鍒涘缓鐨勪复鏃舵枃浠�: " + tempFile);
+		return tempFile.toFile();
+	}
 	public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
 		//List<DncSendBackData> datas = new ArrayList<>();
 		List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
@@ -107,6 +137,7 @@
 	 * @param query 鏌ヨ鍙傛暟
 	 * @return
 	 */
+
 	public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
 
 		IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryReader.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryReader.java
new file mode 100644
index 0000000..42b5eae
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryReader.java
@@ -0,0 +1,37 @@
+package org.springblade.mdm.utils;
+
+import java.io.*;
+import java.util.Arrays;
+
+public class CustomBinaryReader {
+	/**
+	 * 浠庤緭鍏ユ祦璇诲彇鏁版嵁鍒拌緭鍑烘祦
+	 * @param inputStream
+	 * @param os
+	 * @throws IOException
+	 */
+	public static void read(InputStream inputStream, OutputStream os) throws IOException {
+		byte[] buffer = new byte[1024];
+		try (DataInputStream in = new DataInputStream(
+			new BufferedInputStream(inputStream))) {
+
+			// 璇诲彇骞堕獙璇丮agic Number
+			byte[] magic = new byte[4];
+			in.readFully(magic);
+			if (!Arrays.equals(magic, CustomBinaryWriter.MAGIC_NUMBER)) {
+				throw new RuntimeException("涓嶆槸鏈夋晥鐨勮嚜瀹氫箟鏂囦欢鏍煎紡");
+			}
+
+			// 璇诲彇鐗堟湰鍙�
+			short version = in.readShort();
+			if (version > CustomBinaryWriter.VERSION) {
+				throw new RuntimeException("涓嶆敮鎸佺殑鐗堟湰: " + version);
+			}
+
+			while(in.read(buffer) != -1){
+				os.write(buffer);
+			}
+
+		}
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryWriter.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryWriter.java
new file mode 100644
index 0000000..3d6b7a6
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryWriter.java
@@ -0,0 +1,29 @@
+package org.springblade.mdm.utils;
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+public class CustomBinaryWriter {
+	static final byte[] MAGIC_NUMBER = {'M', 'D', 'M', '1'};
+	static final short VERSION = 1;
+
+	/**
+	 * 灏嗚緭鍏ユ祦涓殑鍐呭鍐欏叆杈撳嚭娴�
+	 * @param outputStream
+	 * @param ins
+	 * @throws IOException
+	 */
+	public static void write(OutputStream outputStream, InputStream ins) throws IOException {
+		byte[] buffer = new byte[1024];
+		try (DataOutputStream out = new DataOutputStream(outputStream)) {
+
+			// 鍐欏叆鏂囦欢澶�
+			out.write(MAGIC_NUMBER);
+			out.writeShort(VERSION);
+
+			while(ins.read(buffer) != -1) {
+				out.write(buffer);
+			}
+
+		}
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileExchangeUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileExchangeUtil.java
new file mode 100644
index 0000000..a2ed863
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileExchangeUtil.java
@@ -0,0 +1,30 @@
+package org.springblade.mdm.utils;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class FileExchangeUtil {
+
+	public static InputStream convertFileToZip(InputStream inputStream) throws IOException {
+
+		File tempFile = createTempFile();
+		FileOutputStream fos = new FileOutputStream(tempFile);
+		CustomBinaryReader.read(inputStream,fos);
+
+
+		FileInputStream dInstream = new FileInputStream(tempFile);
+
+		return dInstream;
+	}
+
+	public static File createTempFile() throws IOException {
+		Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
+		// 鍦ㄤ复鏃剁洰褰曚腑鍒涘缓鏂囦欢
+		String tfilename = "t"+System.currentTimeMillis();
+		Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp");
+		System.out.println("鍒涘缓鐨勪复鏃舵枃浠�: " + tempFile);
+		return tempFile.toFile();
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
index aaf3acd..8d30a0c 100644
--- a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
@@ -3,10 +3,14 @@
   <process id="dispatch" name="浠诲姟娲惧伐" isExecutable="true">
     <startEvent id="start" name="寮�濮�"/>
     <sequenceFlow id="sid-c1619263-d1ff-4106-9315-f9ab9a3bee71" sourceRef="start" targetRef="teamLeaderTask"/>
-    <userTask id="teamLeaderTask" name="涓撲笟缁勯暱" flowable:assignee="${teamLeader}"/>
-    <userTask id="programmingTask" name="缂栧埗" flowable:assignee="${assignee}"/>
-    <userTask id="check" name="鏍″" flowable:assignee="${assignee}"/>
-    <userTask id="approveTask" name="楂樺笀瀹℃壒" flowable:assignee="${assignee}"/>
+    <userTask id="teamLeaderTask" name="浠诲姟鍒嗘淳" flowable:assignee="${teamLeader}">
+      <documentation>涓撲笟缁勯暱浠诲姟鍒嗘淳</documentation>
+    </userTask>
+    <userTask id="programmingTask" name="鏁版帶绋嬪簭缂栧啓" flowable:assignee="${assignee}"/>
+    <userTask id="check" name="鏁版帶绋嬪簭鏍″" flowable:assignee="${assignee}"/>
+    <userTask id="approveTask" name="鏁版帶绋嬪簭瀹℃壒" flowable:assignee="${assignee}">
+      <documentation>楂樺笀鏁版帶绋嬪簭瀹℃壒</documentation>
+    </userTask>
     <endEvent id="approveEnd" name="瀹℃壒瀹屾垚">
       <extensionElements>
         <flowable:executionListener expression="${dispatchFinishListener.handle(execution)}" event="end"/>
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryReaderTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryReaderTest.java
new file mode 100644
index 0000000..a2b9f7b
--- /dev/null
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryReaderTest.java
@@ -0,0 +1,17 @@
+package org.springblade.mdm.utils;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class CustomBinaryReaderTest {
+	//@Test
+	public void testRead() throws IOException {
+		FileInputStream fis = new FileInputStream("d:/myd.bin");
+		FileOutputStream fos = new FileOutputStream("d:/ddddreadout.zip");
+
+		CustomBinaryReader.read(fis,fos);
+	}
+}
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryWriterTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryWriterTest.java
new file mode 100644
index 0000000..4496f7f
--- /dev/null
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryWriterTest.java
@@ -0,0 +1,16 @@
+package org.springblade.mdm.utils;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class CustomBinaryWriterTest {
+	//@Test
+	public void testWrite() throws IOException {
+		FileOutputStream fos = new FileOutputStream("d:/myd.bin");
+		FileInputStream fis = new FileInputStream("d:/dddd.zip");
+		CustomBinaryWriter.write(fos,fis);
+	}
+}
diff --git a/doc/sql/mdm/mdm.mysql.all.create.sql b/doc/sql/mdm/mdm.mysql.all.create.sql
index e8f4a07..6882fc4 100644
--- a/doc/sql/mdm/mdm.mysql.all.create.sql
+++ b/doc/sql/mdm/mdm.mysql.all.create.sql
@@ -111,13 +111,16 @@
   `code` varchar(100) NULL COMMENT '绋嬪簭缂栧彿',
   `name` varchar(100) NOT NULL COMMENT '绋嬪簭鍚嶇О',
   `oss_name` varchar(100) NULL COMMENT 'oss涓殑鏂囦欢鍚�',
-  `category` varchar(2) NULL COMMENT '鏂囦欢鍒嗙被',
+  `category` varchar(20) 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` varchar(100) DEFAULT NULL COMMENT '璁惧缂栧彿/鏈哄簥缂栧彿',
   `part_no` varchar(100) NULL COMMENT '闆剁粍浠剁紪鍙�/鍥惧彿',
+  `part_no_edition` varchar(100) NULL COMMENT '鍥惧彿鐗堟',
+  `craft_edition` varchar(20) NULL COMMENT '璁捐鐗堟',
+  `description` 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 '宸ュ簭鐗堟锛屽崌鐗堝氨鏄彉鏇存敼璇ュ瓧娈碉紝闇�瑕佷繚鐣欏巻鍙茶褰�',
@@ -135,15 +138,38 @@
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='鏁版帶绋嬪簭';
 
+/**
+  娴佺▼瀹℃壒璁板綍琛紝瀹℃壒杩囩▼涓褰�
+ */
+DROP TABLE IF EXISTS `mdm_approve_record`;
+CREATE TABLE `mdm_approve_record` (
+   `id` bigint NOT NULL,
+   `tenant_id` varchar(6) DEFAULT NULL COMMENT '鎵�灞炵鎴�',
+   `nc_program_id` bigint NULL COMMENT '绋嬪簭id銆傛湭閫夋嫨绋嬪簭涔嬪墠鏄痭ull',
+   `process_instance_id` varchar(64) DEFAULT NULL COMMENT '娴佺▼瀹炰緥id',
+   `task_name` varchar(100) DEFAULT NULL COMMENT '浠诲姟鍚嶇О',
+   `operate_time` datetime DEFAULT NULL COMMENT '瀹℃壒鏃堕棿',
+   `operate_result` varchar(20) DEFAULT NULL COMMENT '瀹℃壒缁撴灉',
+   `user_id` bigint NOT NULL COMMENT '瀹℃壒鐢ㄦ埛id',
+   `user_nickname` varchar(100) NOT NULL COMMENT '瀹℃壒鐢ㄦ埛濮撳悕',
+   `comment` varchar(100) NOT 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_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,鎸囧悜鏈�鏂扮殑绋嬪簭璁板綍',
+   `nc_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 '鍒涘缓鏃堕棿',

--
Gitblit v1.9.3