diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java index 5d9fcbf..96ba54f 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java @@ -236,11 +236,11 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { */ private void validEntityUsed(@NotNull ProdMaterialBomBo entity) { - if(entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE)){ + if (entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE)) { throw new ServiceException("此物料bom已经发布,不能修改"); } - if(entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_HISTORY)){ + if (entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_HISTORY)) { throw new ServiceException("此物料bom为历史版本,不能修改"); } @@ -407,16 +407,17 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { */ private List buildMaterialBomTree(List bomList) { // 1. 建立索引 - Map> parentVersionGroup = new HashMap<>(); - Map> materialVersions = new HashMap<>(); - Map materialNameMap = new HashMap<>(); - Map materialTypeIdMap = new HashMap<>(); - Map materialTypeNameMap = new HashMap<>(); - Map versionActiveFlagMap = new HashMap<>(); // 新增:存储版本状态 + Map> parentVersionGroup = new HashMap<>();//根据parentid_materialbomversion分组 + Map> materialVersions = new HashMap<>();//根据materialid分组存储materialbomversion + Map materialNameMap = new HashMap<>();//根据materialid存储materialname + Map materialTypeIdMap = new HashMap<>();//根据materialid存储materialtypeid + Map materialTypeNameMap = new HashMap<>();//根据materialid存储materialtypename + Map versionActiveFlagMap = new HashMap<>(); // 根据materialid和version存储版本状态 for (ProdMaterialBomVo item : bomList) { // 按parentId+version分组 String parentKey = item.getParentId() + "_" + item.getMaterialBomVersion(); + //如果不存在则计算添加 parentVersionGroup.computeIfAbsent(parentKey, k -> new ArrayList<>()).add(item); // 记录每个material的所有版本 @@ -443,7 +444,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { // 记录版本状态(新增) String versionKey = item.getParentId() + "_" + item.getMaterialBomVersion(); - versionActiveFlagMap.putIfAbsent(versionKey, item.getActiveFlag()); // 假设activeFlag是boolean类型 + versionActiveFlagMap.putIfAbsent(versionKey, item.getActiveFlag()); } @@ -464,41 +465,17 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { .collect(Collectors.toSet()); for (String version : parentVersions) { - String versionKey = topParentId + "_" + version; - String activeFlag = versionActiveFlagMap.get(versionKey); - TreeSelect versionNode = new TreeSelect(); - versionNode.setTreeKey(versionKey); - versionNode.setLabel(buildLabel(topParentId, version, materialNameMap,materialTypeNameMap)); - versionNode.setMaterialBomVersion(version); - versionNode.setMaterialId(topParentId); - versionNode.setMaterialTypeId(materialTypeIdMap.getOrDefault(topParentId, 0L)); - versionNode.setMaterialTypeName(materialTypeNameMap.getOrDefault(topParentId, "")); - versionNode.setActiveFlag(activeFlag); - versionNode.setChildren(new ArrayList<>()); - String parentKey = topParentId + "_" + version; + String activeFlag = versionActiveFlagMap.get(parentKey); + TreeSelect versionNode = createParentNode(topParentId, version, activeFlag, materialNameMap, materialTypeIdMap, materialTypeNameMap, parentKey); + if (parentVersionGroup.containsKey(parentKey)) { // 获取该父节点下的所有materialId Set childMaterialIds = parentVersionGroup.get(parentKey).stream() .map(ProdMaterialBomVo::getMaterialId) .collect(Collectors.toSet()); + buildTree(versionNode,childMaterialIds,materialVersions,parentVersionGroup,materialNameMap,materialTypeIdMap,materialTypeNameMap,versionActiveFlagMap); - - for (Long materialId : childMaterialIds) { - // 添加无版本号的基础节点 - versionNode.getChildren().add(createBasicNode(materialId,materialNameMap,materialTypeIdMap,materialTypeNameMap)); - - // 动态添加该material的有子节点的版本 - if (materialVersions.containsKey(materialId)) { - for (String childVersion : materialVersions.get(materialId)) { - TreeSelect versionedNode = createVersionNodeIfHasChildren( - materialId, childVersion, activeFlag,parentVersionGroup,materialNameMap,materialTypeIdMap,materialTypeNameMap); - if (versionedNode != null) { - versionNode.getChildren().add(versionedNode); - } - } - } - } } // 只有当有子节点时才添加父节点 @@ -513,6 +490,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { // return rootNodes.stream().map(TreeSelect::new).collect(Collectors.toList()); } + private static String buildLabel(Long materialId, String version, Map materialNameMap, Map materialTypeNameMap) { String materialName = materialNameMap.getOrDefault(materialId, ""); String materialTypeName = materialTypeNameMap.getOrDefault(materialId, ""); @@ -523,8 +501,30 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { } - private static TreeSelect createBasicNode(Long materialId, - Map materialNameMap,Map materialTypeIdMap,Map materialTypeNameMap) { + private static void buildTree(TreeSelect versionNode, + Set childMaterialIds,Map> materialVersions, + Map> parentVersionGroup, + Map materialNameMap, Map materialTypeIdMap, + Map materialTypeNameMap,Map versionActiveFlagMap){ + for (Long materialId : childMaterialIds) { + // 添加无版本号的基础节点 + versionNode.getChildren().add(createChildNode(materialId, materialNameMap, materialTypeIdMap, materialTypeNameMap)); + + // 动态添加该material的有子节点的版本 + if (materialVersions.containsKey(materialId)) { + for (String childVersion : materialVersions.get(materialId)) { + TreeSelect versionedNode = createVersionNodeIfHasChildren( + materialId, childVersion, materialVersions,parentVersionGroup, materialNameMap, materialTypeIdMap, materialTypeNameMap, versionActiveFlagMap); + if (versionedNode != null) { + versionNode.getChildren().add(versionedNode); + } + } + } + } + } + + private static TreeSelect createChildNode(Long materialId, + Map materialNameMap, Map materialTypeIdMap, Map materialTypeNameMap) { // this.parentId = prodMaterialBomVo.getParentId(); TreeSelect node = new TreeSelect(); @@ -543,40 +543,52 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { node.setActiveFlag(null); return node; } - private static TreeSelect createVersionNodeIfHasChildren(Long materialId, String version,String activeFlag, + + private static TreeSelect createVersionNodeIfHasChildren(Long materialId, String version, + Map> materialVersions, Map> parentVersionGroup, - Map materialNameMap,Map materialTypeIdMap,Map materialTypeNameMap) { - String key = materialId + "_" + version; + Map materialNameMap, Map materialTypeIdMap, + Map materialTypeNameMap, Map versionActiveFlagMap) { + + String key = materialId+"_"+version; + String activeFlag = versionActiveFlagMap.getOrDefault(key, ""); + // 只有当该版本有子节点时才创建 if (parentVersionGroup.containsKey(key)) { - TreeSelect node = new TreeSelect(); - node.setTreeKey(key); - node.setLabel(buildLabel(materialId, version, materialNameMap,materialTypeNameMap)); - node.setMaterialBomVersion(version); - node.setMaterialBomVersion(version); - node.setMaterialId(materialId); - node.setMaterialTypeId(materialTypeIdMap.getOrDefault(materialId, 0L)); - node.setMaterialTypeName(materialTypeNameMap.getOrDefault(materialId, "")); - node.setActiveFlag(activeFlag); - - node.setChildren(new ArrayList<>()); + TreeSelect node = createParentNode(materialId, version, activeFlag, materialNameMap, materialTypeIdMap, materialTypeNameMap, key); // 添加子节点 Set childIds = parentVersionGroup.get(key).stream() .map(ProdMaterialBomVo::getMaterialId) .collect(Collectors.toSet()); - for (Long childId : childIds) { - node.getChildren().add(createBasicNode(childId,materialNameMap,materialTypeIdMap,materialTypeNameMap)); - } + buildTree(node,childIds,materialVersions,parentVersionGroup,materialNameMap,materialTypeIdMap,materialTypeNameMap,versionActiveFlagMap); +// for (Long childId : childIds) { +// node.getChildren().add(createChildNode(childId, materialNameMap, materialTypeIdMap, materialTypeNameMap)); +// } return node; } return null; } + private static TreeSelect createParentNode(Long materialId, String version, String activeFlag, Map materialNameMap, Map materialTypeIdMap, Map materialTypeNameMap, String key) { + TreeSelect node = new TreeSelect(); + node.setTreeKey(key); + node.setLabel(buildLabel(materialId, version, materialNameMap, materialTypeNameMap)); + node.setMaterialBomVersion(version); + node.setMaterialId(materialId); + node.setMaterialTypeId(materialTypeIdMap.getOrDefault(materialId, 0L)); + node.setMaterialTypeName(materialTypeNameMap.getOrDefault(materialId, "")); + node.setActiveFlag(activeFlag); - private static List buildChildren(Long currentParentId,List items, + node.setChildren(new ArrayList<>()); + + return node; + } + + + private static List buildChildren(Long currentParentId, List items, Map>> parentVersionMap) { List children = new ArrayList<>(); @@ -629,8 +641,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { } - - // private static void printTree(List nodes, int indent) { // for (ProdMaterialBomVo node : nodes) { // System.out.println(" ".repeat(indent) + node.getParentMaterialName()+"["+node.getMaterialBomVersion()+"]"+node.getMaterialName()); @@ -747,18 +757,17 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { } - /** * 递归列表 */ private void recursionFn(List list, ProdMaterialBomVo parent) { // 获取子节点 List childList = getChildList(list, parent); - if(childList == null || childList.isEmpty()){ - System.out.println(parent.getMaterialBomId()+"----"); + if (childList == null || childList.isEmpty()) { + System.out.println(parent.getMaterialBomId() + "----"); // parent.setMaterialBomVersion(""); - }else{ - System.out.println(parent.getMaterialBomId()+"****"+childList.get(0).getMaterialBomVersion()); + } else { + System.out.println(parent.getMaterialBomId() + "****" + childList.get(0).getMaterialBomVersion()); // parent.setMaterialBomVersion(childList.get(0).getMaterialBomVersion()); } parent.setChildren(childList);