From dc01577b31204fd3c80645b45d81ff693f79a985 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期三, 10 九月 2025 23:04:20 +0800
Subject: [PATCH] 程序包名增加版次

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java         |   21 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java                 |   22 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java       |   69 +++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java            |   19 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java    |   12 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java          |   54 +++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java          |   23 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java                        |   55 +++++--
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java        |   33 ++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java                             |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java |   15 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java                             |   19 +-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java     |   58 ++++++++
 13 files changed, 372 insertions(+), 31 deletions(-)

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 25c9406..a5d0bc7 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
@@ -21,7 +21,6 @@
 import org.springblade.mdm.program.service.ProgramSeqService;
 import org.springblade.mdm.utils.EntityUtil;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.flowable.engine.RuntimeService;
 import org.springframework.transaction.annotation.Transactional;
@@ -97,7 +96,7 @@
 		NcNode curedProgramPackage = null;
 		if(!startVO.isTemporaryFlow() && !startVO.isDeviationFlow()) {
 			//姝e父娴佺▼(闈炰复鏃舵祦绋�) 涓斾笉鏄� 鍋忕鍗�,鎵嶅尮閰嶅浐鍖栫▼搴�
-			curedProgramPackage = ncNodeService.getLastCuredProgramPackageWithoutProcessEdition(programPkgName,startVO.getMachineCode());
+			curedProgramPackage = ncNodeService.getLastCuredProgramWithoutProcessEdition(startVO.getDrawingNo(),startVO.getProcessNo(),startVO.getMachineCode());
 			//璁剧疆鏄惁鏈夊浐鍖栫▼搴忔爣璁�
 			vars.put(FlowContants.HAS_CURED_PROGRAM, curedProgramPackage != null ? FlowContants.Y : FlowContants.N);
 			//宸ュ簭鐗堟鏄惁涓�鑷达紝鏄惁鍦ㄦ湁鏁堟湡鍐�
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
index 6583647..96a68e1 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -1,17 +1,21 @@
 package org.springblade.mdm.flow.excution.dispatch;
 
+import com.alibaba.excel.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.service.ApproveRecordService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.FlowProgramProperties;
+import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.service.NcNodeAutoCreateService;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NcProgramApprovedService;
 import org.springblade.mdm.utils.EntityUtil;
+import org.springblade.mdm.utils.ProgramFileNameParser;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -52,7 +56,7 @@
 				Integer newVersion = packageNode.genNewVersionNumber();
 				packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
 			}else{
-				//鍙敤锛屽崌鐗堬紙淇敼鍏跺伐搴忕増鏈級锛屽師鏉ョ殑鑺傜偣娓呴櫎
+				//鍙敤锛屽崌鐗堬紙淇敼鍏跺伐搴忕増娆★級锛屽師鏉ョ殑鑺傜偣娓呴櫎
 				moveToNewProcessEdition(packageNode,props);
 			}
 		}else{
@@ -97,20 +101,31 @@
 		packageNode.setProcessEdition(tempProps.getProcessEdition());
 		packageNode.setParentId(machineNode.getParentId());
 		packageNode.setParentIds(machineNode.getParentIds());
+		packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
 		this.ncNodeService.updateById(packageNode);
 
 		//绉诲姩绋嬪簭鑺傜偣
 		List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
 		for(NcNode programNode : programNodes){
+
+			programNode.setName(buildNewFilename(programNode.getName(),tempProps.getProcessEdition()));//鍚嶇О淇敼锛屽伐搴忕増娆¢儴鍒�
 			programNode.setParentIds(packageNode.getParentIds()+","+packageNode.getId());
 			programNode.setProcessEdition(tempProps.getProcessEdition());//淇敼宸ュ簭鐗堟
 			programNode.setVersionNumber(packageNode.getVersionNumber());
 		}
 		ncNodeService.updateBatchById(programNodes);
 
-
 	}
 
