yangys
2025-09-18 0d61b9bfca526e9c3da2209de8f9f367e76fd013
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
@@ -5,7 +5,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.constants.FlowConstant;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramFileService;
@@ -31,7 +31,7 @@
   private final NcNodeService ncNodeService;
   private final FlowCommonService flowCommonService;
   private final FlowProgramFileService flowProgramFileService;
   private final ProgramSeqService programSeqService;
   public static final String TRY_NAME = "试切";
   public static final String CURE_NAME = "固化";
   public static final String DEVIATION_NAME = "偏离";
@@ -41,7 +41,48 @@
    * @param programProperties 程序属性
    */
   @Transactional
   public NcNode createNodeTreeToMachine(FlowProgramProperties programProperties) {
   public NcNode createNodeTreeToMachineGroup(FlowProgramProperties programProperties) {
      NcNode root;
      if(programProperties.getProcessDefinitionKey().equals(FlowConstant.TRY_PROCESS_KEY)){
         if(Func.isEmpty(programProperties.getDeviation()) ||
            (FlowConstant.Y.equals(programProperties.getHasCuredProgram()) &&  FlowConstant.N.equals(programProperties.getCureProgramUseable()))){
            //普通试切,或者有固化不可用,建立试切节点
            //试切根节点
            root = rootNodeByName(TRY_NAME);
            if (root == null) {
               root = createTryNode();
            }
         }else{
            //有偏离
            root = rootNodeByName(DEVIATION_NAME);
            if(root == null){
               root = createDeviationNode();
            }
         }
      }else if(programProperties.getProcessDefinitionKey().equals(FlowConstant.CURE_PROCESS_KEY)){
         root = rootNodeByName(CURE_NAME);
         if(root == null){
            root = createCureNode();
         }
      }else{
         throw new ServiceException("流程定义不在范围内");
      }
      //创建产品型号节点
      NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties,null);
      //零组件号节点
      NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties,null);
      //工艺版次节点
      //NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,programProperties);
      //工序号节
      NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, drawingNoNode,programProperties,null);
      //工序版次节点
      NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties,null);
      //加工机床节点
      return createNodeIfNotExists(programProperties.getMachineGroupCode(),NcNode.TYPE_MACHINE_GROUP, processEditionNode,programProperties,null);
   }
   /*
   @Transactional
   public NcNode createNodeTreeToProcessEdition(FlowProgramProperties programProperties) {
      NcNode root;
      if(programProperties.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)){
         if(Func.isEmpty(programProperties.getDeviation()) ||
@@ -68,33 +109,34 @@
         throw new ServiceException("流程定义不在范围内");
      }
      //创建产品型号节点
      NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties);
      NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties,null);
      //零组件号节点
      NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties);
      NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties,null);
      //工艺版次节点
      //NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,programProperties);
      //工序号节
      NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, drawingNoNode,programProperties);
      NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, drawingNoNode,programProperties,null);
      //工序版次节点
      NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties);
      NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties,null);
      //加工机床节点
      return createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,programProperties);
      return createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,programProperties,null);
   }
   */
   /**
    * 根据流程信息,自动创建各个节点,包括程序节点
    * @param programProperties 程序属性
    * @return 程序包节点实例
    */
   @Transactional
   public NcNode createNodeTreeWithProgram(FlowProgramProperties programProperties) {
   public NcNode createNodeTreeWithProgram(FlowProgramProperties programProperties,Integer versionNumber) {
      //,int rootNodeCatgory = 1:试切,2固化,3偏离
      NcNode programPkdNode = createTreeToPackage(programProperties);
      NcNode programPkdNode = createTreeToPackage(programProperties,versionNumber);
      //删除之前创建过的程序文件节点(因为重复在编制节点审批),避免重复数据
      ncNodeService.deleteSubNodes(programPkdNode.getId());
      List<FlowProgramFile> programFiles = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, programProperties.getProcessInstanceId()).list();
      for (FlowProgramFile programFile : programFiles) {
         createProgramFileNode(programFile, programPkdNode, programProperties);//所有文件包括程序和其他,都需要建立节点
         createProgramFileNode(programFile, programPkdNode,versionNumber);//所有文件包括程序和其他,都需要建立节点
      }
      return programPkdNode;
@@ -104,9 +146,9 @@
    * 建立程序文件节点
    * @param programFile 流程文件
    * @param programPkdNode 程序包名 节点,程序节点的 上级
    * @param programProperties 流程发起的程序的属性
    * @param versionNumber 版本号
    */
   private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode, FlowProgramProperties programProperties) {
   private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode, Integer versionNumber) {
      //此处应避免重复创建
      NcNode node = new NcNode();
@@ -117,19 +159,13 @@
      node.setName(programFile.getName());//文件名,
      node.setIsLastEdition(1);
      /*
      node.setDrawingNo(programPkdNode.getDrawingNo());
      node.setDrawingNoEdition(programProperties.getDrawingNoEdition());
      node.setCraftEdition(programProperties.getCraftEdition());
      node.setProcessName(programProperties.getProcessName());
      node.setProcessNo(programProperties.getProcessNo());
      node.setProcessEdition(programProperties.getProcessEdition());
      node.setMachineCode(programProperties.getMachineCode());
      node.setProductModel(programProperties.getProductModel());
       */
      node.setFlowProgramFileId(programFile.getId());
      node.setVersionNumber(1);
      if(versionNumber == null){
         node.setVersionNumber(1);
      }else {
         node.setVersionNumber(versionNumber);
      }
      node.setParentId(programPkdNode.getId());
      node.setParentIds(programPkdNode.getParentIds()+","+programPkdNode.getId());
@@ -143,19 +179,22 @@
    * @return 程序包名节点(最末级)
    */
   @Transactional
   public NcNode createTreeToPackage(FlowProgramProperties programProperties) {
      NcNode machineCodeNode = createNodeTreeToMachine(programProperties);
      NcNode processEditionNode = this.ncNodeService.getById(machineCodeNode.getParentId());
   public NcNode createTreeToPackage(FlowProgramProperties programProperties,Integer versionNumber) {
      NcNode machineGroupNode = createNodeTreeToMachineGroup(programProperties);
      //NcNode processEditionNode = this.ncNodeService.getById(machineCodeNode.getParentId());
      //获取工序版次下其他机床名,存在则删除
      ncNodeService.lambdaUpdate().eq(NcNode::getNodeType,NcNode.TYPE_MACHINE_CODE)
      /*
      ncNodeService.lambdaUpdate().eq(NcNode::getNodeType,NcNode.TYPE_MACHINE_GROUP)
         .eq(NcNode::getParentId,processEditionNode.getId()).eq(NcNode::getIsLastEdition,1)
         .ne(NcNode::getName,machineCodeNode.getName()).remove();
       */
      //保持加工机床是最新下发任务的机床,不是新建一个机床节点,插叙工序版次下是否有其他的机床(零件号一致,工序号,工序版次一致)
      //获取
      //加工机床和程序包名在同一级节点,同在工序版次下级
      String programPkgName = NcNodeService.genProgramName(programProperties.getDrawingNo(),programProperties.getProcessNo());
      return createNodeIfNotExists(programPkgName ,NcNode.TYPE_PROGRAM_PACKAGE, processEditionNode,programProperties);
      //程序包名在机床组下级 20250913
      String programPkgName = NcNodeService.genProgramName(programProperties.getDrawingNo(),programProperties.getProcessNo(),programProperties.getProcessEdition());
      return createNodeIfNotExists(programPkgName ,NcNode.TYPE_PROGRAM_PACKAGE, machineGroupNode,programProperties,versionNumber);
   }
@@ -167,7 +206,7 @@
    * @param programProperties 流程程序属性
    * @return 创建或已存在的节点或
    */
   NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode,FlowProgramProperties programProperties) {
   NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode,FlowProgramProperties programProperties,Integer versionNumber) {
      Optional<NcNode>  nodeOpt = this.ncNodeService.lambdaQuery().eq(NcNode::getName,name).eq(NcNode::getNodeType,nodeType)
         .eq(NcNode::getParentId,parentNode.getId()).eq(NcNode::getIsLastEdition,1).oneOpt();
      if(nodeOpt.isPresent()){
@@ -178,7 +217,11 @@
         ncNode.setParentId(parentNode.getId());
         ncNode.setParentIds(parentNode.getParentIds() + "," + parentNode.getId());
         ncNode.setNodeType(nodeType);
         ncNode.setVersionNumber(1);
         if(versionNumber == null){
            ncNode.setVersionNumber(1);
         }else{
            ncNode.setVersionNumber(versionNumber);
         }
         //程序包节点和程序文件节点数据
         if(NcNode.TYPE_PROGRAM_PACKAGE.equals(nodeType) || NcNode.TYPE_PROGRAM_FILE.equals(nodeType)){
@@ -191,13 +234,13 @@
            ncNode.setProcessEdition(programProperties.getProcessEdition());
            ncNode.setProcessName(programProperties.getProcessName());
            ncNode.setMachineCode(programProperties.getMachineCode());
            ncNode.setMachineGroupCode(programProperties.getMachineGroupCode());
            ncNode.setProductModel(programProperties.getProductModel());
            ncNode.setDeviation(programProperties.getDeviation());
            if(NcNode.TYPE_PROGRAM_PACKAGE.equals(nodeType)) {//程序包节点,分配程序编号
               String programNo = programSeqService.generageProgramNo();
               ncNode.setProgramNo(programNo);
               ncNode.setProgramNo(programProperties.getProgramNo());
            }
         }