From 083df8d788c95c009a94378e620684eb5de2bd21 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期六, 13 九月 2025 13:08:09 +0800
Subject: [PATCH] 注释问题修复

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java                    |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java    |    9 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java                           |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java                       |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java       |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java                     |   29 --
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailProperties.java                |   14 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java               |   22 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java     |   36 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationUtil.java       |   78 +++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java      |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailService.java                   |   36 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/MachineBackFileExcelVO.java                  |    4 
 blade-service/blade-mdm/pom.xml                                                                                       |   30 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java |    9 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java                                  |   32 +-
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/programannotation/AnnotationUtilTest.java   |   15 
 /dev/null                                                                                                             |   19 -
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java                                    |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java         |   18 +
 blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/service/InternalEmailServiceTest.java               |   14 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ParamConstants.java                        |   13 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java             |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java  |   36 ---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/InternalEmailNotifyTask.java                           |  127 ++++++++++++
 25 files changed, 426 insertions(+), 134 deletions(-)

diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml
index 0d51ae1..d9edd29 100644
--- a/blade-service/blade-mdm/pom.xml
+++ b/blade-service/blade-mdm/pom.xml
@@ -108,6 +108,36 @@
             <version>4.0.28</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxws</artifactId>
+            <version>4.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http</artifactId>
+            <version>4.1.3</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-xjc</artifactId>
+            <version>4.0.5</version>
+        </dependency>
+       <!-- <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-core</artifactId>
+            <version>2.3.0.1</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-impl</artifactId>
+            <version>4.0.5</version>
+            <scope>runtime</scope>
+        </dependency>-->
     </dependencies>
     <build>
         <plugins>
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ParamConstants.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ParamConstants.java
index ce6296b..a79a42d 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ParamConstants.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ParamConstants.java
@@ -33,4 +33,17 @@
 	 * 閲嶅娲惧伐澶╂暟楠岃瘉闂撮殧澶╂暟
 	 */
 	public static String TASK_EXPIRE_DAYS = "taskExpireDays";