+	String buildNewFilename(String filename,String newProcessEdition){
+		ProgramNameVO pnameVO = ProgramFileNameParser.parseProgramName(filename);
+		String ext = FilenameUtils.getExtension(filename);
+		String name= pnameVO.getDrawingNo()+"-"+pnameVO.getProcessNo()+"-"+newProcessEdition+"-"+pnameVO.getSegmentCount()+"-"+pnameVO.getSegmentNo();
+		if(StringUtils.isNotBlank(ext)){
+			name += "."+ext;
+		}
+		return name;
+	}
 
 	/**
 	 * 淇濆瓨瀹℃壒瀹屾垚鐨勮褰�
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 a9dfc6a..e34f27a 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
@@ -5,6 +5,7 @@
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BizServiceImpl;
@@ -25,6 +26,10 @@
 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.service.programannotation.AnnotationProcessor;
+import org.springblade.mdm.program.service.programannotation.DefaultProcessor;
+import org.springblade.mdm.program.service.programannotation.FanucProcessor;
+import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
 import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springblade.mdm.program.vo.DncSendBackFile;
 import org.springblade.mdm.program.vo.ProgramAnnotation;
@@ -36,11 +41,13 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.lang.annotation.Annotation;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 import java.time.Duration;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -62,6 +69,10 @@
 	private final DncBackFileService dncBackFileService;
 	private final MachineService machineService;
 	private final ParamService paramService;
+	private final MachineAnnotationConfig machineAnnotationConfig;
+
+	private final FanucProcessor fanucProcessor;
+	private final DefaultProcessor defaultProcessor;
 	/**
 	 * 鍋忕鍗曟枃浠舵湯灏剧殑妯″紡锛歅+鏁板瓧
 	 */
@@ -134,12 +145,13 @@
 				DncSendBackData progData = new DncSendBackData();
 				String folderName = StringUtils.removeEnd(entryName,"/");
 
-				PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
-				String packageName = pkgAndEdition.getProgramPackageName();
-				String processEdition = pkgAndEdition.getProcessEdition();
+				//PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
+				String packageName = folderName;//pkgAndEdition.getProgramPackageName();
+				//String processEdition = pkgAndEdition.getProcessEdition();
+				/*
 				if(StringUtils.isBlank(packageName) || StringUtils.isBlank(processEdition)){
-					throw new ServiceException("鍖呭唴鏂囦欢澶瑰悕鏍煎紡閿欒搴旇涓篬闆剁粍浠跺彿-宸ュ簭鍙�-宸ュ簭鐗堟]:"+folderName);
-				}
+					throw new ServiceException("鍖呭唴鏂囦欢澶瑰悕鏍煎紡閿欒锛屽簲璇ヤ负[闆剁粍浠跺彿-宸ュ簭鍙�-宸ュ簭鐗堟]:"+folderName);
+				}*/
 
 				progData.setProgramName(packageName);
 				String statusLine;
@@ -147,20 +159,32 @@
 				if(optFilename.isPresent()){
 					entry = zipFile.getEntry(optFilename.get());
 					InputStream ins = zipFile.getInputStream(entry);
+					ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(ins));;
 					progData.setFileBackTime(DateUtil.fromInstant(entry.getLastModifiedTime().toInstant()));
