| | |
| | | |
| | | package org.springblade.mdm.program.service; |
| | | |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.*; |
| | | import org.springblade.core.mp.base.BizServiceImpl; |
| | | import org.springblade.core.secure.utils.AuthUtil; |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.mdm.basesetting.machine.MachineService; |
| | | import org.springblade.mdm.basesetting.machine.entity.Machine; |
| | | import org.springblade.mdm.program.entity.NcNode; |
| | | import org.springblade.mdm.program.mapper.NcNodeMapper; |
| | | import org.springblade.mdm.program.vo.NcNodeVO; |
| | | import org.springblade.mdm.program.vo.*; |
| | | 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; |
| | | |
| | | /** |
| | | * 程序节点 |
| | |
| | | |
| | | BeanUtils.copyProperties(vo, ncNode); |
| | | ncNode.setId(null); |
| | | ncNode.setParentIds(buildParentIds(vo.getParentId())); |
| | | |
| | | this.save(ncNode); |
| | | } |
| | | |
| | | /** |
| | | * 构建父id节点 |
| | | * @param nodeId 节点id |
| | | * @return |
| | | */ |
| | | String buildParentIds(long nodeId){ |
| | | if(nodeId == 0L){ |
| | | return "0"; |
| | | } |
| | | NcNode pNode = this.baseMapper.selectById(nodeId); |
| | | |
| | | public void updateNcCode(NcNodeVO vo) { |
| | | return pNode.getParentIds()+","+pNode.getId(); |
| | | } |
| | | /** |
| | | * 更新节点 |
| | | * @param vo |
| | | */ |
| | | public void updateNcNode(NcNodeVO vo) { |
| | | NcNode ncNode = this.getById(vo.getId()); |
| | | ncNode.setName(vo.getName()); |
| | | ncNode.setNodeType(vo.getNodeType()); |
| | | ncNode.setDescription(vo.getDescription()); |
| | | ncNode.setRemark(vo.getRemark()); |
| | | ncNode.setMachineCode(vo.getMachineCode()); |
| | | ncNode.setParentIds(buildParentIds(vo.getParentId())); |
| | | |
| | | this.updateById(ncNode); |
| | | } |
| | | |
| | |
| | | * @return |
| | | */ |
| | | public List<NcNodeVO> lazyList(Long parentId) { |
| | | // 判断点击搜索但是没有查询条件的情况 |
| | | // 判断点击搜索但是没有查询条件的情况 |
| | | if (Func.isEmpty(parentId)) { |
| | | parentId = 0L; |
| | | } |
| | | |
| | | return baseMapper.lazyList(parentId); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 查询现有固化的程序,暂定条件:零组件号相同,且是同一机床组 |
| | | * * @param name 程序名称 |
| | | * @param name |
| | | * @return |
| | | */ |
| | | public NcNode getLastProgramNode(String name) { |
| | | return this.getBaseMapper().getLastProgramNode(name); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 首页树查询 |
| | | * @param queryVO |
| | | * @return |
| | | */ |
| | | public List<NcNodeVO> searchList(NcNodeQueryVO queryVO) { |
| | | //1.根据关进字和节点类型查询初始列表,查询的原始列表,需要hasChild字段,所以使用mapper.xml |
| | | List<NcNodeVO> oriList = this.getBaseMapper().searchList(queryVO); |
| | | if ("10".equals(queryVO.getNodeType())) { |
| | | //搜索的根级别,直接返回 |
| | | return oriList; |
| | | } |
| | | |
| | | List<NcNodeVO> allVos = new ArrayList<NcNodeVO>();//已经加入过的节点,用于去重 |
| | | List<NcNodeVO> rootVos = new ArrayList<NcNodeVO>(); |
| | | |
| | | //List<NcNode> rootNodes = new ArrayList<>(); |
| | | |
| | | for(NcNodeVO vo : oriList){ |
| | | allVos.add(vo); |
| | | //上级各级的节点 |
| | | List<NcNodeVO> parents = this.getBaseMapper().searchListInIds(Func.toLongList(vo.getParentIds())); |
| | | |
| | | for(NcNodeVO pvo : parents){ |
| | | if(pvo.getParentId() == 0L){ |
| | | rootVos.add(pvo); |
| | | } |
| | | allVos.add(pvo); |
| | | } |
| | | } |
| | | for(NcNodeVO root : rootVos){ |
| | | addNodeChildren(root, allVos); |
| | | |
| | | } |
| | | return rootVos; |
| | | } |
| | | |
| | | void addNodeChildren(NcNodeVO node, List<NcNodeVO> allNodes) { |
| | | for(NcNodeVO vo : allNodes){ |
| | | if(Objects.equals(vo.getParentId(), node.getId())){ |
| | | node.addChildren(vo); |
| | | } |
| | | } |
| | | |
| | | if(node.getChildren()!=null && !node.getChildren().isEmpty()){ |
| | | for(NcNodeVO child : node.getChildren()){ |
| | | addNodeChildren(child, allNodes); |
| | | } |
| | | } |
| | | } |
| | | |
| | | NcNodeVO toNodeVO(NcNode node){ |
| | | NcNodeVO vo = new NcNodeVO(); |
| | | |
| | | BeanUtils.copyProperties(node, vo); |
| | | |
| | | return vo; |
| | | } |
| | | |
| | | /** |
| | | * 获取程序包名的数据 |
| | | * @param programName 程序名称(程序包名) |
| | | * @return 程序报包名的节点 |
| | | */ |
| | | public NcNode getProgramPackageByName(String programName) { |
| | | List<NcNode> pkgs = this.lambdaQuery().eq(NcNode::getName, programName) |
| | | .eq(NcNode::getIsLastEdition,1) |
| | | .eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE).list(); |
| | | if(pkgs.isEmpty()){ |
| | | return null; |
| | | }else{ |
| | | return pkgs.get(0); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 查询节点的历史列表(节点的上级节点”程序包名“因为存在多个版本,所以历史记录也需要根据不同版本程序包名进行查询) |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @Transactional(readOnly = true) |
| | | public List<NcNodeVO> historyByNodeId(Long id) { |
| | | NcNode node = this.getById(id); |
| | | NcNode parentNode = this.getById(node.getParentId()); |
| | | return this.baseMapper.historyByParentIdAndName(node.getName(),parentNode); |
| | | } |
| | | |
| | | /** |
| | | * 获取“程序包名”试切的最新版本 |
| | | * @param name 节点名称 |
| | | * @return 最新版本程序报名节点 |
| | | */ |
| | | public NcNode getLastEditionTryingProgramPackage(String name){ |
| | | //.or(NcNode::getIsCured,0) |
| | | List<NcNode> pkgList = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE) |
| | | .eq(NcNode::getName, name).and(i->{ |
| | | i.eq(NcNode::getIsCured, 0).or().isNull(NcNode::getIsCured); |
| | | }).likeRight(NcNode::getParentIds,"0,1,") |
| | | .eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list(); |
| | | |
| | | if(pkgList.isEmpty()){ |
| | | return null; |
| | | }else{ |
| | | return pkgList.get(0); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据父节点和名称,查询文件界节点列表 |
| | | * @param name 节点/文件名称 |
| | | * @param parentId 父节点id |
| | | */ |
| | | public NcNode getLastEditionProgramFile(String name,Long parentId) { |
| | | List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_FILE) |
| | | .eq(NcNode::getName, name).eq(NcNode::getParentId,parentId) |
| | | .eq(NcNode::getIsLastEdition,1).list(); |
| | | if(nodes.isEmpty()){ |
| | | return null; |
| | | }else { |
| | | return nodes.get(0); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取node的历史列表(同一个父节点下,同名的所有节点) |
| | | * @param pkgNode node |
| | | * @return 历史列表,报错节点本身 |
| | | */ |
| | | public List<NcNode> getNodeHistory(NcNode pkgNode) { |
| | | return this.lambdaQuery().eq(NcNode::getParentId,pkgNode.getParentId()) |
| | | .eq(NcNode::getName,pkgNode.getName()).list(); |
| | | } |
| | | |
| | | /** |
| | | * 生成程序包名/程序名称 |
| | | * @param drawingNo 零组件号 |
| | | * @param processNo 工序版次 |
| | | * @return 程序包名/程序名称 |
| | | */ |
| | | public static String genProgramName(String drawingNo,String processNo){ |
| | | return drawingNo+"-"+processNo; |
| | | } |
| | | |
| | | /** |
| | | * 获取最新版本的 已固化节点 |
| | | * @param programPkgName |
| | | * @return |
| | | */ |
| | | public NcNode getLastEditionCuredProgramPackage(String programPkgName) { |
| | | List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE) |
| | | .eq(NcNode::getName, programPkgName).eq(NcNode::getIsCured,1) |
| | | .eq(NcNode::getIsLastEdition,1).list(); |
| | | |
| | | if(nodes.isEmpty()){ |
| | | return null; |
| | | }else { |
| | | return nodes.get(0); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据流程实例id获取node节点,都是程序包节点 |
| | | * @param processInstanceId 流程实例id |
| | | * @return 对应额系欸但那 |
| | | */ |
| | | public NcNode getByProcessInstanceId(String processInstanceId) { |
| | | Optional<NcNode> nodeOpt = this.lambdaQuery().eq(NcNode::getProcessInstanceId,processInstanceId).oneOpt(); |
| | | return nodeOpt.orElse(null); |
| | | } |
| | | |
| | | /** |
| | | * 物理删除节点id下的子节点(性能考虑,否则数据太多) |
| | | * @param nodeId 节点id |
| | | */ |
| | | public void deleteSubNodes(Long nodeId) { |
| | | this.baseMapper.deleteSubNodes(nodeId); |
| | | } |
| | | |
| | | /** |
| | | * 获取程序包下所有层序文件节点 |
| | | * @param packageNodeId 程序包名 节点id |
| | | * @return 包下属的程序文件 |
| | | */ |
| | | public List<NcNode> getProgramFilesByPackageId(Long packageNodeId) { |
| | | return this.lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_FILE) |
| | | .eq(NcNode::getParentId,packageNodeId).eq(NcNode::getIsLastEdition,1).list(); |
| | | } |
| | | |
| | | /** |
| | | * 升级版本号(+1) |
| | | * @param nodeId 节点id |
| | | */ |
| | | @Transactional |
| | | public void upgradeVersionNumber(Long nodeId) { |
| | | NcNode node = this.getById(nodeId); |
| | | node.upgradeVersionNUmber(); |
| | | this.updateById(node); |
| | | |
| | | } |
| | | } |