转换结构 tree 和list

This commit is contained in:
jing's 2024-02-21 13:30:42 +08:00
parent 7f8363978d
commit 214c515136
4 changed files with 210 additions and 181 deletions

View File

@ -18,4 +18,8 @@ public class ReportBomVO {
private Integer bomType;
@ApiModelProperty("查询方式 0-单层 1-多层 2-汇总")
private Integer queryType;
@ApiModelProperty("查询方式 0-树 1-列表")
private Integer dataType;
}

View File

@ -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<ForwardReportVO> bomList) {
//分层统计避免使用遍历树统计
Map<Integer, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum));
Map<Long, List<ForwardReportVO>> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
listMap.forEach((key, value) -> {
value.forEach(parent -> {
List<ForwardReportVO> 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<ForwardReportVO> leafMergeMaterialNo(List<ForwardReportVO> convertBomList) {
//无子级的数据
List<ForwardReportVO> leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() == 0)).collect(Collectors.toList());
//相同物料合并统计
Map<String, List<ForwardReportVO>> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo));
List<ForwardReportVO> 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<ForwardReportVO> showDataStyle(List<ForwardReportVO> bomList, Long parentRowId) {
Integer dataStyle = ReportConstant.DataTypeEnum.LIST.getValue();
if (Objects.nonNull(query.getDataType())) {
dataStyle = query.getDataType();
}
query.setDataType(dataStyle);
List<ForwardReportVO> 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<ForwardReportVO> listToTree(List<ForwardReportVO> bomList, Long parentRowId) {
Map<Long, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
bomList.forEach(item -> {
item.setChildNodes(listMap.get(item.getBomRowId()));
});
List<ForwardReportVO> rootList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList());
return rootList;
}
protected List<ForwardReportVO> listToList(List<ForwardReportVO> bomList, Long parentRowId) {
Map<Long, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
List<ForwardReportVO> parentChildList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList());
//无bom
List<ForwardReportVO> rootList = parentChildList.stream().filter(item -> item.getBomRowId() == null || item.getBomRowId().longValue() == 0).collect(Collectors.toList());
//有bom
List<ForwardReportVO> moreBomList = parentChildList.stream().filter(item -> item.getBomRowId() != null || item.getBomRowId().longValue() > 0).collect(Collectors.toList());
//采用前序遍历 ->-> 输出
Deque<ForwardReportVO> 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<ForwardReportVO> 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<ForwardReportVO> 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<ForwardReportVO> childNode){
return buildReportBomVo(parent,childNode,ReportConstant.DataTypeEnum.LIST.getValue());
}
}

View File

@ -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<BomNewEbomParentFormalEntity> buildQuery() {
QueryWrapper<BomNewEbomParentFormalEntity> 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<BomNewEbomChildFormalEntity> queryWrapper = new QueryWrapper<>();
// queryWrapper.lambda().eq(BomNewEbomChildFormalEntity::getParentRowId, parentFormal.getRowId());
//
// List<BomNewEbomChildFormalEntity> list = SpringUtil.getBean(BomNewEbomChildFormalService.class).list(queryWrapper);
//
List<BomNewEbomParentFormalVO> list = SpringUtil.getBean(BomNewEbomParentFormalService.class).getBaseMapper().getParentChild(parentFormal.getRowId());
List<ForwardReportVO> nodeList=null;
if (CollectionUtil.isNotEmpty(list)) {
if (CollectionUtil.isEmpty(list)) {
reportBomVO.setChildNodes(new ArrayList<>());
} else {
List<ForwardReportVO> nodeList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
nodeList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
}, 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<BomNewEbomParentFormalVO> bomList = bomDetailList(parentFormal.getRowId());
List<ForwardReportVO> convertBomList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
}, bomList);
sumLevel(convertBomList);
List<ForwardReportVO> rootList;
//转化为树结构
List<ForwardReportVO> 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<BomNewEbomParentFormalVO> bomList = bomDetailList(parentFormal.getRowId());
List<ForwardReportVO> convertBomList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
}, bomList);
@ -242,63 +227,11 @@ public EBomForwardReport(){
sumLevel(convertBomList);
//无子级的数据
List<ForwardReportVO> leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() ==0)).collect(Collectors.toList());
//相同物料合并统计
Map<String, List<ForwardReportVO>> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo));
List<ForwardReportVO> 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<ForwardReportVO> sumList =leafMergeMaterialNo(convertBomList);
reportBomVO.setChildNodes(sumList);
return reportBomVO;
return buildReportBomVo(forwardReportVO,sumList);
}
/**
* 各层汇总
*1.按层分组 parent分组
* 2.下层数量=下层数量*上层数量
* @param bomList
*/
void sumLevel(List<ForwardReportVO> bomList) {
//分层统计避免使用遍历树统计
Map<Integer, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum));
Map<Long, List<ForwardReportVO>> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
listMap.forEach((key, value) -> {
value.forEach(parent -> {
List<ForwardReportVO> dataList = bomParentMap.get(parent.getBomRowId());
if (CollectionUtil.isNotEmpty(dataList)) {
for (ForwardReportVO data :
dataList) {
data.setNum(parent.getNum().multiply(data.getNum()));
}
}
});
});
}
List<ForwardReportVO> listToTree(List<ForwardReportVO> bomList, Long parentRowId) {
Map<Long, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
bomList.forEach(item -> {
item.setChildNodes(listMap.get(item.getBomRowId()));
});
List<ForwardReportVO> rootList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList());
return rootList;
}

