yangys
2025-08-22 016f6009aef19985e5e50be497651cb77795c868
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
ÎļþÃû´Ó blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/cure/CureFinishOperateTask.java ÐÞ¸Ä
@@ -1,30 +1,35 @@
package org.springblade.mdm.flow.task.cure;
package org.springblade.mdm.flow.excution.cure;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.flowable.engine.delegate.DelegateExecution;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.commons.contants.ParamConstants;
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.FlowCommonService;
import org.springblade.mdm.flow.excution.dispatch.FinishDataHandler;
import org.springblade.mdm.flow.service.ApproveRecordService;
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.program.service.ProgramAnnotationService;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.EntityUtil;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.pojo.entity.Dict;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -34,62 +39,61 @@
import java.util.Date;
import java.util.List;
/**
 * æ™®é€šæ´¾å·¥å®Œæˆæ•°æ®å¤„理器,功能:插入审批表数据,DispatchFinishListener调用
 */
@Slf4j
@Component("cureFinishOperateTask")
@AllArgsConstructor
public class CureFinishOperateTask {
   private final NcNodeService nodeService;
   private final NcNodeAutoCreateService ncNodeAutoCreateService;
   private final FlowCommonService flowCommonService;
   private final FlowProgramFileService flowProgramFileService;
   private final ISysClient sysClient;
   private final OssTemplate ossTemplate;
   private final ProgramAnnotationService programAnnotationService;
   private final MachineService machineService;
@Component("normalCureFinishDataHandler")
public class NormalCureFinishDataHandler implements FinishDataHandler {
   @Autowired
   private NcProgramApprovedService approvedService;
   @Autowired
   private ApproveRecordService approveRecordService;
   @Autowired
   private FlowProgramFileService flowProgramFileService;
   @Autowired
   private NcNodeService nodeService;
   @Autowired
   private NcNodeAutoCreateService ncNodeAutoCreateService;
   @Autowired
   private MachineService machineService;
   @Autowired
   private OssTemplate ossTemplate;
   @Autowired
   private ISysClient sysClient;
   @Autowired
   private ProgramAnnotationService programAnnotationService;
   /**
    * é»˜è®¤æœ‰æ•ˆæœŸé—´ï¼ˆæœˆæ•°ï¼‰,2å¹´
    */
   private static final int DEFAULT_VALID_MONTH = 24;
   private final NcNodeService ncNodeService;
   /**
    * å›ºåŒ–审批通过处理任务,
    * @param execution æµç¨‹execution
    * DispatchFinishListener中调用
    * @param flowProps æµç¨‹å±žæ€§
    */
   @Transactional
   public void execute(DelegateExecution execution) throws IOException {
      log.info("执行固化程序任务服务,流程实例id={}", execution.getProcessInstanceId());
      //固化程序检查有效期,
      dealWithNode(execution.getProcessInstanceId());
   }
   public void handleData(FlowProgramProperties flowProps) {
      // æ‰§è¡Œä¸šåŠ¡é€»è¾‘
      NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  flowProps.getProcessInstanceId()).one();
      //试切的
      pkgNode.setIsCured(1);
      pkgNode.setIsLocked(NcNode.UNLOCK);
      //设置过期日期
      pkgNode.upgradeVersionNumber();
      pkgNode.setExpireDate(calculateExpireDate());
      nodeService.updateById(pkgNode);
   /**
    * å¤„理node状态。
    * @param processInstanceId æµç¨‹å®žä¾‹id
    */
   void dealWithNode(String processInstanceId) throws IOException {
      //程序包节点和下属程序节点(包括历史节点非最新版本的)从试切挪到固化下面
      //程序包节点 è®¾ç½®æœªå·²å›ºåŒ–
      NcNode pkgNode =  nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId, processInstanceId).one();
      if(pkgNode.isDeviationProgram()){
         //偏离的程序直接锁定
         //pkgNode.setIsLocked(1);
         pkgNode.lock();
         nodeService.updateById(pkgNode);
      }else {
         //试切的
         pkgNode.setIsCured(1);
         pkgNode.setIsLocked(NcNode.UNLOCK);
         //设置过期日期
         pkgNode.upgradeVersionNumber();
         pkgNode.setExpireDate(calculateExpireDate());
         nodeService.updateById(pkgNode);
         List<NcNode> historyProgramPackageNodes = nodeService.getNodeHistory(pkgNode);
         moveNodeToCuredTree(pkgNode, historyProgramPackageNodes, flowCommonService.getProgramProperties(processInstanceId));
      List<NcNode> historyProgramPackageNodes = nodeService.getNodeHistory(pkgNode);
      try {
         moveNodeToCuredTree(pkgNode, historyProgramPackageNodes, flowProps);
      }catch(Exception e) {
         log.error("固化流程完成异常",e);
         throw new ServiceException("普通固化执行异常"+e.getMessage());
      }
      addApproveTable(pkgNode,flowProps);
      updateApproveRecordNodeId(flowProps.getProcessInstanceId(), pkgNode.getId());
   }
   /**
    * å°†èŠ‚ç‚¹å’ŒåŽ†å²èŠ‚ç‚¹æŒªåŠ¨åˆ°å›ºåŒ–çš„åŒçº§èŠ‚ç‚¹ä¸‹
@@ -140,27 +144,21 @@
      List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode.getProcessInstanceId()).list();
      for(FlowProgramFile flowProgramFile : files){
         NcNode newProgNode = new NcNode();
         BeanUtils.copyProperties(pkgNode,newProgNode);
         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());
         newProgNode.setFlowProgramFileId(flowProgramFile.getId());
         newProgNode.setIsCured(1);
         ncNodeService.save(newProgNode);
         nodeService.save(newProgNode);
         //修改文件内容更新注释,并更新文件数据的地址
         ///替换注释后总是不行啊
         setGhAnnotation(flowProgramFile,machine.getMachineGroupCode(),annoDicts);
         flowProgramFileService.updateById(flowProgramFile);
         //flowProgramFileService.updateById(flowProgramFile);
      }
   }
@@ -178,17 +176,7 @@
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(bytes);
         InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,machineGroup,annoDicts);
         /*
         String annoTxt = programAnnotationService.generateAnnotation("GH",machineGroup,annoDicts);
         //int statusLineIndex = 2;
         String line2 = FileContentUtil.readLineAt(byteInputStream,ProgramAnnotationService.STATUS_LINE_INDEX);//第三行应该是状态注释
         byteInputStream.reset();
         InputStream finishedStream;
         if(programAnnotationService.isAnnotation(line2,machineGroup,annoDicts)){
            finishedStream = FileContentUtil.replaceAtLine(byteInputStream,ProgramAnnotationService.STATUS_LINE_INDEX,annoTxt);
         }else{
            finishedStream = FileContentUtil.insertLine(byteInputStream,ProgramAnnotationService.STATUS_LINE_INDEX,annoTxt);
         }*/
         try(finishedStream) {
            finishedStream.reset();
            BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
@@ -214,4 +202,27 @@
      return DateUtil.toDate(now.plusMonths(month));
   }
   /**
    * ä¿å­˜å®¡æ‰¹å®Œæˆçš„记录
    * @param packageNode
    * @param props
    */
   void addApproveTable(NcNode packageNode,FlowProgramProperties props){
      NcProgramApproved approved = new NcProgramApproved();
      approved.setProgramName(packageNode.getName());
      approved.setNcNodeId(packageNode.getId());//程序包节点id
      approved.setTitle(props.getTitle());
      approved.setProgrammerId(props.getProgrammerId());
      approvedService.save(approved);
   }
   void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
      //更新审批记录的ncNodeId
      approveRecordService.lambdaUpdate()
         .eq(ApproveRecord::getProcessInstanceId, processInstanceId)
         .set(ApproveRecord::getNcNodeId,nodeId).update();
   }
}