From 295bf6f10ad0b668d2dbaa4525a15d6d52807ef1 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期三, 20 八月 2025 14:24:42 +0800
Subject: [PATCH] 导入工控网,附件改名

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java                     |    9 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java             |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml           |    3 
 blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml                               |   23 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/EmailService.java                    |   63 ++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java       |  116 -----------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/FinishDataHandler.java        |   15 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameCheckUtil.java                  |    5 
 blade-service/blade-mdm/pom.xml                                                                                |    8 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java  |   56 ++---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DataHandlerHelper.java        |   27 ++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java                           |   12 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java |   23 +-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java                            |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java              |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java                  |    8 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java                   |    5 
 blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml                                   |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/TempFinishDataHandler.java    |  101 ++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DispatchFinishListener.java   |   56 ++++
 20 files changed, 363 insertions(+), 179 deletions(-)

diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml
index 4854ff9..8243c3a 100644
--- a/blade-service/blade-mdm/pom.xml
+++ b/blade-service/blade-mdm/pom.xml
@@ -109,10 +109,10 @@
             <artifactId>groovy-jsr223</artifactId>
             <version>4.0.28</version>
         </dependency>
-        <!--<dependency>
-            <groupId>org.springblade</groupId>
-            <artifactId>blade-starter-transaction</artifactId>
-        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
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
new file mode 100644
index 0000000..174afa2
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/EmailService.java
@@ -0,0 +1,63 @@
+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 {
+	@Autowired
+	private JavaMailSender mailSender;
+
+	public void sendSimpleEmail(String to, String subject, String text) {
+		SimpleMailMessage message = new SimpleMailMessage();
+		message.setTo(to);
+		message.setSubject(subject);
+		message.setText(text);
+		message.setFrom("zhangxiaoxu@qianwen.ltd");
+
+		mailSender.send(message);
+		log.info("Simple email sent to: {}", to);
+	}
+
+	public void sendHtmlEmail(String to, String subject, String htmlContent)
+		throws MessagingException {
+		MimeMessage message = mailSender.createMimeMessage();
+		MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
+
+		helper.setTo(to);
+		helper.setSubject(subject);
+		helper.setText(htmlContent, true); // true 琛ㄧず HTML 鍐呭
+		helper.setFrom("zhangxiaoxu@qianwen.ltd");
+
+		mailSender.send(message);
+		log.info("HTML email sent to: {}", to);
+	}
+
+	public void sendEmailWithAttachment(String to, String subject, String text,
+										File attachment) throws MessagingException {
+		MimeMessage message = mailSender.createMimeMessage();
+		MimeMessageHelper helper = new MimeMessageHelper(message, true);
+
+		helper.setTo(to);
+		helper.setSubject(subject);
+		helper.setText(text);
+		helper.setFrom("noreply@example.com");
+
+		// 娣诲姞闄勪欢
+		FileSystemResource file = new FileSystemResource(attachment);
+		helper.addAttachment(attachment.getName(), file);
+
+		mailSender.send(message);
+		log.info("Email with attachment sent to: {}", to);
+	}
+}
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 d42f854..26847e2 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
@@ -131,4 +131,13 @@
 	 * 娴佺▼鍙橀噺涓殑寮傚父鏍囧織锛�="1"涓哄紓甯告祦绋�
 	 */
 	public static final String EXCEPTION = "exception";
