yangys
2025-08-06 053a438acf9ec33e182b25211ce8108f0367feac
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
@@ -3,26 +3,20 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowCommonService;
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.mapper.NcNodeMapper;
import org.springblade.mdm.program.vo.NcNodeQueryVO;
import org.springblade.mdm.program.vo.NcNodeVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * 程序节点
 * 程序节点自动创建服务,在 试切流程 程序编制 节点 审核通过后调用
 *
 * @author yangys
 */
@@ -33,51 +27,27 @@
   private final NcNodeService ncNodeService;
   private final FlowCommonService flowCommonService;
   private final FlowProgramFileService flowProgramFileService;
   public static final String SHIQIE_NAME = "试切";
   public static final String GUHUA_NAME = "固化";
   private final ProgramSeqService programSeqService;
   public static final String TRY_NAME = "试切";
   public static final String CURE_NAME = "固化";
   public static final String PIANLI_NAME = "偏离";
   /**
    * 根据流程信息,自动创建各个节点
    * @param processInstanceId
    * 创建树到机床级别
    * @param programProperties
    */
   public void createNodeTree(String processInstanceId) {
      FlowProgramProperties programProperties = flowCommonService.getProgramProperties(processInstanceId);
   @Transactional
   public NcNode createNodeTreeToMachine(FlowProgramProperties programProperties) {
      //,int rootNodeCatgory = 1:试切,2固化,3偏离
      NcNode programPkdNode = createTreeToProgramPackageByRootCategory(1,programProperties);
      List<FlowProgramFile> programFiles = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, processInstanceId).list();
      for (FlowProgramFile programFile : programFiles) {
         createProgramFileNode(programFile,programPkdNode,programProperties);
      }
   }
   private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode, FlowProgramProperties programProperties) {
      NcNode node = new NcNode();
      node.setNodeType(NcNode.TYPE_PROGRAM_FILE);
      node.setName(programFile.getProgramName());
      node.setParentId(programPkdNode.getId());
      node.setParentIds(programPkdNode.getParentIds()+","+programPkdNode.getId());
      node.setDrawingNo(programPkdNode.getDrawingNo());
      node.setDrawingNoEdition(programProperties.getDrawingNoEdition());
      node.setProcessNo(programProperties.getProcessNo());
      node.setMachineCode(programProperties.getMachineCode());
      node.setProductModel(programProperties.getProductModel());
      ncNodeService.save(node);
   }
   NcNode createTreeToProgramPackageByRootCategory(int category,FlowProgramProperties programProperties) {
      NcNode root;
      if(category == 1){
      if(programProperties.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)){
         //试切
         root = rootNodeByName(SHIQIE_NAME);
         root = rootNodeByName(TRY_NAME);
         if(root == null){
            root = createShiqieNode();
            root = createTryNode();
         }
      }else if(category == 2){
         root = rootNodeByName(GUHUA_NAME);
      }else if(programProperties.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY)){
         root = rootNodeByName(CURE_NAME);
         if(root == null){
            root = createCureNode();
         }
@@ -88,49 +58,84 @@
         }
      }
      NcNode lastNode = null;
      //创建产品型号节点
      //NcNode productModelNode = createProductModelNode(programProperties.getProductModel(), root);
      NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root);
      NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties);
      //零组件号节点
      NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode);
      NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties);
      //工艺版次节点
      NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode);
      NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,programProperties);
      //工序号节
      NcNode processNoNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_NO, craftEditionNode);
      NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, craftEditionNode,programProperties);
      //工序版次节点
      NcNode processEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode);
      NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties);
      //加工机床节点
      NcNode machineCodeNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_MACHINE_CODE, processEditionNode);
      //程序包名节点
      NcNode programPkgNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROGRAM_PACKAGE, machineCodeNode);
      return programPkgNode;
      //程序文件节点,多个文件需要循环创建
      return createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,programProperties);
   }
   /*
   NcNode createProductModelNode(String name,NcNode parentNode){
      NcNode ncNode = new NcNode();
      ncNode.setName(name);
      ncNode.setParentId(parentNode.getId());
      ncNode.setParentIds(parentNode.getParentIds()+","+parentNode.getId());
      ncNode.setNodeType("15");
      ncNodeService.save(ncNode);
      return ncNode;
   }
   /**
    * 根据流程信息,自动创建各个节点,包括程序节点
    * @param programProperties 程序属性
    */
   @Transactional
   public void createNodeTreeWithProgram(FlowProgramProperties programProperties) {
      //,int rootNodeCatgory = 1:试切,2固化,3偏离
      NcNode programPkdNode = createTreeToPackage(programProperties);
      //删除之前创建过的程序文件节点(因为重复在编制节点审批),避免重复数据
      this.ncNodeService.lambdaUpdate().eq(NcNode::getParentId, programPkdNode.getId()).remove();
      List<FlowProgramFile> programFiles = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, programProperties.getProcessInstanceId()).list();
      for (FlowProgramFile programFile : programFiles) {
         createProgramFileNode(programFile, programPkdNode, programProperties);
      }
   }
   private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode, FlowProgramProperties programProperties) {
      //此处应避免重复创建
      NcNode node = new NcNode();
      node.setNodeType(NcNode.TYPE_PROGRAM_FILE);
      node.setName(programFile.getName());//文件名,
      node.setParentId(programPkdNode.getId());
      node.setParentIds(programPkdNode.getParentIds()+","+programPkdNode.getId());
      node.setIsLastEdition(1);
      node.setDrawingNo(programPkdNode.getDrawingNo());
      node.setDrawingNoEdition(programProperties.getDrawingNoEdition());
      node.setCraftEdition(programProperties.getCraftEdition());
      node.setProcessName(programProperties.getProcessName());
      node.setProcessNo(programProperties.getProcessNo());
      node.setMachineCode(programProperties.getMachineCode());
      node.setProductModel(programProperties.getProductModel());
      node.setFlowProgramFileId(programFile.getId());
      node.setVersionNumber(1);
      ncNodeService.save(node);
   }
   /**
    * 创建节点到程序包级别
    * @param programProperties
    * @param createProgramPkg
    * @return
    */
   public NcNode createTreeToPackage(FlowProgramProperties programProperties) {
      NcNode machineCodeNode = createNodeTreeToMachine(programProperties);
      String programPkgName = programProperties.getDrawingNo()+"-"+programProperties.getProcessNo();//零件号加工序号
      return createNodeIfNotExists(programPkgName ,NcNode.TYPE_PROGRAM_PACKAGE, machineCodeNode,programProperties);
   }
   /**
    * 不存在则创建节点
    * @param name 节点名称
    * @param nodeType 节点类型
    * @param parentNode 父节点
    * @param programProperties 流程程序属性
    * @return
    */
   NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode){
      Optional<NcNode>  nodeOpt = this.ncNodeService.lambdaQuery().eq(NcNode::getName,name).eq(NcNode::getNodeType,nodeType).eq(NcNode::getParentId,parentNode.getId()).oneOpt();
   NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode,FlowProgramProperties programProperties) {
      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()){
         return nodeOpt.get();
      }else {
@@ -139,19 +144,31 @@
         ncNode.setParentId(parentNode.getId());
         ncNode.setParentIds(parentNode.getParentIds() + "," + parentNode.getId());
         ncNode.setNodeType(nodeType);
         ncNode.setVersionNumber(1);
         //程序包节点和程序文件节点数据
         if(NcNode.TYPE_PROGRAM_PACKAGE.equals(nodeType) || NcNode.TYPE_PROGRAM_FILE.equals(nodeType)){
            String programNo = programSeqService.generageProgramNo();
            ncNode.setProgramNo(programNo);
            ncNode.setProcessInstanceId(programProperties.getProcessInstanceId());
            ncNode.setDrawingNo(programProperties.getDrawingNo());
            ncNode.setDrawingNoEdition(programProperties.getDrawingNoEdition());
            ncNode.setCraftEdition(programProperties.getCraftEdition());
            ncNode.setProcessNo(programProperties.getProcessNo());
            ncNode.setProcessEdition(programProperties.getProcessEdition());
            ncNode.setProcessName(programProperties.getProcessName());
            ncNode.setMachineCode(programProperties.getMachineCode());
            ncNode.setProductModel(programProperties.getProductModel());
         }
         ncNode.setIsLastEdition(1);
         ncNodeService.save(ncNode);
         return ncNode;
      }
   }
   /**
    * 根节点是否存在,根节点只有 试切/分离/固化 3个
    * @param name 节点名称
    * @return
    */
   boolean rootNodeExists(String name){
      return ncNodeService.lambdaQuery().eq(NcNode::getName, name).eq(NcNode::getParentId, 0).count()>0;
   }
   NcNode rootNodeByName(String name){
@@ -162,13 +179,14 @@
   /**
    * 创建试切节点(根)
    */
   NcNode createShiqieNode() {
   NcNode createTryNode() {
      NcNode ncNode = new NcNode();
      ncNode.setId(1L);
      ncNode.setName(SHIQIE_NAME);
      ncNode.setName(TRY_NAME);
      ncNode.setParentId(0L);
      ncNode.setParentIds("");
      ncNode.setParentIds("0");
      ncNode.setNodeType("10");
      ncNode.setVersionNumber(1);
      ncNodeService.save(ncNode);
      return ncNode;
@@ -180,10 +198,11 @@
   NcNode createCureNode() {
      NcNode ncNode = new NcNode();
      ncNode.setId(2L);
      ncNode.setName(GUHUA_NAME);
      ncNode.setName(CURE_NAME);
      ncNode.setParentId(0L);
      ncNode.setParentIds("");
      ncNode.setParentIds("0");
      ncNode.setNodeType("10");
      ncNode.setVersionNumber(1);
      ncNodeService.save(ncNode);
      return ncNode;
@@ -194,8 +213,9 @@
      ncNode.setId(3L);
      ncNode.setName(PIANLI_NAME);
      ncNode.setParentId(0L);
      ncNode.setParentIds("");
      ncNode.setParentIds("0");
      ncNode.setNodeType("10");
      ncNode.setVersionNumber(1);
      ncNodeService.save(ncNode);
      return ncNode;