From 214c51513641ee84805ee4b17b1a56f74c15a20d Mon Sep 17 00:00:00 2001 From: jing's Date: Wed, 21 Feb 2024 13:30:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E7=BB=93=E6=9E=84=20tree=20?= =?UTF-8?q?=E5=92=8Clist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/bomnew/pojo/vo/ReportBomVO.java | 4 + .../service/domain/BaseForwardReport.java | 161 ++++++++++++++++++ .../domain/EBom/EBomForwardReport.java | 115 +++---------- .../domain/PBom/PBomForwardReport.java | 111 +++--------- 4 files changed, 210 insertions(+), 181 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReportBomVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReportBomVO.java index 1157566d..86b92e6c 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReportBomVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReportBomVO.java @@ -18,4 +18,8 @@ public class ReportBomVO { private Integer bomType; @ApiModelProperty("查询方式 0-单层 1-多层 2-汇总") private Integer queryType; + + + @ApiModelProperty("查询方式 0-树 1-列表") + private Integer dataType; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java new file mode 100644 index 00000000..d1c612d0 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java @@ -0,0 +1,161 @@ +package com.nflg.product.bomnew.service.domain; + +import cn.hutool.core.collection.CollectionUtil; +import com.nflg.product.bomnew.constant.ReportConstant; +import com.nflg.product.bomnew.pojo.query.ReverseReportQuery; +import com.nflg.product.bomnew.pojo.vo.ForwardReportVO; +import com.nflg.product.bomnew.pojo.vo.ReportBomVO; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public abstract class BaseForwardReport { + + protected ReverseReportQuery query; + + public BaseForwardReport(ReverseReportQuery query) { + this.query = query; + } + + /** + * 各层汇总 + * 1.按层分组 和 parent分组 + * 2.下层数量=下层数量*上层数量 + * + * @param bomList + */ + protected void sumLevel(List bomList) { + //分层统计,避免使用遍历树统计 + Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum)); + Map> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); + listMap.forEach((key, value) -> { + value.forEach(parent -> { + List dataList = bomParentMap.get(parent.getBomRowId()); + if (CollectionUtil.isNotEmpty(dataList)) { + for (ForwardReportVO data : + dataList) { + data.setNum(parent.getNum().multiply(data.getNum())); + } + } + + }); + }); + + } + + /** + * 获取叶子节点 合并相同物料 + * + * @param convertBomList + * @return + */ + protected List leafMergeMaterialNo(List convertBomList) { + //无子级的数据 + List leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() == 0)).collect(Collectors.toList()); + //相同物料合并统计 + Map> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo)); + List sumList = new ArrayList<>(); + materialNoListMap.forEach((key, valueList) -> { + if (CollectionUtil.isNotEmpty(valueList)) { + ForwardReportVO item0 = valueList.get(0); + //相同物料合并数量 + if (valueList.size() > 1) { + for (int index = 1; index < valueList.size(); index++) { + item0.setNum(item0.getNum().add(valueList.get(index).getNum())); + } + } + sumList.add(item0); + } + }); + return sumList; + + } + + + protected List showDataStyle(List bomList, Long parentRowId) { + Integer dataStyle = ReportConstant.DataTypeEnum.LIST.getValue(); + if (Objects.nonNull(query.getDataType())) { + dataStyle = query.getDataType(); + } + query.setDataType(dataStyle); + List rootList = null; + if (dataStyle.compareTo(ReportConstant.DataTypeEnum.LIST.getValue()) == 0) { + //列表 + rootList = listToList(bomList, parentRowId); + } else if (dataStyle.compareTo(ReportConstant.DataTypeEnum.TREE.getValue()) == 0) { + //转化为树结构 + rootList = listToTree(bomList, parentRowId); + } + + return rootList; + } + + + List listToTree(List bomList, Long parentRowId) { + Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); + bomList.forEach(item -> { + item.setChildNodes(listMap.get(item.getBomRowId())); + }); + List rootList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList()); + return rootList; + } + + + protected List listToList(List bomList, Long parentRowId) { + + Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); + List parentChildList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList()); + //无bom + List rootList = parentChildList.stream().filter(item -> item.getBomRowId() == null || item.getBomRowId().longValue() == 0).collect(Collectors.toList()); + //有bom + List moreBomList = parentChildList.stream().filter(item -> item.getBomRowId() != null || item.getBomRowId().longValue() > 0).collect(Collectors.toList()); + //采用前序遍历 前->左->右 输出 + Deque majorStack = new ArrayDeque(); + + + if (CollectionUtil.isNotEmpty(moreBomList)) { + AtomicInteger noCode = new AtomicInteger(); + //noCode.set(1); + for (ForwardReportVO item : moreBomList) { + + majorStack.push(item); + + while (!majorStack.isEmpty()) { + + ForwardReportVO pop = majorStack.poll(); + if (pop != null) { + pop.setOrderNumber(noCode.incrementAndGet() + ""); + rootList.add(pop); + List childNode = listMap.get(pop.getBomRowId()); + if (CollectionUtil.isNotEmpty(childNode)) { + for (int size = childNode.size() - 1, index = 0; size >= index; size--) { + majorStack.push(childNode.get(size)); + } + } + } + } + + } + } + + return rootList; + + } + + protected ReportBomVO buildReportBomVo(ForwardReportVO parent,List childNode,Integer dataType){ + ReportBomVO reportBomVO = new ReportBomVO(); + reportBomVO.setBomType(query.getBomType()); + reportBomVO.setQueryType(query.getQueryType()); + reportBomVO.setDataType(dataType); + reportBomVO.setParent(parent); + reportBomVO.setChildNodes(childNode); + return reportBomVO; + } + + protected ReportBomVO buildReportBomVo(ForwardReportVO parent,List childNode){ + + return buildReportBomVo(parent,childNode,ReportConstant.DataTypeEnum.LIST.getValue()); + } + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java index ec875eea..e3da796e 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java @@ -17,33 +17,30 @@ import com.nflg.product.bomnew.pojo.query.ReverseReportQuery; import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.service.BomNewEbomChildFormalService; import com.nflg.product.bomnew.service.BomNewEbomParentFormalService; +import com.nflg.product.bomnew.service.domain.BaseForwardReport; import com.nflg.product.bomnew.util.ListCommonUtil; import com.nflg.product.bomnew.util.VersionUtil; import nflg.product.common.constant.STATE; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * ebom报表统计 */ -public class EBomForwardReport { +public class EBomForwardReport extends BaseForwardReport { - ReverseReportQuery query; public EBomForwardReport(ReverseReportQuery query) { - this.query = query; + + super(query); } -public EBomForwardReport(){ -} QueryWrapper buildQuery() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(BomNewEbomParentFormalEntity::getMaterialNo, query.getMaterialNo()); @@ -51,9 +48,7 @@ public EBomForwardReport(){ queryWrapper.lambda().eq(BomNewEbomParentFormalEntity::getDrawingNo, query.getDrawingNo()); } if (query.getVersionStrategy().compareTo(ReportConstant.VersionStrategyEnum.NEW.getValue()) == 0) { - queryWrapper.lambda().eq(BomNewEbomParentFormalEntity::getCurrentVersion, getMaxVersion()); - } else { queryWrapper.lambda().eq(BomNewEbomParentFormalEntity::getCurrentVersion, query.getBomVersion()); } @@ -79,6 +74,7 @@ public EBomForwardReport(){ /** * 最大的版本号 + * * @return */ public String getMaxVersion() { @@ -105,34 +101,30 @@ public EBomForwardReport(){ ReportBomVO singleReport() { BomNewEbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); - ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getConvertToEbomTime()); - reportBomVO.setParent(forwardReportVO); + // QueryWrapper queryWrapper = new QueryWrapper<>(); // queryWrapper.lambda().eq(BomNewEbomChildFormalEntity::getParentRowId, parentFormal.getRowId()); // // List list = SpringUtil.getBean(BomNewEbomChildFormalService.class).list(queryWrapper); // List list = SpringUtil.getBean(BomNewEbomParentFormalService.class).getBaseMapper().getParentChild(parentFormal.getRowId()); + List nodeList=null; + if (CollectionUtil.isNotEmpty(list)) { - if (CollectionUtil.isEmpty(list)) { - reportBomVO.setChildNodes(new ArrayList<>()); - } else { - List nodeList = Convert.convert(new TypeReference>() { + nodeList = Convert.convert(new TypeReference>() { }, list); for (ForwardReportVO vo : nodeList) { - vo.setCreatedTime(reportBomVO.getParent().getCreatedTime()); + vo.setCreatedTime(forwardReportVO.getCreatedTime()); // vo.setOrderNumber(""); } - reportBomVO.setChildNodes(nodeList); + } - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); - return reportBomVO; + + return buildReportBomVo(forwardReportVO,nodeList); } @@ -194,31 +186,26 @@ public EBomForwardReport(){ */ ReportBomVO multiReport() { BomNewEbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); + ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getConvertToEbomTime()); - reportBomVO.setParent(forwardReportVO); - List bomList = bomDetailList(parentFormal.getRowId()); - List convertBomList = Convert.convert(new TypeReference>() { }, bomList); - sumLevel(convertBomList); + List rootList; //转化为树结构 - List rootList = listToTree(convertBomList, parentFormal.getRowId()); + rootList = showDataStyle(convertBomList, parentFormal.getRowId()); - reportBomVO.setChildNodes(rootList); - return reportBomVO; + return buildReportBomVo(forwardReportVO,rootList,query.getDataType()); } + /** * 汇总 * 1. 查询所有不含子级的物料信息,并对数据进行汇总。 @@ -228,13 +215,11 @@ public EBomForwardReport(){ ReportBomVO sumReport() { BomNewEbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); + ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getConvertToEbomTime()); - reportBomVO.setParent(forwardReportVO); + List bomList = bomDetailList(parentFormal.getRowId()); List convertBomList = Convert.convert(new TypeReference>() { }, bomList); @@ -242,63 +227,11 @@ public EBomForwardReport(){ sumLevel(convertBomList); //无子级的数据 - List leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() ==0)).collect(Collectors.toList()); - //相同物料合并统计 - Map> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo)); - List sumList = new ArrayList<>(); - materialNoListMap.forEach((key, valueList) -> { - if (CollectionUtil.isNotEmpty(valueList)) { - ForwardReportVO item0 = valueList.get(0); - //相同物料合并数量 - if (valueList.size() > 1) { - for (int index = 1; index < valueList.size(); index++) { - item0.setNum(item0.getNum().add(valueList.get(index).getNum())); - } - } - sumList.add(item0); - } - }); + List sumList =leafMergeMaterialNo(convertBomList); - reportBomVO.setChildNodes(sumList); - return reportBomVO; + return buildReportBomVo(forwardReportVO,sumList); } - /** - * 各层汇总 - *1.按层分组 和 parent分组 - * 2.下层数量=下层数量*上层数量 - * @param bomList - */ - void sumLevel(List bomList) { - //分层统计,避免使用遍历树统计 - Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum)); - Map> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); - listMap.forEach((key, value) -> { - value.forEach(parent -> { - List dataList = bomParentMap.get(parent.getBomRowId()); - if (CollectionUtil.isNotEmpty(dataList)) { - for (ForwardReportVO data : - dataList) { - data.setNum(parent.getNum().multiply(data.getNum())); - } - } - - }); - }); - - } - - - List listToTree(List bomList, Long parentRowId) { - Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); - bomList.forEach(item -> { - item.setChildNodes(listMap.get(item.getBomRowId())); - }); - List rootList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList()); - return rootList; - } - - diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomForwardReport.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomForwardReport.java index 59958a4b..4aa71023 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomForwardReport.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomForwardReport.java @@ -18,6 +18,7 @@ import com.nflg.product.bomnew.service.BomNewEbomChildFormalService; import com.nflg.product.bomnew.service.BomNewEbomParentFormalService; import com.nflg.product.bomnew.service.BomNewPbomChildFormalService; import com.nflg.product.bomnew.service.BomNewPbomParentFormalService; +import com.nflg.product.bomnew.service.domain.BaseForwardReport; import com.nflg.product.bomnew.service.domain.EBom.EBomFormalTreeTask; import com.nflg.product.bomnew.util.VersionUtil; import nflg.product.common.constant.STATE; @@ -33,12 +34,12 @@ import java.util.stream.Collectors; /** * pbom报表统计 */ -public class PBomForwardReport { +public class PBomForwardReport extends BaseForwardReport { + - ReverseReportQuery query; public PBomForwardReport(ReverseReportQuery query) { - this.query = query; + super(query); } @@ -55,15 +56,11 @@ public class PBomForwardReport { } if (query.getVersionStrategy().compareTo(ReportConstant.VersionStrategyEnum.NEW.getValue()) == 0) { - queryWrapper.lambda().eq(BomNewPbomParentFormalEntity::getCurrentVersion, getMaxVersion()); - } else { queryWrapper.lambda().eq(BomNewPbomParentFormalEntity::getCurrentVersion, query.getBomVersion()); } - - if (StrUtil.isNotBlank(query.getStartDate()) && StrUtil.isNotBlank(query.getEndDate())) { queryWrapper.lambda().between(BomNewPbomParentFormalEntity::getReleaseTime, query.getStartDate(), query.getEndDate()); } @@ -111,33 +108,31 @@ public class PBomForwardReport { ReportBomVO singleReport() { BomNewPbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); + ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getReleaseTime()); - reportBomVO.setParent(forwardReportVO); + // QueryWrapper queryWrapper = new QueryWrapper<>(); // queryWrapper.lambda().eq(BomNewPbomChildFormalEntity::getParentRowId, parentFormal.getRowId()); // List list = SpringUtil.getBean(BomNewPbomChildFormalService.class).list(queryWrapper); List list = SpringUtil.getBean(BomNewPbomParentFormalService.class).getBaseMapper().getParentChild(parentFormal.getRowId()); + List nodeList=null; + if (CollectionUtil.isNotEmpty(list)) { - if (CollectionUtil.isEmpty(list)) { - reportBomVO.setChildNodes(new ArrayList<>()); - } else { - List nodeList = Convert.convert(new TypeReference>() { + nodeList = Convert.convert(new TypeReference>() { }, list); for (ForwardReportVO vo : nodeList) { - vo.setCreatedTime(reportBomVO.getParent().getCreatedTime()); + vo.setCreatedTime(forwardReportVO.getCreatedTime()); } - reportBomVO.setChildNodes(nodeList); + } - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); - return reportBomVO; + + return buildReportBomVo(forwardReportVO,nodeList); } @@ -204,13 +199,11 @@ public class PBomForwardReport { */ ReportBomVO multiReport() { BomNewPbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); + ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getReleaseTime()); - reportBomVO.setParent(forwardReportVO); + List bomList = bomDetailList(parentFormal.getRowId()); @@ -221,11 +214,8 @@ public class PBomForwardReport { sumLevel(convertBomList); //转化为树结构 - List rootList = listToTree(convertBomList, parentFormal.getRowId()); - - reportBomVO.setChildNodes(rootList); - return reportBomVO; - + List rootList = showDataStyle(convertBomList, parentFormal.getRowId()); + return buildReportBomVo(forwardReportVO,rootList,query.getDataType()); } @@ -236,80 +226,23 @@ public class PBomForwardReport { * @return */ ReportBomVO sumReport() { - BomNewPbomParentFormalEntity parentFormal = getParent(); - ReportBomVO reportBomVO = new ReportBomVO(); - reportBomVO.setBomType(query.getBomType()); - reportBomVO.setQueryType(query.getQueryType()); + ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal); forwardReportVO.setCreatedTime(parentFormal.getReleaseTime()); - reportBomVO.setParent(forwardReportVO); + List bomList = bomDetailList(parentFormal.getRowId()); List convertBomList = Convert.convert(new TypeReference>() { }, bomList); sumLevel(convertBomList); + List sumList =leafMergeMaterialNo(convertBomList); - //无子级的数据 - List leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() ==0)).collect(Collectors.toList()); - //相同物料合并统计 - Map> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo)); - List sumList = new ArrayList<>(); - materialNoListMap.forEach((key, valueList) -> { - if (CollectionUtil.isNotEmpty(valueList)) { - ForwardReportVO item0 = valueList.get(0); - //相同物料合并数量 - if (valueList.size() > 1) { - for (int index = 1; index < valueList.size(); index++) { - item0.setNum(item0.getNum().add(valueList.get(index).getNum())); - } - } - sumList.add(item0); - } - }); - reportBomVO.setChildNodes(sumList); - return reportBomVO; + return buildReportBomVo(forwardReportVO,sumList); } - /** - * 各层汇总 - *1.按层分组 和 parent分组 - * 2.下层数量=下层数量*上层数量 - * @param bomList - */ - void sumLevel(List bomList) { - //分层统计,避免使用遍历树统计 - Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum)); - Map> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); - listMap.forEach((key, value) -> { - value.forEach(parent -> { - List dataList = bomParentMap.get(parent.getBomRowId()); - if (CollectionUtil.isNotEmpty(dataList)) { - for (ForwardReportVO data : - dataList) { - data.setNum(parent.getNum().multiply(data.getNum())); - } - } - - }); - }); - - } - - - List listToTree(List bomList, Long parentRowId) { - Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); - bomList.forEach(item -> { - item.setChildNodes(listMap.get(item.getBomRowId())); - }); - List rootList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList()); - return rootList; - } - - - @@ -326,9 +259,7 @@ public class PBomForwardReport { if (query.getQueryType().compareTo(ReportConstant.QueryTypeEnum.SUM.getValue()) == 0) { return sumReport(); } - return null; } - }