From f77951077aa87daae6460c0161868bd5661efb2f Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期六, 16 八月 2025 14:16:52 +0800
Subject: [PATCH] bug修复

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java                                |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml                      |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackData.java                                 |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java                  |    6 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java                       |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java                               |   18 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackFile.java                                 |   20 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java                                     |   60 +-----
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java                        |    6 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java                                      |   50 +++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java                   |   17 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/AnsiTextDetector.java                                     |   47 +++++
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java                                  |   31 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java |   18 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java                         |   80 ++++++--
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/ReplaceFlowController.java                      |   19 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java                       |   60 ++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java                              |   56 ++---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowProgramController.java                      |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java                            |   17 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java                        |    7 
 blade-service/blade-mdm/src/test/resources/filecontenttest.txt                                                            |    4 
 22 files changed, 363 insertions(+), 165 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
index 904a68b..2a2be31 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/service/ProduceDivisionService.java
@@ -161,14 +161,6 @@
 			.eq(ProduceDivision::getTeamLeaderId,division.getTeamLeaderId()).count()>0;
 	}
 
-	public ProduceDivision getByDrawingNo(String drawingNo){
-		List<ProduceDivision> divs = lambdaQuery().eq(ProduceDivision::getDrawingNo, drawingNo).list();
-		if(divs.isEmpty()){
-			return null;
-		}else{
-			return divs.get(0);
-		}
-	}
 
 	/**
 	 * 鏍规嵁鍕ゅ摬闆朵欢鍙蜂簬涓荤缂栧埗鑾峰彇鍒嗗伐琛ㄦ暟鎹� 鍥惧彿->鍕ゅ摬鏁版嵁锛堢紪鍒讹級 ->  涓诲埗鍒嗗伐琛ㄦ暟鎹�
@@ -179,7 +171,7 @@
 	public ProduceDivision getByDrawingNoWithQinzhe(String drawingNo){
 		QinzheFgb qinzheFgb = qinzheFgbService.getByLjh(drawingNo);
 		if(qinzheFgb == null){
-			throw new ServiceException("鏈壘鍒伴浂缁勪欢鍙�");
+			throw new ServiceException("鏈壘鍒伴浂缁勪欢鍙�:"+drawingNo);
 		}
 
 		Long programmerId = tUserService.getUserIdByName(qinzheFgb.getZggy());
@@ -190,11 +182,7 @@
 		if(division == null){
 			throw new ServiceException("涓诲埗鍒嗗伐琛ㄦ棤宸ヨ壓鍛�"+qinzheFgb.getZggy()+"瀵瑰簲鐨勬暟鎹�");
 		}
-		List<ProduceDivision> divs = lambdaQuery().eq(ProduceDivision::getDrawingNo, drawingNo).list();
-		if(divs.isEmpty()){
-			return null;
-		}else{
-			return divs.get(0);
-		}
+
+		return division;
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java
index 16f3d67..a9874bf 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java
@@ -104,7 +104,7 @@
 	/**
 	 * 浠诲姟杞﹂棿
 	 */
-	public static final String WORK_SHOP = "workShop";
+	public static final String WORKSHOP = "workshop";
 
 	/**
 	 * 鍋忕鍗曞彿
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowProgramController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowProgramController.java
index 1165fbd..91c711f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowProgramController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowProgramController.java
@@ -18,8 +18,6 @@
 import org.springblade.mdm.program.service.ProcessProgRefService;
 import org.springframework.web.bind.annotation.*;
 
-import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/ReplaceFlowController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/ReplaceFlowController.java
index 9432aed..f55ce6c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/ReplaceFlowController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/ReplaceFlowController.java
@@ -10,6 +10,8 @@
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
 import org.springblade.core.tool.api.R;
+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.excution.StartDispatcher;
 import org.springblade.mdm.flow.service.ApproveRecordService;
@@ -24,6 +26,7 @@
 import org.springblade.mdm.flow.vo.ReplaceUploadVO;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
 import org.springblade.mdm.program.service.ProcessProgRefService;
+import org.springblade.mdm.program.service.ProgramFlowStatusQueryService;
 import org.springblade.mdm.program.vo.NcNodeVO;
 import org.springframework.web.bind.annotation.*;
 
@@ -35,14 +38,7 @@
 @RequestMapping("/flow/replace")
 @Tag(name = "鏇挎崲娴佺▼", description = "鏇挎崲娴佺▼")
 public class ReplaceFlowController {
-
-	private final TaskService taskService;
-	private final RuntimeService runtimeService;
-
-	private final ApproveRecordService approveRecordService;
-	private final FlowProgramFileService flowProgramFileService;
-	private final DefaultFlowCompleteService defaultFlowCompleteService;
-	private final TaskDispatchService taskDispatchService;
+	private final ProduceDivisionService produceDivisionService;
 	private final ReplaceFlowService replaceFlowService;
 
 	@PostMapping("/pre")
@@ -85,4 +81,11 @@
 		}
 		return R.success();
 	}
+
+	@GetMapping("/default-assignees")
+	@Operation(summary = "榛樿鐨勫鏍哥敤鎴�", description = "鍑嗗绋嬪簭鏇挎崲娴佺▼锛屾墦寮�鐣岄潰涔嬪墠璋冪敤锛岃皟鐢ㄤ箣鍚庝細鍒濆鍖栨枃浠跺垪琛�,")
+	public R<ProduceDivision> defaultAssignees(@Parameter(description = "闆剁粍浠跺彿") String drawingNo) {
+		return R.data(produceDivisionService.getByDrawingNoWithQinzhe(drawingNo));
+
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java
index 49f9d00..c755687 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java
@@ -23,7 +23,7 @@
 
 	//private final ProduceDivisionMapper divMapper;
 	private final ProduceDivisionService divService;
-
+	/*
 	public Map<String,Object> autoAssignUsers(TaskAssignVO startVO){
 		LambdaQueryWrapper<ProduceDivision> queryWrapper = new LambdaQueryWrapper<>();
 		queryWrapper.eq(ProduceDivision::getDrawingNo,startVO.getDrawingNo());
@@ -42,5 +42,5 @@
 		result.put(FlowContants.SENIOR,division.getSeniorId());
 
 		return result;
-	}
+	}*/
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
index 09b5a6a..c0f3859 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
@@ -7,6 +7,8 @@
 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.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.flow.service.FlowProgramFileService;
