From 8db9b68d0bf4b7ec2e80b580f5931a40788caac7 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期六, 16 八月 2025 21:48:46 +0800
Subject: [PATCH] 替换流程bug修复

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java        |   43 +++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/unlock/UnlockFinishListener.java |   52 ++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java                       |    3 
 blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml                       |   66 +++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java            |   23 +++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java             |    9 
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java             |    6 +
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ReplaceFlowService.java           |   46 ++-----
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java              |   66 +++++++++++
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java                     |    4 
 10 files changed, 280 insertions(+), 38 deletions(-)

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
new file mode 100644
index 0000000..5a2b651
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/LockFlowController.java
@@ -0,0 +1,43 @@
+package org.springblade.mdm.flow.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.api.R;
+import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
+import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
+import org.springblade.mdm.flow.service.LockFlowService;
+import org.springblade.mdm.flow.service.ReplaceFlowService;
+import org.springblade.mdm.flow.vo.ReplaceFlowStartVO;
+import org.springblade.mdm.flow.vo.ReplaceUploadVO;
+import org.springblade.mdm.program.vo.NcNodeVO;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/flow/lock")
+@Tag(name = "鏇挎崲娴佺▼", description = "鏇挎崲娴佺▼")
+public class LockFlowController {
+	private final LockFlowService replaceFlowService;
+
+
+	/**
+	 * 鍙戣捣瑙i攣娴佺▼
+	 */
+	@PostMapping("/start-unlock")
+	@Operation(summary = "鍙戣捣瑙i攣娴佺▼", description = "鍙戣捣瑙i攣娴佺▼")
+	public R<Boolean> start(@Parameter(description = "绋嬪簭鍖呭悕 鑺傜偣鐨刬d") Long nodeId,@Parameter(description = "澶勭悊浜篿d")String assingee) {
+		try {
+			replaceFlowService.startUnlock(nodeId,assingee);
+			return R.data(true);
+		}catch(Exception e){
+			log.error("鍙戣捣绋嬪簭鏇挎崲閿欒",e);
+			return R.fail(e.getMessage());
+		}
+
+	}
+
+}
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 c0f3859..f85c9bd 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
@@ -11,6 +11,7 @@
 import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
+import org.springblade.mdm.flow.service.FlowCommonService;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.vo.TaskAssignVO;
 import org.springblade.mdm.program.entity.NcNode;
@@ -40,7 +41,7 @@
 	private final FlowProgramFileService flowProgramFileService;
 	private final NodeDeptQueryService nodeDeptQueryService;
 	private final ProduceDivisionService produceDivisionService;
-
+	private final FlowCommonService flowCommonService;
 
 	/**
 	 * 鍚姩娲惧伐娴佺▼
@@ -50,9 +51,9 @@
 	@Transactional
 	public String start(TaskAssignVO startVO){
 		Map<String, Object> vars = new HashMap<>();
-		//Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO);
-		this.putDefaultAssignees(vars,startVO.getDrawingNo());
-
+		//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.MACHINE_CODE,startVO.getMachineCode());
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/unlock/UnlockFinishListener.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/unlock/UnlockFinishListener.java
new file mode 100644
index 0000000..6bbdd02
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/unlock/UnlockFinishListener.java
@@ -0,0 +1,52 @@
+package org.springblade.mdm.flow.excution.unlock;
+
+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.FlowProgramFileService;
+import org.springblade.mdm.flow.service.ReplaceFlowService;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.entity.NcProgramApproved;
+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;
+
+/**
+ * 瑙i攣瀹屾垚鎵ц鐨勪簨浠讹紝鍔熻兘锛氭彃鍏ュ鎵硅〃鏁版嵁
+ */
+@Slf4j
+@Component("unlockFinishListener")
+public class UnlockFinishListener {
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private ApproveRecordService approveRecordService;
+	@Autowired
+	private FlowProgramFileService flowProgramFileService;
+	@Autowired
+	private NcProgramApprovedService ncProgramApprovedService;
+	@Autowired
+	private NcNodeService ncNodeService;
+	/**
+	 * 鍦ㄦ祦绋嬬粨鏉熸椂鑷姩璋冪敤,锛堥厤缃湪瀹℃壒缁撴潫浜嬩欢鐨別xecutelistener涓簡锛�
+	 * @param execution 鎵ц瀵硅薄
+	 */
+	public void handle(DelegateExecution execution) {
+		// 鎵ц涓氬姟閫昏緫
+		String instId = execution.getProcessInstanceId();
+		Long nodeId = runtimeService.getVariable(execution.getId(),ReplaceFlowService.NODE_ID,Long.class);
+
+		this.ncNodeService.unlock(nodeId);
+	}
+
+}
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 0a39ee5..c19f79a 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
@@ -1,5 +1,6 @@
 package org.springblade.mdm.flow.service;
 