View File

@ -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<BomNewPbomChildFormalEntity> queryWrapper = new QueryWrapper<>();
// queryWrapper.lambda().eq(BomNewPbomChildFormalEntity::getParentRowId, parentFormal.getRowId());
// List<BomNewPbomChildFormalEntity> list = SpringUtil.getBean(BomNewPbomChildFormalService.class).list(queryWrapper);
List<BomNewPbomParentFormalVO> list = SpringUtil.getBean(BomNewPbomParentFormalService.class).getBaseMapper().getParentChild(parentFormal.getRowId());
List<ForwardReportVO> nodeList=null;
if (CollectionUtil.isNotEmpty(list)) {
if (CollectionUtil.isEmpty(list)) {
reportBomVO.setChildNodes(new ArrayList<>());
} else {
List<ForwardReportVO> nodeList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
nodeList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
}, 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<BomNewPbomParentFormalVO> bomList = bomDetailList(parentFormal.getRowId());
@ -221,11 +214,8 @@ public class PBomForwardReport {
sumLevel(convertBomList);
//转化为树结构
List<ForwardReportVO> rootList = listToTree(convertBomList, parentFormal.getRowId());
reportBomVO.setChildNodes(rootList);
return reportBomVO;
List<ForwardReportVO> 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<BomNewPbomParentFormalVO> bomList = bomDetailList(parentFormal.getRowId());
List<ForwardReportVO> convertBomList = Convert.convert(new TypeReference<List<ForwardReportVO>>() {
}, bomList);
sumLevel(convertBomList);
List<ForwardReportVO> sumList =leafMergeMaterialNo(convertBomList);
//无子级的数据
List<ForwardReportVO> leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() ==0)).collect(Collectors.toList());
//相同物料合并统计
Map<String, List<ForwardReportVO>> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo));
List<ForwardReportVO> 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<ForwardReportVO> bomList) {
//分层统计避免使用遍历树统计
Map<Integer, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum));
Map<Long, List<ForwardReportVO>> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
listMap.forEach((key, value) -> {
value.forEach(parent -> {
List<ForwardReportVO> dataList = bomParentMap.get(parent.getBomRowId());
if (CollectionUtil.isNotEmpty(dataList)) {
for (ForwardReportVO data :
dataList) {
data.setNum(parent.getNum().multiply(data.getNum()));
}
}
});
});
}
List<ForwardReportVO> listToTree(List<ForwardReportVO> bomList, Long parentRowId) {
Map<Long, List<ForwardReportVO>> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId));
bomList.forEach(item -> {
item.setChildNodes(listMap.get(item.getBomRowId()));
});
List<ForwardReportVO> 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;
}
}