From 0ef4cc755bddd87799b8bfdd65c8123df6e149d0 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期日, 17 八月 2025 23:52:51 +0800
Subject: [PATCH] 锁定流程完成

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowContants.java                 |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java          |    2 
 blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml                         |    6 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java                |  155 ++++---------------------
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java            |    5 
 blade-service/blade-mdm/pom.xml                                                                            |    5 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java                |   49 ++++---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java                       |    2 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java |   21 ++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java          |    3 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.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/task/cure/CureFinishOperateTask.java        |   21 ++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java              |   36 ++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java               |    4 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java             |   26 ++-
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/DispatchFinishListener.java        |   14 +
 17 files changed, 170 insertions(+), 189 deletions(-)

diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml
index 9ab35a3..4854ff9 100644
--- a/blade-service/blade-mdm/pom.xml
+++ b/blade-service/blade-mdm/pom.xml
@@ -104,6 +104,11 @@
             <artifactId>juniversalchardet</artifactId>
             <version>1.0.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.groovy</groupId>
+            <artifactId>groovy-jsr223</artifactId>
+            <version>4.0.28</version>
+        </dependency>
         <!--<dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
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 0bfe175..d42f854 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
@@ -19,6 +19,10 @@
 	 */
 	public static final String REPLACE_PROCESS_KEY = "program-replace";
 
