From 3baca21e0e6563f8379359ef2ba78c224eb4bc80 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期二, 23 九月 2025 22:45:51 +0800
Subject: [PATCH] 修复审批表,确认表内容

---
 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java |  217 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 129 insertions(+), 88 deletions(-)

diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
index 9f14712..6cd2f89 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -1,23 +1,32 @@
 package org.springblade.mdm.flow.excution.dispatch;
 
+import com.alibaba.excel.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.mdm.flow.constants.FlowContants;
-import org.springblade.mdm.flow.entity.ApproveRecord;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.springblade.core.oss.OssTemplate;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.mdm.basesetting.machine.entity.Machine;
+import org.springblade.mdm.basesetting.machine.service.MachineService;
+import org.springblade.mdm.flow.constants.FlowConstant;
 import org.springblade.mdm.flow.entity.FlowProgramFile;
-import org.springblade.mdm.flow.service.ApproveRecordService;
+import org.springblade.mdm.flow.excution.ListenerHelper;
 import org.springblade.mdm.flow.service.FlowProgramFileService;
 import org.springblade.mdm.flow.service.FlowProgramProperties;
+import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
 import org.springblade.mdm.program.entity.NcNode;
-import org.springblade.mdm.program.entity.NcProgramApproved;
 import org.springblade.mdm.program.service.NcNodeAutoCreateService;
+import org.springblade.mdm.program.service.NcNodeHisService;
 import org.springblade.mdm.program.service.NcNodeService;
-import org.springblade.mdm.program.service.NcProgramApprovedService;
-import org.springblade.mdm.utils.EntityUtil;
+import org.springblade.mdm.program.service.programannotation.*;
+import org.springblade.mdm.utils.ProgramFileNameParser;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -27,111 +36,143 @@
 @Component("normalDispatchFinishDataHandler")
 public class NormalFinishDataHandler implements FinishDataHandler{
 	@Autowired
-	private NcProgramApprovedService approvedService;
-	@Autowired
-	private ApproveRecordService approveRecordService;
-	@Autowired
 	private FlowProgramFileService flowProgramFileService;
+	@Autowired
+	private MachineAnnotationConfig annotationConfig;
+	@Autowired
+	private MachineService machineService;
 	@Autowired
 	private NcNodeService ncNodeService;
 	@Autowired
 	private NcNodeAutoCreateService ncNodeAutoCreateService;
+	@Autowired
+	private ListenerHelper listenerHelper;
+	@Autowired
+	private OssTemplate ossTemplate;
+	@Autowired
+	private NcNodeHisService ncNodeHisService;
+
 	/**
 	 * DispatchFinishListener涓皟鐢�
-	 * @param props 鎵ц瀵硅薄
+	 * @param props 娴佺▼灞炴��
 	 */
-	public void handleData(FlowProgramProperties props) {
+	public void handleData(FlowProgramProperties props) throws IOException {
 		// 鎵ц涓氬姟閫昏緫
-		String instId = props.getProcessInstanceId();
-
-		String programPkgName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
-		createProgramNodes(props);
-		//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);
+		if(FlowConstant.Y.equals(props.getHasCuredProgram())){
+			//鏈夊浐鍖�
+			packageNode = ncNodeService.getById(props.getCuredNodeId());
+
+			if(FlowConstant.N.equals(props.getCureProgramUseable())) {
+				//绋嬪簭涓嶅彲鐢紝鍘熸潵鐨勫浐鍖栬妭鐐归攣瀹�
+				packageNode.lock();
+				ncNodeService.updateById(packageNode);
+
+				//鐗堟湰鍙锋牴鎹浂缁勪欢鍙�+宸ュ簭鍙凤紝宸ュ簭鐗堟锛屾満搴婄粍 鐩存帴鏌ヨ鏁伴噺锛�+1鑾峰彇
+				Integer newVersion = ncNodeHisService.calculateVersionNumber(packageNode);
+				packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props);
+				packageNode.setVersionNumber(newVersion);
+				ncNodeService.updateById(packageNode);
+			}else{
+				//鍙敤锛岀┖鍗囩増锛堜慨鏀瑰叾宸ュ簭鐗堟锛夛紝鍘熸潵鐨勮妭鐐规竻闄�
+				moveToNewProcessEdition(packageNode,props);
+				//鏇存柊宸插浐鍖栫殑锛屽悓鍚嶃�佷笉鍚屾満搴婄粍鐨勭▼搴忎负閿佸畾鐘舵��
+				ncNodeService.lockSameNameOtherMachineGroupProgramPackage(packageNode);
+			}
 		}else{
-			//鏅�氳瘯鍒囷紝鎴栬�呮湁鍥哄寲涓嶅彲鐢�
-			packageNode = ncNodeService.getLastEditionTryingProgramPackage(programPkgName);
+			//鏅�氳瘯鍒�/涓存椂鏇存敼鍗�
+			packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props);
+			Integer newVersion = ncNodeHisService.calculateVersionNumber(packageNode);
+			long hisSerial = ncNodeService.calculateHistorySerial(packageNode);
+			packageNode.setHisSerial(hisSerial);
+			packageNode.setVersionNumber(newVersion);
+			ncNodeService.updateById(packageNode);
 		}
 
-		addApproveTable(packageNode,props);
-		updateApproveRecordNodeId(instId, packageNode.getId());
+		listenerHelper.addApproveTable(packageNode,props);
+
 		log.info("鏅�氭祦绋嬪凡瀹屾垚in DispatchFinishListener");
 	}
 
 	/**
-	 * 鑷姩鍒涘缓绋嬪簭鑺傜偣
-	 * @param progProperties 娴佺▼灞炴��
+	 * 鑺傜偣绉诲姩鍒版柊鐨勫伐搴忕増鏈笅
+	 * @param packageNode 绋嬪簭鍖呭悕鑺傜偣
+	 * @param props 娴佺▼灞炴��
 	 */