@@ -37,7 +39,8 @@
 
 	private final FlowProgramFileService flowProgramFileService;
 	private final NodeDeptQueryService nodeDeptQueryService;
-	//public static final String PROCESS_KEY = "dispatch";
+	private final ProduceDivisionService produceDivisionService;
+
 
 	/**
 	 * 鍚姩娲惧伐娴佺▼
@@ -46,19 +49,17 @@
 	 */
 	@Transactional
 	public String start(TaskAssignVO startVO){
-
-		Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO);
-		Map<String, Object> vars = new HashMap<>(preAssignee);
-		vars.put(FlowContants.ASSIGNEE,preAssignee.get(FlowContants.TEAM_LEADER));//绗竴涓鎵圭敤鎴凤細缁勯暱
+		Map<String, Object> vars = new HashMap<>();
+		//Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO);
+		this.putDefaultAssignees(vars,startVO.getDrawingNo());
 
 		vars.put(FlowContants.TITLE,startVO.getTitle());
 		//鏈哄簥缂栧彿
 		vars.put(FlowContants.MACHINE_CODE,startVO.getMachineCode());
 		String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(startVO.getMachineCode());
-		vars.put("workshop",workshop);
+		vars.put(FlowContants.WORKSHOP,workshop);
 		//鏈哄簥鍨嬪彿
 		vars.put(FlowContants.MACHINE_MODE,startVO.getMachineMode());
-
 
 		vars.put(FlowContants.PROCESS_NO,startVO.getProcessNo());
 		vars.put(FlowContants.PROCESS_NAME,startVO.getProcessName());
@@ -93,6 +94,9 @@
 		if(vars.getOrDefault(FlowContants.HAS_CURED_PROGRAM,FlowContants.N).equals(FlowContants.Y)){
 			myProcessName = "鍥哄寲涓嬪彂娴佺▼";
 		}
+		if(StringUtils.isNotBlank(startVO.getDeviation()) ){
+			myProcessName = "鍋忕鍗�";
+		}
 		vars.put(FlowContants.MY_PROCESS_NAME, myProcessName);
 
 		String businessKey = "0";//涓氬姟琛╧ey
@@ -107,18 +111,18 @@
 	}
 
 	/**
-	 * 鏍规嵁鍘熸湁鍥哄寲绋嬪簭鍖呭悕鑺傜偣锛屽鍒朵竴涓紝璧嬩簣鏂扮殑娴佺▼瀹炰緥id
-	 * @param programPkg 鍘熸湁鍥哄寲鐨勭▼搴忓寘鍚嶈妭鐐�
-	 * @param processInstanceId 娴佺▼瀹炰緥id
+	 * 灏嗛粯璁ゅ鎵圭敤鎴锋斁鍏ap涓�
+	 * @param vars 鍚姩娴佺▼鐨勫彉閲弇ap
+	 * @param drawingNo 闆剁粍浠跺彿
 	 */
+	void putDefaultAssignees(Map<String, Object> vars,String drawingNo){
+		ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(drawingNo);
+		vars.put(FlowContants.TEAM_LEADER,div.getTeamLeaderId());
+		vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
+		vars.put(FlowContants.CHECKER,div.getCheckerId());
+		vars.put(FlowContants.SENIOR,div.getSeniorId());
 
-	void cloneNodes(NcNode programPkg,String processInstanceId){
-		NcNode newProgramPkg = new NcNode();
-		BeanUtils.copyProperties(programPkg,newProgramPkg);
-		EntityUtil.clearBaseProperties(newProgramPkg);
-
-		newProgramPkg.setProcessInstanceId(processInstanceId);
-		this.ncNodeService.save(newProgramPkg);
+		vars.put(FlowContants.ASSIGNEE,div.getTeamLeaderId());//绗竴涓鎵圭敤鎴凤細缁勯暱
 	}
 
 	/**
@@ -140,21 +144,5 @@
 		}
 	}
 
-	/**
-	 * 鐢熸垚闆剁粍浠剁紪鍙�
-	 * 鍥惧彿銆佸浘鍙风増娆°�佸伐搴忓彿銆佸伐搴忓悕绉般�佸伐鑹虹増娆°�佸伐搴忕増娆� 缁勫悎璧锋潵鑾峰緱闆剁粍浠跺彿
-	 * @param startVO
-	 * @return
-	 */
-	/*
-	String generatePartNo(TaskAssignVO startVO){
-		//TODO 杩欎釜鏍煎紡鏈‘瀹氾紝闇�瑕佺‘璁�
-		return String.format("%s-%s-%s-%s-%s-%s",
-			startVO.getPartNo(),
-			startVO.getPartNoEdition(),
-			startVO.getProcessNo(),
-			startVO.getProcessName(),
-			startVO.getCraftEdition(),
-			startVO.getProcessEdition());
-	}*/
+
 }
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 fe191cc..c7b2f6a 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
@@ -17,16 +17,9 @@
 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.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.entity.ProcessProgRef;
 import org.springblade.mdm.program.service.NcNodeService;