-					statusLine = FileContentUtil.readLineAt(ins,2);
+					//machineAnnotationConfig.getConfigMap().get(machine.getcon)
+					Pattern fanucPattern = Pattern.compile("^[oO]\\d{4}");
+					String testLine = FileContentUtil.readLineAt(bais,2);//TODO,fanuc杩欒鏄笅鍙戣矾寰勶紝鍏朵粬鏈哄櫒鏄姸鎬�
+					bais.reset();
+					//boolean isFanuc = fanucPattern.matcher(testLine).matches();
+					boolean isFanuc = !StringUtils.containsAny(testLine,"(SQ)","(GH)","(PL)");
+					if(isFanuc){
+						statusLine = FileContentUtil.readLineAt(bais,3);//fanuc鐨勭姸鎬佽绗�4琛�
+					}else{
+						statusLine = testLine;
+					}
+
 					if(statusLine.contains("SQ")){
 						//璇曞垏
-						programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName,processEdition);
+						programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);//,processEdition
 					}else if(statusLine.contains("GH")){
 						//鍥哄寲
-						programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName,processEdition);
+						programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName);
 					}else if(statusLine.contains("PL")){
 						//鍋忕
-						programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName,processEdition);
+						programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName);
 					}else{
 						//鏌ヨ鏄惁杞﹀簥锛屾槸杞﹀簥鍙互鏀捐繃锛屾寜璇曞垏澶勭悊
-						programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName,processEdition);
+						programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);
 						if(programPackageNode!=null){
 							Machine machine = machineService.getByCode(programPackageNode.getMachineCode());
 							String chechuangVal = paramService.turninngValue();
@@ -205,10 +229,10 @@
 	 * @param folderName 鏂囦欢澶瑰悕
 	 * @return 缁撴瀯鏁版嵁
 	 */
+	/*
 	PackageAndProcessEdition parseProgramPackageFromFolderName(String folderName){
 		int index = StringUtils.lastIndexOf(folderName,'-');
 		String processEditon = "";
-		String temp;
 		String packageName = "";
 		if(index != -1){
 			processEditon = folderName.substring(index+1);
@@ -219,7 +243,7 @@
 		result.setProgramPackageName(packageName);
 		result.setProcessEdition(processEditon);
 		return result;
-	}
+	}*/
 
 	/**
 	 * 鍏ュ簱鍥炰紶鏂囦欢,骞跺惎鍔ㄥ浐鍖栨祦绋�
@@ -269,8 +293,8 @@
 			for(String dir : dirList){
 				String folderName = StringUtils.removeEnd(dir,"/");
 
-				PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
-				String programPackageName = pkgAndEdition.getProgramPackageName();
+				//PackageAndProcessEdition pkgAndEdition = folderName;//parseProgramPackageFromFolderName(folderName);
+				String programPackageName = folderName; //pkgAndEdition.getProgramPackageName();
 
 				Optional<NcNode> optPackageNode = allAcceptPackages.stream().filter(node -> StringUtils.equals(node.getName(),programPackageName)).findFirst();
 
@@ -414,4 +438,7 @@
 	private String programPackageName;
 	private String processEdition;
 
+	public String programName(){
+		return programPackageName+"-"+processEdition;
+	}
 }
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 d65e692..55aff67 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
@@ -197,13 +197,13 @@
 	 * @param name 鑺傜偣鍚嶇О
 	 * @return 鏈�鏂扮増鏈▼搴忔姤鍚嶈妭鐐�
 	 */
-	public NcNode getLastEditionTryingProgramPackage(String name,String processEdition){
+	public NcNode getLastEditionTryingProgramPackage(String name){
 		//.or(NcNode::getIsCured,0)
 		List<NcNode> pkgList = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
 			.eq(NcNode::getName, name).and(i->{
 				i.eq(NcNode::getIsCured, 0).or().isNull(NcNode::getIsCured);
 			}).likeRight(NcNode::getParentIds,"0,1,")
-			.eq(NcNode::getIsLastEdition,1).eq(NcNode::getProcessEdition,processEdition).orderByDesc(NcNode::getCreateTime).list();
+			.eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();//.eq(NcNode::getProcessEdition,processEdition)
 
 		if(pkgList.isEmpty()){
 			return null;
@@ -253,10 +253,10 @@
 	 * @param programPkgName
 	 * @return
 	 */
-	public NcNode getLastEditionCuredProgramPackage(String programPkgName,String processEdition) {
+	public NcNode getLastEditionCuredProgramPackage(String programPkgName) {
 		List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
 			.eq(NcNode::getName, programPkgName).likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
-			.eq(NcNode::getProcessEdition, processEdition)
+			//.eq(NcNode::getProcessEdition, processEdition)
 			.eq(NcNode::getIsLastEdition,1).list();
 
 		if(nodes.isEmpty()){
@@ -292,16 +292,17 @@
 
 	/**
 	 * 鑾峰彇鏈�鏂扮殑鍥哄寲绋嬪簭锛屼笉鐢ㄥ伐搴忕増娆″尮閰�
-	 * @param programPkgName
+	 * @param drawingNo
+	 * @param processNo
 	 * @param machineCode
 	 * @return
 	 */
-	public NcNode getLastCuredProgramPackageWithoutProcessEdition(String programPkgName,String machineCode) {
+	public NcNode getLastCuredProgramWithoutProcessEdition(String drawingNo, String processNo, String machineCode) {
 		Machine machine = machineService.getByCode(machineCode);
 		List<Machine> sameGroupMachines = machineService.lambdaQuery().eq(Machine::getMachineGroupCode,machine.getMachineGroupCode()).list();
 		List<String> machineCodesInGroup = sameGroupMachines.stream().map(Machine::getCode).toList();
 		List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
-			.eq(NcNode::getName, programPkgName)
+			.eq(NcNode::getDrawingNo, drawingNo).eq(NcNode::getProcessNo, processNo)
 			.likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
 			.in(!machineCodesInGroup.isEmpty(),NcNode::getMachineCode,machineCodesInGroup)
 			.eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();
@@ -318,10 +319,10 @@
 	 * @param programPkgName 绋嬪簭鍖呭悕
 	 * @return 鍋忕鐨勭▼搴忚妭鐐�
 	 */
-	public NcNode getLastEditionDeviationProgramPackage(String programPkgName,String processEdition) {
+	public NcNode getLastEditionDeviationProgramPackage(String programPkgName) {//,String processEdition
 		List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
 			.eq(NcNode::getName, programPkgName)
-			.eq(NcNode::getProcessEdition, processEdition)
+			//.eq(NcNode::getProcessEdition, processEdition)
 			.likeRight(NcNode::getParentIds,"0,3,")
 			.eq(NcNode::getIsLastEdition,1).list();
 
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 cfec60a..7e9e87e 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
@@ -17,6 +17,10 @@
 import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.entity.NcProgramExchange;
 import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
+import org.springblade.mdm.program.service.programannotation.AnnotationData;
+import org.springblade.mdm.program.service.programannotation.AnnotationProcessor;
+import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
+import org.springblade.mdm.program.service.programannotation.ProcessorHelper;
 import org.springblade.system.feign.IDictClient;
 import org.springblade.system.pojo.entity.DictBiz;
 import org.springframework.stereotype.Service;
@@ -44,7 +48,7 @@
 	private final FlowProgramFileService flowProgramFileService;
 	private final ProgramAnnotationService programAnnotationService;
 
-
+	private final MachineAnnotationConfig annotationConfig;
 	/**
 	 * 瀵煎嚭dnc鍘嬬缉鍖�
 	 * @param approvedIdArray 寰呭鍑哄鎵硅〃id鏁扮粍
@@ -75,7 +79,7 @@
 	private void addProgramPackageToZip(ZipOutputStream zipOut, NcProgramApproved approved) throws IOException{
 		NcNode packageNode = ncNodeService.getById(approved.getNcNodeId());
 
-		String packageFolder = packageNode.getName()+"-"+packageNode.getProcessEdition()+"/";
+		String packageFolder = packageNode.getName()+"/";
 		ZipEntry zipEntry = new ZipEntry(packageFolder);// "/"缁撳熬琛ㄧず鏂囦欢澶�
 		zipOut.putNextEntry(zipEntry);
 		zipOut.closeEntry();
@@ -97,13 +101,23 @@
 			deviationSerial = ncNodeService.getDeviationSerialForNode(packageNode);
 		}
 
-		List<DictBiz> annotationDictList= programAnnotationService.getAnnotionDictList();
+		//List<DictBiz> annotationDictList= programAnnotationService.getAnnotionDictList();
 		for (NcNode node : programNodes) {
 			String filePathInZip = genFilePathInZip(packageFolder,node,deviationSerial);
 			programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId());
 			if(programFile.isProgram()) {//绋嬪簭鏂囦欢锛屾墠浼氬姞鍏ュ帇缂╁寘
 				InputStream inputStream = ossTemplate.statFileStream(programFile.getOssName());
 				String sendDir = machine.getProgSendDir()==null? StringUtil.EMPTY:machine.getProgSendDir();
+
+				AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(machine.getControlSystem(),annotationConfig);
+				AnnotationData annoData = new AnnotationData();
+				annoData.setSendPath(sendDir);
+				annoData.setProgramStatus(status);
+				annoData.setDeviation(programPackageNode.getDeviation());
+				annoData.setFilename(programFile.getName());
+				InputStream addedInsFinal = annoProcessor.setAnnotation(annoData,inputStream);
+				addedInsFinal.reset();
+				/*
 				InputStream addedInsFinal;
 				InputStream addedIns2 = programAnnotationService.setSendDirAndStatusAnnotation(sendDir,status,inputStream,machine.getControlSystem());
 				if(StringUtils.isNotBlank(programPackageNode.getDeviation())) {
@@ -111,7 +125,7 @@
 					addedInsFinal = programAnnotationService.setPldAnnotation(programPackageNode.getDeviation(),addedIns2, machine.getControlSystem(), annotationDictList);;
 				}else{
 					addedInsFinal = addedIns2;
-				}
+				}*/
 				this.addInputStreamToZip(zipOut, addedInsFinal, filePathInZip);
 			}
 		}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java
new file mode 100644
index 0000000..63abded
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java
@@ -0,0 +1,69 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import org.apache.commons.io.IOUtils;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.utils.FileContentUtil;
+import org.springblade.system.pojo.entity.DictBiz;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+public abstract class AbstractProcessor implements AnnotationProcessor{
+
+	@Autowired
+	private ProgramAnnotationService programAnnotationService;
+
+	protected AnnotationProperties annotationProperties;
+
+
+	@Override
+	public InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException {
+		List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
+
+		InputStream finishedStream;
+		try(inputStream){
+			ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
+
+			//1鍔犲叆鍙戦�佽矾寰勭殑娉ㄩ噴
+			String sendPathAnnotation = generateAnnotation(annoData.getSendPath(),getControlSystem(),annoDicts);//鍔犱簡娉ㄩ噴涔嬪悗鐨勬枃鏈�
+
+			String sendDirLine = FileContentUtil.readLineAt(byteInputStream,annotationProperties.getSendPathLineIndex());//绗�2琛屾槸鍙戦�佽矾寰�
+			byteInputStream.reset();
+			String statusLine = FileContentUtil.readLineAt(byteInputStream,annotationProperties.getStatusLineIndex());//鐘舵�佹敞閲�
+			byteInputStream.reset();
+
+			InputStream insAfterSetSendDir ;
+			if(isAnnotation(sendDirLine,getControlSystem(),annoDicts)){
+				insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
+			}else{
+				insAfterSetSendDir = FileContentUtil.insertLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
+			}
+
+			insAfterSetSendDir.reset();
+			//鍔犲叆鐘舵�佹敞閲婅
+			String statusAnnotation = generateAnnotation(annoData.getProgramStatus(),getControlSystem(),annoDicts);//娉ㄩ噴鍚庣殑鐘舵�佹枃鏈�
+			if(isAnnotation(statusLine,getControlSystem(),annoDicts)){
+				finishedStream = FileContentUtil.replaceAtLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
+			}else{
+				finishedStream = FileContentUtil.insertLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
+			}
+		}
+
+		return finishedStream;
+	}
+
+	@Override
+	public abstract void setControlSystem(String controlSystemDictVal) ;
+
+	@Override
+	public void setAnnotationProperties(AnnotationProperties annotationProperties) {
+		this.annotationProperties= annotationProperties;
+	}
+
+	public abstract String getControlSystem();
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java
new file mode 100644
index 0000000..0ed2f5d
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java
@@ -0,0 +1,23 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import lombok.Data;
+
+@Data
+public class AnnotationData {
+	/**
+	 * 涓嬪彂璺緞
+	 */
+	private String filename;
+	/**
+	 * 涓嬪彂璺緞
+	 */
+	private String sendPath;
+	/**
+	 * 绋嬪簭鐘舵��
+	 */
+	private String programStatus;
+	/**
+	 * 鍋忕鍗曞彿
+	 */
+	private String deviation;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java
new file mode 100644
index 0000000..9042c89
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java
@@ -0,0 +1,58 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.program.vo.ProgramAnnotation;
+import org.springblade.system.pojo.entity.DictBiz;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Optional;
+
+public interface AnnotationProcessor {
+	static final String DEFAULT_ANNOTATION_SETTING = "(,)";
+
+	default String generateAnnotation(String oriTest, String systemDictVal, List<DictBiz> annotationList) {
+		ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
+		return progAnnotation.addAnnotation(oriTest);
+	}
+	default boolean isAnnotation(String line,String systemDictVal,List<DictBiz> annotationList){
+		ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
+
+		line = StringUtils.trim(line);//鍘婚灏剧┖鏍�
+		return progAnnotation.isAnnotation(line);
+	}
+
+	default ProgramAnnotation getProgramAnnotationFormat(String systemDictVal,List<DictBiz> annoDictList){
+		String begin;
+		String end;
+
+		Optional<DictBiz> dictOpt = annoDictList.stream().filter(dict -> {return dict.getDictKey().equals(systemDictVal);}).findFirst();
+		String annotationSetting = DEFAULT_ANNOTATION_SETTING;
+		if(dictOpt.isPresent()) {
+			annotationSetting = dictOpt.get().getRemark();
+		}
+		String[] arr = StringUtils.split(annotationSetting,",");
+		if(arr.length == 2){
+			begin = arr[0];
+			end = arr[1];
+		}else if(arr.length == 1){
+			begin = arr[0];
+			end = "";
+		}else{
+			throw new ServiceException("娉ㄩ噴鏍煎紡閰嶇疆閿欒锛屽簲璇ヤ负1鍒�2娈碉紝涓棿鐢ㄩ�楀彿鍒嗛殧");
+		}
+
+		ProgramAnnotation programAnnotation = new ProgramAnnotation();
+		programAnnotation.setBegin(begin);
+		programAnnotation.setEnd(end);
+		return programAnnotation;
+	}
+	void setControlSystem(String controlSystemDictVal);
+	void setAnnotationProperties(AnnotationProperties annotationProperties);
+	String getControlSystem();
+	InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java
new file mode 100644
index 0000000..b162d0d
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java
@@ -0,0 +1,12 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import lombok.Data;
+
+@Data
+public class AnnotationProperties {
+	private String beanId;
+	private int sendPathLineIndex;
+	private int statusLineIndex;
+	private int deviationLineIndex;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java
new file mode 100644
index 0000000..1234ca2
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java
@@ -0,0 +1,33 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+@Component("defaultProcessor")
+public class DefaultProcessor extends AbstractProcessor{
+
+	@Autowired
+	private ProgramAnnotationService programAnnotationService;
+	private String controlSystem;
+	private AnnotationProperties annotationPropreties;
+
+
+	@Override
+	public void setControlSystem(String controlSystemDictVal) {
+		this.controlSystem = controlSystemDictVal;
+	}
+
+	@Override
+	public void setAnnotationProperties(AnnotationProperties annotationProperties) {
+		this.annotationPropreties= annotationProperties;
+	}
+
+	@Override
+	public String getControlSystem() {
+		return this.controlSystem;
+	}
+
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java
new file mode 100644
index 0000000..87467cb
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java
@@ -0,0 +1,54 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import com.qiniu.util.IOUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.utils.FileContentUtil;
+import org.springblade.system.pojo.entity.DictBiz;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.regex.Pattern;
+
+@Component("fanucProcessor")
+public class FanucProcessor  extends AbstractProcessor{
+	@Autowired
+	private ProgramAnnotationService programAnnotationService;
+	private String controlSystem;
+	//AnnotationProperties annotationProperties;
+	private Pattern PATTERN = Pattern.compile("^[oO]\\d{4}");
+	private final int O_LINE = 1;
+	@Override
+	public InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException {
+		//鍦∣0001 杩欑鏂囧瓧鍚庨潰澧炲姞鏂囦欢鍚嶏紙涓嶅甫鎵╁睍鍚嶏級
+		ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
+		String line = FileContentUtil.readLineAt(bais,O_LINE);
+		bais.reset();
+		boolean oMatched = PATTERN.matcher(line).matches();
+		InputStream ins1;
+		if(oMatched){
+			List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
+			String newline =  line + generateAnnotation(FilenameUtils.removeExtension(annoData.getFilename()),getControlSystem(),annoDicts);
+			ins1 = FileContentUtil.replaceAtLine(bais,O_LINE,newline);
+		}else{
+			ins1 = bais;
+		}
+		return super.setAnnotation(annoData, ins1);
+
+	}
+
+
+	@Override
+	public void setControlSystem(String controlSystemDictVal) {
+		this.controlSystem = controlSystemDictVal;
+	}
+
+	@Override
+	public String getControlSystem() {
+		return this.controlSystem;
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java
new file mode 100644
index 0000000..1255b3c
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Map;
+
+@Configuration
+@ConfigurationProperties(prefix = "program-annotation")
+@Data
+public class MachineAnnotationConfig {
+	private Map<String, AnnotationProperties> configMap;
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java
new file mode 100644
index 0000000..117de48
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java
@@ -0,0 +1,21 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import org.springblade.core.tool.utils.SpringUtil;
+
+/**
+ * 璐熻矗鍒囨崲鍚堥�傜殑娉ㄩ噴澶勭悊鍣�
+ */
+public class ProcessorHelper {
+
+	public static AnnotationProcessor getProcessor(String controlSystem,MachineAnnotationConfig config){
+		AnnotationProperties props = config.getConfigMap().get(controlSystem);
+		AnnotationProcessor processor;
+		if(props != null){
+			processor = SpringUtil.getBean(props.getBeanId());
+		}else{
+			processor = SpringUtil.getBean(DefaultProcessor.class);
+		}
+		processor.setAnnotationProperties(props);
+		return processor;
+	}
+}

--
Gitblit v1.9.3