+	/**
+	 * 绋嬪簭瑙i攣娴佺▼key
+	 */
+	public static final String UNLOCK_PROCESS_KEY = "program-unlock";
 
 	public static final String TEAM_LEADER = "teamLeader";
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
index 6cb0fc4..b50fa52 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -83,7 +83,8 @@
 
 	AbstractFlowCompleteService getActualService(String processInstanceId){
 		ProcessInstance inst = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
-		if(inst.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY) || inst.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY) || inst.getProcessDefinitionKey().equals(FlowContants.REPLACE_PROCESS_KEY)){
+		if(inst.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY) || inst.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY)
+			|| inst.getProcessDefinitionKey().equals(FlowContants.REPLACE_PROCESS_KEY)|| inst.getProcessDefinitionKey().equals(FlowContants.UNLOCK_PROCESS_KEY)){
 			return tryFlowCompleteService;
 		}else{
 			return defaultFlowCompleteService;
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java
index 4147385..c5ebc30 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java
@@ -29,7 +29,7 @@
 	 */
 	@PostMapping("/start-unlock")
 	@Operation(summary = "鍙戣捣瑙i攣娴佺▼", description = "鍙戣捣瑙i攣娴佺▼")
-	public R<Boolean> start(@Parameter(description = "绋嬪簭鍖呭悕 鑺傜偣鐨刬d") Long nodeId) {//,@Parameter(description = "澶勭悊浜篿d")String assingee
+	public R<Boolean> startUnlock(@Parameter(description = "绋嬪簭鍖呭悕 鑺傜偣鐨刬d") Long nodeId) {//,@Parameter(description = "澶勭悊浜篿d")String assingee
 		try {
 			replaceFlowService.startUnlock(nodeId);
 			return R.data(true);
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/DispatchFinishListener.java
index 4666f08..4e7670b 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/DispatchFinishListener.java
@@ -60,7 +60,7 @@
 		String programName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
 		NcNode packageNode = ncNodeService.getProgramPackageByName(programName);
 
-		addApproveTable(packageNode,props.getTitle());
+		addApproveTable(packageNode,props);
 
 		updateApproveRecordNodeId(instId,packageNode.getId());
 
@@ -112,12 +112,18 @@
 		}
 	}
 
-	void addApproveTable(NcNode packageNode,String title){
+	/**
+	 * 淇濆瓨瀹℃壒瀹屾垚鐨勮褰�
+	 * @param packageNode
+	 * @param props
+	 */
+	void addApproveTable(NcNode packageNode,FlowProgramProperties props){
 		NcProgramApproved approved = new NcProgramApproved();
-		//approved.setProgramName(pf.getProgramName());
+
 		approved.setProgramName(packageNode.getName());
 		approved.setNcNodeId(packageNode.getId());//绋嬪簭鍖呰妭鐐筰d
-		approved.setTitle(title);
+		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/excution/replace/ReplaceFinishListener.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java
index 9cebd61..45fef5b 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java
@@ -7,9 +7,7 @@
 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.FlowProgramFileService;
-import org.springblade.mdm.flow.service.ReplaceFlowService;
+import org.springblade.mdm.flow.service.*;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.service.NcNodeService;
@@ -37,6 +35,8 @@
 	private NcProgramApprovedService ncProgramApprovedService;
 	@Autowired
 	private NcNodeService ncNodeService;
+	@Autowired
+	private FlowCommonService flowCommonService;
 	/**
 	 * 鍦ㄦ祦绋嬬粨鏉熸椂鑷姩璋冪敤,锛堥厤缃湪瀹℃壒缁撴潫浜嬩欢鐨別xecutelistener涓簡锛�
 	 * @param execution 鎵ц瀵硅薄
@@ -44,26 +44,29 @@
 	public void handle(DelegateExecution execution) {
 		// 鎵ц涓氬姟閫昏緫
 		String instId = execution.getProcessInstanceId();
+		FlowProgramProperties props = flowCommonService.getProgramProperties(instId);
 		Long nodeId = runtimeService.getVariable(execution.getId(),FlowContants.NODE_ID,Long.class);
 		log.info("浜嬩欢鍚嶇О{}锛宨nstid={}" , execution.getEventName(),instId);
-		List<FlowProgramFile> programFiles =  flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, instId).list();
+
+		//List<FlowProgramFile> programFiles =  flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, instId).list();
+		List<FlowProgramFile> programFiles = flowProgramFileService.listByProcessInstanceId(instId);
 		NcNode newProgramPackage = replaceProgram(nodeId,instId,programFiles);
 
-
-		addToApproved(newProgramPackage,Func.toStr(execution.getVariables().get(FlowContants.TITLE)));
+		addToApproved(newProgramPackage,props);
 		log.info("娴佺▼宸插畬鎴� in replaceFinishListener");
 	}
 
 	/**
 	 * 澧炲姞瀹℃壒閫氳繃璁板綍锛屼緵鐢ㄦ埛瀵煎嚭鍒板伐鎺х綉
 	 * @param newProgramPackage 鏂扮殑绋嬪簭鍖呰妭鐐�
-	 * @param title 鏍囬
+	 * @param props 娴佺▼灞炴�ч泦鍚�
 	 */
-	void addToApproved(NcNode newProgramPackage,String title){
+	void addToApproved(NcNode newProgramPackage,FlowProgramProperties props){
 		NcProgramApproved approve = new NcProgramApproved();
 		approve.setProgramName(newProgramPackage.getName());
 		approve.setNcNodeId(newProgramPackage.getId());
-		approve.setTitle(title);
+		approve.setTitle(props.getTitle());
+		approve.setProgrammerId(props.getProgrammerId());
 
 		ncProgramApprovedService.save(approve);
 	}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
index c7b2f6a..04274a5 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -6,10 +6,7 @@
 import org.flowable.engine.IdentityService;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
-import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
-import org.flowable.task.api.Task;
-import org.flowable.task.api.history.HistoricTaskInstance;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.mdm.basesetting.machine.MachineService;
 import org.springblade.mdm.basesetting.machine.entity.Machine;
@@ -26,7 +23,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 鍥哄寲娴佺▼鏈嶅姟
@@ -46,127 +42,22 @@
 
 	private final FlowProgramFileService flowProgramFileService;
 	private final ProduceDivisionService produceDivisionService;
+	private final MachineService machineService;
+
+
+	/**
+	 * 鍚姩鍥哄寲娴佺▼
+	 */
 	@Transactional
-	public void startCure(List<NcNode> programPackageList, Map<Long,List<NcNode>> allFlowProgramFilesMap) {
-		//鏍规嵁鍒嗙粍鍚姩娴佺▼锛屽苟鎻掑叆鍏宠仈琛�
-		programPackageList.forEach(pkg -> {
-			this.startOne(pkg,allFlowProgramFilesMap.get(pkg.getId()));
-		});
-	}
-
-	/**
-	 * 鍚姩涓�涓暟鎺х▼搴忕殑鍥哄寲娴佺▼
-	 * @param programPackage 绋嬪簭鍖呭悕 鑺傜偣瀹炰綋
-	 */
-	public void startOne(NcNode programPackage,List<NcNode> programNodes) {
-		Map<String, Object> vars = new HashMap<>();
-		//璇ョ▼搴忓湪璁″垝浠诲姟鏃� 鑾峰彇缂栧埗锛屾牎瀵癸紝瀹℃壒鐨勪汉鍛橈紝浣滀负榛樿鐢ㄦ埛锛屽叾涓紪鍒舵椂绗竴涓浐瀹氱殑鐢ㄦ埛
-		if(programPackage.getProcessInstanceId() != null) {
-			//鑾峰彇瀹℃壒鐢ㄦ埛
-			HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
-				.processInstanceId(programPackage.getProcessInstanceId()).includeProcessVariables()
-				.singleResult();
-			if(instance != null) {//浣跨敤浠诲姟娲惧伐娴佺▼鐨勫彉閲�
-				Map<String, Object> oldVars = instance.getProcessVariables();
-				//鏈哄簥缂栧彿
-				vars.put(FlowContants.MACHINE_CODE,oldVars.get(FlowContants.MACHINE_CODE));
-				//鏈哄簥鍨嬪彿
-				vars.put(FlowContants.MACHINE_MODE,oldVars.get(FlowContants.MACHINE_MODE));
-
-				String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(programPackage.getMachineCode());
-				vars.put(FlowContants.WORKSHOP,workshop);
-
-				vars.put(FlowContants.PROCESS_NO,oldVars.get(FlowContants.PROCESS_NO));
-				vars.put(FlowContants.PROCESS_NAME,oldVars.get(FlowContants.PROCESS_NAME));
-				vars.put(FlowContants.PROCESS_EDITION,oldVars.get(FlowContants.PROCESS_EDITION));
-				vars.put(FlowContants.CRAFT_EDITION, oldVars.get(FlowContants.CRAFT_EDITION));
-				vars.put(FlowContants.DRAWING_NO,oldVars.get(FlowContants.DRAWING_NO));
-				vars.put(FlowContants.DRAWING_NO_EDITION,oldVars.get(FlowContants.DRAWING_NO_EDITION));
-
-				vars.put(FlowContants.PRODUCT_MODEL,oldVars.get(FlowContants.PRODUCT_MODEL));
-			}
-
-		}
-
-		//鏌ユ壘鍘嗗彶瀹為檯鐨勫鎵逛汉
-		List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
-			.orderByTaskCreateTime().desc().processInstanceId(programPackage.getProcessInstanceId())
-			.list();
-		fillHistoryAssignees(vars, historicTasks);
-
-		String businessKey = "0";//涓氬姟琛╧ey
-
-		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
-
-		vars.put(FlowContants.LAST_STEP_USER_NICKNAME, AuthUtil.getNickName());
-		vars.put(FlowContants.TITLE,programPackage.getName()+"-鍥哄寲");//鑷姩澧炲姞鏍囬
-
-		ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.CURE_PROCESS_KEY,businessKey,vars);
-
-		//鏇存柊绋嬪簭鍖呭悕鑺傜偣鐨勬祦绋嬪疄渚媔d
-		programPackage.setProcessInstanceId(inst.getProcessInstanceId());
-		ncNodeService.updateById(programPackage);
-
-		//鏇存柊鏂囦欢鐨勬祦绋嬪疄渚媔d锛屽拰 绋嬪簭鑺傜偣鐨勬祦绋嬫枃浠秈d 骞跺叆搴�
-		programNodes.forEach(programNode -> {
-			FlowProgramFile flowProgramFile = programNode.getFlowProgramFile();
-			flowProgramFile.setProcessInstanceId(inst.getProcessInstanceId());
-			this.flowProgramFileService.save(flowProgramFile);
-
-			programNode.setFlowProgramFileId(flowProgramFile.getId());
-			this.ncNodeService.save(programNode);
-		});
-		log.info("鍚姩鍥哄寲娴佺▼瀹屾垚锛屽疄渚媔d={}", inst.getId());
-	}
-
-	/**
-	 * 濉厖鍘嗗彶瀹℃壒浜猴紝浠庤瘯鍒囨祦绋嬩腑鏌ユ壘
-	 * @param vars 鎵惧埌瀹℃壒浜哄悗濉厖鐨刴ap
-	 * @param historicTasks 鍘嗗彶浠诲姟闆嗗悎
-	 */
-	@Deprecated
-	void fillHistoryAssignees(Map<String, Object> vars,List<HistoricTaskInstance> historicTasks){
-		String programmer = null;
-		String checker = null;
-		String senior = null;
-
-		//鎵句笉鍒板伐鑹哄憳锛岄偅涔堟煡璇㈡渶鍚庝竴涓鎵圭殑宸ヨ壓鍛�
-
-		for (HistoricTaskInstance task : historicTasks) {
-			// 鑾峰彇浠诲姟鐨勫姙鐞嗕汉
-			if (task.getTaskDefinitionKey().equals("programmingTask")) {
-				//缂栧埗
-				if (programmer == null) {
-					programmer = task.getAssignee();
-				}
-			} else if (task.getTaskDefinitionKey().equals("check")) {
-				//鏍″
-				if (checker == null) {
-					checker = task.getAssignee();
-				}
-
-			} else if (task.getTaskDefinitionKey().equals("approveTask")) {
-				//瀹℃牳
-				if (senior == null) {
-					senior = task.getAssignee();
-				}
-			}
-
-		}
-
-		vars.put(FlowContants.PROGRAMMER,programmer);
-		vars.put(FlowContants.CHECKER,checker);
-		vars.put(FlowContants.SENIOR,senior);
-		vars.put(FlowContants.ASSIGNEE,programmer);
-	}
-
 	public void startCureNew(Map<Long, List<FlowProgramFile>> pkgIdFileMap) {
-		pkgIdFileMap.forEach((nodeId, fileList) -> {
-			this.startOneNew(nodeId,fileList);
-		});
-
+		pkgIdFileMap.forEach(this::startOneNew);
 	}
 
+	/**
+	 * 鍚姩涓�璋冪▼搴忕殑鍥哄寲娴佺▼
+	 * @param nodeId
+	 * @param fileList
+	 */
 	private void startOneNew(Long nodeId, List<FlowProgramFile> fileList) {
 		Map<String, Object> vars = new HashMap<>();
 		NcNode programPackage = this.ncNodeService.getById(nodeId);
@@ -174,6 +65,15 @@
 		vars.put(FlowContants.MACHINE_CODE,programPackage.getMachineCode());
 		//鏈哄簥鍨嬪彿
 		//vars.put(FlowContants.MACHINE_MODE,programPackage.getm);
+		//鏈哄簥鍨嬪彿
+		Machine machine = machineService.getByCode(programPackage.getMachineCode());
+		if(machine != null) {
+			vars.put(FlowContants.MACHINE_MODE,machine.getName());
+		}
+
+		String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(programPackage.getMachineCode());
+		vars.put(FlowContants.WORKSHOP,workshop);
+
 		vars.put(FlowContants.PROCESS_NO,programPackage.getProcessNo());
 		vars.put(FlowContants.PROCESS_NAME,programPackage.getProcessName());
 		vars.put(FlowContants.PROCESS_EDITION,programPackage.getProcessEdition());
@@ -186,14 +86,13 @@
 		vars.put(FlowContants.PROGRAM_PACKAGE_NAME,programPackage.getName());
 
 		ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(programPackage.getDrawingNo());
-		if(div != null) {
-			vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
-			vars.put(FlowContants.CHECKER,div.getCheckerId());
-			vars.put(FlowContants.SENIOR,div.getSeniorId());
-			vars.put(FlowContants.TEAM_LEADER,div.getTeamLeaderId());
+		vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
+		vars.put(FlowContants.CHECKER,div.getCheckerId());
+		vars.put(FlowContants.SENIOR,div.getSeniorId());
+		vars.put(FlowContants.TEAM_LEADER,div.getTeamLeaderId());
 
-			vars.put(FlowContants.ASSIGNEE,div.getProgrammerId());
-		}
+		vars.put(FlowContants.ASSIGNEE,div.getProgrammerId());
+
 
 		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
 
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 c19f79a..b2ff051 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
@@ -12,9 +12,13 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.mdm.basesetting.machine.MachineService;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
 import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.service.NodeDeptQueryService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -28,6 +32,8 @@
 	private final RuntimeService runtimeService;
 	private final HistoryService historyService;
 	private final ProduceDivisionService produceDivisionService;
+	private final NodeDeptQueryService nodeDeptQueryService;
+	private final MachineService machineService;
 	/**
 	 * 鏍规嵁娴佺▼瀹炰緥id鑾峰彇definitionKey
 	 * @param processInstanceId
@@ -76,6 +82,7 @@
 		}
 		programProperties.setCureProgramUseable(String.valueOf(vars.get(FlowContants.CURE_PROGRAM_USEABLE)));
 
+		programProperties.setProgrammerId(Func.toLong(vars.get(FlowContants.PROGRAMMER)));
 
 		ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
 			.processInstanceId(processInstanceId)
@@ -147,6 +154,35 @@
 
 		return div;
 	}
+
+	/**
+	 * 鏍规嵁绋嬪簭鍖呭悕鑺傜偣锛屽~鍏呭彉閲弇ap
+	 * @param vars
+	 * @param programPackageNode
+	 */
+	public void putFlowVariablesByNode(Map<String, Object> vars, NcNode programPackageNode){
+		//鏈哄簥缂栧彿
+		vars.put(FlowContants.MACHINE_CODE,programPackageNode.getMachineCode());
+		Machine machine = machineService.getByCode(programPackageNode.getMachineCode());
+		//鏈哄簥鍨嬪彿
+		if(machine != null) {
+			vars.put(FlowContants.MACHINE_MODE, machine.getName());
+		}
+		vars.put(FlowContants.PROCESS_NO,programPackageNode.getProcessNo());
+		vars.put(FlowContants.PROCESS_NAME,programPackageNode.getProcessName());
+		vars.put(FlowContants.PROCESS_EDITION,programPackageNode.getProcessEdition());
+		vars.put(FlowContants.CRAFT_EDITION,programPackageNode.getCraftEdition());
+
+		vars.put(FlowContants.DRAWING_NO,programPackageNode.getDrawingNo());
+		vars.put(FlowContants.DRAWING_NO_EDITION,programPackageNode.getDrawingNoEdition());
+
+		vars.put(FlowContants.PROGRAM_PACKAGE_NAME,programPackageNode.getName());
+
+		vars.put(FlowContants.PRODUCT_MODEL,programPackageNode.getProductModel());
+		vars.put(FlowContants.NODE_ID, programPackageNode.getId());
+		vars.put(FlowContants.WORKSHOP,nodeDeptQueryService.getWorkshopNameByMachineCode(programPackageNode.getMachineCode()));
+
+	}
 }
 
 
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 dbd3f3f..6795dd5 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
@@ -59,4 +59,7 @@
 
 	@Schema(description = "绋嬪簭鏄惁鍙敤鍒ゅ畾:Y/N")
 	private String cureProgramUseable;
+
+	@Schema(description = "缂栫▼鍛榠d")
+	private Long programmerId;
 }
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
index 2f15f49..a235061 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
@@ -10,12 +10,16 @@
 import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.flow.entity.FlowProgramFile;
 import org.springblade.mdm.program.entity.NcNode;
 import org.springblade.mdm.program.service.NcNodeService;
+import org.springblade.mdm.program.service.NodeDeptQueryService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @AllArgsConstructor
@@ -26,8 +30,9 @@
 	private final IdentityService identityService;
 	private final MachineService machineService;
 	private final ProduceDivisionService produceDivisionService;
-
-
+	private final NodeDeptQueryService nodeDeptQueryService;
+	private final FlowCommonService flowCommonService;
+	private final FlowProgramFileService flowProgramFileService;
 	/**
 	 * 鍚姩瑙i攣娴佺▼
 	 */
@@ -35,40 +40,40 @@
 	public void startUnlock(Long nodeId){
 		NcNode programPackage = nodeService.getById(nodeId);
 		Map<String, Object> vars = new HashMap<>();
+		flowCommonService.putFlowVariablesByNode(vars,programPackage);
 
 		ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(programPackage.getDrawingNo());
+		vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
+		vars.put(FlowContants.SENIOR,div.getSeniorId());
 		vars.put(FlowContants.ASSIGNEE,div.getSeniorId());//瀹℃壒鐢ㄦ埛:楂樺笀
 
 		vars.put(FlowContants.TITLE,programPackage.getName()+"绋嬪簭瑙i攣");
 
-		//鏈哄簥缂栧彿
-		vars.put(FlowContants.MACHINE_CODE,programPackage.getMachineCode());
-		Machine machine = machineService.getByCode(programPackage.getMachineCode());
-		//鏈哄簥鍨嬪彿
-		if(machine != null) {
-			vars.put(FlowContants.MACHINE_MODE, machine.getName());
-		}
-		vars.put(FlowContants.PROCESS_NO,programPackage.getProcessNo());
-		vars.put(FlowContants.PROCESS_NAME,programPackage.getProcessName());
-		vars.put(FlowContants.PROCESS_EDITION,programPackage.getProcessEdition());
-		vars.put(FlowContants.CRAFT_EDITION,programPackage.getCraftEdition());
-
-		vars.put(FlowContants.DRAWING_NO,programPackage.getDrawingNo());
-		vars.put(FlowContants.DRAWING_NO_EDITION,programPackage.getDrawingNoEdition());
-
-		vars.put(FlowContants.PROGRAM_PACKAGE_NAME,programPackage.getName());
-
-		vars.put(FlowContants.PRODUCT_MODEL,programPackage.getProductModel());
-		vars.put(FlowContants.NODE_ID, nodeId);
 		vars.put(FlowContants.MY_PROCESS_NAME,"瑙i攣娴佺▼");
 		vars.put("comment", "瑙i攣绋嬪簭"+programPackage.getName());
 		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
-		ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.REPLACE_PROCESS_KEY,nodeId+"",vars);
+		ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.UNLOCK_PROCESS_KEY,nodeId+"",vars);
 
 		programPackage.setProcessInstanceId(inst.getId());
 		this.nodeService.updateById(programPackage);
+
+		//鏇存柊鑺傜偣鏂囦欢鐨勬祦绋嬪疄渚媔d
+
+		updateFlowProgramFilesProcessInstance(programPackage);
 	}
 
+	/**
+	 * 鏇存柊鎵�灞炴祦绋嬫枃浠剁殑娴佺▼瀹炰緥id
+	 * @param programPackage 瑕佽В閿佺殑绋嬪簭鎶ュ悕鑺傜偣
+	 */
+	void updateFlowProgramFilesProcessInstance(NcNode programPackage){
+		List<NcNode> fileNodes = nodeService.getProgramFilesByPackageId(programPackage.getId());
+		List<Long> fileIds = fileNodes.stream().map(NcNode::getFlowProgramFileId).toList();
+		if(!fileIds.isEmpty()){
+			flowProgramFileService.lambdaUpdate().in(FlowProgramFile::getId, fileIds)
+				.set(FlowProgramFile::getProcessInstanceId, programPackage.getProcessInstanceId()).update();
+		}
+	}
 }
 
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
index 7826e15..5b475ee 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java
@@ -53,7 +53,7 @@
 	private final NodeDeptQueryService nodeDeptQueryService;
 	private final FlowCommonService flowCommonService;
 	private final OssTemplate ossTemplate;
