yangys
2025-09-13 a0f3e98fdd9472af3c78b42423a7e3fa6fb92eba
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -7,23 +7,20 @@
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.service.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.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.program.service.programannotation.AnnotationProperties;
import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
import org.springblade.mdm.utils.EntityUtil;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.pojo.entity.DictBiz;
@@ -47,9 +44,8 @@
@Component("normalCureFinishDataHandler")
public class NormalCureFinishDataHandler implements FinishDataHandler {
   @Autowired
   private NcProgramApprovedService approvedService;
   @Autowired
   private ApproveRecordService approveRecordService;
   private MachineAnnotationConfig config;
   @Autowired
   private FlowProgramFileService flowProgramFileService;
   @Autowired
@@ -74,13 +70,9 @@
    * @param flowProps 流程属性
    */
   public void handleData(FlowProgramProperties flowProps) {
      // 执行业务逻辑
      //需要固化的节点
      NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  flowProps.getProcessInstanceId()).one();
      //pkgNode.setIsLastEdition(0);
      //nodeService.updateById(pkgNode);
      List<NcNode> historyProgramPackageNodes = nodeService.getNodeHistory(pkgNode);
      try {
@@ -90,14 +82,12 @@
         throw new ServiceException("普通固化执行异常"+e.getMessage());
      }
      //固化流程,不用再导出
      updateApproveRecordNodeId(flowProps.getProcessInstanceId(), pkgNode.getId());
   }
   /**
    * 将节点和历史节点挪动到固化的同级节点下
    * @param pkgNode 要固化的节点
    * @param pkgNode1 要固化的节点
    * @param historyProgramPackageNodes 程序包名 历史节点
    */
   void moveNodeToCuredTree(NcNode pkgNode1,List<NcNode> historyProgramPackageNodes, FlowProgramProperties programProperties) throws IOException {
@@ -111,17 +101,16 @@
      //新建一个节点,作为固化节点,老节点保留不动,置为老版本
      //机床下现在没有文件了,程序包名升级与机床同级了,改为找到机床同级程序包名更新了
      //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,cureNode.getId())//不要更新新固化的节点
         .set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
      NcNode cureNode = createNewCureNodeByTargetNode(pkgNode1);
      List<NcNode> programNodes = nodeService.getProgramFilesByPackageId(pkgNode1.getId());
      boolean tryPkdNodeHasChild = !programNodes.isEmpty();
      NcNode cureNode = createNewCureNodeByTargetNode(pkgNode1,tryPkdNodeHasChild);
      for(NcNode hisPackageNode : historyProgramPackageNodes){
         //if(!hisPackageNode.getId().equals(pkgNode.getId())){
            hisPackageNode.setIsLastEdition(0);
         //}
         hisPackageNode.setIsLastEdition(0);
         hisPackageNode.setParentId(machineNode.getParentId());
         hisPackageNode.setParentIds(machineNode.getParentIds());//程序包与机床节点同级
@@ -130,12 +119,11 @@
         FlowProgramFile pfile;
         for(NcNode oldProgramNode : oriProgramNodes){
            oldProgramNode.setParentIds(hisPackageNode.getParentIds()+","+hisPackageNode.getId());
            //oldProgramNode.setIsLastEdition(0);
            pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
            if(oldProgramNode.getParentId().equals(pkgNode1.getId()) && !pfile.isProgram()){
               //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
               //oldProgramNode.setIsLastEdition(1);
               //其他文件,需要复制到新建的固化节点下
               NcNode newOtherFileNode = new NcNode();
               BeanUtils.copyProperties(oldProgramNode,newOtherFileNode);
@@ -169,7 +157,7 @@
         newProgNode.setFlowProgramFileId(flowProgramFile.getId());
         newProgNode.setIsCured(1);
         setGhAnnotation(flowProgramFile,machine.getMachineGroupCode(),annoDicts);
         setGhAnnotation(flowProgramFile,machine.getControlSystem(),annoDicts);
         nodeService.save(newProgNode);
      }
@@ -182,7 +170,7 @@
    * @param waitingCureNode 待固化节点
    * @return 固化节点
    */
   NcNode createNewCureNodeByTargetNode(NcNode waitingCureNode){
   NcNode createNewCureNodeByTargetNode(NcNode waitingCureNode,boolean tryPkdNodeHasProgramFiles){
      //新建一个节点,作为固化节点,老节点保留不动
      NcNode cureNode = new NcNode();
      BeanUtils.copyProperties(waitingCureNode, cureNode);
@@ -197,8 +185,9 @@
         .eq(NcNode::getProcessEdition,waitingCureNode.getProcessEdition())
         .eq(NcNode::getIsLastEdition,1).eq(NcNode::getIsCured,1).oneOpt();
      if(optOldCuredPackageNode.isEmpty()){
      if(optOldCuredPackageNode.isEmpty() && tryPkdNodeHasProgramFiles){
         //之前 没有已固化的程序包名,则直接更新版本号,如果有,那就使用node现在的版本号,因为不可用转为试切,审批完成已经升级version
         //tryPkdNodeHasProgramFiles 试切程序包下有程序文件才需要升级版本(没有文件的是车床,无文件,直接等待回传)
         cureNode.upgradeVersionNumber();
      }
@@ -211,15 +200,20 @@
    * @param flowProgramFile oss 文件
    *
    */
   void setGhAnnotation(FlowProgramFile flowProgramFile,String machineGroup,List<DictBiz> annoDicts) throws IOException {
   void setGhAnnotation(FlowProgramFile flowProgramFile,String controlSystem,List<DictBiz> annoDicts) throws IOException {
      String ossName = flowProgramFile.getOssName();
      //
      try(InputStream ins = ossTemplate.statFileStream(ossName);){
         byte[] bytes = IOUtils.toByteArray(ins);
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(bytes);
         InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,machineGroup,annoDicts);
         //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);
         try(finishedStream) {
            finishedStream.reset();
            BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
@@ -230,6 +224,7 @@
         }
      }
   }
   /**
    * 计算有效期
@@ -247,27 +242,12 @@
      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();
   }
    */
}