-	void createProgramNodes(FlowProgramProperties progProperties){
-		if(FlowContants.N.equals(progProperties.getHasCuredProgram())) {
-			//鏃犲浐鍖�(璇曞垏鎴栬�呭亸绂�)
-			ncNodeAutoCreateService.createNodeTreeWithProgram(progProperties);
-		}else{
-			//鏈夊浐鍖栵紝绋嬪簭涓嶅彲鐢�
-			if(FlowContants.N.equals(progProperties.getCureProgramUseable())) {
-				//鍥哄寲绋嬪簭涓嶅彲鐢紝闇�瑕侀噸鏂板缓绔嬬▼搴忓寘鍚嶅拰鏂囦欢鑺傜偣;鍙敤鎯呭喌鍦ㄦ祦绋嬪鎵逛腑宸茬粡鍗囩骇杩囪妭鐐逛簡
-				NcNode curedProgramPackage = ncNodeService.getById(Func.toLong(progProperties.getCuredNodeId()));
+	private void moveToNewProcessEdition(NcNode packageNode, FlowProgramProperties props) throws IOException {
+		//ncNodeService.deleteMachineGroupNodeByParentId();
+		ncNodeService.getBaseMapper().deleteById(packageNode.getParentId());//鍒犻櫎鏈哄簥缁勮妭鐐�
 
-				NcNode newCuredPkgNode = new NcNode();
-				BeanUtils.copyProperties(curedProgramPackage, newCuredPkgNode);
-				EntityUtil.clearBaseProperties(newCuredPkgNode);
-				newCuredPkgNode.setIsLastEdition(1);
-				newCuredPkgNode.setIsLocked(0);
-				newCuredPkgNode.upgradeVersionNumber();
-				ncNodeService.save(newCuredPkgNode);
+		FlowProgramProperties tempProps = new FlowProgramProperties();
+		BeanUtils.copyProperties(props,tempProps);
+		tempProps.setProcessDefinitionKey(FlowConstant.CURE_PROCESS_KEY);//涓存椂淇敼鍏朵负鍥哄寲,鍦ㄥ浐鍖栦笅鍒涘缓鑺傜偣
+		NcNode machineGroupNode = ncNodeAutoCreateService.createNodeTreeToMachineGroup(tempProps);
 
-				//鏂扮殑娴佺▼瀵瑰簲鐨勬枃浠舵洿鏂板埌鏂拌妭鐐逛笅
-				List<FlowProgramFile> newFlowFileList = flowProgramFileService.listByProcessInstanceId(progProperties.getProcessInstanceId());
-				for (FlowProgramFile newFlowFile : newFlowFileList) {
-					NcNode newProgramNode = new NcNode();
-					BeanUtils.copyProperties(newCuredPkgNode, newProgramNode);
-					EntityUtil.clearBaseProperties(newProgramNode);
+		//绉诲姩绋嬪簭鍖呭悕鑺傜偣
+		packageNode.setProcessEdition(tempProps.getProcessEdition());
+		packageNode.setParentId(machineGroupNode.getId());
+		packageNode.setParentIds(machineGroupNode.subNodeParentIds());
+		packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
 
-					newProgramNode.setName(newFlowFile.getName());
-					newProgramNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
-					newProgramNode.setParentId(newCuredPkgNode.getId());
-					newProgramNode.setIsLastEdition(1);
-					newProgramNode.setIsLocked(0);
-					newProgramNode.setParentIds(newCuredPkgNode.getParentIds() + "," + newCuredPkgNode.getId());
-					newProgramNode.setFlowProgramFileId(newFlowFile.getId());
-					ncNodeService.save(newProgramNode);
-				}
+		this.ncNodeService.updateById(packageNode);
+		Machine machine = machineService.getByCode(packageNode.getMachineCode());
+		//绉诲姩绋嬪簭鑺傜偣
+		List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
+		for(NcNode programNode : programNodes){
+			FlowProgramFile progFile = this.flowProgramFileService.getById(programNode.getFlowProgramFileId());
 
-				//鍘熻妭鐐规洿鏂颁负鑰佺増鏈紝閿佸畾
-				curedProgramPackage.setIsLastEdition(0);
-				curedProgramPackage.setIsLocked(1);
-				ncNodeService.updateById(curedProgramPackage);
+			programNode.setParentIds(packageNode.subNodeParentIds());
+			programNode.setProcessEdition(tempProps.getProcessEdition());//淇敼宸ュ簭鐗堟
+			programNode.setVersionNumber(packageNode.getVersionNumber());
+			if(progFile.isProgram()) {
+				programNode.setName(buildNewFilename(programNode.getName(), tempProps.getProcessEdition()));//鍚嶇О淇敼锛屽伐搴忕増娆¢儴鍒�
+				setNewProgramNameAnnotation(programNode.getName(), progFile, machine.getControlSystem());
+			}
+		}
+		ncNodeService.updateBatchById(programNodes);
+
+	}
+
+	/**
+	 * 鏋勫缓鏂扮殑绋嬪簭甯傚悕
+	 * @param filename 绋嬪簭鍖呭悕
+	 * @param newProcessEdition 鏂扮殑宸ュ簭鐗堟
+	 * @return 鏂扮殑绋嬪簭鏂囦欢鍚�
+	 */
+	String buildNewFilename(String filename,String newProcessEdition){
+		ProgramNameVO pnameVO = ProgramFileNameParser.parseProgramName(filename);
+		String ext = FilenameUtils.getExtension(filename);
+		String name= pnameVO.getDrawingNo()+"-"+pnameVO.getProcessNo()+"-"+newProcessEdition+"-"+pnameVO.getSegmentCount()+"-"+pnameVO.getSegmentNo();
+		if(StringUtils.isNotBlank(ext)){
+			name += "."+ext;
+		}
+		return name;
+	}
+
+	/**
+	 * 璁剧疆鍥哄寲娉ㄩ噴,瀹炵幇鏂瑰紡锛岃幏鍙栨枃浠跺瓧鑺備笅锛屼慨鏀瑰悗鏇挎崲鏂囦欢
+	 * @param flowProgramFile oss 鏂囦欢
+	 *
+	 */
+	void setNewProgramNameAnnotation(String filename,FlowProgramFile flowProgramFile, String controlSystem) throws IOException {
+
+		try(InputStream ins = ossTemplate.statFileStream(flowProgramFile.getOssName());){
+			ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(ins));
+
+
+			AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(controlSystem,this.annotationConfig);
+
+			InputStream finishedStream = annoProcessor.putFilenameAnnotation(filename,byteInputStream);
+			//InputStream finishedStream = AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
+			try(finishedStream) {
+				finishedStream.reset();
+				BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
+				//鏇挎崲鍘熸湁鐨勬枃浠跺湴鍧�
+				flowProgramFile.setOssName(bfile.getName());
+				flowProgramFile.setName(filename);
+				flowProgramFileService.updateById(flowProgramFile);
 			}
 		}
 	}
 
-	/**
-	 * 淇濆瓨瀹℃壒瀹屾垚鐨勮褰�
-	 * @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);
-
-	}
-
-
-	void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
-		//鏇存柊瀹℃壒璁板綍鐨刵cNodeId
-		approveRecordService.lambdaUpdate()
-			.eq(ApproveRecord::getProcessInstanceId, processInstanceId)
-			.set(ApproveRecord::getNcNodeId,nodeId).update();
-	}
 }

--
Gitblit v1.9.3