-
+	private final MachineService machineService;
 
 	/**
 	 * 鍑嗗鏇挎崲娴佺▼闇�瑕佺殑鏁版嵁
@@ -109,22 +109,23 @@
 	 */
 	@Transactional
 	public void start(ReplaceFlowStartVO startVO){
-
-
 		NcNode programPackage = nodeService.getById(startVO.getNodeId());
 
 		Map<String, Object> vars = new HashMap<>();
+
+		flowCommonService.putFlowVariablesByNode(vars,programPackage);
 		flowCommonService.putDefaultAssignees(vars,programPackage.getDrawingNo(),startVO.getAssignee()+"");
 
 		vars.put(FlowContants.TITLE,startVO.getTitle());
-
+		//浠ヤ笅琚玣lowCommonService.putFlowVariablesByNode(vars,programPackage);浠f浛浜�
+		/*
 		//鏈哄簥缂栧彿
 		vars.put(FlowContants.MACHINE_CODE,programPackage.getMachineCode());
-		//Machine machine = machineService.getByCode(programPackge.getMachineCode());
+		Machine machine = machineService.getByCode(programPackage.getMachineCode());
 		//鏈哄簥鍨嬪彿
-		//if(machine != null) {
-			//vars.put(FlowContants.MACHINE_MODE, programPackge.getMachineMode());
-		//}
+		if(machine != null) {
+			vars.put(FlowContants.MACHINE_MODE, machine.getName());
+		}
 		vars.put(FlowContants.PROCESS_NO,programPackage.getProcessNo());
 		vars.put(FlowContants.PROCESS_NAME,programPackage.getProcessName());
 		vars.put(FlowContants.PROCESS_EDITION,programPackage.getProcessEdition());
@@ -137,12 +138,15 @@
 
 		vars.put(FlowContants.PRODUCT_MODEL,programPackage.getProductModel());
 		vars.put(FlowContants.NODE_ID, startVO.getNodeId());
-
+		vars.put(FlowContants.WORKSHOP,nodeDeptQueryService.getWorkshopNameByMachineCode(programPackage.getMachineCode()));
+		*/
 		vars.put("comment", startVO.getComment());
+		vars.put(FlowContants.MY_PROCESS_NAME,"鏇挎崲娴佺▼");
 		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
 		ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.REPLACE_PROCESS_KEY,startVO.getNodeId()+"",vars);