+	/**
+	 * 閭欢閫氱煡寮�鍚爣蹇楋細1锛氬紑鍚紱0锛氬叧闂�
+	 */
+	public static String EMAIL_NOTIFY_FLAG = "emailNotifyFlag";
+
+	/**
+	 * 閭欢鎻愰啋鏍囧織 锛氬紑
+	 */
+	public static String EMAIL_NOTIFY_FLAG_ON = "1";
+	/**
+	 * 閭欢鎻愰啋鏍囧織 锛氬叧
+	 */
+	public static String EMAIL_NOTIFY_FLAG_OFF = "1";
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java
index dc9e8b1..7368ac1 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java
@@ -44,7 +44,7 @@
 public class RemindController {
 
 	@Autowired
-	NcProgramApprovedService ncProgramApprovedService;
+	private NcProgramApprovedService ncProgramApprovedService;
 	@Autowired
 	private FlowBusinessService businessService;
 	@Autowired
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/EmailService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/EmailService.java
deleted file mode 100644
index cd781f3..0000000
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/EmailService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.springblade.mdm.commons.service;
-
-import jakarta.mail.MessagingException;
-import jakarta.mail.internet.MimeMessage;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.io.FileSystemResource;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.MimeMessageHelper;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-
-@Service
-@Slf4j
-public class EmailService {
-
-}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailProperties.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailProperties.java
new file mode 100644
index 0000000..521e2e2
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailProperties.java
@@ -0,0 +1,14 @@
+package org.springblade.mdm.commons.service;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "mail-remind")
+@Data
+public class InternalEmailProperties {
+
+	private String senderAccount;
+	private String mailServiceAddr;
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailService.java
new file mode 100644
index 0000000..b20aaed
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/InternalEmailService.java
@@ -0,0 +1,36 @@
+package org.springblade.mdm.commons.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+@Service
+@Slf4j
+public class InternalEmailService {
+	@Autowired
+	private InternalEmailProperties internalEmailProperties;
+
+	public void send(String fromid,String toids, String ccids, String bccids, String subject, String content, String[] paths) {
+		try {
+
+			// 鍒涘缓鍔ㄦ�佸鎴风宸ュ巶
+			JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
+
+			// 鍒涘缓瀹㈡埛绔�
+			//Client client = dcf.createClient("http://localhost:8080/services/EmailService?wsdl");
+			Object[] result;
+			try (Client client = dcf.createClient(internalEmailProperties.getMailServiceAddr())) {
+				// 璋冪敤鏂规硶
+				result = client.invoke("sendInternalMail", fromid, toids, ccids, bccids, subject, content, null);
+
+				// 澶勭悊鍝嶅簲
+				if (result != null && result.length > 0) {
+					System.out.println("鍝嶅簲: " + result[0]);
+				}
+			}
+		}catch(Exception e) {
+			log.error("鍐呴儴閭欢鍙戦�佸け璐�",e);
+		}
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
index 4ba8b22..4bf3e0c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
@@ -20,9 +20,6 @@
 public class ParamService{
 	public static String NETWORK_TYPE= "networkType";
 
-
-
-
 	/**
 	 * 瀹℃壒鐢ㄦ埛瑙掕壊鍒悕鍙傛暟key锛岄�楀彿鍒嗛殧
 	 */
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
index c382b9f..818bd98 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -22,6 +22,9 @@
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.NcProgramApprovedService;
 import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.program.service.programannotation.AnnotationProperties;
+import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
+import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
 import org.springblade.mdm.utils.EntityUtil;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.pojo.entity.DictBiz;
@@ -45,9 +48,8 @@
 @Component("normalCureFinishDataHandler")
 public class NormalCureFinishDataHandler implements FinishDataHandler {
 	@Autowired
-	private NcProgramApprovedService approvedService;
-	@Autowired
-	private ApproveRecordService approveRecordService;
+	private MachineAnnotationConfig config;
+
 	@Autowired
 	private FlowProgramFileService flowProgramFileService;
 	@Autowired
@@ -209,8 +211,13 @@
 			byte[] bytes = IOUtils.toByteArray(ins);
 			ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(bytes);
 
-			InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,controlSystem,annoDicts);
-
+			//InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,controlSystem,annoDicts);
+			List<DictBiz> annoDictList = programAnnotationService.getAnnotionDictList();
+			AnnotationProperties annoProps = config.getConfigMap().get(controlSystem);
+			if(annoProps == null){
+				annoProps = AnnotationProperties.getDefault();
+			}
+			InputStream finishedStream =AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
 			try(finishedStream) {
 				finishedStream.reset();
 				BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
@@ -222,6 +229,7 @@
 		}
 	}
 
+
 	/**
 	 * 璁$畻鏈夋晥鏈�
 	 * @return
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
index 860ab08..580473d 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
@@ -36,7 +36,7 @@
 /**
  * 娴佺▼涓氬姟瀹炵幇绫�
  *
- * @author Chill
+ * @author yangys
  */
 @Service
 @AllArgsConstructor
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
index 38b5d53..a3a297f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
@@ -8,6 +8,7 @@
 import org.springblade.mdm.commons.service.ParamService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
 import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springblade.system.pojo.entity.DictBiz;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -185,7 +186,7 @@
 			}
 			bis.reset();
 			String statusLine = FileContentUtil.readLineAt(ins,ProgramAnnotationService.STATUS_LINE_INDEX);
-			if(programAnnotationService.isAnnotation(statusLine,controlSystem,annotatiionList)){
+			if(AnnotationUtil.isAnnotation(statusLine,controlSystem,annotatiionList)){
 				String progStatusTxt = programAnnotationService.removeAnnotation(controlSystem,statusLine,annotatiionList);
 				if(ProgramAnnotationService.SQ.equals(progStatusTxt)){
 					programStatus = MachineFile.PROGRAM_STATUS_TRY;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/MachineBackFileExcelVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/MachineBackFileExcelVO.java
index bf8aca7..6b5d7ea 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/MachineBackFileExcelVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/vo/MachineBackFileExcelVO.java
@@ -6,17 +6,17 @@
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.springblade.mdm.commons.vo.BaseVO;
 
 import java.util.Date;
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ColumnWidth(25)
 @HeadRowHeight(20)
 @ContentRowHeight(18)
-@Setter
-@Getter
 public class MachineBackFileExcelVO extends BaseVO {
 
 	@ExcelProperty("鏂囦欢鍚嶇О")
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 e34f27a..01f6c61 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
@@ -26,10 +26,7 @@
 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.service.programannotation.*;
 import org.springblade.mdm.program.vo.DncSendBackData;
 import org.springblade.mdm.program.vo.DncSendBackFile;
 import org.springblade.mdm.program.vo.ProgramAnnotation;
@@ -71,8 +68,6 @@
 	private final ParamService paramService;
 	private final MachineAnnotationConfig machineAnnotationConfig;
 
-	private final FanucProcessor fanucProcessor;
-	private final DefaultProcessor defaultProcessor;
 	/**
 	 * 鍋忕鍗曟枃浠舵湯灏剧殑妯″紡锛歅+鏁板瓧
 	 */
@@ -161,36 +156,30 @@
 					InputStream ins = zipFile.getInputStream(entry);
 					ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(ins));;
 					progData.setFileBackTime(DateUtil.fromInstant(entry.getLastModifiedTime().toInstant()));
-					//machineAnnotationConfig.getConfigMap().get(machine.getcon)
-					Pattern fanucPattern = Pattern.compile("^[oO]\\d{4}");
-					String testLine = FileContentUtil.readLineAt(bais,2);//TODO,fanuc杩欒鏄笅鍙戣矾寰勶紝鍏朵粬鏈哄櫒鏄姸鎬�
+
+					AnnotationProperties defAnnoProperties =AnnotationProperties.getDefault();
+					statusLine = FileContentUtil.readLineAt(bais,defAnnoProperties.getStatusLineIndex());//鐘舵�佹敞閲婅
 					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);//TODO 杩橀渶鏍规嵁鏈哄簥缁勶紙濡備綍鑾峰彇锛熸牴鎹笅鍙戣矾寰勮幏鍙栨満搴婏紝杩涜�岃幏鍙栵級锛�,processEdition
 					}else if(statusLine.contains("GH")){
-						//鍥哄寲
+						//TODO 鍥哄寲锛屾牴鏈笉闇�瑕佸洖浼狅紝搴旇鎻愮ず鎶ラ敊銆傛垨鑰呬笉杩涘叆鍒楄〃锛屾垨鍒楄〃涓笉鍙�夊垯鍏ュ簱
 						programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName);
 					}else if(statusLine.contains("PL")){
 						//鍋忕
 						programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName);
 					}else{
-						//鏌ヨ鏄惁杞﹀簥锛屾槸杞﹀簥鍙互鏀捐繃锛屾寜璇曞垏澶勭悊
+						//鏌ヨ鏄惁杞﹀簥/鐜板満缂栧埗锛屾槸杞﹀簥鍙互鏀捐繃锛屾寜璇曞垏澶勭悊锛�
+						//TODO 鐜板満缂栧埗鐨勭▼搴忥紝鎵撳寘鏃跺繀椤诲湪鏂囦欢涓鍔犱笅鍙戣矾寰勶紙鍔犲叆鍚庯級
 						programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);
 						if(programPackageNode!=null){
 							Machine machine = machineService.getByCode(programPackageNode.getMachineCode());
 							String chechuangVal = paramService.turninngValue();
 							if(StringUtils.equals(machine.getMachineSpec(),chechuangVal)){
 								//杞﹀簥
-								ProgramAnnotation pa = programAnnotationService.getProgramAnnotationFormat(machine.getControlSystem(),annotionDictList);
+								ProgramAnnotation pa = AnnotationUtil.getProgramAnnotationFormat(machine.getControlSystem(),annotionDictList);
 								statusLine = pa.addAnnotation(ProgramAnnotationService.SQ);
 							}
 						}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
index 3d715fd..fdb8d11 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
@@ -7,6 +7,7 @@
 import org.jetbrains.annotations.NotNull;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.R;
+import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
 import org.springblade.mdm.program.vo.ProgramAnnotation;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springblade.system.feign.IDictBizClient;
@@ -74,6 +75,7 @@
 	 * @param annotationList 娉ㄩ噴娉ㄩ噴瀛楀吀椤瑰垪琛�
 	 * @return
 	 */
+	/*
 	public boolean isAnnotation(String line,String systemDictVal,List<DictBiz> annotationList){
 		ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
 
@@ -86,7 +88,7 @@
 	public String generateAnnotation(String oriTest,String systemDictVal,List<DictBiz> annotationList) {
 		ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
 		return progAnnotation.addAnnotation(oriTest);
-	}
+	}*/
 
 	/**
 	 * 鎻愬彇娉ㄩ噴涓殑鏂囨湰
@@ -94,13 +96,13 @@
 	 * @param text 娓呴櫎娉ㄩ噴鏍囪
 	 * @return 娓呴櫎鍚庣殑鏂囨湰
 	 */
+
 	public String removeAnnotation(String systemDictVal,String text){
 		List<DictBiz> annoDicts = getAnnotionDictList();
 		return removeAnnotation(systemDictVal,text,annoDicts);
 	}
-
 	public String removeAnnotation(String systemDictVal,String text,List<DictBiz> annotatiionList){
-		ProgramAnnotation panno = this.getProgramAnnotationFormat(systemDictVal,annotatiionList);
+		ProgramAnnotation panno = AnnotationUtil.getProgramAnnotationFormat(systemDictVal,annotatiionList);
 		return panno.cleanAnnotation(text);
 	}
 		/**
@@ -111,9 +113,10 @@
 		 * @return 鍔犲ソ娉ㄩ噴鐨�
 		 * @throws IOException
 		 */
+		/*
 	public InputStream setGHAnnotation(InputStream inputStream, String systemDictVal,List<DictBiz> annoDictList) throws IOException {
 		return setAnnotationAndGetInputStream(inputStream, systemDictVal, annoDictList, GH, STATUS_LINE_INDEX);
-	}
+	}*/
 
 	/**
 	 * 璁剧疆鍋忕鍗曟敞閲�
@@ -123,10 +126,12 @@
 	 * @return 鍔犲ソ娉ㄩ噴鐨勮緭鍏ユ祦
 	 * @throws IOException 璁块棶娴佸彲鑳芥姏鍑哄紓甯�
 	 */
+	/*
 	public InputStream setPldAnnotation(String deviation,InputStream inputStream,String systemDictVal,List<DictBiz> annoDictList) throws IOException {
 		return setAnnotationAndGetInputStream(inputStream, systemDictVal, annoDictList, deviation, STATUS_DEVIATION_INDEX);
 	}
-
+	 */
+	/*
 	@NotNull
 	private InputStream setAnnotationAndGetInputStream(InputStream inputStream, String systemDictVal, List<DictBiz> annoDictList, String text, int lineIndex) throws IOException {
 		InputStream finishedStream;
@@ -149,6 +154,7 @@
 		return finishedStream;
 	}
 
+	*/
 
 	/**
 	 * 涓鸿緭鍏ユ祦璁剧疆鍙戦�佺洰褰�(绗簩琛�)鍜岀姸鎬侊紙绗笁琛岋級
@@ -159,6 +165,7 @@
 	 * @return 鍔犲ソ鍙戦�佽矾寰勫拰鐘舵�佹枃鏈殑杈撳叆娴�
 	 * @throws IOException
 	 */
+	/*
 	public InputStream setSendDirAndStatusAnnotation(String sendPath,String statusText,InputStream inputStream, String systemDictVal) throws IOException {
 		List<DictBiz> annoDicts = getAnnotionDictList();
 
@@ -192,7 +199,7 @@
 		}
 
 		return finishedStream;
-	}
+	}*/
 
 	/**
 	 * 瑙f瀽鍑烘満搴婄▼搴忔敞閲婄殑鏍煎紡
@@ -200,6 +207,7 @@
 	 * @param annoDictList 閰嶇疆鐨勬敞閲婂瓧鍏告暟鎹�
 	 * @return
 	 */
+	/*
 	ProgramAnnotation getProgramAnnotationFormat(String systemDictVal,List<DictBiz> annoDictList){
 		String begin;
 		String end;
@@ -224,7 +232,7 @@
 		programAnnotation.setBegin(begin);
 		programAnnotation.setEnd(end);
 		return programAnnotation;
-	}
+	}*/
 }
 
 
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
index 63abded..7e6ca99 100644
--- 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
@@ -5,7 +5,6 @@
 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;
