package org.springblade.mdm.program.service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.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 TRY_NAME = "试切"; public static final String CURE_NAME = "固化"; public static final String PIANLI_NAME = "偏离"; /** * 创建树到机床级别 * @param programProperties */ @Transactional public NcNode createNodeTreeToMachine(FlowProgramProperties programProperties) { NcNode root; if(programProperties.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)){ //试切 root = rootNodeByName(TRY_NAME); if(root == null){ root = createTryNode(); } }else if(programProperties.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY)){ root = rootNodeByName(CURE_NAME); if(root == null){ root = createCureNode(); } }else{ root = rootNodeByName(PIANLI_NAME); if(root == null){ root = createPianliNode(); } } NcNode lastNode = null; //创建产品型号节点 //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); //加工机床节点 return createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,programProperties); } /** * 根据流程信息,自动创建各个节点,包括程序节点 * @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 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,FlowProgramProperties programProperties) { Optional 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 { NcNode ncNode = new NcNode(); ncNode.setName(name); 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; } } NcNode rootNodeByName(String name){ Optional rootOpt = ncNodeService.lambdaQuery().eq(NcNode::getName, name).eq(NcNode::getParentId, 0).oneOpt(); return rootOpt.orElse(null); } /** * 创建试切节点(根) */ NcNode createTryNode() { NcNode ncNode = new NcNode(); ncNode.setId(1L); ncNode.setName(TRY_NAME); ncNode.setParentId(0L); ncNode.setParentIds("0"); ncNode.setNodeType("10"); ncNode.setVersionNumber(1); ncNodeService.save(ncNode); return ncNode; } /** * 创建固化节点(根) */ NcNode createCureNode() { NcNode ncNode = new NcNode(); ncNode.setId(2L); ncNode.setName(CURE_NAME); ncNode.setParentId(0L); ncNode.setParentIds("0"); ncNode.setNodeType("10"); ncNode.setVersionNumber(1); ncNodeService.save(ncNode); return ncNode; } NcNode createPianliNode() { NcNode ncNode = new NcNode(); ncNode.setId(3L); ncNode.setName(PIANLI_NAME); ncNode.setParentId(0L); ncNode.setParentIds("0"); ncNode.setNodeType("10"); ncNode.setVersionNumber(1); ncNodeService.save(ncNode); return ncNode; } }