-		//replaceProgramFileService.lambdaUpdate().eq(ReplaceProgramFile::getTempId,startVO.getTempId()).set(ReplaceProgramFile::getProcessInstanceId,inst.getProcessInstanceId());
-
+		//鏇存柊鑺傜偣鐨勬祦绋媔d锛岄伩鍏嶉噸澶嶅彂璧锋祦绋�
+		programPackage.setProcessInstanceId(inst.getId());
+		this.nodeService.updateById(programPackage);
 		/*
 		Task startTask = taskService.createTaskQuery()
 			.processInstanceId(inst.getId())
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
index a3152e3..6965f41 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java
@@ -3,7 +3,6 @@
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
-import org.checkerframework.checker.units.qual.N;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.model.BladeFile;
@@ -47,8 +46,6 @@
 	private final ProgramAnnotationService programAnnotationService;
 	private final MachineService machineService;
 
-	public static final String GH = "GH";
-
 
 	/**
 	 * 榛樿鏈夋晥鏈熼棿锛堟湀鏁帮級,2骞�
@@ -77,13 +74,15 @@
 		NcNode pkgNode =  nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId, processInstanceId).one();
 		if(pkgNode.isDeviationProgram()){
 			//鍋忕鐨勭▼搴忕洿鎺ラ攣瀹�
-			pkgNode.setIsLocked(1);
+			//pkgNode.setIsLocked(1);
+			pkgNode.lock();
 			nodeService.updateById(pkgNode);
 		}else {
 			//璇曞垏鐨�
 			pkgNode.setIsCured(1);
+			pkgNode.setIsLocked(NcNode.UNLOCK);
 			//璁剧疆杩囨湡鏃ユ湡
-			pkgNode.upgradeVersionNUmber();
+			pkgNode.upgradeVersionNumber();
 			pkgNode.setExpireDate(calculateExpireDate());
 			nodeService.updateById(pkgNode);
 
@@ -101,9 +100,13 @@
 		//鍒涘缓鑺傜偣鍒版満搴婄骇鍒�.(鍥哄寲鏍�)
 		NcNode machineNode = ncNodeAutoCreateService.createNodeTreeToMachine(programProperties);
 
+		pkgNode.setParentId(machineNode.getParentId());
+		pkgNode.setParentIds(machineNode.getParentIds());//鏇存柊涓婄骇鑺傜偣锛屼笅闈㈣繕瑕佺敤搴斾负鍦╤istoryProgramPackageNodes涓殑鍜岃繖涓笉鏄竴涓疄渚�
 		//鏈哄簥涓嬬幇鍦ㄦ病鏈夋枃浠朵簡锛岀▼搴忓寘鍚嶅崌绾т笌鏈哄簥鍚岀骇浜嗭紝鏀逛负鎵惧埌鏈哄簥鍚岀骇绋嬪簭鍖呭悕鏇存柊浜�
+		//TODO 杩欎釜parentIds鏄笉鏄笉澶燂紵锛屼笉澶燂紝涓�涓満搴婁笅澶氫釜绋嬪簭鍖呯殑鎯呭喌涓嶈鍚э紝浣嗘槸鎸夌収鏍戯紝澶氫釜绋嬪簭鍖呬笉澶幇瀹�
 		this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, machineNode.getParentIds())
 			.in(NcNode::getNodeType, Arrays.asList(NcNode.TYPE_PROGRAM_PACKAGE,NcNode.TYPE_PROGRAM_FILE))
+			.ne(NcNode::getId,pkgNode.getId())//涓嶈鏇存柊鏂板浐鍖栫殑鑺傜偣new
 			.set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
 
 		for(NcNode hisPackageNode : historyProgramPackageNodes){
@@ -113,7 +116,7 @@
 			hisPackageNode.setParentId(machineNode.getParentId());
 			hisPackageNode.setParentIds(machineNode.getParentIds());//绋嬪簭鍖呬笌鏈哄簥鑺傜偣鍚岀骇
 
-			//澶勭悊绋嬪簭鍖呬笅灞傜殑绋嬪簭鑺傜偣
+			//澶勭悊绋嬪簭鍖呬笅灞傜殑绋嬪簭鑺傜偣111
 			List<NcNode> programNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,hisPackageNode.getId()).list();
 			for(NcNode programNode : programNodes){
 				programNode.setIsLastEdition(0);
@@ -132,6 +135,12 @@
 			newProgNode.setName(flowProgramFile.getName());
 			newProgNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
 			newProgNode.setParentId(pkgNode.getId());
+			newProgNode.setDrawingNo(pkgNode.getDrawingNo());
+			newProgNode.setDrawingNoEdition(pkgNode.getDrawingNoEdition());
+			newProgNode.setMachineCode(pkgNode.getMachineCode());
+			newProgNode.setProcessEdition(pkgNode.getProcessEdition());
+			newProgNode.setProcessName(pkgNode.getProcessName());
+			newProgNode.setProcessNo(pkgNode.getProcessNo());
 			newProgNode.setParentIds(pkgNode.getParentIds()+","+pkgNode.getId());
 			newProgNode.setIsLastEdition(1);
 			newProgNode.setVersionNumber(pkgNode.getVersionNumber());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
index d5d081a..79562d7 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -211,7 +211,7 @@
 		return this.isCured != null && this.isCured == 1;
 	}
 
-	public void upgradeVersionNUmber() {
+	public void upgradeVersionNumber() {
 		this.versionNumber = genNewVersionNumber();
 	}
 
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
index 012d0b4..d23c063 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramApproved.java
@@ -36,4 +36,9 @@
 	 */
 	private String title;
 