+	/**
+	 * 缂栫▼鍛樺鍚�
+	 */
+	public static final String PROGRAMMER_NAME = "programmerName";
+
+	/**
+	 * 鏄惁涓存椂娴佺▼锛屼复鏃舵祦绋嬩笉妫�鏌ョ▼搴忔枃浠跺悕鍚堟硶鎬э紝涓嶇敓鎴愪骇鍝佺粨鏋勬爲
+	 */
+	public static final String IS_TEMP_FLOW = "isTempFlow";
 }
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 c059ac3..4aa863c 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
@@ -51,10 +51,13 @@
 	@Transactional
 	public String start(TaskAssignVO startVO){
 		Map<String, Object> vars = new HashMap<>();
-		//this.putDefaultAssignees(vars,startVO.getDrawingNo());
+
 		ProduceDivision div = flowCommonService.putDefaultAssignees(vars,startVO.getDrawingNo(),null);
 		vars.put(FlowContants.ASSIGNEE,div.getTeamLeaderId());//绗竴涓敤鎴风粍闀�
 		vars.put(FlowContants.TITLE,startVO.getTitle());
+
+		//涓存椂娴佺▼鏍囧織锛屾槑纭寚瀹歒锛屽睘浜庝复鏃舵祦绋�
+		vars.put(FlowContants.IS_TEMP_FLOW,FlowContants.Y.equals(startVO.getIsTempFlow())?FlowContants.Y:FlowContants.N);
 		//鏈哄簥缂栧彿
 		vars.put(FlowContants.MACHINE_CODE,startVO.getMachineCode());
 		String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(startVO.getMachineCode());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DataHandlerHelper.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DataHandlerHelper.java
new file mode 100644
index 0000000..f5d8473
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DataHandlerHelper.java
@@ -0,0 +1,27 @@
+package org.springblade.mdm.flow.excution.dispatch;
+
+import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.flow.service.FlowProgramProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DataHandlerHelper {
+	@Autowired
+	private NormalFinishDataHandler normalFinishDataHandler;
+	@Autowired
+	private TempFinishDataHandler tempFinishDataHandler;
+
+	/**
+	 * 鏍规嵁娴佺▼灞炴�э紝鑾峰彇鏁版嵁澶勭悊鍣�
+	 * @param props
+	 * @return
+	 */
+	public FinishDataHandler getDataHandler(FlowProgramProperties props){
+		if(FlowContants.Y.equals(props.getIsTempFlow())){
+			return normalFinishDataHandler;
+		}else {
+			return normalFinishDataHandler;
+		}
+	}
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DispatchFinishListener.java
similarity index 72%
copy from blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java
copy to blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DispatchFinishListener.java
index 52efbbf..bf21bce 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/DispatchFinishListener.java
@@ -1,9 +1,8 @@
-package org.springblade.mdm.flow.excution;
+package org.springblade.mdm.flow.excution.dispatch;
 
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.delegate.DelegateExecution;
-import org.flowable.engine.history.HistoricProcessInstance;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.ApproveRecord;
@@ -44,6 +43,9 @@
 	private NcNodeService ncNodeService;
 	@Autowired
 	private NcNodeAutoCreateService ncNodeAutoCreateService;
+
+	@Autowired
+	private DataHandlerHelper dataHandlerHelper;
 	/**
 	 * 鍦ㄦ祦绋嬬粨鏉熸椂鑷姩璋冪敤,锛堥厤缃湪瀹℃壒缁撴潫浜嬩欢鐨別xecutelistener涓簡锛�
 	 * @param execution 鎵ц瀵硅薄
@@ -54,15 +56,49 @@
 		log.info("浜嬩欢鍚嶇О{}锛宨nstid={}" , execution.getEventName(),instId);
 
 		FlowProgramProperties props = flowCommonService.getProgramProperties(instId);
+		FinishDataHandler dataHandler = dataHandlerHelper.getDataHandler(props);
 
-		createProgramNodes(props);
-
+		dataHandler.handleData(props);
+		/*
 		String programName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
-		NcNode packageNode = ncNodeService.getProgramPackageByName(programName);
+		if(FlowContants.N.equals(props.getIsTempFlow())) {
+			createProgramNodes(props);
+			//TODO 鍋忕鍗曪紝鍜屽凡缁忓浐鍖栫殑绋嬪簭锛屾病鏈夊鐞�
 
-		addApproveTable(packageNode,props);
+			NcNode packageNode = ncNodeService.getProgramPackageByName(programName);
 
-		updateApproveRecordNodeId(instId,packageNode.getId());
+			addApproveTable(packageNode,props);
+			updateApproveRecordNodeId(instId, packageNode.getId());
+		}else{
+			//涓存椂娴佺▼锛屼笉澶勭悊鏍戯紝鍙鐞嗘枃浠�
+			NcNode tempPkgNode = new NcNode();
+			tempPkgNode.setNodeType(NcNode.TYPE_PROGRAM_PACKAGE);
+			tempPkgNode.setIsLastEdition(0);
+			tempPkgNode.setProcessNo(props.getProcessNo());
+			tempPkgNode.setMachineCode(props.getMachineCode());
+			tempPkgNode.setProcessName(props.getProcessName());
+			tempPkgNode.setProcessEdition(props.getProcessEdition());
+			tempPkgNode.setName(programName);
+			tempPkgNode.setParentIds("0,4");
+			tempPkgNode.setIsLocked(0);
+			tempPkgNode.setCraftEdition(props.getCraftEdition());
+			tempPkgNode.setDrawingNo(props.getDrawingNo());
+			ncNodeService.save(tempPkgNode);
+
+			List<FlowProgramFile> newFlowFileList = flowProgramFileService.listByProcessInstanceId(props.getProcessInstanceId());
+			for(FlowProgramFile newFlowFile : newFlowFileList) {
+				NcNode tempProgramNode = new NcNode();
+				tempProgramNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
+				tempProgramNode.setName(newFlowFile.getName());
+				BeanUtils.copyProperties(tempPkgNode,tempProgramNode);
+				tempProgramNode.setParentId(tempPkgNode.getId());
+				tempProgramNode.setParentIds(tempPkgNode.getParentIds()+","+tempPkgNode.getId());
+				tempProgramNode.setProcessInstanceId(props.getProcessInstanceId());
+				tempProgramNode.setFlowProgramFileId(newFlowFile.getId());
+			}
+		}
+
+		*/
 
 		log.info("娴佺▼宸插畬鎴恑n DispatchFinishListener");
 	}
@@ -71,6 +107,7 @@
 	 * 鑷姩鍒涘缓绋嬪簭鑺傜偣
 	 * @param progProperties 娴佺▼灞炴��
 	 */
+	/*
 	void createProgramNodes(FlowProgramProperties progProperties){
 		if(!FlowContants.Y.equals(progProperties.getHasCuredProgram())) {
 			//璇曞垏鎴栬�呭亸绂�
@@ -114,12 +151,13 @@
 			}
 		}
 	}
-
+	*/
 	/**
 	 * 淇濆瓨瀹℃壒瀹屾垚鐨勮褰�
 	 * @param packageNode
 	 * @param props
 	 */
+	/*
 	void addApproveTable(NcNode packageNode,FlowProgramProperties props){
 		NcProgramApproved approved = new NcProgramApproved();
 
@@ -138,4 +176,6 @@
 			.eq(ApproveRecord::getProcessInstanceId, processInstanceId)
 			.set(ApproveRecord::getNcNodeId,nodeId).update();
 	}
+
+	 */
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/FinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/FinishDataHandler.java
new file mode 100644
index 0000000..506c253
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/FinishDataHandler.java
@@ -0,0 +1,15 @@
+package org.springblade.mdm.flow.excution.dispatch;
+
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springblade.mdm.flow.service.FlowProgramProperties;
+
+/**
+ * 鐣欏瓨缁欑粨鏉熷鐞嗙粨鏋�
+ */
+public interface FinishDataHandler {
+	/**
+	 * 澶勭悊浜嗘暟鎹�
+	 * @param props
+	 */
+	public void handleData(FlowProgramProperties props);
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
similarity index 73%
rename from blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java
rename to blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
index 52efbbf..9f14712 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -1,15 +1,11 @@
-package org.springblade.mdm.flow.excution;
+package org.springblade.mdm.flow.excution.dispatch;
 
 import lombok.extern.slf4j.Slf4j;
-import org.flowable.engine.RuntimeService;
-import org.flowable.engine.delegate.DelegateExecution;
-import org.flowable.engine.history.HistoricProcessInstance;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.ApproveRecord;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.service.ApproveRecordService;
-import org.springblade.mdm.flow.service.FlowCommonService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.FlowProgramProperties;
 import org.springblade.mdm.program.entity.NcNode;
@@ -25,13 +21,11 @@
 import java.util.List;
 
 /**
- * 娲惧伐瀹℃壒閫氳繃鎵ц鐨勪簨浠讹紝鍔熻兘锛氭彃鍏ュ鎵硅〃鏁版嵁
+ * 鏅�氭淳宸ュ畬鎴愭暟鎹鐞嗗櫒锛屽姛鑳斤細鎻掑叆瀹℃壒琛ㄦ暟鎹紝DispatchFinishListener璋冪敤
  */
 @Slf4j
-@Component("dispatchFinishListener")
-public class DispatchFinishListener {
-	@Autowired
-	private RuntimeService runtimeService;
+@Component("normalDispatchFinishDataHandler")
+public class NormalFinishDataHandler implements FinishDataHandler{
 	@Autowired
 	private NcProgramApprovedService approvedService;
 	@Autowired
@@ -39,32 +33,35 @@
 	@Autowired
 	private FlowProgramFileService flowProgramFileService;
 	@Autowired
-	private FlowCommonService flowCommonService;
-	@Autowired
 	private NcNodeService ncNodeService;
 	@Autowired
 	private NcNodeAutoCreateService ncNodeAutoCreateService;
 	/**
-	 * 鍦ㄦ祦绋嬬粨鏉熸椂鑷姩璋冪敤,锛堥厤缃湪瀹℃壒缁撴潫浜嬩欢鐨別xecutelistener涓簡锛�
-	 * @param execution 鎵ц瀵硅薄
+	 * DispatchFinishListener涓皟鐢�
+	 * @param props 鎵ц瀵硅薄
 	 */
-	public void handle(DelegateExecution execution) {
+	public void handleData(FlowProgramProperties props) {
 		// 鎵ц涓氬姟閫昏緫
-		String instId = execution.getProcessInstanceId();
-		log.info("浜嬩欢鍚嶇О{}锛宨nstid={}" , execution.getEventName(),instId);
+		String instId = props.getProcessInstanceId();
 
-		FlowProgramProperties props = flowCommonService.getProgramProperties(instId);
-
+		String programPkgName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
 		createProgramNodes(props);
-
-		String programName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
-		NcNode packageNode = ncNodeService.getProgramPackageByName(programName);
+		//TODO 鍋忕鍗曪紝鍜屽凡缁忓浐鍖栫殑绋嬪簭锛屾病鏈夊鐞�,:宸茬粡澶勭悊娌℃湁楠岃瘉
+		NcNode packageNode;
+		if(FlowContants.Y.equals(props.getHasCuredProgram()) && FlowContants.Y.equals(props.getCureProgramUseable())){
+			//鏈夊浐鍖栵紝涓旂▼搴忓彲鐢紝浠庡浐鍖栨爲鏌ヨ鑺傜偣
+			packageNode = ncNodeService.getLastEditionCuredProgramPackage(programPkgName);
+		}else if(Func.isNotBlank(props.getDeviation())){
+			//鏈夊亸绂诲崟
+			packageNode = ncNodeService.getLastEditionDeviationProgramPackage(programPkgName);
+		}else{
+			//鏅�氳瘯鍒囷紝鎴栬�呮湁鍥哄寲涓嶅彲鐢�
+			packageNode = ncNodeService.getLastEditionTryingProgramPackage(programPkgName);
+		}
 
 		addApproveTable(packageNode,props);
-
-		updateApproveRecordNodeId(instId,packageNode.getId());
-
-		log.info("娴佺▼宸插畬鎴恑n DispatchFinishListener");
+		updateApproveRecordNodeId(instId, packageNode.getId());
+		log.info("鏅�氭祦绋嬪凡瀹屾垚in DispatchFinishListener");
 	}
 
 	/**
@@ -72,12 +69,11 @@
 	 * @param progProperties 娴佺▼灞炴��
 	 */
 	void createProgramNodes(FlowProgramProperties progProperties){
-		if(!FlowContants.Y.equals(progProperties.getHasCuredProgram())) {
-			//璇曞垏鎴栬�呭亸绂�
+		if(FlowContants.N.equals(progProperties.getHasCuredProgram())) {
+			//鏃犲浐鍖�(璇曞垏鎴栬�呭亸绂�)
 			ncNodeAutoCreateService.createNodeTreeWithProgram(progProperties);
 		}else{
-			//鏈夊浐鍖�
-			//TODO 杩樿鍖哄垎鏄惁鍙敤鍒ゅ畾鏄惁鍙敤銆傚彲鐢ㄧ晫
+			//鏈夊浐鍖栵紝绋嬪簭涓嶅彲鐢�
 			if(FlowContants.N.equals(progProperties.getCureProgramUseable())) {
 				//鍥哄寲绋嬪簭涓嶅彲鐢紝闇�瑕侀噸鏂板缓绔嬬▼搴忓寘鍚嶅拰鏂囦欢鑺傜偣;鍙敤鎯呭喌鍦ㄦ祦绋嬪鎵逛腑宸茬粡鍗囩骇杩囪妭鐐逛簡
 				NcNode curedProgramPackage = ncNodeService.getById(Func.toLong(progProperties.getCuredNodeId()));
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/TempFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/TempFinishDataHandler.java
new file mode 100644
index 0000000..18cf2b9
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/TempFinishDataHandler.java
@@ -0,0 +1,101 @@
+package org.springblade.mdm.flow.excution.dispatch;
+
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.flow.entity.ApproveRecord;
+import org.springblade.mdm.flow.entity.FlowProgramFile;
+import org.springblade.mdm.flow.service.ApproveRecordService;
+import org.springblade.mdm.flow.service.FlowCommonService;
+import org.springblade.mdm.flow.service.FlowProgramFileService;
+import org.springblade.mdm.flow.service.FlowProgramProperties;
+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.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 涓存椂娲惧伐瀹℃壒閫氳繃鎵ц鐨勪簨浠讹紝鍔熻兘锛氬缓绔嬩复鏃惰妭鐐癸紝鎻掑叆瀹℃壒瀹屾垚璁板綍
+ */
+@Slf4j
+@Component("tempDispatchFinishDataHandler")
+public class TempFinishDataHandler  implements FinishDataHandler{
+	@Autowired
+	private NcProgramApprovedService approvedService;
+	@Autowired
+	private FlowProgramFileService flowProgramFileService;
+	@Autowired
+	private NcNodeService ncNodeService;
+	/**
+	 * 鍦ㄦ祦绋嬬粨鏉熸椂鑷姩璋冪敤锛岀敱
+	 * @param props 娴佺▼灞炴��
+	 */
+	public void handleData(FlowProgramProperties props ) {
+		// 鎵ц涓氬姟閫昏緫
+
+		String programName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
+
+		//涓存椂娴佺▼锛屼笉澶勭悊鏍戯紝鍙鐞嗘枃浠�.鐢变簬瀵煎嚭鏄熀浜庤妭鐐圭殑锛岃繖閲屽垱寤轰复鏃惰妭鐐癸紝涓嶅湪鏍戠珛灞曠ず
+		NcNode tempPkgNode = new NcNode();
+		tempPkgNode.setNodeType(NcNode.TYPE_PROGRAM_PACKAGE);
+		tempPkgNode.setIsLastEdition(0);
+		tempPkgNode.setProcessNo(props.getProcessNo());
+		tempPkgNode.setMachineCode(props.getMachineCode());
+		tempPkgNode.setProcessName(props.getProcessName());
+		tempPkgNode.setProcessEdition(props.getProcessEdition());
+		tempPkgNode.setName(programName);
+		tempPkgNode.setParentIds("0,4");
+		tempPkgNode.setIsLocked(0);
+		tempPkgNode.setCraftEdition(props.getCraftEdition());
+		tempPkgNode.setDrawingNo(props.getDrawingNo());
+		tempPkgNode.setProcessInstanceId(props.getProcessInstanceId());
+		ncNodeService.save(tempPkgNode);
+
+		List<FlowProgramFile> newFlowFileList = flowProgramFileService.listByProcessInstanceId(props.getProcessInstanceId());
+		for(FlowProgramFile newFlowFile : newFlowFileList) {
+			NcNode tempProgramNode = new NcNode();
+			BeanUtils.copyProperties(tempPkgNode,tempProgramNode);
+			EntityUtil.clearBaseProperties(tempProgramNode);
+
+			tempProgramNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
+			tempProgramNode.setName(newFlowFile.getName());
+			BeanUtils.copyProperties(tempPkgNode,tempProgramNode);
+			tempProgramNode.setParentId(tempPkgNode.getId());
+			tempProgramNode.setIsLastEdition(1);//瀵煎嚭鏃堕渶瑕佷娇鐢ㄦ渶鏂拌妭鐐�
+			tempProgramNode.setParentIds(tempPkgNode.getParentIds()+","+tempPkgNode.getId());
+			tempProgramNode.setProcessInstanceId(props.getProcessInstanceId());
+			tempProgramNode.setFlowProgramFileId(newFlowFile.getId());
+
+			ncNodeService.save(tempProgramNode);
+		}
+		addApproveTable(tempPkgNode,props);
+		log.info("娴佺▼宸插畬鎴恑n DispatchFinishListener");
+	}
+
+
+	/**
+	 * 淇濆瓨瀹℃壒瀹屾垚鐨勮褰�
+	 * @param packageNode
+	 * @param props
+	 */
+	void addApproveTable(NcNode packageNode,FlowProgramProperties props){
+		NcProgramApproved approved = new NcProgramApproved();
+
+		approved.setProgramName(packageNode.getName());
+		approved.setNcNodeId(packageNode.getId());//绋嬪簭鍖呰妭鐐筰d
+		approved.setTitle(props.getTitle());
+		approved.setProgrammerId(props.getProgrammerId());
+		approvedService.save(approved);
+
+	}
+
+}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
index b2ff051..a19af2a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -19,6 +19,8 @@
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NodeDeptQueryService;
+import org.springblade.system.feign.IUserClient;
+import org.springblade.system.pojo.entity.User;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -34,6 +36,7 @@
 	private final ProduceDivisionService produceDivisionService;
 	private final NodeDeptQueryService nodeDeptQueryService;
 	private final MachineService machineService;
+	private final IUserClient userClient;
 	/**
 	 * 鏍规嵁娴佺▼瀹炰緥id鑾峰彇definitionKey
 	 * @param processInstanceId
@@ -59,6 +62,7 @@
 		Map<String, Object> vars = runtimeService.getVariables(processInstanceId);
 
 		programProperties.setTitle(String.valueOf(vars.get(FlowContants.TITLE)));
+		programProperties.setIsTempFlow(Func.toStr(vars.get(FlowContants.IS_TEMP_FLOW)));
 		programProperties.setDrawingNo(String.valueOf(vars.get(FlowContants.DRAWING_NO)));
 		programProperties.setDrawingNoEdition(String.valueOf(vars.get(FlowContants.DRAWING_NO_EDITION)));
 		programProperties.setProductModel(String.valueOf(vars.get(FlowContants.PRODUCT_MODEL)));
@@ -152,6 +156,10 @@
 			vars.put(FlowContants.ASSIGNEE, defaultAssignee);//绗竴涓鎵圭敤鎴凤細缁勯暱
 		}
 
+		R<User> programmerResult = userClient.userInfoById(div.getProgrammerId());
+		if(programmerResult.isSuccess()) {
+			vars.put(FlowContants.PROGRAMMER_NAME, programmerResult.getData().getName());
+		}
 		return div;
 	}
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
index 6795dd5..ba9456a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
@@ -62,4 +62,7 @@
 
 	@Schema(description = "缂栫▼鍛榠d")
 	private Long programmerId;
+
+	@Schema(description = "鏄惁涓存椂娴佺▼:Y/N")
+	private String isTempFlow;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
index 9050a5e..11d7b70 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
@@ -41,5 +41,6 @@
 
 	@Schema(description = "鍋忕鍗曞彿")
 	private String deviation;
-
+	@Schema(description = "鏄惁涓存椂娴佺▼锛屽��:Y/N")
+	private String isTempFlow;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
index 7c565d9..55ff76a 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -9,24 +9,21 @@
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.UrlUtil;
 import org.springblade.mdm.commons.vo.IdsVO;
 import org.springblade.mdm.program.service.NcProgramApprovedService;
 import org.springblade.mdm.program.service.NcProgramExportDNCService;
 import org.springblade.mdm.program.service.NcProgramService;
-import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
 import org.springblade.mdm.program.vo.NcProgramExportDncPageVO;
 import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO;
-import org.springblade.mdm.program.vo.NcProgramVO;
-import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.server.ResponseStatusException;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.PrintWriter;
 
 /**
  * 绋嬪簭娑夊瘑缃�-宸ユ帶缃戜氦鎹㈡帴鍙�
@@ -57,13 +54,17 @@
 			throw new ServiceException("鏈�夋嫨鏂囦欢瀵煎嚭");
 		}
 		//try {
-		String filename = "programexp-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
-		response.setHeader("Content-Disposition", "attachment; filename="+filename);
-		response.setContentType("application/octet-stream");
+		//瀵煎嚭鏂囦欢鍚嶇О瑕佹眰瀵煎嚭浜哄悕瀛�+鏃堕棿鎴�
 
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			ncProgramExportDNCService.exportDnc(vo.getIds(),bos);
-			response.getOutputStream().write(bos.toByteArray());
+		String uname = UrlUtil.encode(AuthUtil.getNickName());
+		//String filename =AuthUtil.getNickName()+"-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
+		String filename = uname+"-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
+		response.setHeader("Content-Disposition", "attachment; filename="+filename);
+		response.setContentType("application/octet-stream;charset=utf-8");
+
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		ncProgramExportDNCService.exportDnc(vo.getIds(),bos);
+		response.getOutputStream().write(bos.toByteArray());
 
 
 		//} catch (Exception e) {
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 dfa5776..2ed24c4 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,8 +11,9 @@
         <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.process_no,n.process_edition,n.drawing_no,n.drawing_no_edition,n.process_name,a.create_time,a.update_time from mdm_nc_program_approved a
+        select a.id,a.title,n.name,a.nc_node_id,n.process_no,n.process_edition,n.drawing_no,n.drawing_no_edition,n.process_name,a.create_time,a.update_time,u.name exporter from mdm_nc_program_approved a
             inner join mdm_nc_node n on a.nc_node_id=n.id
+            left join blade_user u on a.update_user=u.id
         <where>
             a.is_deleted=0 and a.status=#{query.status}
             <if test="query.name!=null and query.name!=''">
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
index 55243df..9fe865e 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
@@ -88,15 +88,10 @@
 				approvedService.updateById(approved);
 			}
 
-			//鐘舵�佷慨鏀逛负宸插鍑�
-			/*
-			approvedService.lambdaUpdate().in(NcProgramApproved::getId, Arrays.asList(approvedIdArray))
-				.set(NcProgramApproved::getStatus,NcProgramApproved.STATUS_EXPORTED).update();*/
 		}catch(Exception e){
 			Throwable [] err = e.getSuppressed();
 			throw new ServiceException("瀵煎嚭宸ユ帶缃戦敊璇�"+e.getMessage());
 		}
-
 	}
 
 	/**
@@ -123,7 +118,7 @@
 		}else if(programPackageNode.hasCured()){
 			status = "GH";
 		}
-		//List<Dict> annotationList = programAnnotationService.getAnnotionList();
+
 		for (NcNode node : programNodes) {
 			String filePathInZip = packageFolder + node.getName();
 			programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId());
@@ -184,7 +179,7 @@
 	}*/
 
 
-
+	/*
 	String generateAnnotation(String oriTest,String machineGroupCode,List<Dict> annotationList) {
 		R<List<Dict>> dictsResult = dictClient.getList(ANNOTATION_DICT);
 		String annotation = oriTest;
@@ -206,114 +201,7 @@
 		return annotation;
 
 	}
-	/**
-	 * 瀵煎叆鏁版嵁鏂囦欢
-	 * @param zipOut
-	 */
-	/*
-	void addDataJson(ZipOutputStream zipOut, List<Long> programPackageNodeIdList) throws IOException {
-		addNodeDataJson(zipOut, programPackageNodeIdList);
-		addApproveRecordDataJson(zipOut, programPackageNodeIdList);
-	}
 	*/
-
-	/**
-	 * zip淇濋噸鍔犲叆鑺傜偣鐨勬暟鎹�
-	 * @param zipOut
-	 * @param pkgNodeIdList
-	 * @throws IOException
-	 */
-	/*
-	void  addNodeDataJson(ZipOutputStream zipOut,List<Long>  pkgNodeIdList) throws IOException {
-		List<NcNode> pkgNodes =  this.ncNodeService.lambdaQuery().in(NcNode::getId, pkgNodeIdList).list();
-
-		List<Long> allNodeIds = new ArrayList<>();
-		for(NcNode node : pkgNodes){
-			allNodeIds.addAll(Func.toLongList(node.getParentIds()));
-			allNodeIds.add(node.getId());
-		}
-		//鍔犲叆绋嬪簭鍖呬笅绾х殑绋嬪簭鑺傜偣
-		List<NcNode> programNodes = ncNodeService.lambdaQuery().in(NcNode::getParentId, pkgNodes.stream().map(NcNode::getId).toList()).list();
-
-		allNodeIds.addAll(programNodes.stream().map(NcNode::getId).toList());
-		List<Long>  distinctIds = allNodeIds.stream().distinct().toList();
-		List<NcNode> allNodes = this.ncNodeService.lambdaQuery().in(NcNode::getId, distinctIds).list();
-		JSONArray jsonArray = new JSONArray();
-
-		for(NcNode node : allNodes){
-			JSONObject recObj = getNodeJsonObject(node);
-			addSuperProperties(recObj,node);
-			jsonArray.add(recObj);
-		}
-		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),NODE_JSON_FILE);
-
-	}
-	*/
-	/*
-	@NotNull
-	private static JSONObject getNodeJsonObject(NcNode node) {
-		JSONObject recObj = new JSONObject();
-		recObj.put("id", node.getId());
-		recObj.put("name", node.getName());
-		recObj.put("drawingNo", node.getDrawingNo());
-		recObj.put("drawingNoEdition", node.getDrawingNoEdition());
-		recObj.put("productModel", node.getProductModel());
-		recObj.put("processName", node.getProcessName());
-		recObj.put("processEdition", node.getProcessEdition());
-		recObj.put("craftEdition", node.getCraftEdition());
-		recObj.put("parentIds", node.getParentIds());
-		recObj.put("processNo", node.getProcessNo());
-
-		recObj.put("isCured", node.getIsCured());
-		recObj.put("isLocked", node.getIsLocked());
-		recObj.put("nodeType", node.getNodeType());
-
-		recObj.put("machineCode", node.getMachineCode());
-		recObj.put("flowProgramFileId", node.getFlowProgramFileId());
-		recObj.put("processInstanceId", node.getProcessInstanceId());
-		return recObj;
-	}
-	*/
-	/**
-	 * 瀵煎叆瀹℃壒璁板綍
-	 * @param zipOut
-	 * @param programPackageNodeIdList 绋嬪簭鍖呭悕鐨刬d鍒楄〃
-	 */
-	/*
-	void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programPackageNodeIdList) throws IOException {
-
-		//List<ApproveRecord> records = approveRecordService.lambdaQuery().in(ApproveRecord::getProcessInstanceId, instanceIds).list();
-		List<ApproveRecord> records = approveRecordService.lambdaQuery().in(ApproveRecord::getNcNodeId, programPackageNodeIdList).list();
-
-		JSONArray jsonArray = new JSONArray();
-		for(ApproveRecord record : records){
-			JSONObject recObj = new JSONObject();
-			recObj.put("id", record.getId());
-			recObj.put("comment", record.getComment());
-			recObj.put("userId",record.getUserId());
-			recObj.put("userNickname",record.getUserNickname());
-			recObj.put("operateTime",record.getOperateTime());
-			recObj.put("operateResult",record.getOperateResult());
-			recObj.put("taskName",record.getTaskName());
-			recObj.put("processInstanceId",record.getProcessInstanceId());
-			recObj.put("ncNodeId",record.getNcNodeId());
-			addSuperProperties(recObj,record);
-
-			jsonArray.add(recObj);
-		}
-		addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json");
-
-	}*/
-
-	void addSuperProperties(JSONObject recObj, BizEntity entity){
-		recObj.put("tenantId",entity.getTenantId());
-		recObj.put("createTime",entity.getCreateTime());
-		recObj.put("updateTime",entity.getUpdateTime());
-		recObj.put("createUser",entity.getCreateUser());
-		recObj.put("updateUser",entity.getUpdateUser());
-		recObj.put("status",entity.getStatus());
-		recObj.put("createDept",entity.getCreateDept());
-	}
 
 	/**
 	 * 灏� 杈撳叆娴� 涓殑鍐呭鍐欏叆zip
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java
index 4c0b8b9..d1d2254 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java
@@ -25,4 +25,6 @@
 	private String processNo;
 	@Schema(description = "宸ュ簭鍙�")
 	private String processEdition;
+	@Schema(description = "瀵煎嚭浜哄鍚�")
+	private String exporter;
 }
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 d878699..6c9f0d1 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
@@ -2,10 +2,12 @@
 
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.mail.MessagingException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 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.gkw.programnode.entity.MachineFile;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
@@ -40,6 +42,8 @@
 	private ProgramAnnotationService programAnnotationService;
 	@Autowired
 	private IDictBizClient bizDictClient;
+	@Autowired
+	private EmailService mailService;
 	/**
 	 * 鏂板
 	 */
@@ -102,4 +106,12 @@
 		return this.bizDictClient.getList	(code);
 	}
 
+	@GetMapping("/sendmail")
+	@Operation(summary = "sendmail", description = "sendmail")
+	public R<Void> sendmail(String code) throws IOException, MessagingException {
+		mailService.sendHtmlEmail("zhangxiaoxu@qianwen.ltd","testtitle"+code,"abc鐑︾儲鐑�");
+		mailService.sendHtmlEmail("y_ys79@sina.com","testtitle"+code,"abc鐑︾儲鐑�");
+		return R.success();
+	}
+
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameCheckUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameCheckUtil.java
index 8ac958a..ccd0cff 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameCheckUtil.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ProgramFileNameCheckUtil.java
@@ -4,6 +4,7 @@
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.IResultCode;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.service.FlowProgramProperties;
 import org.springblade.mdm.program.service.NcNodeService;
 
@@ -14,6 +15,10 @@
 	 * @param programProperties 绋嬪簭灞炴�э紝鍙戣捣鏃跺~鍐欑殑
 	 */
 	public static void checkFilename(String filename, FlowProgramProperties programProperties){
+		if(FlowContants.IS_TEMP_FLOW.equals(programProperties.getIsTempFlow())){
+			//涓存椂绋嬪簭涓嬪彂娴佺▼锛屼笉妫�鏌ユ枃浠跺悕鍚堟硶鎬�
+			return;
+		}
 		//绋嬪簭鍚嶇О锛氶浂浠跺彿鍔犲伐搴忓彿锛屾枃浠跺悕搴旇浠ユ寮�澶�
 		String programNamePrefix = NcNodeService.genProgramName(programProperties.getDrawingNo(),programProperties.getProcessNo()) + "-"+programProperties.getProcessEdition();
 		if(!StringUtils.startsWith(filename,programNamePrefix)){
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
index 3374300..77e7c5b 100644
--- a/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
@@ -41,7 +41,7 @@
     <sequenceFlow id="sid-d144dad0-dc94-4a2b-96d6-9d8451b05ec1" sourceRef="confirmIsUseableTask" targetRef="check" name="鍥哄寲绋嬪簭鍙敤">
       <conditionExpression>${approve=='Y'}</conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="sid-d4133565-1a45-4bb6-b603-9b9e4db1cdbb" sourceRef="approveTask" targetRef="check">
+    <sequenceFlow id="sid-d4133565-1a45-4bb6-b603-9b9e4db1cdbb" sourceRef="approveTask" targetRef="programmingTask">
       <conditionExpression>${approve=='N'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-80b50f96-7601-4ba2-8c32-968923170d25" sourceRef="confirmIsUseableTask" targetRef="programmingTask" name="涓嶅彲鐢�">
@@ -123,7 +123,7 @@
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge-7a5135fe-5eb1-425c-b920-3e2b5bf18454" bpmnElement="sid-d4133565-1a45-4bb6-b603-9b9e4db1cdbb">
         <omgdi:waypoint x="167.5" y="-4.0"/>
-        <omgdi:waypoint x="175.0" y="-80.0"/>
+        <omgdi:waypoint x="-8.75" y="-77.5"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge-223da197-47f2-44ef-847e-40d1fae1009b" bpmnElement="sid-80b50f96-7601-4ba2-8c32-968923170d25">
         <omgdi:waypoint x="-93.75" y="37.5"/>
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
index 32b8c4f..286b0a0 100644
--- a/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
@@ -20,7 +20,7 @@
       <conditionExpression>${approve=='Y'}</conditionExpression>
     </sequenceFlow>
     <endEvent id="cureProgramingNoEnd" name="鍥哄寲缂栧埗缁撴潫"/>
-    <sequenceFlow id="sid-a3a0654d-e9fd-4814-a1bd-384dce8a3b7a" sourceRef="cureProgramTask" targetRef="exceptionHandleTask">
+    <sequenceFlow id="sid-a3a0654d-e9fd-4814-a1bd-384dce8a3b7a" sourceRef="cureProgramTask" targetRef="programMgrConfirm">
       <conditionExpression>${approve=='N'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-c04cc547-0baf-4514-8056-54b1612cdefd" sourceRef="seniorApproveTask" targetRef="cureCheckTask">
@@ -30,12 +30,14 @@
       <documentation>璁剧疆鏁版嵁鐨勫浐鍖栨爣蹇楋紝鐢熸垚鍥哄寲绋嬪簭鍒楄〃</documentation>
     </serviceTask>
     <sequenceFlow id="sid-253f5be1-3275-47d6-a3a1-5d1eaf01ec79" sourceRef="cureOKOperateTask" targetRef="end"/>
-    <scriptTask id="exceptionHandleTask" scriptFormat="groovy">
+    <scriptTask id="exceptionHandleTask" scriptFormat="groovy" name="寮傚父鏍囪璁剧疆">
       <script><![CDATA[
       execution.setVariable("exception", "1");
       ]]></script>
     </scriptTask>
     <sequenceFlow id="sid-f8533f07-b17b-4a37-89b2-bfa7e014cd08" sourceRef="exceptionHandleTask" targetRef="cureProgramingNoEnd"/>
+    <userTask id="programMgrConfirm" name="绋嬪簭绠$悊鍛樼‘璁�" flowable:assignee="${assignee}"/>
+    <sequenceFlow id="sid-8e4bff35-c436-419b-8df8-cd1161ade204" sourceRef="programMgrConfirm" targetRef="exceptionHandleTask"/>
   </process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_program-cure">
     <bpmndi:BPMNPlane bpmnElement="program-cure" id="BPMNPlane_program-cure">
@@ -79,11 +81,11 @@
         <omgdi:waypoint x="25.0" y="-68.75"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-b240ebd6-4961-477a-9621-67f9b92bde64" bpmnElement="cureProgramingNoEnd">
-        <omgdc:Bounds x="-215.0" y="35.0" width="30.0" height="30.0"/>
+        <omgdc:Bounds x="-240.0" y="40.0" width="30.0" height="30.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-d760db6d-fd9f-435e-8d42-3613cb75be57" bpmnElement="sid-a3a0654d-e9fd-4814-a1bd-384dce8a3b7a">
         <omgdi:waypoint x="-130.0" y="-56.25"/>
-        <omgdi:waypoint x="-140.0" y="-25.0"/>
+        <omgdi:waypoint x="-92.5" y="-10.0"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge-5c7dd10c-358c-4088-8af7-4d2ada7247db" bpmnElement="sid-c04cc547-0baf-4514-8056-54b1612cdefd">
         <omgdi:waypoint x="41.25" y="-60.0"/>
@@ -97,11 +99,18 @@
         <omgdi:waypoint x="197.5" y="-52.5"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="shape-914147ff-52e6-4152-834c-0bc3c552c53a" bpmnElement="exceptionHandleTask">
-        <omgdc:Bounds x="-177.5" y="-25.0" width="50.0" height="45.0"/>
+        <omgdc:Bounds x="-192.5" y="-12.5" width="50.0" height="45.0"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge-19b7d7ad-693c-4677-af1d-e0b630e6d7ef" bpmnElement="sid-f8533f07-b17b-4a37-89b2-bfa7e014cd08">
-        <omgdi:waypoint x="-177.5" y="8.75"/>
-        <omgdi:waypoint x="-192.5" y="35.0"/>
+        <omgdi:waypoint x="-192.5" y="21.25"/>
+        <omgdi:waypoint x="-217.5" y="40.0"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-e9859997-6e09-483f-ae53-f7dfe0a99533" bpmnElement="programMgrConfirm">
+        <omgdc:Bounds x="-120.0" y="-10.0" width="55.0" height="40.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-b95990aa-31c7-44ce-8c31-d505a2805c8f" bpmnElement="sid-8e4bff35-c436-419b-8df8-cd1161ade204">
+        <omgdi:waypoint x="-120.0" y="10.0"/>
+        <omgdi:waypoint x="-142.5" y="21.25"/>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>

--
Gitblit v1.9.3