package org.springblade.mdm.program.service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; /** * 程序节点自动创建服务,在 试切流程 程序编制 节点 审核通过后调用 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class NcNodeAutoCreateService { private final NcNodeService ncNodeService; private final FlowCommonService flowCommonService; private final FlowProgramFileService flowProgramFileService; private final ProgramSeqService programSeqService; public static final String SHIQIE_NAME = "试切"; public static final String GUHUA_NAME = "固化"; public static final String PIANLI_NAME = "偏离"; /** * 根据流程信息,自动创建各个节点 * @param processInstanceId */ @Transactional public void createNodeTree(String processInstanceId) { FlowProgramProperties programProperties = flowCommonService.getProgramProperties(processInstanceId); //,int rootNodeCatgory = 1:试切,2固化,3偏离 NcNode programPkdNode = createTreeToProgramPackageByRootCategory(1,programProperties); List 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.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()); ncNodeService.save(node); } NcNode createTreeToProgramPackageByRootCategory(int category,FlowProgramProperties programProperties) { NcNode root; if(category == 1){ //试切 root = rootNodeByName(SHIQIE_NAME); if(root == null){ root = createShiqieNode(); } }else if(category == 2){ root = rootNodeByName(GUHUA_NAME); if(root == null){ root = createCureNode(); } }else{ root = rootNodeByName(PIANLI_NAME); if(root == null){ root = createPianliNode(); } } //创建产品型号节点 //NcNode productModelNode = createProductModelNode(programProperties.getProductModel(), root); NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties); //零组件号节点 NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties); //工艺版次节点 NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,programProperties); //工序号节 NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, craftEditionNode,programProperties); //工序版次节点 NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties); //加工机床节点 NcNode machineCodeNode = createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,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,FlowProgramProperties programProperties) { Optional nodeOpt = this.ncNodeService.lambdaQuery().eq(NcNode::getName,name).eq(NcNode::getNodeType,nodeType).eq(NcNode::getParentId,parentNode.getId()).oneOpt(); if(nodeOpt.isPresent()){ return nodeOpt.get(); }else { NcNode ncNode = new NcNode(); ncNode.setName(name); ncNode.setParentId(parentNode.getId()); ncNode.setParentIds(parentNode.getParentIds() + "," + parentNode.getId()); ncNode.setNodeType(nodeType); //程序包节点和程序文件节点数据 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){ Optional rootOpt = ncNodeService.lambdaQuery().eq(NcNode::getName, name).eq(NcNode::getParentId, 0).oneOpt(); return rootOpt.orElse(null); } /** * 创建试切节点(根) */ NcNode createShiqieNode() { NcNode ncNode = new NcNode(); ncNode.setId(1L); ncNode.setName(SHIQIE_NAME); ncNode.setParentId(0L); ncNode.setParentIds(""); ncNode.setNodeType("10"); ncNodeService.save(ncNode); return ncNode; } /** * 创建固化节点(根) */ NcNode createCureNode() { NcNode ncNode = new NcNode(); ncNode.setId(2L); ncNode.setName(GUHUA_NAME); ncNode.setParentId(0L); ncNode.setParentIds(""); ncNode.setNodeType("10"); ncNodeService.save(ncNode); return ncNode; } NcNode createPianliNode() { NcNode ncNode = new NcNode(); ncNode.setId(3L); ncNode.setName(PIANLI_NAME); ncNode.setParentId(0L); ncNode.setParentIds(""); ncNode.setNodeType("10"); ncNodeService.save(ncNode); return ncNode; } }