-import org.springblade.mdm.program.service.NcProgramService;
-import org.springblade.mdm.program.service.ProcessProgRefService;
-import org.springblade.mdm.program.vo.DncSendBackData;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springblade.mdm.program.service.NodeDeptQueryService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -48,7 +41,7 @@
 	private final HistoryService historyService;
 	private final TaskService taskService;
 	private final IdentityService identityService;
-
+	private final NodeDeptQueryService nodeDeptQueryService;
 	private final NcNodeService ncNodeService;
 
 	private final FlowProgramFileService flowProgramFileService;
@@ -79,6 +72,10 @@
 				vars.put(FlowContants.MACHINE_CODE,oldVars.get(FlowContants.MACHINE_CODE));
 				//鏈哄簥鍨嬪彿
 				vars.put(FlowContants.MACHINE_MODE,oldVars.get(FlowContants.MACHINE_MODE));
+
+				String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(programPackage.getMachineCode());
+				vars.put(FlowContants.WORKSHOP,workshop);
+
 				vars.put(FlowContants.PROCESS_NO,oldVars.get(FlowContants.PROCESS_NO));
 				vars.put(FlowContants.PROCESS_NAME,oldVars.get(FlowContants.PROCESS_NAME));
 				vars.put(FlowContants.PROCESS_EDITION,oldVars.get(FlowContants.PROCESS_EDITION));
@@ -186,8 +183,9 @@
 
 		vars.put(FlowContants.PRODUCT_MODEL,programPackage.getProductModel());
 
+		vars.put(FlowContants.PROGRAM_PACKAGE_NAME,programPackage.getName());
 