@@ -29,7 +28,7 @@
 			ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
 
 			//1鍔犲叆鍙戦�佽矾寰勭殑娉ㄩ噴
-			String sendPathAnnotation = generateAnnotation(annoData.getSendPath(),getControlSystem(),annoDicts);//鍔犱簡娉ㄩ噴涔嬪悗鐨勬枃鏈�
+			String sendPathAnnotation = AnnotationUtil.generateAnnotation(annoData.getSendPath(),getControlSystem(),annoDicts);//鍔犱簡娉ㄩ噴涔嬪悗鐨勬枃鏈�
 
 			String sendDirLine = FileContentUtil.readLineAt(byteInputStream,annotationProperties.getSendPathLineIndex());//绗�2琛屾槸鍙戦�佽矾寰�
 			byteInputStream.reset();
@@ -37,7 +36,7 @@
 			byteInputStream.reset();
 
 			InputStream insAfterSetSendDir ;
-			if(isAnnotation(sendDirLine,getControlSystem(),annoDicts)){
+			if(AnnotationUtil.isAnnotation(sendDirLine,getControlSystem(),annoDicts)){
 				insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
 			}else{
 				insAfterSetSendDir = FileContentUtil.insertLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
@@ -45,8 +44,8 @@
 
 			insAfterSetSendDir.reset();
 			//鍔犲叆鐘舵�佹敞閲婅
-			String statusAnnotation = generateAnnotation(annoData.getProgramStatus(),getControlSystem(),annoDicts);//娉ㄩ噴鍚庣殑鐘舵�佹枃鏈�
-			if(isAnnotation(statusLine,getControlSystem(),annoDicts)){
+			String statusAnnotation = AnnotationUtil.generateAnnotation(annoData.getProgramStatus(),getControlSystem(),annoDicts);//娉ㄩ噴鍚庣殑鐘舵�佹枃鏈�
+			if(AnnotationUtil.isAnnotation(statusLine,getControlSystem(),annoDicts)){
 				finishedStream = FileContentUtil.replaceAtLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
 			}else{
 				finishedStream = FileContentUtil.insertLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
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
index 9042c89..2d5bf01 100644
--- 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
@@ -12,44 +12,8 @@
 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();
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
index b162d0d..f576b20 100644
--- 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
@@ -5,8 +5,17 @@
 @Data
 public class AnnotationProperties {
 	private String beanId;
+	private int programNameLineIndex;
 	private int sendPathLineIndex;
 	private int statusLineIndex;
 	private int deviationLineIndex;
 
+	public static AnnotationProperties getDefault(){
+		AnnotationProperties def = new AnnotationProperties();
+		def.setProgramNameLineIndex(1);
+		def.setSendPathLineIndex(2);
+		def.setStatusLineIndex(3);
+		def.setDeviationLineIndex(4);
+		return def;
+	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationUtil.java
new file mode 100644
index 0000000..3dd859a
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationUtil.java
@@ -0,0 +1,78 @@
+package org.springblade.mdm.program.service.programannotation;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.mdm.program.vo.ProgramAnnotation;
+import org.springblade.mdm.utils.FileContentUtil;
+import org.springblade.system.pojo.entity.DictBiz;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Optional;
+
+public class AnnotationUtil {
+	static String DEFAULT_ANNOTATION_SETTING = "(,)";
+
+	public static 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;
+	}
+
+	public static boolean isAnnotation(String line,String systemDictVal,List<DictBiz> annotationList){
+		ProgramAnnotation progAnnotation = AnnotationUtil.getProgramAnnotationFormat(systemDictVal,annotationList);
+
+		line = StringUtils.trim(line);//鍘婚灏剧┖鏍�
+		return progAnnotation.isAnnotation(line);
+	}
+
+	public static String generateAnnotation(String oriTest, String systemDictVal, List<DictBiz> annotationList) {
+		ProgramAnnotation progAnnotation = AnnotationUtil.getProgramAnnotationFormat(systemDictVal,annotationList);
+		return progAnnotation.addAnnotation(oriTest);
+	}
+
+	public static InputStream setAnnotationAndGetInputStream(InputStream inputStream, String text, int lineIndex, String systemDictVal, List<DictBiz> annoDictList) throws IOException {
+		InputStream finishedStream;
+		try(inputStream){
+			ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
+
+			String annoTxt = generateAnnotation(text,systemDictVal,annoDictList);//鍔犱簡娉ㄩ噴涔嬪悗鐨勬枃鏈�
+
+			String lineText = FileContentUtil.readLineAt(byteInputStream, lineIndex);
+			byteInputStream.reset();
+
+			if(isAnnotation(lineText,systemDictVal,annoDictList)){
+				finishedStream = FileContentUtil.replaceAtLine(byteInputStream, lineIndex,annoTxt);
+			}else{
+				finishedStream = FileContentUtil.insertLine(byteInputStream, lineIndex,annoTxt);
+			}
+			finishedStream.reset();
+		}
+
+		return finishedStream;
+	}
+
+}
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
index 1234ca2..eb2908a 100644
--- 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
@@ -1,8 +1,17 @@
 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;
 
 
 @Component("defaultProcessor")
@@ -11,17 +20,32 @@
 	@Autowired
 	private ProgramAnnotationService programAnnotationService;
 	private String controlSystem;
-	private AnnotationProperties annotationPropreties;
 
+
+	@Override
+	public InputStream setAnnotation(AnnotationData annoData, InputStream inputStream) throws IOException {
+		List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
+		ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
+
+		String line = FileContentUtil.readLineAt(bais, annotationProperties.getProgramNameLineIndex());
+		bais.reset();
+		boolean isAnnotation = AnnotationUtil.isAnnotation(line,controlSystem,annoDicts);
+		InputStream insAfter;
+		//鍔犲叆绋嬪簭鍚嶆敞閲婅
+		String proNameLine =  AnnotationUtil.generateAnnotation(FilenameUtils.removeExtension(annoData.getFilename()),getControlSystem(),annoDicts);
+		if(isAnnotation){
+			insAfter = FileContentUtil.replaceAtLine(bais, annotationProperties.getProgramNameLineIndex(),proNameLine);
+		}else{
+			insAfter = FileContentUtil.insertLine(bais, annotationProperties.getProgramNameLineIndex(),proNameLine);
+		}
+
+		return super.setAnnotation(annoData, insAfter);
+
+	}
 
 	@Override
 	public void setControlSystem(String controlSystemDictVal) {
 		this.controlSystem = controlSystemDictVal;
-	}
-
-	@Override
-	public void setAnnotationProperties(AnnotationProperties annotationProperties) {
-		this.annotationPropreties= annotationProperties;
 	}
 
 	@Override
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
index 87467cb..7f1d4c8 100644
--- 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
@@ -19,7 +19,6 @@
 	@Autowired
 	private ProgramAnnotationService programAnnotationService;
 	private String controlSystem;
-	//AnnotationProperties annotationProperties;
 	private Pattern PATTERN = Pattern.compile("^[oO]\\d{4}");
 	private final int O_LINE = 1;
 	@Override
@@ -32,7 +31,7 @@
 		InputStream ins1;
 		if(oMatched){
 			List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
-			String newline =  line + generateAnnotation(FilenameUtils.removeExtension(annoData.getFilename()),getControlSystem(),annoDicts);
+			String newline =  line + AnnotationUtil.generateAnnotation(FilenameUtils.removeExtension(annoData.getFilename()),getControlSystem(),annoDicts);
 			ins1 = FileContentUtil.replaceAtLine(bais,O_LINE,newline);
 		}else{
 			ins1 = bais;
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
index 117de48..a116518 100644
--- 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
@@ -12,10 +12,12 @@
 		AnnotationProcessor processor;
 		if(props != null){
 			processor = SpringUtil.getBean(props.getBeanId());
+			processor.setAnnotationProperties(props);
 		}else{
 			processor = SpringUtil.getBean(DefaultProcessor.class);
+			processor.setAnnotationProperties(AnnotationProperties.getDefault());
 		}
-		processor.setAnnotationProperties(props);
+
 		return processor;
 	}
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
index 8e1535f..1768964 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
@@ -11,7 +11,7 @@
 
 @Setter
 @Getter
-@EqualsAndHashCode
+@EqualsAndHashCode(callSuper = false)
 public class NcNodeVO extends BaseVO {
 	@Schema(description = "鑺傜偣鍚嶇О")
 	private String name;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/InternalEmailNotifyTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/InternalEmailNotifyTask.java
new file mode 100644
index 0000000..f21e5cf
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/InternalEmailNotifyTask.java
@@ -0,0 +1,127 @@
+package org.springblade.mdm.task;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.TaskService;
+import org.flowable.task.api.TaskQuery;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.basesetting.producedivision.entity.MdmUser;
+import org.springblade.mdm.basesetting.producedivision.service.MdmUserService;
+import org.springblade.mdm.commons.contants.ParamConstants;
+import org.springblade.mdm.commons.service.InternalEmailProperties;
+import org.springblade.mdm.commons.service.InternalEmailService;
+import org.springblade.mdm.commons.service.ParamService;
+import org.springblade.mdm.program.service.NcProgramApprovedService;
+import org.springblade.mdm.program.vo.NcProgramExportDncPageVO;
+import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 鍐呴儴閭欢浠诲姟鎻愰啋瀹氭椂浠诲姟
+ */
+@Slf4j
+@Component
+@EnableScheduling
+public class InternalEmailNotifyTask {
+	@Autowired
+	private MdmUserService mdmUserService;
+	@Autowired
+	private ParamService paramService;
+	@Autowired
+	private TaskService taskService;
+	@Autowired
+	private InternalEmailService internalEmailService;
+	@Autowired
+	private NcProgramApprovedService ncProgramApprovedService;
+	@Autowired
+	private InternalEmailProperties internalEmailProperties;
+	//@Value("${mail-remind.sender-account:xxx}")
+	//private String senderAccount;
+
+	@Scheduled(cron = "${task.cron.innernal_email_notify:0 0 9 * * ?}")
+	public void execute() {
+		String notifyFlag = paramService.getParamValue(ParamConstants.EMAIL_NOTIFY_FLAG,ParamConstants.EMAIL_NOTIFY_FLAG_OFF);
+
+		if("1".equals(notifyFlag)){
+			//鐘舵�佷负寮�鍚紝鎵ц閭欢閫氱煡
+			queryAllUserTodo();
+		}
+
+	}
+
+	void queryAllUserTodo(){
+		List<MdmUser> allUsers = mdmUserService.list();
+
+		for(MdmUser user : allUsers){
+			queryAndSendNotify(user);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鐢ㄦ埛todo骞跺彂閫侀�氱煡閭欢
+	 * @param user
+	 */
+	private void queryAndSendNotify(MdmUser user) {
+		long flowTodoCount = queryFlowTodo(user.getId());
+		long expTodoCount = queryExportTodo(user.getId());
+		if(flowTodoCount + expTodoCount > 0){
+			sendRemindEmail(flowTodoCount,expTodoCount,user.getAccount());
+		}
+
+	}
+
+	/**
+	 * 鍙戦�佹彁閱掗偖浠�
+	 * @param flowTodoCount
+	 * @param expTodoCount
+	 * @param userAccount
+	 */
+	void sendRemindEmail(long flowTodoCount,long expTodoCount,String userAccount){
+		String content = buildMailConent(flowTodoCount,expTodoCount);
+		internalEmailService.send(this.internalEmailProperties.getSenderAccount(),userAccount,null,null,"MDM绋嬪簭绠$悊浠诲姟鎻愰啋",content,null);
+	}
+	String buildMailConent(long flowTodoCount,long expTodoCount){
+		String content= String.format("鎮ㄥ叡鏈�%s鏉′换鍔″緟澶勭悊",(flowTodoCount+expTodoCount));
+		if(flowTodoCount>0){
+			content += "锛�"+flowTodoCount+"鏉′负寰呭鎵规祦绋�";
+		}
+		if(flowTodoCount>0){
+			content += "锛�"+expTodoCount+"鏉′负寰呭鍑哄伐鎺х綉绋嬪簭";
+		}
+
+		return content+"銆�";
+	}
+
+	private long queryFlowTodo(long userId){
+		String userIdStr = "" + userId;
+
+		TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userIdStr).active().includeProcessVariables();
+
+		return todoQuery.count();
+	}
+
+	private long queryExportTodo(long userId){
+
+		NcProgramExportDncQueryVO query = new NcProgramExportDncQueryVO();
+		query.setCurrent(1);
+		query.setSize(1);
+
+		List<String> userRoleAliasList = Func.toStrList(",", AuthUtil.getUserRole());//瑙掕壊鍒悕锛屽涓鑹查�楀彿鍒嗛殧
+		String managerRole = paramService.getProgramManagerRoleAlias();
+		if(!userRoleAliasList.contains(managerRole) && !AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
+			//闈炴暟鎺х鐞嗗憳瑙掕壊銆佺鐞嗗憳锛岄檺鍒舵湭鍙兘瀵煎嚭鑷繁鐨勭▼搴�
+			query.setUserId(userId);
+		}
+
+		IPage<NcProgramExportDncPageVO> pages = ncProgramApprovedService.exportDncPageQuery(query);
+		return pages.getTotal();
+
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
index 2b415e4..f76b704 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
@@ -3,17 +3,22 @@
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.mail.MessagingException;
+import jakarta.xml.soap.SOAPException;
+import jakarta.xml.ws.WebServiceContext;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
+import org.apache.neethi.AssertionBuilderFactory;
+import org.apache.ws.commons.schema.XmlSchemaSerializer;
 import org.springblade.core.tool.api.R;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
-import org.springblade.mdm.commons.service.EmailService;
+import org.springblade.mdm.commons.service.InternalEmailService;
 import org.springblade.mdm.flow.service.WIthdrawService;
 import org.springblade.mdm.machinefile.entity.MachineFile;
 import org.springblade.mdm.machinefile.service.MachineFileScanService;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
 import org.springblade.mdm.program.service.ProgramAnnotationService;
+import org.springblade.mdm.task.InternalEmailNotifyTask;
 import org.springblade.mdm.task.MachineFileScanTask;
 import org.springblade.mdm.utils.FileContentUtil;
 import org.springblade.system.feign.IDictBizClient;
@@ -23,6 +28,7 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.wsdl.WSDLException;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -44,11 +50,13 @@
 	@Autowired
 	private IDictBizClient bizDictClient;
 	@Autowired
-	private EmailService mailService;
+	private InternalEmailService mailService;
 	@Autowired
 	private MachineFileScanService machineFileScanService;
 	@Autowired
 	private WIthdrawService withdrawService;
+	@Autowired
+	private InternalEmailNotifyTask notifyTask;
 	/**
 	 * 鏂板
 	 */
@@ -88,21 +96,6 @@
 		return R.success();
 	}
 
-	@GetMapping("/repalce-anno")
-	@Operation(summary = "鏇挎崲娉ㄩ噴", description = "test鎵弿")
-	public R<List<String>> repalceAnno() throws IOException {
-		InputStream res;
-		try(FileInputStream fis = new FileInputStream("d:/b.txt");) {
-			res = programAnnotationService.setSendDirAndStatusAnnotation("D:/mysend", "PL", fis,"FANUC");
-		}
-		List<String> lines = null;
-		if(res!=null) {
-			try(res) {
-				lines = IOUtils.readLines(res, "utf-8");
-			}
-		}
-		return R.data(lines);
-	}
 
 	@GetMapping("/dict-biz")
 	@Operation(summary = "biz", description = "test鎵弿")
@@ -129,4 +122,9 @@
 		machineFileScanService.scanMachineFile();
 	}
 
+	@GetMapping("/notify")
+	public void emailNotify(){
+		SOAPException s;
+		notifyTask.execute();
+	}
 }
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/service/InternalEmailServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/service/InternalEmailServiceTest.java
new file mode 100644
index 0000000..155578b
--- /dev/null
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/service/InternalEmailServiceTest.java
@@ -0,0 +1,14 @@
+package org.springblade.mdm.commons.service;
+
+import org.junit.jupiter.api.Test;
+
+public class InternalEmailServiceTest {
+
+	@Test
+	public void testSend(){
+		InternalEmailService service = new InternalEmailService();
+
+		service.send("from","to","cc","bcc","閭欢鎻愰啋","鎮ㄦ湁閭f潯浠诲姟瑕佸鐞�",new String[]{"Path1"});
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/ProgramAnnotationServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/programannotation/AnnotationUtilTest.java
similarity index 63%
rename from blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/ProgramAnnotationServiceTest.java
rename to blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/programannotation/AnnotationUtilTest.java
index 44b3136..f1cc495 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/ProgramAnnotationServiceTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/programannotation/AnnotationUtilTest.java
@@ -1,13 +1,14 @@
-package org.springblade.mdm.program.service;
+package org.springblade.mdm.program.service.programannotation;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.springblade.mdm.program.service.ProgramAnnotationService;
 import org.springblade.system.pojo.entity.DictBiz;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class ProgramAnnotationServiceTest {
+public class AnnotationUtilTest {
 
 	@Test
 	public void testIsAnnotation(){
@@ -23,9 +24,9 @@
 		xmz.setRemark("*-,");
 
 		List<DictBiz> dictList = Arrays.asList(fanucDict, xmz);
-		Assertions.assertTrue(s.isAnnotation("(abc)","FANUC", dictList));
-		Assertions.assertFalse(s.isAnnotation("*-","FANUC",dictList));
-		Assertions.assertTrue(s.isAnnotation("*-","XIMENZI", dictList));
+		Assertions.assertTrue(AnnotationUtil.isAnnotation("(abc)","FANUC", dictList));
+		Assertions.assertFalse(AnnotationUtil.isAnnotation("*-","FANUC",dictList));
+		Assertions.assertTrue(AnnotationUtil.isAnnotation("*-","XIMENZI", dictList));
 	}
 
 	@Test
@@ -42,8 +43,8 @@
 		xmz.setRemark("*-,");
 		List<DictBiz> dictList = Arrays.asList(fanucDict, xmz);
 
-		Assertions.assertEquals("(A)",s.generateAnnotation("A","FANUC",dictList));
+		Assertions.assertEquals("(A)",AnnotationUtil.generateAnnotation("A","FANUC",dictList));
 
-		Assertions.assertEquals("*-A",s.generateAnnotation("A","XIMENZI",dictList));
+		Assertions.assertEquals("*-A",AnnotationUtil.generateAnnotation("A","XIMENZI",dictList));
 	}
 }

--
Gitblit v1.9.3