+import com.alibaba.excel.util.StringUtils;
 import lombok.AllArgsConstructor;
 import org.flowable.engine.HistoryService;
 import org.flowable.engine.RuntimeService;
@@ -11,6 +12,8 @@
 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.producedivision.entity.ProduceDivision;
+import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
 import org.springblade.mdm.flow.constants.FlowContants;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -24,7 +27,7 @@
 public class FlowCommonService {
 	private final RuntimeService runtimeService;
 	private final HistoryService historyService;
-
+	private final ProduceDivisionService produceDivisionService;
 	/**
 	 * 鏍规嵁娴佺▼瀹炰緥id鑾峰彇definitionKey
 	 * @param processInstanceId
@@ -126,6 +129,24 @@
 		}
 		return assignee;
     }
+
+	/**
+	 * 灏嗛粯璁ゅ鎵圭敤鎴锋斁鍏ap涓�
+	 * @param vars 鍚姩娴佺▼鐨勫彉閲弇ap
+	 * @param drawingNo 闆剁粍浠跺彿
+	 */
+	public ProduceDivision putDefaultAssignees(Map<String, Object> vars,String drawingNo,String defaultAssignee){
+		ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(drawingNo);
+		vars.put(FlowContants.TEAM_LEADER,div.getTeamLeaderId());
+		vars.put(FlowContants.PROGRAMMER,div.getProgrammerId());
+		vars.put(FlowContants.CHECKER,div.getCheckerId());
+		vars.put(FlowContants.SENIOR,div.getSeniorId());
+		if(StringUtils.isNotBlank(defaultAssignee)) {
+			vars.put(FlowContants.ASSIGNEE, defaultAssignee);//绗竴涓鎵圭敤鎴凤細缁勯暱
+		}
+
+		return div;
+	}
 }
 
 
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
new file mode 100644
index 0000000..3b45487
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/LockFlowService.java
@@ -0,0 +1,66 @@
+package org.springblade.mdm.flow.service;
+
+import lombok.AllArgsConstructor;
+import org.flowable.engine.IdentityService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.mdm.flow.constants.FlowContants;
+import org.springblade.mdm.program.entity.NcNode;
+import org.springblade.mdm.program.service.NcNodeService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@AllArgsConstructor
+@Service
+public class LockFlowService {
+	private final NcNodeService nodeService;
+	private final RuntimeService runtimeService;
+	private final IdentityService identityService;
+	public static final String NODE_ID = "nodeId";
+
+
+	/**
+	 * 鍚姩瑙i攣娴佺▼
+	 */
+	@Transactional
+	public void startUnlock(Long nodeId,String assignee){
+		NcNode programPackage = nodeService.getById(nodeId);
+		Map<String, Object> vars = new HashMap<>();
+		vars.put(FlowContants.ASSIGNEE,assignee);//绗竴涓鎵圭敤鎴�
+
+		vars.put(FlowContants.TITLE,programPackage.getName()+"绋嬪簭鏇挎崲");
+
+		//鏈哄簥缂栧彿
+		vars.put(FlowContants.MACHINE_CODE,programPackage.getMachineCode());
+		//Machine machine = machineService.getByCode(programPackge.getMachineCode());
+		//鏈哄簥鍨嬪彿
+		//if(machine != null) {
+			//vars.put(FlowContants.MACHINE_MODE, programPackge.getMachineMode());
+		//}
+		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(NODE_ID, nodeId);
+
+		vars.put("comment", "add on start");
+		identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//璁剧疆娴佺▼鍙戣捣浜�
+		ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.REPLACE_PROCESS_KEY,nodeId+"",vars);
+
+
+	}
+
+}
+
+
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 1c24bcc..e9f4404 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
@@ -14,6 +14,8 @@
 import org.springblade.core.secure.utils.AuthUtil;
 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.flow.entity.FlowProgramFile;
 import org.springblade.mdm.flow.entity.ReplaceProgramFile;
@@ -47,39 +49,12 @@
 	private final TaskService taskService;
 	private final IdentityService identityService;
 	private final FlowProgramFileService flowProgramFileService;
-	private final ReplaceProgramFileService replaceProgramFileService;
 	private final ProgramFlowStatusQueryService flowStatusQueryService;
 	private final NodeDeptQueryService nodeDeptQueryService;
-	private OssTemplate ossTemplate;
+	private final FlowCommonService flowCommonService;
+	private final OssTemplate ossTemplate;
 	public static final String NODE_ID = "nodeId";