-		ProduceDivision div = produceDivisionService.getByDrawingNo(programPackage.getDrawingNo());
+		ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(programPackage.getDrawingNo());
 		if(div != null) {
 			vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
 			vars.put(FlowContants.CHECKER,div.getCheckerId());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java
index f329e43..48f83b5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java
@@ -86,9 +86,12 @@
 		String fileName = programFile.getOssName();
 		try (InputStream inputStream = ossTemplate.statFileStream(fileName)) {
 			ByteArrayInputStream bos = new ByteArrayInputStream(inputStream.readAllBytes());
-			boolean isText= FileContentUtil.isTextFile(bos);
+			boolean isText = StringUtils.endsWithIgnoreCase(fileName,".txt") || StringUtils.endsWithIgnoreCase(fileName,".nc")|| StringUtils.endsWithIgnoreCase(fileName,".xml");
+			if(!isText){
+				isText= FileContentUtil.isTextFile(bos);
+			}
 			if(isText){
-			bos.reset();
+				bos.reset();
 				result = FileContentUtil.getContentFromStream(bos);
 			}else{
 				result = "<闈炴枃鏈枃浠�>";
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 a44762d..e3c53f1 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
@@ -23,6 +23,7 @@
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NodeDeptQueryService;
+import org.springblade.mdm.program.service.ProgramFlowStatusQueryService;
 import org.springblade.mdm.program.vo.NcNodeVO;
 import org.springblade.mdm.utils.EntityUtil;
 import org.springblade.mdm.utils.ProgramFileNameCheckUtil;
@@ -47,6 +48,7 @@
 	private final IdentityService identityService;
 	private final FlowProgramFileService flowProgramFileService;
 	private final ReplaceProgramFileService replaceProgramFileService;
+	private final ProgramFlowStatusQueryService flowStatusQueryService;
 	private final NodeDeptQueryService nodeDeptQueryService;
 	private OssTemplate ossTemplate;
 	public static final String NODE_ID = "nodeId";
@@ -79,8 +81,15 @@
 
 	 */
 
+	/**
+	 * 鍑嗗鏇挎崲娴佺▼闇�瑕佺殑鏁版嵁
+	 * @param nodeId 瑕佹浛鎹㈢殑绋嬪簭鍖呭悕鑺傜偣id
+	 * @param tempInstanceId 涓存椂娴佺▼瀹炰緥id锛岀敤浜庢柊鐨勬枃浠�
+	 * @return 鍚姩鏁版嵁
+	 */
 	@Transactional
 	public NcNodeVO pre(long nodeId, String tempInstanceId) {
+		checkFlowStatus(nodeId);
 
 		List<NcNode> fileNodes = nodeService.lambdaQuery()
 			.eq(NcNode::getParentId, nodeId)
@@ -113,6 +122,14 @@
 		return vo;
 	}
 
+	void checkFlowStatus(long nodeId) {
+		NcNode packageNode = nodeService.getById(nodeId);
+		int status = flowStatusQueryService.queryFlowStatus(packageNode.getProcessInstanceId());
+		if (status == 1) {
+			throw new ServiceException("绋嬪簭鐨勬祦绋嬫鍦ㄨ繘琛屼腑锛屼笉鑳借繘琛屾浛鎹�");
+		}
+	}
+
 	/**
 	 * 鍚姩鏇挎崲娴佺▼
 	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
index 9d1720b..67eb5c3 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
@@ -4,8 +4,12 @@
 import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.N;
 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.service.FlowCommonService;
@@ -14,9 +18,15 @@
 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.mdm.utils.FileContentUtil;
 import org.springblade.system.feign.ISysClient;
+import org.springblade.system.pojo.entity.Dict;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.time.LocalDate;
 import java.util.Arrays;
 import java.util.Date;
@@ -31,6 +41,13 @@
 	private final FlowCommonService flowCommonService;
 	private final FlowProgramFileService flowProgramFileService;
 	private final ISysClient sysClient;
+	private final OssTemplate ossTemplate;
+	private final ProgramAnnotationService programAnnotationService;
+	private final MachineService machineService;
+
+	public static final String GH = "GH";
+
+
 	/**
 	 * 榛樿鏈夋晥鏈熼棿锛堟湀鏁帮級,2骞�
 	 */
@@ -41,10 +58,10 @@
 	 * 鍥哄寲瀹℃壒閫氳繃澶勭悊浠诲姟锛�
 	 * @param execution 娴佺▼execution
 	 */
-	public void execute(DelegateExecution execution) {
+	@Transactional
+	public void execute(DelegateExecution execution) throws IOException {
 		log.info("鎵ц鍥哄寲绋嬪簭浠诲姟鏈嶅姟,娴佺▼瀹炰緥id={}", execution.getProcessInstanceId());
 		//鍥哄寲绋嬪簭妫�鏌ユ湁鏁堟湡锛�
-		//1.灏嗘祦绋嬭缃�
 		dealWithNode(execution.getProcessInstanceId());
 	}
 
@@ -52,7 +69,7 @@
 	 * 澶勭悊node鐘舵�併��
 	 * @param processInstanceId 娴佺▼瀹炰緥id
 	 */
-	void dealWithNode(String processInstanceId) {
+	void dealWithNode(String processInstanceId) throws IOException {
 		//绋嬪簭鍖呰妭鐐瑰拰涓嬪睘绋嬪簭鑺傜偣(鍖呮嫭鍘嗗彶鑺傜偣闈炴渶鏂扮増鏈殑)浠庤瘯鍒囨尓鍒板浐鍖栦笅闈�
 		//绋嬪簭鍖呰妭鐐� 璁剧疆鏈凡鍥哄寲
 		NcNode pkgNode =  nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId, processInstanceId).one();
@@ -78,7 +95,7 @@
 	 * @param pkgNode 瑕佹尓鍔ㄧ殑鑺傜偣
 	 * @param historyProgramPackageNodes 绋嬪簭鍖呭悕 鍘嗗彶鑺傜偣
 	 */
-	void moveNodeToCuredTree(NcNode pkgNode,List<NcNode> historyProgramPackageNodes, FlowProgramProperties programProperties) {
+	void moveNodeToCuredTree(NcNode pkgNode,List<NcNode> historyProgramPackageNodes, FlowProgramProperties programProperties) throws IOException {
 		//鍒涘缓鑺傜偣鍒版満搴婄骇鍒�.(鍥哄寲鏍�)
 		NcNode machineNode = ncNodeAutoCreateService.createNodeTreeToMachine(programProperties);
 
@@ -104,6 +121,8 @@
 		}
 		nodeService.updateBatchById(historyProgramPackageNodes);
 
+		Machine machine = machineService.getByCode(pkgNode.getMachineCode());
+		List<Dict> annoDicts = programAnnotationService.getAnnotionList();
 		//鏂扮殑娴佺▼鏂囦欢锛岄渶瑕佸湪鍖呰妭鐐逛笅鏂板缓锛屼笉鑳界敤鑰佺殑
 		List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode.getProcessInstanceId()).list();
 		for(FlowProgramFile flowProgramFile : files){
@@ -117,6 +136,39 @@
 			newProgNode.setFlowProgramFileId(flowProgramFile.getId());
 			newProgNode.setIsCured(1);
 			ncNodeService.save(newProgNode);
+
+			//淇敼鏂囦欢鍐呭鏇存柊娉ㄩ噴锛屽苟鏇存柊鏂囦欢鏁版嵁鐨勫湴鍧�
+			///鏇挎崲娉ㄩ噴鍚庢�绘槸涓嶈鍟�
+			setGhAnnotation(flowProgramFile,machine.getMachineGroupCode(),annoDicts);
+
+			flowProgramFileService.updateById(flowProgramFile);
+		}
+	}
+
+	/**
+	 * 璁剧疆鍥哄寲娉ㄩ噴,瀹炵幇鏂瑰紡锛岃幏鍙栨枃浠跺瓧鑺備笅锛屼慨鏀瑰悗鏇挎崲鏂囦欢
+	 * @param flowProgramFile oss 鏂囦欢
+	 *
+	 */
+	void setGhAnnotation(FlowProgramFile flowProgramFile,String machineGroup,List<Dict> annoDicts) throws IOException {
+		String ossName = flowProgramFile.getOssName();
+		//
+		try(InputStream ins = ossTemplate.statFileStream(ossName);){
+			String annoTxt = programAnnotationService.generateAnnotation("GH",machineGroup,annoDicts);
+			int statusLineIndex = 2;
+			String line2 = FileContentUtil.readLineAt(ins,statusLineIndex);//绗笁琛屽簲璇ユ槸鐘舵�佹敞閲�
+			InputStream finishedStream;
+			if(programAnnotationService.isAnnotation(line2,machineGroup,annoDicts)){
+				finishedStream = FileContentUtil.replaceAtLine(ins,statusLineIndex,annoTxt);
+			}else{
+				finishedStream = FileContentUtil.insertLine(ins,statusLineIndex,annoTxt);
+			}
+			try(finishedStream) {
+				finishedStream.reset();
+				BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
+				//鏇挎崲鍘熸湁鐨勬枃浠跺湴鍧�
+				flowProgramFile.setOssName(bfile.getName());
+			}
 		}
 	}
 
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 16c8d5f..a810df2 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
@@ -3,6 +3,7 @@
 
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -45,14 +46,16 @@
 			return R.fail(e.getMessage());
 		}
 	}
-	/*
-	@Operation(summary = "dnc鍥炰紶鏁版嵁鍒嗛〉", description = "dnc鍥炰紶鏁版嵁鍒嗛〉")
-	@GetMapping("/page")
-	public R<IPage<DncSendBackData>> page(Query query) {
-		IPage<DncSendBackData> pages = ncProgramExchangeService.dncSendBackPageQuery(query);
-		return R.data(pages);
+	@GetMapping("/back-file-content")
+	@Operation(summary = "鑾峰彇鍥炰紶鏂囦欢鍐呭", description = "鏌ョ湅宸ユ帶缃戝洖浼犳枃浠跺唴瀹�")
+	public R<String> fileContent(@Parameter(description = "鏂囦欢鐨別ntryName") String entryName) {
+		try {
+			return R.data(dncSendBackService.getEntryFileContent(entryName));
+		}catch(Exception e) {
+			log.error("鍒犻櫎鏂囦欢澶辫触",e);
+			return R.fail(e.getMessage());
+		}
 	}
-	*/
 	@PostMapping("accept")
 	@ApiOperationSupport(order = 2)
 	@Operation(summary = "DNC鍥炰紶鏁版嵁鍏ュ簱", description = "鍏ュ簱锛屽悓鏃跺惎鍔ㄥ浐鍖栨祦绋�,鍏ュ弬涓轰笂浼犳槸瑙f瀽鐨勬暟鎹垪琛�")
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 e0eb14f..59730bd 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
@@ -73,12 +73,10 @@
 		List<NcNodeVO> list = ncNodeService.lazyList(parentId);
 		if(list != null && !list.isEmpty()) {
 			for(NcNodeVO ncNodeVO : list) {
-				if(!NcNode.TYPE_PROGRAM_PACKAGE.equals(ncNodeVO.getNodeType())){
-					break;
+				if(NcNode.TYPE_PROGRAM_PACKAGE.equals(ncNodeVO.getNodeType())){
+					ncNodeVO.setFlowStatus(programFlowStatusQueryService.queryFlowStatus(ncNodeVO.getProcessInstanceId()));
 				}
-				ncNodeVO.setFlowStatus(programFlowStatusQueryService.queryFlowStatus(ncNodeVO.getProcessInstanceId()));
 			}
-
 		}
 		return R.data(list);
 	}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml
index 8daeba5..2a47aa7 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml
@@ -11,7 +11,7 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
     <select id="exportDncPageQuery" resultType="org.springblade.mdm.program.vo.NcProgramExportDncPageVO">
-        select a.id,a.title,n.name,a.nc_node_id,n.drawing_no,n.drawing_no_edition,n.process_name,a.create_time from mdm_nc_program_approved a
+        select a.id,a.title,n.name,a.nc_node_id,n.drawing_no,n.drawing_no_edition,n.process_name,a.create_time,a.update_time from mdm_nc_program_approved a
             inner join mdm_nc_node n on a.nc_node_id=n.id
         <where>
             a.is_deleted=0 and a.status=#{query.status}
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 43455e4..5fbf450 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
@@ -24,6 +24,7 @@
 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.program.vo.DncSendBackFile;
 import org.springblade.mdm.utils.EntityUtil;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springframework.beans.BeanUtils;
@@ -57,7 +58,7 @@
 	private final FlowCommonService flowCommonService;
 
 	private String getFileKey(){
-		return "dncexpfile-"+ AuthUtil.getUserId();
+		return "dncimpfile-"+ AuthUtil.getUserId();
 	}
 	/**
 	 * dnc鍥炰紶鏂囦欢涓婁紶
@@ -78,10 +79,10 @@
 			//璁剧疆涓�涓紦瀛橈紝2灏忔椂杩囨湡
 			bladeRedis.setEx(getFileKey(),bfile.getName(), Duration.ofHours(2));
 
-			InputStream zipFileInputStream = file.getInputStream();//test
-
-			list = parseProgramListFromZip(zipFileInputStream);
-
+			try(InputStream zipFileInputStream = ossTemplate.statFileStream(bfile.getName());) {
+				//InputStream zipFileInputStream = file.getInputStream();//test
+				list = parseProgramListFromZip(zipFileInputStream);
+			}
 		} catch (IOException e) {
 			log.error("涓婁紶dnc鍥炰紶鏂囦欢澶辫触",e);
 			throw new ServiceException("瑙f瀽DNC鍥炰紶鏁版嵁澶辫触");
@@ -145,6 +146,17 @@
 					if(programPackageNode != null) {
 						progData.setId(programPackageNode.getId());
 						progData.setProgramNo(programPackageNode.getProgramNo());
+
+						List<String> fileEtriyNames  = fileEntryNameList.stream().filter(n -> n.startsWith(packageName)).toList();
+						List<DncSendBackFile> programFiles = new ArrayList<>();
+						fileEtriyNames.forEach( filePath ->{
+								DncSendBackFile backFile = new DncSendBackFile();
+								backFile.setEntryName(filePath);
+								backFile.setName(StringUtils.removeStart(filePath,entryName));
+								programFiles.add(backFile);
+						});
+
+						progData.setFiles(programFiles);
 						list.add(progData);
 					}else{
 						throw new ServiceException("鎵句笉鍒扮▼搴忓寘鍚�:"+packageName+statusLine);
@@ -189,9 +201,9 @@
 
 			this.save(exchange);
 		}*/
-		bladeRedis.del(filekey);
-		this.ossTemplate.removeFile(zipFileName);
-		log.info("鍒犻櫎oss鏂囦欢:{}",zipFileName);
+		//bladeRedis.del(filekey);
+		//this.ossTemplate.removeFile(zipFileName);
+		//log.info("鍒犻櫎oss鏂囦欢:{}",zipFileName);
 
 		//cureFlowService.startCure(newProgramPackageList,programPackageSubMap);
 		cureFlowService.startCureNew(pkgIdFileMap);
@@ -394,20 +406,42 @@
 
 		return tempFile;
 	}
-	void setBaseProperties(BizEntity entity, JSONObject jsonObject){
-		entity.setCreateTime(jsonObject.getDate("createTime"));
-		entity.setUpdateTime(jsonObject.getDate("updateTime"));
-		entity.setStatus(jsonObject.getInteger("status"));
-		entity.setCreateUser(jsonObject.getLong("createUser"));
-		entity.setUpdateUser(jsonObject.getLong("updateUser"));
+
+	/**
+	 * 鑾峰彇鍥炰紶鏂囦欢鐨勫唴瀹�
+	 * @param entryName 鏂囦欢鍦ㄥ帇缂╁寘鍐呯殑璺緞
+	 * @return 鏂囦欢鍐呭鏂囨湰
+	 */
+	public String getEntryFileContent(String entryName) throws IOException {
+		String result  = "";
+		String zipFileName = bladeRedis.get(getFileKey());
+		try(InputStream inputStream = this.ossTemplate.statFileStream(zipFileName);){
+			Path tempZipFile = createTempFile(inputStream);
+
+			ZipEntry entry;
+			try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
+				Enumeration<? extends ZipEntry> entries = zipFile.entries();
+				while (entries.hasMoreElements()) {
+					entry = entries.nextElement();
+					if (!entryName.equals(entry.getName())) {
+						continue;
+					}
+					try (InputStream fileIns = zipFile.getInputStream(zipFile.getEntry(entryName))) {
+						ByteArrayInputStream bos = new ByteArrayInputStream(fileIns.readAllBytes());
+						boolean isText = FileContentUtil.isTextFile(bos);
+						if (isText) {
+							bos.reset();
+							result = FileContentUtil.getContentFromStream(bos);
+						} else {
+							result = "<闈炴枃鏈枃浠�>";
+						}
+					}
+
+				}
+			}
+		}
+
+		return result;
 	}
-	/*
-	void clearBaseProperties(BizEntity entity){
-		entity.setId(null);
-		entity.setCreateTime(null);
-		entity.setUpdateTime(null);
-		entity.setStatus(null);
-		entity.setCreateUser(null);
-		entity.setUpdateUser(null);
-	}*/
+
 }
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 80cb090..7734274 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
@@ -83,11 +83,15 @@
 			for (Long approvedId : approvedIdArray) {
 				NcProgramApproved approved = approvedService.getById(approvedId);
 				addProgramPackageToZip(zipOut,approved);
+
+				approved.setStatus(NcProgramApproved.STATUS_EXPORTED);
+				approvedService.updateById(approved);
 			}
 
 			//鐘舵�佷慨鏀逛负宸插鍑�
+			/*
 			approvedService.lambdaUpdate().in(NcProgramApproved::getId, Arrays.asList(approvedIdArray))
-				.set(NcProgramApproved::getStatus,NcProgramApproved.STATUS_EXPORTED).update();
+				.set(NcProgramApproved::getStatus,NcProgramApproved.STATUS_EXPORTED).update();*/
 		}catch(Exception e){
 			Throwable [] err = e.getSuppressed();
 			throw new ServiceException("瀵煎嚭宸ユ帶缃戦敊璇�"+e.getMessage());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackData.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackData.java
index d9654ff..f5e50a5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackData.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackData.java
@@ -25,6 +25,6 @@
 	private String md5;
 
 	@Schema(description = "瀛愭枃浠讹紙鐢ㄤ簬鍙瘑鍒枃浠跺姞鐨勬満鍣ㄨ繑鍥炵殑绋嬪簭锛�")
-	private List<String> children;
+	private List<DncSendBackFile> files;
 	private boolean hasChildren;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackFile.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackFile.java
new file mode 100644
index 0000000..6de4e58
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncSendBackFile.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 java.time.LocalDateTime;
+import java.util.List;
+
+@Setter
+@Getter
+@Schema(description = "DNC鍥炰紶鏁版嵁")
+public class DncSendBackFile {
+
+	@Schema(description = "鏂囦欢鍚�")
+	private String name;
+	@Schema(description = "鏂囦欢璺緞")
+	private String entryName;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java
index bd77b7a..aa9cacd 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java
@@ -8,9 +8,11 @@
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.oss.OssTemplate;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.FileUtil;
+import org.springblade.mdm.utils.FileContentUtil;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -68,54 +70,20 @@
 
 		System.out.println(entryNameList);
 
-		/*
-		try (ZipFile zipFile = new ZipFile(tempFile.toFile())) {
-			ZipEntry entry = zipFile.getEntry(entryn);
-			InputStream ins = zipFile.getInputStream(entry);
 
-			Path outputPath = Paths.get("d:/downtest.txt");
-			Files.copy(ins, outputPath, StandardCopyOption.REPLACE_EXISTING);
-		}
-
-			List<String> entryNameList = new ArrayList<>();
-		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
-			 ZipFile zipFile = new ZipFile(channel)) {
-
-			ZipArchiveEntry entry;
-			Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
-			String entryn = "CP1-13-1/CP1-13-1-1-1-1.txt";
-			while (entries.hasMoreElements()) {
-				entry = entries.nextElement();
-				entryNameList.add(entry.getName());
-			}
-		}*/
-			/*
-		try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
-			 ZipFile zipFile = new ZipFile(channel)) {
-			List<String> dirList = entryNameList.stream().filter(s -> s.endsWith("/")).toList();
-			for(String dir : dirList) {
-				entryNameList.stream().filter(s -> s.startsWith(dir)).forEach(entryName -> {
-					ZipArchiveEntry fileEntry = zipFile.getEntry(entryName);
-					//ZipArchiveEntry fileEntry = entryMap.get(entryName);
-					String fileName = StringUtils.removeStart(entryName,dir);//鍘婚櫎鏂囦欢鍚嶈矾寰勯儴鍒�
-					try {
-						InputStream ins = zipFile.getInputStream(fileEntry);
-						ByteArrayInputStream byteS = new ByteArrayInputStream(ins.readAllBytes());
-
-						Path outputPath = Paths.get("d:/downtest.txt");
-						Files.copy(byteS, outputPath, StandardCopyOption.REPLACE_EXISTING);
-						byteS.reset();
-
-						BladeFile newOssFile = ossTemplate.putFile("mdm", fileName, byteS);
-						r.setData(newOssFile.getName());
-						System.out.println(newOssFile.getName());
-					} catch (IOException e) {
-						throw new RuntimeException(e);
-					}
-				});
-			}
-		}*/
 		return r;
 	}
 
+	@GetMapping("/replace")
+	@ApiOperationSupport(order = 2)
+	@Operation(summary = "鏇挎崲鍐呭")
+	public R<String> replace(String filepath) throws IOException {
+		File file = new File(filepath);
+		FileInputStream fis = new FileInputStream(file);
+		InputStream newins = FileContentUtil.replaceAtLine(fis,2,"GHTEST");
+
+		BladeFile bfile = ossTemplate.putFile("replaceok.txt",newins);
+		return R.data(bfile.getLink()+","+bfile.getName());
+	}
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/AnsiTextDetector.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/AnsiTextDetector.java
new file mode 100644
index 0000000..5829508
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/AnsiTextDetector.java
@@ -0,0 +1,47 @@
+package org.springblade.mdm.utils;
+import org.apache.tika.detect.Detector;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class AnsiTextDetector  implements Detector {
+	// 鍙墦鍗板瓧绗﹁寖鍥达紙ASCII + 鎵╁睍ANSI瀛楃锛�
+	private static final int PRINTABLE_START = 32;
+	private static final int PRINTABLE_END = 126;
+	private static final int EXTENDED_ANSI_START = 128;
+	private static final int EXTENDED_ANSI_END = 255;
+
+	// 鏂囨湰鍒ゅ畾闃堝�硷細鍙墦鍗板瓧绗﹀崰姣� >= 80%
+	private static final double TEXT_THRESHOLD = 0.8;
+
+	@Override
+	public MediaType detect(InputStream input, Metadata metadata) throws IOException {
+		TikaInputStream tis = TikaInputStream.get(input);
+		byte[] buffer = new byte[1024];
+		int bytesRead = tis.read(buffer);
+		if (bytesRead <= 0) {
+			return MediaType.OCTET_STREAM;
+		}
+
+		int total = 0;
+		int printable = 0;
+		for (int i = 0; i < bytesRead; i++) {
+			byte b = buffer[i];
+			int unsigned = b & 0xFF; // 杞负鏃犵鍙峰瓧鑺�
+			total++;
+			// 鍒ゆ柇鏄惁涓哄彲鎵撳嵃瀛楃锛堝惈鎵╁睍ANSI锛�
+			if ((unsigned >= PRINTABLE_START && unsigned <= PRINTABLE_END) ||
+				(unsigned >= EXTENDED_ANSI_START && unsigned <= EXTENDED_ANSI_END)) {
+				printable++;
+			}
+		}
+
+		// 鑻ュ彲鎵撳嵃瀛楃鍗犳瘮杈炬爣锛屽垽瀹氫负鏂囨湰
+		if ((double) printable / total >= TEXT_THRESHOLD) {
+			return MediaType.TEXT_PLAIN;
+		}
+		return MediaType.OCTET_STREAM;
+	}
+}
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
index f29bbdd..7aef091 100644
--- 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
@@ -1,12 +1,22 @@
 package org.springblade.mdm.utils;
 
 import org.apache.tika.Tika;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.detect.CompositeDetector;
+import org.apache.tika.detect.DefaultDetector;
+import org.apache.tika.detect.Detector;
+import org.apache.tika.detect.TextDetector;
+import org.apache.tika.mime.MimeType;
+import org.apache.tika.mime.MimeTypeException;
+import org.apache.tika.mime.MimeTypes;
 import org.mozilla.universalchardet.UniversalDetector;
 import org.springblade.core.tool.utils.Charsets;
 
 import java.io.*;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,7 +28,9 @@
 	 * @return
 	 */
 	public static boolean isTextFile(InputStream inputStream) {
-		Tika tika = new Tika();
+		MimeTypes mimeTypes = MimeTypes.getDefaultMimeTypes();
+		Tika tika = new Tika(mimeTypes);
+
 		try {
 			String mimeType = tika.detect(inputStream);
 			//String mimeType = tika.detect(file);
@@ -143,4 +155,40 @@
 
 		return new String(bytes, charset);
 	}
+
+	/**
+	 * 鏇挎崲鏂囦欢涓殑鏌愪竴琛�
+	 * @param ins 杈撳叆娴�
+	 * @param repalceWith 鏇挎崲鍚庣殑鏂囨湰
+	 * @param lineIndex 琛岀储寮� 0 based
+	 */
+    public static InputStream replaceAtLine(InputStream ins, int lineIndex,String repalceWith) throws IOException {
+		byte[] bytes = ins.readAllBytes();
+		ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
+		Charset charset = Charsets.charset(detectFromInputStream(byteStream));
+		byteStream.reset();
+
+		Path tempFile = Files.createTempFile("temppro"+System.currentTimeMillis(), ".tmp");
+
+		try (InputStreamReader isr = new InputStreamReader(byteStream, charset);
+			 BufferedReader reader = new BufferedReader(isr);
+			 BufferedWriter writer = Files.newBufferedWriter(tempFile,charset)) {//
+
+			int currentLine = 0;
+			String line;
+
+			while ((line = reader.readLine()) != null) {
+				// 濡傛灉鏄洰鏍囪锛屽啓鍏ユ柊鍐呭
+				if (currentLine == lineIndex) {
+					writer.write(repalceWith);
+				} else {
+					writer.write(line);
+				}
+				writer.newLine();
+				currentLine++;
+			}
+
+		}
+		return new ByteArrayInputStream(Files.newInputStream(tempFile).readAllBytes());
+    }
 }
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java
index bd420f6..5bb149b 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java
@@ -1,7 +1,10 @@
 package org.springblade.mdm.utils;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Charsets;
 
@@ -9,6 +12,9 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
 
 public class FileContentUtilTest {
 
@@ -46,15 +52,34 @@
 		//System.out.println(charset);
 	}
 
-	//@Test
+	@Test
 	public void testReadLineAt() throws IOException {
-		String file = "D:/a.txt";
+
+		Path source = Paths.get("src/test/resources/filecontenttest.txt");
 		int lineIndex = 1;
-		FileInputStream fis = new FileInputStream(file);
+		FileInputStream fis = new FileInputStream(source.toFile());
 
 		String expected = "绗簩琛�";
 		String read = FileContentUtil.readLineAt(fis,lineIndex);
 		Assertions.assertEquals(expected,read);
 
 	}
+
+	@Test
+	public void testReplaceReadLineAt(@TempDir Path tempDir) throws IOException {
+		// 鍔犺浇璧勬簮鏂囦欢
+		Path source = Paths.get("src/test/resources/filecontenttest.txt");
+		//File file = new File(classLoader.getResource("filecontenttest.txt").getFile());
+		File testFile = source.toFile();
+		try(FileInputStream fis = new FileInputStream(testFile);) {
+
+			String expected = "newline2";
+			int lineIndex = 1;
+			InputStream ins = FileContentUtil.replaceAtLine(fis, lineIndex, expected);
+			List<String> list = IOUtils.readLines(ins, Charsets.UTF_8);
+			System.out.println(list);
+			Assertions.assertEquals(expected, list.get(lineIndex));
+		}
+
+	}
 }
diff --git a/blade-service/blade-mdm/src/test/resources/filecontenttest.txt b/blade-service/blade-mdm/src/test/resources/filecontenttest.txt
new file mode 100644
index 0000000..34c5091
--- /dev/null
+++ b/blade-service/blade-mdm/src/test/resources/filecontenttest.txt
@@ -0,0 +1,4 @@
+绛変竴浼�
+绗簩琛�
+绗簩3
+绗�4琛寈
\ No newline at end of file

--
Gitblit v1.9.3