+	/**
+	 * 鍙樻垚鍛榠d
+	 */
+	private Long programmerId;
+
 }
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 c96009d..4e00615 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
@@ -58,6 +58,7 @@
 	private final BladeRedis bladeRedis;
 	private final FlowCommonService flowCommonService;
 	private final DncBackFileService dncBackFileService;
+	private final ProgramFlowStatusQueryService programFlowStatusQueryService;
 	private String getFileKey(){
 		return "dncimpfile-"+ AuthUtil.getUserId();
 	}
@@ -254,7 +255,7 @@
 				//鏍规嵁鑺傜偣淇℃伅鏌ヨ娴佺▼
 				boolean active = flowCommonService.isProcessInstanceActive(packageNode.getProcessInstanceId());
 				if(active){
-					throw new ServiceException(programPackageName+"姝e湪瀹℃壒涓紝璇峰嬁閲嶅鍏ュ簱銆�");
+					throw new ServiceException(programPackageName+"姝e湪瀹℃壒涓紝璇峰嬁绛夊緟瀹℃壒瀹屾垚銆�");
 				}
 
 				//楠岃瘉閮借繃浜嗭紝淇濆瓨dncbackFile
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
index 6309024..2e9380f 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -224,7 +224,7 @@
 	 */
     public List<NcNode> getNodeHistory(NcNode pkgNode) {
 		return this.lambdaQuery().eq(NcNode::getParentId,pkgNode.getParentId())
-			.eq(NcNode::getName,pkgNode.getName()).list();
+			.eq(NcNode::getName,pkgNode.getName()).list();//.ne(NcNode::getId,pkgNode.getId())
     }
 
 	/**
@@ -306,7 +306,7 @@
 	@Transactional
 	public void upgradeVersionNumber(Long nodeId) {
 		NcNode node = this.getById(nodeId);
-		node.upgradeVersionNUmber();
+		node.upgradeVersionNumber();
 		this.updateById(node);
 
 	}
diff --git a/blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml
index 32cc547..bded29f 100644
--- a/blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml
@@ -12,10 +12,10 @@
     <sequenceFlow id="sid-030b6e4b-640a-41aa-a536-ddf9fb485ac1" sourceRef="unlockStart" targetRef="unlockApproveTask"/>
     <userTask id="unlockProgramConfirm" name="缂栧埗澶嶆牳" flowable:assignee="${assignee}"/>
     <sequenceFlow id="sid-eef79355-70bc-4610-aece-b1aed2f9876a" sourceRef="unlockApproveTask" targetRef="unlockApproveEnd">
-      <conditionExpression>{approve=='Y'}</conditionExpression>
+      <conditionExpression>${approve=='Y'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-be770b3a-d711-45df-8477-fdd73b84d85b" sourceRef="unlockApproveTask" targetRef="unlockProgramConfirm">
-      <conditionExpression>{approve=='N'}</conditionExpression>
+      <conditionExpression>${approve=='N'}</conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="sid-5a3d8229-b648-424a-a0f4-f356082d5375" sourceRef="unlockProgramConfirm" targetRef="exceptionHandleScriptTask">
       <conditionExpression>${approve=='N'}</conditionExpression>
@@ -23,7 +23,7 @@
     <sequenceFlow id="sid-185054ce-c200-475e-8128-2369554b05cf" sourceRef="unlockProgramConfirm" targetRef="unlockApproveTask">
       <conditionExpression>${approve=='Y'}</conditionExpression>
     </sequenceFlow>
-    <scriptTask id="exceptionHandleScriptTask" scriptFormat="JavaScript">
+    <scriptTask id="exceptionHandleScriptTask" scriptFormat="groovy">
       <script><![CDATA[
           execution.setVariable("exception", "1");//璁剧疆寮傚父鏍囧織
         ]]></script>

--
Gitblit v1.9.3