-	/**
-     * 杞淳锛屽苟璁板綍鑷繁鐨勫娉ㄤ俊鎭�
-	 * @param nodeId 鏇挎崲鐨勮妭鐐筰d
-	 */
-	/*
-	@Transactional
-	public void prestart(long nodeId,String tempInstanceId) {
-		List<NcNode> fileNodes = nodeService.lambdaQuery()
-			.eq(NcNode::getParentId, nodeId)
-			.eq(NcNode::getIsLastEdition,1)
-			.eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_FILE).list();
-		List<Long> fileIds = fileNodes.stream().map(NcNode::getFlowProgramFileId).toList();
 
-		List<FlowProgramFile> programFiles = flowProgramFileService.lambdaQuery()
-			.in(FlowProgramFile::getId, fileIds).list();
-
-
-		//灏嗙幇鏈夋枃浠跺鍒跺埌鐙珛鐨勮〃涓紝鍚庣画浣滀负瀹℃壒鐨勬枃浠讹紝瀹℃壒鐣岄潰璋冪敤鐨勬帴鍙d篃涓嶅悓锛屾渶濂藉崟鐙紑鍙�
-		for(FlowProgramFile programFile : programFiles) {
-			FlowProgramFile newFile = new FlowProgramFile();
-			BeanUtils.copyProperties(programFile, newFile);
-			EntityUtil.clearBaseProperties(newFile);
-			newFile.setProcessInstanceId(tempInstanceId);
-			flowProgramFileService.save(newFile);
-		}
-	}
-
-	 */
 
 	/**
 	 * 鍑嗗鏇挎崲娴佺▼闇�瑕佺殑鏁版嵁
@@ -136,11 +111,14 @@
 	@Transactional
 	public void start(ReplaceFlowStartVO startVO){
 
+
+		NcNode programPackage = nodeService.getById(startVO.getNodeId());
+
 		Map<String, Object> vars = new HashMap<>();
-		vars.put(FlowContants.ASSIGNEE,startVO.getAssignee());//绗竴涓鎵圭敤鎴�
+		flowCommonService.putDefaultAssignees(vars,programPackage.getDrawingNo(),startVO.getAssignee()+"");
 
 		vars.put(FlowContants.TITLE,startVO.getTitle());
-		NcNode programPackage = nodeService.getById(startVO.getNodeId());
+
 		//鏈哄簥缂栧彿
 		vars.put(FlowContants.MACHINE_CODE,programPackage.getMachineCode());
 		//Machine machine = machineService.getByCode(programPackge.getMachineCode());
@@ -181,13 +159,13 @@
 	}
 
 
+
 	/**
 	 * 涓婁紶绋嬪簭寰愭枃浠讹紙缂栧埗鑺傜偣璋冪敤锛�
 	 * @param uploadVO 涓婁紶瀵硅薄
 	 */
 	public void uploadReplaceProgramFile(ReplaceUploadVO uploadVO) {
 
-		//FlowProgramProperties progProps= flowCommonService.getProgramProperties(uploadVO.getProcessInstanceId());
 		MultipartFile file = uploadVO.getFile();
 		if(file.getSize() == 0){
 			throw new ServiceException("绋嬪簭鏂囦欢涓嶅彲涓虹┖鏂囦欢");
@@ -196,8 +174,10 @@
 		progProps.setDrawingNo(uploadVO.getDrawingNo());
 		progProps.setProcessNo(uploadVO.getProcessNo());
 		progProps.setProcessEdition(uploadVO.getProcessEdition());
+		if(FlowProgramFile.TYPE_PROGRAM.equals(uploadVO.getFileType())) {
+			ProgramFileNameCheckUtil.checkFilename(file.getOriginalFilename(),progProps);
+		}
 
-		ProgramFileNameCheckUtil.checkFilename(file.getOriginalFilename(),progProps);
 
 		String programName = NcNodeService.genProgramName(progProps.getDrawingNo(),progProps.getProcessNo());
 
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 40767ff..d5d081a 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
@@ -221,4 +221,8 @@
 	public void lock() {
 		this.isLocked = LOCKED;
 	}
+
+	public void unlock() {
+		this.isLocked = UNLOCK;
+	}
 }
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 158b002..6309024 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
@@ -321,4 +321,10 @@
 		node.lock();
 		this.updateById(node);
     }
+	@Transactional
+	public void unlock(Long id) {
+		NcNode node = this.getById(id);
+		node.unlock();
+		this.updateById(node);
+	}
 }
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 70f4fb8..8e1535f 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
@@ -54,6 +54,9 @@
 	private Integer isCured;
 	@Schema(description = "鏄惁鏈�鏂扮増鏈�")
 	private Integer isLastEdition;
