@ -1,14 +1,12 @@
package org.dromara.mes.service.impl ;
import com.alibaba.csp.sentinel.util.StringUtil ;
import com.baomidou.mybatisplus.core.toolkit.Wrappers ;
import org.dromara.common.constant.HwMomMesConstants ;
import org.dromara.common.core.utils.MapstructUtils ;
import org.dromara.common.core.utils.StringUtils ;
import com.github.yulichang.toolkit.JoinWrappers ;
import com.github.yulichang.wrapper.MPJLambdaWrapper ;
import lombok.RequiredArgsConstructor ;
import org.dromara.mes.domain.BaseStructureBom ;
import org.dromara.mes.domain.vo.BaseStructureBomVo ;
import org.dromara.mes.domain.vo.TreeSelect ;
import org.springframework.stereotype.Service ;
import org.dromara.mes.domain.bo.ProdMaterialBomBo ;
@ -19,6 +17,7 @@ import org.dromara.mes.service.IProdMaterialBomService;
import java.util.* ;
import java.util.stream.Collectors ;
import java.util.function.Function ;
import org.springframework.transaction.annotation.Transactional ;
import cn.hutool.core.collection.CollUtil ;
@ -71,7 +70,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
. like ( StringUtils . isNotBlank ( bo . getMaterialName ( ) ) , ProdMaterialBom : : getMaterialName , bo . getMaterialName ( ) )
. like ( StringUtils . isNotBlank ( bo . getMaterialBomDesc ( ) ) , ProdMaterialBom : : getMaterialBomDesc , bo . getMaterialBomDesc ( ) )
. like ( StringUtils . isNotBlank ( bo . getMaterialBomVersion ( ) ) , ProdMaterialBom : : getMaterialBomVersion , bo . getMaterialBomVersion ( ) )
. like ( StringUtils . isNotBlank ( bo . getAncestors ( ) ) , ProdMaterialBom : : getAncestors , bo . getAncestors ( ) )
. eq ( bo . getStandardAmount ( ) ! = null , ProdMaterialBom : : getStandardAmount , bo . getStandardAmount ( ) )
. eq ( bo . getTopFlag ( ) ! = null , ProdMaterialBom : : getTopFlag , bo . getTopFlag ( ) )
. eq ( StringUtils . isNotBlank ( bo . getCheckType ( ) ) , ProdMaterialBom : : getCheckType , bo . getCheckType ( ) )
@ -94,11 +92,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
public Boolean insertByBo ( ProdMaterialBomBo bo ) {
isTopFlag ( bo ) ;
ProdMaterialBomVo info = baseMapper . selectVoById ( bo . getParentId ( ) ) ;
if ( StringUtils . isNull ( info ) ) {
bo . setAncestors ( bo . getParentId ( ) . toString ( ) ) ;
} else {
bo . setAncestors ( info . getAncestors ( ) + "," + bo . getParentId ( ) ) ;
}
ProdMaterialBom add = MapstructUtils . convert ( bo , ProdMaterialBom . class ) ;
validEntityBeforeSave ( add ) ;
boolean flag = baseMapper . insert ( add ) > 0 ;
@ -178,6 +171,8 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
if ( CollUtil . isEmpty ( boList ) ) {
return false ;
}
//todo:在pojo中增加equals方法, 来判断有没有修改, 如果有修改则判断计划中是否有引用, 根据物料id和bom版本找
//TODO:判断在新建子级时, 是否存在在此颗树的父级节点存在此子级节点, 根据bom版本找
//获取materialbomid不为空的更新, 获取materialbomid为空materialid不为空的保存
for ( ProdMaterialBomBo prodMaterialBomBo : boList ) {
if ( prodMaterialBomBo . getMaterialBomId ( ) = = null ) {
@ -210,6 +205,17 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return baseMapper . selectMaterialBomJoinStructureList ( bo ) ;
}
/ * *
* 查 询 父 级 生 产 bom 信 息
*
* @param bo 生 产 bom 信 息
* @return 生 产 bom 信 息 集 合
* /
@Override
public ProdMaterialBomVo selectParentMaterialBom ( ProdMaterialBomBo bo ) {
return baseMapper . selectParentMaterialBomJoin ( bo ) ;
}
/ * *
* 查 询 生 产 bom 信 息
@ -232,26 +238,75 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* /
private List < ProdMaterialBomVo > buildMaterialBomTree ( List < ProdMaterialBomVo > prodMaterialBomVos ) {
List < ProdMaterialBomVo > returnList = new ArrayList < ProdMaterialBomVo > ( ) ;
// ProdMaterialBomVo topProdMaterialBomVo = new ProdMaterialBomVo();
// topProdMaterialBomVo.setMaterialId(0L);
// topProdMaterialBomVo.setMaterialName("生产BOM");
// topProdMaterialBomVo.setMaterialTypeId(1L);
// prodMaterialBomVos.add(topProdMaterialBomVo);
// List<Long> tempList = prodMaterialBomVos.stream().map(ProdMaterialBomVo::getMaterialId).toList();
/ * *
* 由 于 顶 级 节 点 的 parent 没 有 父 级 对 象 , 需 要 虚 拟 新 增 一 个
* 例 如 顶 级 节 点 v1 版 本 A 节 点 下 有 b , 也 有 c , 则 只 增 加 一 个 A 的 顶 级 节 点 对 象 , parentId 是 1 , materialId 是 A
* /
//1、先过滤出顶级
List < ProdMaterialBomVo > topMaterialBomVos = prodMaterialBomVos . stream ( )
. filter ( obj - > prodMaterialBomVos . stream ( )
. noneMatch ( other - > other . getMaterialId ( ) . longValue ( ) = = obj . getParentId ( ) . longValue ( ) ) )
. toList ( ) ;
//2、过滤出parentId相同的
List < ProdMaterialBomVo > distinctParentIdVoList = topMaterialBomVos . stream ( )
. collect ( Collectors . toMap (
ProdMaterialBomVo : : getParentId , // 以parentId作为key
Function . identity ( ) , // 以对象本身作为value
( existing , replacement ) - > existing // 如果遇到重复的key, 保留已有的对象
) )
. values ( )
. stream ( )
. toList ( ) ;
//3、基于过滤出顶级的增加虚拟top节点进行递归
for ( ProdMaterialBomVo prodMaterialBomVo : distinctParentIdVoList ) {
ProdMaterialBomVo topProdMaterialBomVo = new ProdMaterialBomVo ( ) ;
topProdMaterialBomVo . setMaterialBomId ( 0 L ) ;
topProdMaterialBomVo . setMaterialName ( "生产BOM" ) ;
topProdMaterialBomVo . setMaterialTypeId ( 1L ) ;
topProdMaterialBomVo . setParentId ( 0 L ) ;
topProdMaterialBomVo . setMaterialId ( prodMaterialBomVo . getParentId ( ) ) ;
topProdMaterialBomVo . setMaterialTypeId ( prodMaterialBomVo . getParentMaterialTypeId ( ) ) ;
topProdMaterialBomVo . setMaterialTypeName ( prodMaterialBomVo . getParentMaterialTypeName ( ) ) ; //设置parent的物料类型名称
topProdMaterialBomVo . setMaterialName ( prodMaterialBomVo . getParentMaterialName ( ) ) ; //设置parent的物料名称
topProdMaterialBomVo . setMaterialBomVersion ( prodMaterialBomVo . getMaterialBomVersion ( ) ) ;
prodMaterialBomVos . add ( topProdMaterialBomVo ) ;
List < Long > tempList = prodMaterialBomVos . stream ( ) . map ( ProdMaterialBomVo : : getMaterialBomId ) . toList ( ) ;
for ( ProdMaterialBomVo prodMaterialBomVo : prodMaterialBomVos ) {
// 如果是顶级节点, 遍历该父节点的所有子节点
if ( ! tempList . contains ( prodMaterialBomVo . getParentId ( ) ) ) {
recursionFn ( prodMaterialBomVos , prodMaterialBomVo ) ;
returnList . add ( prodMaterialBomVo ) ;
}
recursionFn ( prodMaterialBomVos , topProdMaterialBomVo ) ;
returnList . add ( topProdMaterialBomVo ) ;
// // 如果是顶级节点, 遍历该父节点的所有子节点
// if (!tempList.contains(prodMaterialBomVo.getParentId())) {
// recursionFn(prodMaterialBomVos, prodMaterialBomVo);
// returnList.add(prodMaterialBomVo);
// }
}
// for (ProdMaterialBomVo prodMaterialBomVo : prodMaterialBomVos) {
// // 如果是顶级节点, 遍历该父节点的所有子节点
// if (!tempList.contains(prodMaterialBomVo.getParentId())) {
// recursionFn(prodMaterialBomVos, prodMaterialBomVo);
// returnList.add(prodMaterialBomVo);
// }
// }
if ( returnList . isEmpty ( ) ) {
returnList = prodMaterialBomVos ;
}
return returnList ;
}
/ * *
* 构 建 前 端 所 需 要 下 拉 树 结 构
*
@ -259,8 +314,18 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* @return 下 拉 树 结 构 列 表
* /
private List < TreeSelect > buildMaterialBomTreeSelect ( List < ProdMaterialBomVo > prodMaterialBomVos ) {
List < ProdMaterialBomVo > materialBomTrees = buildMaterialBomTree ( prodMaterialBomVos ) ;
return materialBomTrees . stream ( ) . map ( TreeSelect : : new ) . collect ( Collectors . toList ( ) ) ;
// 根据物料bom版本号group, 不能的版本是不同的树。使用 groupingBy 将 List 转换为 Map<String, List<ProdMaterialBomVo>>
Map < String , List < ProdMaterialBomVo > > prodMaterialBomVoMap = prodMaterialBomVos . stream ( )
. collect ( Collectors . groupingBy ( ProdMaterialBomVo : : getMaterialBomVersion ) ) ;
List < ProdMaterialBomVo > allMaterialBomTrees = new ArrayList < > ( ) ;
// 根据物料版本号build树
prodMaterialBomVoMap . forEach ( ( materialBomVersion , vos ) - > {
List < ProdMaterialBomVo > materialBomTrees = buildMaterialBomTree ( vos ) ;
allMaterialBomTrees . addAll ( materialBomTrees ) ;
} ) ;
return allMaterialBomTrees . stream ( ) . map ( TreeSelect : : new ) . collect ( Collectors . toList ( ) ) ;
}
@ -285,11 +350,12 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
/ * *
* 得 到 子 节 点 列 表
* /
private List < ProdMaterialBomVo > getChildList ( List < ProdMaterialBomVo > list , ProdMaterialBomVo paren t) {
private List < ProdMaterialBomVo > getChildList ( List < ProdMaterialBomVo > list , ProdMaterialBomVo t) {
return list . stream ( )
. filter ( n - > StringUtils . isNotNull ( n . getParentId ( ) ) & &
n . getParentId ( ) . equals ( paren t. getMaterial Bom Id( ) ) )
n . getParentId ( ) . equals ( t. getMaterial Id( ) ) )
. collect ( Collectors . toList ( ) ) ;
}
/ * *