yangys
2025-09-29 4c7296d45efe849dc70a3b2e2240c905481a91c9
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -16,6 +16,7 @@
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.program.entity.NcNode;
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.ProgramAnnotationService;
import org.springblade.mdm.program.service.programannotation.AnnotationProperties;
@@ -32,6 +33,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -50,6 +52,7 @@
   private FlowProgramFileService flowProgramFileService;
   @Autowired
   private NcNodeService nodeService;
   @Autowired
   private NcNodeAutoCreateService ncNodeAutoCreateService;
   @Autowired
@@ -73,10 +76,28 @@
      //需要固化的节点
      NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  flowProps.getProcessInstanceId()).one();
      //原节点保留不动,置为老版本
      pkgNode.setIsLastEdition(0);
      pkgNode.setIsLocked(1);
      nodeService.updateById(pkgNode);
      List<NcNode> historyProgramPackageNodes = nodeService.getNodeHistory(pkgNode);
      nodeService.getBaseMapper().deleteById(pkgNode.getParentId());//删除机床组节点
      //List<NcNode> historyProgramPackageNodes = nodeService.getTryNodeHistory(pkgNode);
      try {
         moveNodeToCuredTree(pkgNode, historyProgramPackageNodes, flowProps);
         moveNodeToCuredTree(pkgNode, flowProps);//, historyProgramPackageNodes
         //固化不锁定,后续还可能使用该固化程序
         //nodeService.lockSameNameOtherMachineGroupProgramPackage(pkgNode);
         /*
         nodeService.lambdaUpdate().eq(NcNode::getDrawingNo,pkgNode.getDrawingNo())
            .eq(NcNode::getProcessNo,pkgNode.getProcessNo())
            .eq(NcNode::getName,pkgNode.getName())
            .ne(NcNode::getMachineGroupCode,pkgNode.getMachineGroupCode())
            .eq(NcNode::getIsCured,1)
            .set(NcNode::getIsLocked,NcNode.LOCKED)
            .set(NcNode::getRemark,"回传固化同名程序锁定")
            .update();
         */
      }catch(Exception e) {
         log.error("固化流程完成异常",e);
         throw new ServiceException("普通固化执行异常"+e.getMessage());
@@ -88,61 +109,95 @@
   /**
    * 将节点和历史节点挪动到固化的同级节点下
    * @param pkgNode1 要固化的节点
    * @param historyProgramPackageNodes 程序包名 历史节点
    * @param programProperties 流程属性
    */
   void moveNodeToCuredTree(NcNode pkgNode1,List<NcNode> historyProgramPackageNodes, FlowProgramProperties programProperties) throws IOException {
   void moveNodeToCuredTree(NcNode pkgNode1, FlowProgramProperties programProperties) throws IOException {
      //创建节点到机床级别.(固化树)
      NcNode machineNode = ncNodeAutoCreateService.createNodeTreeToMachine(programProperties);
      NcNode machineGroupNode = ncNodeAutoCreateService.createNodeTreeToMachineGroup(programProperties);
      pkgNode1.setParentId(machineNode.getParentId());
      pkgNode1.setParentIds(machineNode.getParentIds());//更新上级节点,下面还要用应为在historyProgramPackageNodes中的和这个不是一个实例
      //新建一个节点,作为固化节点,老节点保留不动,置为老版本
      //机床下现在没有文件了,程序包名升级与机床同级了,改为找到机床同级程序包名更新了
      this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, machineNode.getParentIds())
      //新建一个节点,作为固化节点,
      this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, machineGroupNode.subNodeParentIds())
         .in(NcNode::getNodeType, Arrays.asList(NcNode.TYPE_PROGRAM_PACKAGE,NcNode.TYPE_PROGRAM_FILE))
         .set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
      List<NcNode> programNodes = nodeService.getProgramFilesByPackageId(pkgNode1.getId());
      boolean tryPkdNodeHasChild = !programNodes.isEmpty();
      NcNode cureNode = createNewCureNodeByTargetNode(pkgNode1,tryPkdNodeHasChild);
      boolean tryPkgNodeHasChild = !programNodes.isEmpty();
      for(NcNode hisPackageNode : historyProgramPackageNodes){
         hisPackageNode.setIsLastEdition(0);
         hisPackageNode.setParentId(machineNode.getParentId());
         hisPackageNode.setParentIds(machineNode.getParentIds());//程序包与机床节点同级
      //新建固化节点
      NcNode cureNode = createNewCureNodeByTargetNode(pkgNode1,tryPkgNodeHasChild);
      cureNode.setParentId(machineGroupNode.getId());
      cureNode.setParentIds(machineGroupNode.subNodeParentIds());
      nodeService.save(cureNode);
         //处理程序包下层的程序节点,这里:老的程序节点不用更新为历史版本,因为会建立新节点。只修改parentId 和 parentIds
         List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,hisPackageNode.getId()).list();
         FlowProgramFile pfile;
         for(NcNode oldProgramNode : oriProgramNodes){
            oldProgramNode.setParentIds(hisPackageNode.getParentIds()+","+hisPackageNode.getId());
            pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
            if(oldProgramNode.getParentId().equals(pkgNode1.getId()) && !pfile.isProgram()){
               //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
               //其他文件,需要复制到新建的固化节点下
               NcNode newOtherFileNode = new NcNode();
               BeanUtils.copyProperties(oldProgramNode,newOtherFileNode);
               EntityUtil.clearBaseProperties(newOtherFileNode);
               newOtherFileNode.setParentId(cureNode.getId());
               newOtherFileNode.setParentIds(cureNode.getParentIds()+","+cureNode.getId());
               newOtherFileNode.setIsLastEdition(1);
               nodeService.save(newOtherFileNode);
            }
      this.copyNonProgramNodes(pkgNode1,cureNode);
      /*
      List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,pkgNode1.getId()).list();
      FlowProgramFile pfile;
      for(NcNode oldProgramNode : oriProgramNodes){
         oldProgramNode.setParentIds(pkgNode1.subNodeParentIds());
         oldProgramNode.setIsLastEdition(0);
         //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
         //其他文件,需要复制到新建的固化节点下(程序文件不复制)
         pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
         if(!pfile.isProgram()) {
            NcNode newFileNode = new NcNode();
            BeanUtils.copyProperties(oldProgramNode, newFileNode);
            EntityUtil.clearBaseProperties(newFileNode);
            newFileNode.setParentId(cureNode.getId());
            newFileNode.setParentIds(cureNode.subNodeParentIds());
            newFileNode.setIsLastEdition(1);
            nodeService.save(newFileNode);
         }
         nodeService.updateBatchById(oriProgramNodes);
      }
      nodeService.updateBatchById(historyProgramPackageNodes);
      }
      nodeService.updateBatchById(oriProgramNodes);
      */
      this.addNewProgramNode(cureNode,pkgNode1.getProcessInstanceId());
   }
   /**
    * 从待固化节点复制非程序文件节点到固化节点下
    * @param oriPkgNode 待固化节点
    * @param cureNode 固化节点
    */
   void copyNonProgramNodes(NcNode oriPkgNode,NcNode cureNode){
      List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,oriPkgNode.getId()).list();
      FlowProgramFile pfile;
      for(NcNode oldProgramNode : oriProgramNodes){
         oldProgramNode.setParentIds(oriPkgNode.subNodeParentIds());
         oldProgramNode.setIsLastEdition(0);
         //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
         //其他文件,需要复制到新建的固化节点下(程序文件不复制)
         /*
         pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
         if(!pfile.isProgram()) {
            NcNode newFileNode = new NcNode();
            BeanUtils.copyProperties(oldProgramNode, newFileNode);
            EntityUtil.clearBaseProperties(newFileNode);
            newFileNode.setParentId(cureNode.getId());
            newFileNode.setParentIds(cureNode.subNodeParentIds());
            newFileNode.setIsLastEdition(1);
            nodeService.save(newFileNode);
         }
         */
      }
      nodeService.updateBatchById(oriProgramNodes);
   }
   /**
    * 加入新的程序节点
    * @param cureNode 固化节点
    * @param processInstanceId 流程实例id
    * @throws IOException
    */
   void addNewProgramNode(NcNode cureNode,String processInstanceId) throws IOException {
      Machine machine = machineService.getByCode(cureNode.getMachineCode());
      List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
      //新的流程文件,需要在包节点下新建,不能用老的
      List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode1.getProcessInstanceId()).list();
      //新的流程文件,需要在包节点下新建,不能用老的包节点
      List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,processInstanceId).list();
      for(FlowProgramFile flowProgramFile : files){
         NcNode newProgNode = new NcNode();
@@ -152,7 +207,7 @@
         newProgNode.setName(flowProgramFile.getName());
         newProgNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
         newProgNode.setParentId(cureNode.getId());
         newProgNode.setParentIds(cureNode.getParentIds()+","+cureNode.getId());
         newProgNode.setParentIds(cureNode.subNodeParentIds());
         newProgNode.setIsLastEdition(1);
         newProgNode.setFlowProgramFileId(flowProgramFile.getId());
         newProgNode.setIsCured(1);
@@ -161,16 +216,15 @@
         nodeService.save(newProgNode);
      }
   }
   /**
    * 复制待固化节点数据,创建一个新的固化节点
    * @param waitingCureNode 待固化节点
    * @param tryPkgNodeHasProgramFiles 是否有程序文件
    * @return 固化节点
    */
   NcNode createNewCureNodeByTargetNode(NcNode waitingCureNode,boolean tryPkdNodeHasProgramFiles){
   NcNode createNewCureNodeByTargetNode(NcNode waitingCureNode,boolean tryPkgNodeHasProgramFiles){
      //新建一个节点,作为固化节点,老节点保留不动
      NcNode cureNode = new NcNode();
      BeanUtils.copyProperties(waitingCureNode, cureNode);
@@ -180,18 +234,18 @@
      cureNode.setIsLastEdition(1);
      cureNode.setExpireDate(calculateExpireDate());//设置过期日期
      cureNode.setHisSerial(nodeService.calculateHistorySerial(cureNode));
      Optional<NcNode> optOldCuredPackageNode = nodeService.lambdaQuery().eq(NcNode::getName,waitingCureNode.getName())
         .eq(NcNode::getProcessNo,waitingCureNode.getProcessNo())
         .eq(NcNode::getProcessEdition,waitingCureNode.getProcessEdition())
         .eq(NcNode::getIsLastEdition,1).eq(NcNode::getIsCured,1).oneOpt();
      if(optOldCuredPackageNode.isEmpty() && tryPkdNodeHasProgramFiles){
      if(optOldCuredPackageNode.isEmpty() && tryPkgNodeHasProgramFiles){
         //之前 没有已固化的程序包名,则直接更新版本号,如果有,那就使用node现在的版本号,因为不可用转为试切,审批完成已经升级version
         //tryPkdNodeHasProgramFiles 试切程序包下有程序文件才需要升级版本(没有文件的是车床,无文件,直接等待回传)
         cureNode.upgradeVersionNumber();
      }
      nodeService.save(cureNode);
      return cureNode;
   }
@@ -207,13 +261,12 @@
         byte[] bytes = IOUtils.toByteArray(ins);
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(bytes);
         //InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,controlSystem,annoDicts);
         List<DictBiz> annoDictList = programAnnotationService.getAnnotionDictList();
         AnnotationProperties annoProps = config.getConfigMap().get(controlSystem);
         if(annoProps == null){
            annoProps = AnnotationProperties.getDefault();
         }
         InputStream finishedStream =AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
         InputStream finishedStream =AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, AnnotationUtil.GH, annoProps.getStatusLineIndex(), controlSystem, annoDictList);
         try(finishedStream) {
            finishedStream.reset();
            BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
@@ -228,7 +281,7 @@
   /**
    * 计算有效期
    * @return
    * @return 过期日
    */
   private Date calculateExpireDate() {
      R<String> validMonResult = sysClient.getParamValue(ParamConstants.CURE_VALID_MONTH_KEY);
@@ -242,12 +295,4 @@
      return DateUtil.toDate(now.plusMonths(month));
   }
   /*
   void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
      //更新审批记录的ncNodeId
      approveRecordService.lambdaUpdate()
         .eq(ApproveRecord::getProcessInstanceId, processInstanceId)
         .set(ApproveRecord::getNcNodeId,nodeId).update();
   }
    */
}