+
+	@Schema(description = "鏄惁閿佸畾")
+	private Integer isLocked = 0;
 	@Schema(description = "鐗堟湰鍙�,绋嬪簭鍖呭悕鑺傜偣鐨勫睘鎬�")
 	private Integer versionNumber;
 	@Schema(description = "娴佺▼鐘舵��,绋嬪簭鍖呭悕鑺傜偣鐨勫睘鎬�")
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
new file mode 100644
index 0000000..1e72f6a
--- /dev/null
+++ b/blade-service/blade-mdm/src/main/resources/processesbpmn/program-unlock.bpmn20.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
+  <process id="program-unlock" name="program-unlock" isExecutable="true">
+    <startEvent id="sid-69b14c2b-2d00-4e49-a5f8-67f6f60a8a03"/>
+    <endEvent id="unlockApproveEnd">
+        <extensionElements>
+            <flowable:executionListener expression="${unlockFinishListener.handle(execution)}" event="end"/>
+        </extensionElements>
+    </endEvent>
+    <endEvent id="sid-cac1097c-7a5c-4452-8b5d-551b01e03f67"/>
+    <userTask id="unlockApproveTask" flowable:assignee="${assignee}" name="楂樺笀瀹℃牳"/>
+    <sequenceFlow id="sid-030b6e4b-640a-41aa-a536-ddf9fb485ac1" sourceRef="sid-69b14c2b-2d00-4e49-a5f8-67f6f60a8a03" 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>
+    </sequenceFlow>
+    <sequenceFlow id="sid-be770b3a-d711-45df-8477-fdd73b84d85b" sourceRef="unlockApproveTask" targetRef="unlockProgramConfirm">
+      <conditionExpression>{approve=='N'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-5a3d8229-b648-424a-a0f4-f356082d5375" sourceRef="unlockProgramConfirm" targetRef="sid-cac1097c-7a5c-4452-8b5d-551b01e03f67">
+      <conditionExpression>${approve=='N'}</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="sid-185054ce-c200-475e-8128-2369554b05cf" sourceRef="unlockProgramConfirm" targetRef="unlockApproveTask">
+      <conditionExpression>${approve=='Y'}</conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_program-unlock">
+    <bpmndi:BPMNPlane bpmnElement="program-unlock" id="BPMNPlane_program-unlock">
+      <bpmndi:BPMNShape id="shape-0d3745b5-d492-4430-bfb3-975eac8a9852" bpmnElement="sid-69b14c2b-2d00-4e49-a5f8-67f6f60a8a03">
+        <omgdc:Bounds x="-180.0" y="-75.0" width="30.0" height="30.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape-9544d391-52f3-44d0-a3d0-1461593102f9" bpmnElement="unlockApproveEnd">
+        <omgdc:Bounds x="105.0" y="-90.0" width="30.0" height="30.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape-37a910c4-327e-4273-a60e-22de9f892bd9" bpmnElement="sid-cac1097c-7a5c-4452-8b5d-551b01e03f67">
+        <omgdc:Bounds x="55.0" y="10.0" width="30.0" height="30.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape-0eb28127-9a0b-4308-996a-9f19a0943921" bpmnElement="unlockApproveTask">
+        <omgdc:Bounds x="-70.0" y="-100.0" width="70.0" height="50.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-d5bed6a4-0499-4c91-aa94-3cfa5ddfb5bb" bpmnElement="sid-030b6e4b-640a-41aa-a536-ddf9fb485ac1">
+        <omgdi:waypoint x="-150.0" y="-67.5"/>
+        <omgdi:waypoint x="-70.0" y="-87.5"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="shape-d54efb68-e798-45b5-a892-e75a5be60f08" bpmnElement="unlockProgramConfirm">
+        <omgdc:Bounds x="-155.0" y="-5.0" width="65.0" height="60.0"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="edge-a82c55eb-2bf4-4c8f-be88-07467b081f86" bpmnElement="sid-eef79355-70bc-4610-aece-b1aed2f9876a">
+        <omgdi:waypoint x="0.0" y="-75.0"/>
+        <omgdi:waypoint x="105.0" y="-75.0"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-50638e38-39b8-4127-8992-b0efb6e0f1da" bpmnElement="sid-be770b3a-d711-45df-8477-fdd73b84d85b">
+        <omgdi:waypoint x="-70.0" y="-62.5"/>
+        <omgdi:waypoint x="-106.25" y="-5.0"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-2a037d18-24db-4d77-8cdb-40033885876d" bpmnElement="sid-5a3d8229-b648-424a-a0f4-f356082d5375">
+        <omgdi:waypoint x="-90.0" y="25.0"/>
+        <omgdi:waypoint x="55.0" y="25.0"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge-bc8f223a-1a63-4206-b55d-f168040d127a" bpmnElement="sid-185054ce-c200-475e-8128-2369554b05cf">
+        <omgdi:waypoint x="-90.0" y="10.0"/>
+        <omgdi:waypoint x="-52.5" y="-50.0"/>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

--
Gitblit v1.9.3