@ -1,13 +1,21 @@
package org.dromara.mes.service.impl ;
import com.baomidou.mybatisplus.core.toolkit.Wrappers ;
import org.dromara.common.constant.DatabaseConstants ;
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.common.properties.MesProperties ;
import org.dromara.mes.domain.ProdPlanInfo ;
import org.dromara.mes.domain.bo.ProdPlanInfoBo ;
import org.dromara.mes.domain.vo.ProdPlanInfoVo ;
import org.dromara.mes.domain.vo.TreeSelect ;
import org.dromara.mes.mapper.ProdPlanInfoMapper ;
import org.jetbrains.annotations.NotNull ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import org.dromara.mes.domain.bo.ProdMaterialBomBo ;
import org.dromara.mes.domain.vo.ProdMaterialBomVo ;
@ -36,6 +44,12 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
private final ProdMaterialBomMapper baseMapper ;
private final ProdPlanInfoMapper prodPlanInfoMapper ;
@Autowired
private MesProperties mesProperties ;
/ * *
* 查 询 物 料 BOM 信 息
*
@ -56,6 +70,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* /
@Override
public List < ProdMaterialBomVo > queryList ( ProdMaterialBomBo bo ) {
bo . setDeleteFlag ( HwMomMesConstants . DELETE_FLAG_NO ) ;
MPJLambdaWrapper < ProdMaterialBom > lqw = buildQueryWrapper ( bo ) ;
return baseMapper . selectVoList ( lqw ) ;
}
@ -72,6 +87,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
. like ( StringUtils . isNotBlank ( bo . getMaterialBomVersion ( ) ) , ProdMaterialBom : : getMaterialBomVersion , bo . getMaterialBomVersion ( ) )
. eq ( bo . getStandardAmount ( ) ! = null , ProdMaterialBom : : getStandardAmount , bo . getStandardAmount ( ) )
. eq ( bo . getTopFlag ( ) ! = null , ProdMaterialBom : : getTopFlag , bo . getTopFlag ( ) )
. eq ( bo . getDeleteFlag ( ) ! = null , ProdMaterialBom : : getDeleteFlag , bo . getDeleteFlag ( ) )
. eq ( StringUtils . isNotBlank ( bo . getCheckType ( ) ) , ProdMaterialBom : : getCheckType , bo . getCheckType ( ) )
. eq ( bo . getProjectId ( ) ! = null , ProdMaterialBom : : getProjectId , bo . getProjectId ( ) )
. eq ( bo . getAssembleTime ( ) ! = null , ProdMaterialBom : : getAssembleTime , bo . getAssembleTime ( ) )
@ -91,9 +107,8 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
@Override
public Boolean insertByBo ( ProdMaterialBomBo bo ) {
isTopFlag ( bo ) ;
ProdMaterialBomVo info = baseMapper . selectVoById ( bo . getParentId ( ) ) ;
ProdMaterialBom add = MapstructUtils . convert ( bo , ProdMaterialBom . class ) ;
validEntity BeforeSave( add ) ;
validEntity Used( bo ) ;
boolean flag = baseMapper . insert ( add ) > 0 ;
if ( flag ) {
bo . setMaterialBomId ( add . getMaterialBomId ( ) ) ;
@ -110,17 +125,15 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
@Override
public Boolean updateByBo ( ProdMaterialBomBo bo ) {
ProdMaterialBom update = MapstructUtils . convert ( bo , ProdMaterialBom . class ) ;
validEntityBeforeSave ( update ) ;
ProdMaterialBomVo dbProdMaterialBomVo = baseMapper . selectVoById ( bo . getMaterialBomId ( ) ) ;
if ( ! dbProdMaterialBomVo . equalsToSource ( update ) ) {
validEntityUsed ( bo ) ;
return baseMapper . updateById ( update ) > 0 ;
}
/ * *
* 保 存 前 的 数 据 校 验
* /
private void validEntityBeforeSave ( ProdMaterialBom entity ) {
//TODO 做一些数据校验,如唯一约束
return true ;
}
/ * *
* 校 验 并 批 量 删 除 物 料 BOM 信 息 信 息
*
@ -143,6 +156,78 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return baseMapper . deleteByIds ( ids ) > 0 ;
}
/ * *
* @param materialBomBos
* @return java . lang . Boolean
* @description 校 验 并 批 量 删 除 物 料 BOM 信 息 信 息
* /
@Override
@Transactional ( rollbackFor = Exception . class )
public Boolean deleteMaterialBoms ( List < ProdMaterialBomBo > materialBomBos ) {
Collection < Long > ids = new ArrayList < > ( ) ;
materialBomBos . forEach ( materialBomBo - > {
validEntityUsed ( materialBomBo ) ;
ProdMaterialBom update = MapstructUtils . convert ( materialBomBo , ProdMaterialBom . class ) ;
update . setDeleteFlag ( HwMomMesConstants . DELETE_FLAG_YES ) ;
baseMapper . updateById ( update ) ;
} ) ;
return true ;
}
/ * *
* 更 新 前 的 数 据 校 验
* /
private void validEntityUsed ( @NotNull ProdMaterialBomBo entity ) {
Long semiFinishedId = mesProperties . getSemiFinishedId ( ) ;
Long modelingId = mesProperties . getModelingId ( ) ;
Long vulcanizingId = mesProperties . getVulcanizingId ( ) ;
String semiFinishedTableName = DatabaseConstants . TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + semiFinishedId ;
String modelingTableName = DatabaseConstants . TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + modelingId ;
String vulcanizingTableName = DatabaseConstants . TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + vulcanizingId ;
ProdPlanInfoBo queryBo = new ProdPlanInfoBo ( ) ;
queryBo . setMaterialId ( entity . getParentId ( ) ) ;
queryBo . setMaterialBomVersion ( entity . getMaterialBomVersion ( ) ) ;
MPJLambdaWrapper < ProdPlanInfo > lqw = buildPlanQueryWrapper ( queryBo ) ;
/ * *
* 查 询 半 制 品 计 划 、 成 型 计 划 、 硫 化 计 划 中 有 没 有 使 用 此 bom
* /
List < ProdPlanInfoVo > semiFinishedPlanInfoVos = prodPlanInfoMapper . selectProdPlanInfoList ( semiFinishedTableName , lqw ) ;
if ( semiFinishedPlanInfoVos ! = null & & ! semiFinishedPlanInfoVos . isEmpty ( ) ) {
List < String > planCodes = semiFinishedPlanInfoVos . stream ( )
. map ( ProdPlanInfoVo : : getPlanCode )
. toList ( ) ;
throw new ServiceException ( "半制品计划中计划编号[" + planCodes . toString ( ) + "]已经使用此bom, 不能修改" ) ;
}
List < ProdPlanInfoVo > modelingPlanInfoVos = prodPlanInfoMapper . selectProdPlanInfoList ( modelingTableName , lqw ) ;
if ( modelingPlanInfoVos ! = null & & ! modelingPlanInfoVos . isEmpty ( ) ) {
List < String > planCodes = modelingPlanInfoVos . stream ( )
. map ( ProdPlanInfoVo : : getPlanCode )
. toList ( ) ;
throw new ServiceException ( "成型计划中计划编号[" + planCodes . toString ( ) + "]已经使用此bom, 不能修改" ) ;
}
List < ProdPlanInfoVo > vulcanizingPlanInfoVos = prodPlanInfoMapper . selectProdPlanInfoList ( vulcanizingTableName , lqw ) ;
if ( vulcanizingPlanInfoVos ! = null & & ! vulcanizingPlanInfoVos . isEmpty ( ) ) {
List < String > planCodes = vulcanizingPlanInfoVos . stream ( )
. map ( ProdPlanInfoVo : : getPlanCode )
. toList ( ) ;
throw new ServiceException ( "硫化计划中计划编号已经使用[" + planCodes . toString ( ) + "已经使用此bom, 不能修改" ) ;
}
}
/ * *
* SET 顶 级 标 识
* 判 断 是 否 顶 级 BOM
@ -171,8 +256,8 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
if ( CollUtil . isEmpty ( boList ) ) {
return false ;
}
//todo:在pojo中增加equals方法, 来判断有没有修改, 如果有修改则判断计划中是否有引用, 根据物料id和bom版本找
// TODO: 判断在新建子级时, 是否存在在此颗树的父级节点存在此子级节点, 根据bom版本找
// 判断在新建子级时, 是否存在在此颗树的父级节点存在此子级节点, 根据bom版本找(可以先不加此判断,主要原因是物料类型已经限制了)
//获取materialbomid不为空的更新, 获取materialbomid为空materialid不为空的保存
for ( ProdMaterialBomBo prodMaterialBomBo : boList ) {
if ( prodMaterialBomBo . getMaterialBomId ( ) = = null ) {
@ -238,15 +323,6 @@ 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
@ -306,7 +382,6 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
}
/ * *
* 构 建 前 端 所 需 要 下 拉 树 结 构
*
@ -365,4 +440,45 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return getChildList ( list , t ) . size ( ) > 0 ? true : false ;
}
private MPJLambdaWrapper < ProdPlanInfo > buildPlanQueryWrapper ( ProdPlanInfoBo bo ) {
Map < String , Object > params = bo . getParams ( ) ;
MPJLambdaWrapper < ProdPlanInfo > lqw = JoinWrappers . lambda ( ProdPlanInfo . class )
. selectAll ( ProdPlanInfo . class )
. eq ( bo . getPlanId ( ) ! = null , ProdPlanInfo : : getPlanId , bo . getPlanId ( ) )
. eq ( bo . getProductOrderId ( ) ! = null , ProdPlanInfo : : getProductOrderId , bo . getProductOrderId ( ) )
. eq ( bo . getSaleOrderId ( ) ! = null , ProdPlanInfo : : getSaleOrderId , bo . getSaleOrderId ( ) )
. eq ( StringUtils . isNotBlank ( bo . getSaleorderCode ( ) ) , ProdPlanInfo : : getSaleorderCode , bo . getSaleorderCode ( ) )
. eq ( StringUtils . isNotBlank ( bo . getPlanCode ( ) ) , ProdPlanInfo : : getPlanCode , bo . getPlanCode ( ) )
. eq ( StringUtils . isNotBlank ( bo . getDispatchCode ( ) ) , ProdPlanInfo : : getDispatchCode , bo . getDispatchCode ( ) )
. eq ( bo . getMaterialId ( ) ! = null , ProdPlanInfo : : getMaterialId , bo . getMaterialId ( ) )
. eq ( bo . getMaterialBomVersion ( ) ! = null , ProdPlanInfo : : getMaterialBomVersion , bo . getMaterialBomVersion ( ) )
. eq ( bo . getMaterialBomId ( ) ! = null , ProdPlanInfo : : getMaterialBomId , bo . getMaterialBomId ( ) )
. eq ( bo . getProcessId ( ) ! = null , ProdPlanInfo : : getProcessId , bo . getProcessId ( ) )
. eq ( bo . getProcessOrder ( ) ! = null , ProdPlanInfo : : getProcessOrder , bo . getProcessOrder ( ) )
. eq ( bo . getLastProcessId ( ) ! = null , ProdPlanInfo : : getLastProcessId , bo . getLastProcessId ( ) )
. eq ( StringUtils . isNotBlank ( bo . getFinalProcessFlag ( ) ) , ProdPlanInfo : : getFinalProcessFlag , bo . getFinalProcessFlag ( ) )
. eq ( StringUtils . isNotBlank ( bo . getReleaseType ( ) ) , ProdPlanInfo : : getReleaseType , bo . getReleaseType ( ) )
. eq ( bo . getReleaseId ( ) ! = null , ProdPlanInfo : : getReleaseId , bo . getReleaseId ( ) )
. eq ( bo . getProductionTime ( ) ! = null , ProdPlanInfo : : getProductionTime , bo . getProductionTime ( ) )
. eq ( bo . getPlanAmount ( ) ! = null , ProdPlanInfo : : getPlanAmount , bo . getPlanAmount ( ) )
. eq ( bo . getDispatchAmount ( ) ! = null , ProdPlanInfo : : getDispatchAmount , bo . getDispatchAmount ( ) )
. eq ( bo . getCompleteAmount ( ) ! = null , ProdPlanInfo : : getCompleteAmount , bo . getCompleteAmount ( ) )
. eq ( bo . getPlanBeginTime ( ) ! = null , ProdPlanInfo : : getPlanBeginTime , bo . getPlanBeginTime ( ) )
. eq ( bo . getPlanEndTime ( ) ! = null , ProdPlanInfo : : getPlanEndTime , bo . getPlanEndTime ( ) )
. eq ( bo . getRealBeginTime ( ) ! = null , ProdPlanInfo : : getRealBeginTime , bo . getRealBeginTime ( ) )
. eq ( bo . getRealEndTime ( ) ! = null , ProdPlanInfo : : getRealEndTime , bo . getRealEndTime ( ) )
. eq ( StringUtils . isNotBlank ( bo . getAttachId ( ) ) , ProdPlanInfo : : getAttachId , bo . getAttachId ( ) )
. eq ( StringUtils . isNotBlank ( bo . getPlanStatus ( ) ) , ProdPlanInfo : : getPlanStatus , bo . getPlanStatus ( ) )
. eq ( StringUtils . isNotBlank ( bo . getImportFlag ( ) ) , ProdPlanInfo : : getImportFlag , bo . getImportFlag ( ) )
. eq ( StringUtils . isNotBlank ( bo . getFinishFlag ( ) ) , ProdPlanInfo : : getFinishFlag , bo . getFinishFlag ( ) )
. eq ( bo . getPriority ( ) ! = null , ProdPlanInfo : : getPriority , bo . getPriority ( ) )
. eq ( bo . getShiftId ( ) ! = null , ProdPlanInfo : : getShiftId , bo . getShiftId ( ) )
. eq ( bo . getClassTeamId ( ) ! = null , ProdPlanInfo : : getClassTeamId , bo . getClassTeamId ( ) )
. eq ( StringUtils . isNotBlank ( bo . getModelCode ( ) ) , ProdPlanInfo : : getModelCode , bo . getModelCode ( ) )
. in ( StringUtils . isNotNull ( bo . getPlanIds ( ) ) , ProdPlanInfo : : getPlanId , bo . getPlanIds ( ) )
. orderByDesc ( ProdPlanInfo : : getCreateTime ) ;
return lqw ;
}
}