Merge remote-tracking branch 'origin/DM/nflg-新需求' into test

This commit is contained in:
10001392 2024-09-13 10:35:32 +08:00
commit 799f29f121
17 changed files with 454 additions and 112 deletions

View File

@ -16,4 +16,7 @@ public class BomConstant {
public static final Integer YES=1; public static final Integer YES=1;
public static final Integer NO=0; public static final Integer NO=0;
//工艺包物料类别编码
public static final String ART_PACKAGE_MATERIAL_CATEGORY_CODE="201201";
} }

View File

@ -22,6 +22,8 @@ public class EBomConstant {
public static final String[] EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2 = {"material", "materialTexture", "projectType", "materialUnit","materialNo", public static final String[] EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2 = {"material", "materialTexture", "projectType", "materialUnit","materialNo",
"materialName","materialDesc","drawingNo" "materialName","materialDesc","drawingNo"
}; };
//ebom编辑时物料信息初始化时需忽略的字段
public static final String[] EBOM_EDIT_IGNORED_FIELDS = {"material", "materialTexture", "projectType", "materialNo", "materialName","materialDesc","drawingNo"};
public static final String[] EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT3 = {"material", "materialTexture", "projectType", "materialUnit","materialWeight"}; public static final String[] EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT3 = {"material", "materialTexture", "projectType", "materialUnit","materialWeight"};

View File

@ -83,6 +83,9 @@ public class BomNewPbomParentVO extends BaseMaterialVO implements Serializable {
@ApiModelProperty(value = "数量") @ApiModelProperty(value = "数量")
private BigDecimal num; private BigDecimal num;
public BigDecimal getNum() {
return num==null?null:num.stripTrailingZeros();
}
/** /**
* 是否跟节点 0- 1- * 是否跟节点 0- 1-
@ -311,6 +314,10 @@ public class BomNewPbomParentVO extends BaseMaterialVO implements Serializable {
@ApiModelProperty("原始数量") @ApiModelProperty("原始数量")
private BigDecimal originalNum; private BigDecimal originalNum;
public BigDecimal getOriginalNum() {
return originalNum==null?null:originalNum.stripTrailingZeros();
}
@ApiModelProperty("原始项目类别") @ApiModelProperty("原始项目类别")
private String originalProjectType; private String originalProjectType;

View File

@ -1860,7 +1860,7 @@ public class BomNewEbomParentService extends ServiceImpl<BomNewEbomParentMapper,
childList.addAll(getChild(v.getBomRowId(), 0)); childList.addAll(getChild(v.getBomRowId(), 0));
}); });
} }
materialMainService.intiMaterialInfo(childList, EBomConstant.EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2); materialMainService.intiMaterialInfo(childList, EBomConstant.EBOM_EDIT_IGNORED_FIELDS);
vo.setDatas(childList); vo.setDatas(childList);
} }
@ -2351,7 +2351,7 @@ public class BomNewEbomParentService extends ServiceImpl<BomNewEbomParentMapper,
public List<BomNewEbomParentVO> changeMaterial(BomNewEBomChangeDTO dto) { public List<BomNewEbomParentVO> changeMaterial(BomNewEBomChangeDTO dto) {
List<BaseMaterialVO> materialVOS = CheckEBomException.checkMaterialNoInMain(dto.getDatas()); List<BaseMaterialVO> materialVOS = CheckEBomException.checkMaterialNoInMain(dto.getDatas());
SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(dto.getDatas(), materialVOS, EBomConstant.EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2); SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(dto.getDatas(), materialVOS, EBomConstant.EBOM_EDIT_IGNORED_FIELDS);
for (BomNewEbomParentVO vo : for (BomNewEbomParentVO vo :
dto.getDatas()) { dto.getDatas()) {

View File

@ -1,6 +1,7 @@
package com.nflg.product.bomnew.service; package com.nflg.product.bomnew.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
@ -440,7 +441,7 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
LogRecordContext.putVariable("bom",parent); LogRecordContext.putVariable("bom",parent);
if (CollUtil.isNotEmpty(paramDTO.getChildList())) { if (CollUtil.isNotEmpty(paramDTO.getChildList())) {
paramDTO.getChildList().stream().filter(u->StrUtil.isBlank(u.getFacCode())).collect(Collectors.toList()).forEach(u->u.setFacCode(parent.getFacCode())); // paramDTO.getChildList().stream().filter(u->StrUtil.isBlank(u.getFacCode())).collect(Collectors.toList()).forEach(u->u.setFacCode(parent.getFacCode()));
List<BomNewPbomChildEntity> childList = Convert.toList(BomNewPbomChildEntity.class, paramDTO.getChildList()); List<BomNewPbomChildEntity> childList = Convert.toList(BomNewPbomChildEntity.class, paramDTO.getChildList());
List<Long> childIds = paramDTO.getChildList().stream().map(BomNewPbomParentVO::getRowId).collect(Collectors.toList()); List<Long> childIds = paramDTO.getChildList().stream().map(BomNewPbomParentVO::getRowId).collect(Collectors.toList());
List<BomNewPbomChildEntity> pChildList = Lists.newArrayList(); List<BomNewPbomChildEntity> pChildList = Lists.newArrayList();
@ -454,6 +455,7 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
u.setParentRowId(paramDTO.getBomRowId()); u.setParentRowId(paramDTO.getBomRowId());
if(u.getRowId() == null){ if(u.getRowId() == null){
u.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue()); u.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue());
u.setFacCode(parent.getFacCode());
}else{ }else{
BomNewPbomChildEntity oChild = childMap.get(u.getRowId()); BomNewPbomChildEntity oChild = childMap.get(u.getRowId());
//判断是否有变更记录 //判断是否有变更记录
@ -546,13 +548,13 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
return hasTechnologypackage; return hasTechnologypackage;
} }
//删除辅助物料 //删除辅助物料
List<BomNewPbomParentVO> noDelList = childListVO.stream() // List<BomNewPbomParentVO> noDelList = childListVO.stream()
.filter(u -> !u.getMaterialCategoryCode().startsWith("1003") // .filter(u -> !u.getMaterialCategoryCode().startsWith("1003")
&& !u.getMaterialCategoryCode().startsWith("1020") // && !u.getMaterialCategoryCode().startsWith("1020")
&& !u.getMaterialCategoryCode().startsWith("1021") // && !u.getMaterialCategoryCode().startsWith("1021")
&& !u.getMaterialCategoryCode().equals(MaterialMainConstant.CATEGORYCODE_TECHNOLOGYPACKAGE)) // && !u.getMaterialCategoryCode().equals(MaterialMainConstant.CATEGORYCODE_TECHNOLOGYPACKAGE))
.collect(Collectors.toList()); // .collect(Collectors.toList());
VUtils.isTure(CollUtil.isNotEmpty(noDelList)).throwMessage("非机加工件的子级只能删除辅助物料"); // VUtils.isTure(CollUtil.isNotEmpty(noDelList)).throwMessage("非机加工件的子级只能删除辅助物料");
pbomChildService.getBaseMapper().delByRowId(paramDTO.getRowIdList()); pbomChildService.getBaseMapper().delByRowId(paramDTO.getRowIdList());
resetBomExist(parent.getRowId()); resetBomExist(parent.getRowId());
@ -1209,7 +1211,7 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
*/ */
private void initPBomCurrentVersion(List<BomNewPbomParentVO> allPBom){ private void initPBomCurrentVersion(List<BomNewPbomParentVO> allPBom){
List<BomNewPbomParentVO> waitReleaseBom = allPBom.stream().filter(u -> PBomStatusEnum.WAIT_PUBLISH.equalsValue(u.getStatus()) && u.getBomRowId() > 0).collect(Collectors.toList()); List<BomNewPbomParentVO> waitReleaseBom = allPBom.stream().filter(u ->SessionUtil.getUserCode().equals(u.getCreatedBy()) && PBomStatusEnum.WAIT_PUBLISH.equalsValue(u.getStatus()) && u.getBomRowId() > 0).collect(Collectors.toList());
for (BomNewPbomParentVO newPBom : waitReleaseBom) { for (BomNewPbomParentVO newPBom : waitReleaseBom) {
BomNewPbomParentEntity oldParent = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery() BomNewPbomParentEntity oldParent = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery()
@ -1226,6 +1228,10 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
//新BOM 除T项外 //新BOM 除T项外
List<BomNewPbomParentVO> newChildren = this.getBaseMapper().getParentChild(newPBom.getBomRowId()); List<BomNewPbomParentVO> newChildren = this.getBaseMapper().getParentChild(newPBom.getBomRowId());
List<BomNewPbomParentVO> newBomNoTChildren = newChildren.stream().filter(u -> !EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProjectType())).collect(Collectors.toList()); List<BomNewPbomParentVO> newBomNoTChildren = newChildren.stream().filter(u -> !EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProjectType())).collect(Collectors.toList());
if(oldBomNoTChildren.size()!=newBomNoTChildren.size()){
newPBom.setCurrentVersion(VersionUtil.getNextVersion(oldParent.getCurrentVersion()));
}
Set<String> oldChildSet = oldBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet()); Set<String> oldChildSet = oldBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet());
Set<String> newChildSet = newBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet()); Set<String> newChildSet = newBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet());
@ -1234,6 +1240,33 @@ public class BomNewPbomParentService extends ServiceImpl<BomNewPbomParentMapper,
if(oldChildSet0.equals(newChildSet0)){ if(oldChildSet0.equals(newChildSet0)){
newPBom.setStatus(PBomStatusEnum.PUBLISH.getValue()); newPBom.setStatus(PBomStatusEnum.PUBLISH.getValue());
newPBom.setDelIs(1); newPBom.setDelIs(1);
//当T项外都一致时直接更新T项
List<BomNewPbomParentVO> oldBomT = oldBomDetail.stream().filter(u -> EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProcureType())).collect(Collectors.toList());
//新T项
List<BomNewPbomParentVO> newBomT = newChildren.stream().filter(u -> EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProcureType())).collect(Collectors.toList());
Set<String> oldTSet = oldBomT.stream().map(BomNewPbomParentVO::getMaterialNoAndNumAndProjectType).collect(Collectors.toSet());
Set<String> newTSet = newBomT.stream().map(BomNewPbomParentVO::getMaterialNoAndNumAndProjectType).collect(Collectors.toSet());
if(CollUtil.isNotEmpty(newBomT) && !newTSet.equals(oldTSet)){
if (CollUtil.isNotEmpty(oldBomT)) {
List<Long> bomRowIdsForT = oldBomT.stream().map(u -> u.getRowId()).collect(Collectors.toList());
SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().deleteBatchIds(bomRowIdsForT);
}
List<BomNewPbomChildEntity> tNewChildren=new ArrayList<>();
for (BomNewPbomParentVO netT : newBomT) {
BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity();
BeanUtil.copyProperties(netT, childEnt);
childEnt.setRowId(IdWorker.getId());
childEnt.setParentRowId(oldParent.getRowId());
childEnt.setFacCode(oldParent.getFacCode());
childEnt.setIdentityNo(StrUtil.join("-", oldParent.getMaterialNo(), netT.getMaterialNo()));
tNewChildren.add(childEnt);
}
if (CollUtil.isNotEmpty(tNewChildren)) {
pbomChildService.saveBatch(tNewChildren);
}
}
} }
else if(oldChildSet.equals(newChildSet)){ else if(oldChildSet.equals(newChildSet)){
newPBom.setCurrentVersion( VersionUtil.getNextVersionForSmallVersion(oldParent.getCurrentVersion())); newPBom.setCurrentVersion( VersionUtil.getNextVersionForSmallVersion(oldParent.getCurrentVersion()));

View File

@ -7,6 +7,7 @@ import com.alibaba.excel.enums.BooleanEnum;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.conmon.util.SessionUtil;
import com.nflg.product.bomnew.constant.ConvertToPBomModelEnum; import com.nflg.product.bomnew.constant.ConvertToPBomModelEnum;
import com.nflg.product.bomnew.constant.EBomConstant;
import com.nflg.product.bomnew.constant.PBomStatusEnum; import com.nflg.product.bomnew.constant.PBomStatusEnum;
import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum; import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum;
import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity;
@ -16,9 +17,7 @@ import com.nflg.product.bomnew.util.ListCommonUtil;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -27,6 +26,7 @@ import java.util.stream.Collectors;
@NoArgsConstructor @NoArgsConstructor
public class EBomToPBom extends EBomToPbomBase { public class EBomToPBom extends EBomToPbomBase {
private Map<String, List<BomNewEbomParentVO>> facBomDataMp = new HashMap<>();
@ -39,6 +39,39 @@ public class EBomToPBom extends EBomToPbomBase {
initEBomVersion(); initEBomVersion();
} }
private void splitData() {
// this.facCodes = new ArrayList<>();
//1020数据
List<BomNewEbomParentVO> data1020 = new ArrayList<>();
List<BomNewEbomParentVO> deliveryPackage1020 = result.stream().filter(u -> u.getParentRowId().equals(parent.getRowId()) && u.getMaterialName().contains("仙桃")).collect(Collectors.toList());
if (CollUtil.isNotEmpty(deliveryPackage1020)) {
// facCodes.add(EBomConstant.XIAN_TAO_FACTORY_CODE_1020);
data1020.add(parent);
for (BomNewEbomParentVO data : deliveryPackage1020) {
List<BomNewEbomParentVO> subVos = getResultAllSubIncludeSelf(data);
data1020.addAll(subVos);
}
facBomDataMp.put(EBomConstant.XIAN_TAO_FACTORY_CODE_1020, data1020);
}
//1010 数据
List<BomNewEbomParentVO> data1010 = new ArrayList<>();
List<BomNewEbomParentVO> deliveryPackage1010 = result.stream().filter(u -> u.getParentRowId().equals(parent.getRowId())).collect(Collectors.toList()); //&& !u.getMaterialName().contains("仙桃")
if (CollUtil.isNotEmpty(deliveryPackage1010)) {
// facCodes.add(EBomConstant.MAIN_FACTORY_CODE_1010);
data1010.add(parent);
for (BomNewEbomParentVO data : deliveryPackage1010) {
List<BomNewEbomParentVO> subVos = new ArrayList<>();
if (!data.getMaterialName().contains("仙桃") ) { //只获取下降虚拟包(排除仙桃油漆包)
subVos=getResultAllSubIncludeSelf(data);
}
data1010.addAll(subVos);
}
facBomDataMp.put(EBomConstant.MAIN_FACTORY_CODE_1010, data1010);
}
}
/** /**
* 31項体层 * 31項体层
@ -53,11 +86,20 @@ public class EBomToPBom extends EBomToPbomBase {
changeImpact(); changeImpact();
//bom 提层 //bom 提层
liftingLayer(); liftingLayer();
List<BomNewEbomParentVO> parentList = ListCommonUtil.toDistinct(result.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
splitData();
List<String> hasConvert = new ArrayList<>(); List<String> hasConvert = new ArrayList<>();
for (String facCode : facCodes) { for (String facCode : facCodes) {
//buildPBomParent(parent, facCode); //仙桃的不发1010工厂
if(EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode) && parent.getMaterialName().contains("仙桃") ){
continue;
}
List<BomNewEbomParentVO> parentList = ListCommonUtil.toDistinct(result.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
if(EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode)){
parentList = ListCommonUtil.toDistinct(facBomDataMp.get(facCode).stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
}
for (BomNewEbomParentVO vo : parentList) { for (BomNewEbomParentVO vo : parentList) {
String hasConvertKey = StrUtil.join("-", facCode, vo.getBomRowId()); String hasConvertKey = StrUtil.join("-", facCode, vo.getBomRowId());
if (hasConvert.contains(hasConvertKey)) { if (hasConvert.contains(hasConvertKey)) {
@ -69,23 +111,21 @@ public class EBomToPBom extends EBomToPbomBase {
if(BooleanEnum.TRUE.equals(vo.getNoConvertToPBomIs()) ){ if(BooleanEnum.TRUE.equals(vo.getNoConvertToPBomIs()) ){
continue; continue;
} }
//构建变更明细
// buildUpgradeChangeDetail(vo, VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE);
// buildUpgradeChangeDetail(vo, VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE);
//子级 //子级
List<BomNewEbomParentVO> child = result.stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList()); List<BomNewEbomParentVO> child = result.stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList());
List<BomNewEbomParentVO> mergeChild = mergeChild(child); List<BomNewEbomParentVO> mergeChild=child;
//判断pbom 是否一致 //直发包/发货前包不合并
// if( compareContentIsSame(vo, mergeChild, facCode) && !vo.getMaterialNo().equals(parent.getMaterialNo())){ if(!VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// continue; mergeChild = mergeChild(child);
// } }
BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList); BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList);
if(Objects.isNull(parentEnt)){ if(Objects.isNull(parentEnt)){
continue; continue;
} }
//处理子级BOM
mergeChild= handlerArtPackage(parentEnt,mergeChild,facCode,parentList);
//子级 //子级
if (CollUtil.isNotEmpty(child)) { if (CollUtil.isNotEmpty(mergeChild)) {
//合并子级 //合并子级
for (BomNewEbomParentVO eb : mergeChild) { for (BomNewEbomParentVO eb : mergeChild) {
BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity(); BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity();

View File

@ -111,23 +111,21 @@ public class EBomToPBomFor31 extends EBomToPbomBase {
if (BooleanEnum.TRUE.equals(vo.getNoConvertToPBomIs())) { if (BooleanEnum.TRUE.equals(vo.getNoConvertToPBomIs())) {
continue; continue;
} }
//构建变更明细
// buildUpgradeChangeDetail(vo, VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE);
// buildUpgradeChangeDetail(vo, VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE);
//子级 //子级
List<BomNewEbomParentVO> child = facBomDataMp.get(facCode).stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList()); List<BomNewEbomParentVO> child = facBomDataMp.get(facCode).stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList());
List<BomNewEbomParentVO> mergeChild = mergeChild(child); List<BomNewEbomParentVO> mergeChild=child;
// if(compareContentIsSame(vo, mergeChild, facCode) && !vo.getMaterialNo().equals(parent.getMaterialNo())){ //直发包/发货前包不合并
// continue; if(!VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// } mergeChild = mergeChild(child);
}
BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode, parentList); BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode, parentList);
if (Objects.isNull(parentEnt)) { if (Objects.isNull(parentEnt)) {
continue; continue;
} }
//处理bom子级
mergeChild= handlerArtPackage(parentEnt,mergeChild,facCode,parentList);
//子级 //子级
if (CollUtil.isNotEmpty(child)) { if (CollUtil.isNotEmpty(mergeChild)) {
//合并子级
for (BomNewEbomParentVO eb : mergeChild) { for (BomNewEbomParentVO eb : mergeChild) {
BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity(); BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity();
BeanUtil.copyProperties(eb, childEnt, "sourceRowId"); BeanUtil.copyProperties(eb, childEnt, "sourceRowId");

View File

@ -2,6 +2,7 @@ package com.nflg.product.bomnew.service.domain.EBom;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
@ -85,6 +86,7 @@ public abstract class EBomToPbomBase {
//当子级为F项或Z项时-无需转的父级物料 //当子级为F项或Z项时-无需转的父级物料
protected Set<String> childDelMaterialNos = new HashSet<>(); protected Set<String> childDelMaterialNos = new HashSet<>();
public abstract void convert(); public abstract void convert();
/** /**
@ -186,6 +188,8 @@ public abstract class EBomToPbomBase {
else if (Objects.nonNull(oldParent) && oldParent.getStatus() < EBomStatusEnum.PUBLISHED.getValue()) { else if (Objects.nonNull(oldParent) && oldParent.getStatus() < EBomStatusEnum.PUBLISHED.getValue()) {
//if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy())) { //if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy())) {
if (ConvertToPBomModelEnum.OVERRIDE.equalsValue(convertMode.getValue())) { if (ConvertToPBomModelEnum.OVERRIDE.equalsValue(convertMode.getValue())) {
//当bom创建人为本人 版本大于当前版本则覆盖
if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy()) || VersionUtil.compare(parentVo.getCurrentVersion(),oldParent.getCurrentVersion())>0){
SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().deleteByMap(ImmutableMap.of("parent_row_id", oldParent.getRowId())); SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().deleteByMap(ImmutableMap.of("parent_row_id", oldParent.getRowId()));
// this.delParentRowIds.add(oldParent.getRowId()); // this.delParentRowIds.add(oldParent.getRowId());
oldParent.setSourceRowId(parentVo.getBomRowId()); oldParent.setSourceRowId(parentVo.getBomRowId());
@ -195,7 +199,7 @@ public abstract class EBomToPbomBase {
oldParent.setDeptRowId(SessionUtil.getDepartRowId()); oldParent.setDeptRowId(SessionUtil.getDepartRowId());
this.pBomParentResult.add(oldParent); this.pBomParentResult.add(oldParent);
return oldParent; return oldParent;
// } }
} else { } else {
// 降parentVo 及其子节点标记为不转换 // 降parentVo 及其子节点标记为不转换
@ -204,15 +208,84 @@ public abstract class EBomToPbomBase {
return null; return null;
} else { //pbom-处于正式表 } else { //pbom-处于正式表
//Ebom为已发布时则直接跳过 直发包发货前装配包是则需对比Bom明细一致则跳过否则升级
return buildParentEntity(parentVo, facCode, oldParent, VersionUtil.getNextVersionForSmallVersion(oldParent.getCurrentVersion())); return buildParentEntity(parentVo, facCode, oldParent, VersionUtil.getNextVersionForSmallVersion(oldParent.getCurrentVersion()));
} }
} }
private BomNewPbomChildEntity buildPBomAddChild(BomNewPbomParentEntity parent, String facCode, BomNewPbomParentVO oldChild){
BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity();
BeanUtil.copyProperties(oldChild, childEnt, "sourceRowId");
childEnt.setRowId(IdWorker.getId());
childEnt.setParentRowId(parent.getRowId());
childEnt.setFacCode(facCode);
childEnt.setIdentityNo(StrUtil.join("-", parent.getMaterialNo(), oldChild.getMaterialNo()));
childEnt.setCreatedTime(LocalDateTime.now());
childEnt.setCreatedBy(SessionUtil.getUserCode());
this.pBomChildResult.add(childEnt);
return childEnt;
}
/**
* 处理PBOM新增物料
*/
protected List<BomNewEbomParentVO> handlerArtPackage(BomNewPbomParentEntity parent , List<BomNewEbomParentVO> newBomChildren ,String facCode ,List<BomNewEbomParentVO> parentList){
BomNewPbomParentEntity oldParent = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery().eq(BomNewPbomParentEntity::getMaterialNo, parent.getMaterialNo())
.eq(BomNewPbomParentEntity::getFacCode, facCode).last(" order by current_version desc limit 1").one();
List<String> delResult=new ArrayList<>();
//pBom为已发布时
if(Objects.nonNull(oldParent) && PBomStatusEnum.PUBLISH.getValue()<= oldParent.getStatus()) {
List<BomNewPbomParentVO> oldChildren=SpringUtil.getBean(BomNewPbomParentService.class).getChild(oldParent.getRowId(),1);
//pBom 手工新增物料
List<BomNewPbomParentVO> oldPBomAddChildren = oldChildren.stream().filter(u -> StrUtil.isBlank(u.getOriginalMaterialNo())).collect(Collectors.toList());
Map<String, BomNewEbomParentVO> newBomChildrenMap = newBomChildren.stream().collect(Collectors.toMap(BomNewEbomParentVO::getMaterialNo, u -> u));
for (BomNewPbomParentVO oldPBomAddItem : oldPBomAddChildren) {
//加入当前BOM明细中(新增的且新的子级中不包含该物料编码--主要考虑兼容历史数据)
if(!newBomChildrenMap.containsKey(oldPBomAddItem.getMaterialNo())) {
buildPBomAddChild(parent, facCode, oldPBomAddItem);
}
//如为工艺包且在当前BOM中不存在
if (BomConstant.ART_PACKAGE_MATERIAL_CATEGORY_CODE.equals(oldPBomAddItem.getMaterialCategoryCode()) && !newBomChildrenMap.containsKey(oldPBomAddItem.getMaterialNo())) {
//创建工艺包版本
BomNewPbomParentEntity artParent = buildPBomParent(Convert.convert(BomNewEbomParentVO.class, oldPBomAddItem), facCode, parentList);
//old 工艺包子级
List<BomNewPbomParentVO> oldArtChildren = SpringUtil.getBean(BomNewPbomParentService.class).getChild(oldPBomAddItem.getBomRowId(), 1);
for (BomNewPbomParentVO oldArtChild : oldArtChildren) {
//工艺包新增
if (StrUtil.isBlank(oldArtChild.getOriginalMaterialNo())) {
buildPBomAddChild(artParent, facCode, oldArtChild);
}
if(StrUtil.isNotBlank(oldArtChild.getOriginalMaterialNo()) && newBomChildrenMap.containsKey(oldArtChild.getOriginalMaterialNo())){
// newBomChildrenMap.get(oldArtChild.getOriginalMaterialNo()).setParentRowId(artParent.getRowId());
buildPBomAddChild(artParent, facCode, Convert.convert(BomNewPbomParentVO.class,newBomChildrenMap.get(oldArtChild.getOriginalMaterialNo()) ));
delResult.add(oldArtChild.getOriginalMaterialNo());
}
}
}
}
//pBom中修改过的
List<BomNewPbomParentVO> oldPBomUpdateChildren = oldChildren.stream().filter(u -> StrUtil.isNotBlank(u.getOriginalMaterialNo())).collect(Collectors.toList());
for (BomNewPbomParentVO oldPBomUpdateChild : oldPBomUpdateChildren) {
if (!oldPBomUpdateChild.getOriginalMaterialNo().equals(oldPBomUpdateChild.getMaterialNo()) || !oldPBomUpdateChild.getOriginalProjectType().equals(oldPBomUpdateChild.getProjectType()) || !oldPBomUpdateChild.getOriginalNum().equals(oldPBomUpdateChild.getNum())) {
List<BomNewEbomParentVO> upEnts = newBomChildren.stream().filter(u -> u.getMaterialNo().equals(oldPBomUpdateChild.getOriginalMaterialNo())
&& u.getProjectType().equals(oldPBomUpdateChild.getOriginalProjectType()) && VUtils.compareSafely(u.getNum(), oldPBomUpdateChild.getOriginalNum())==0).collect(Collectors.toList());
if (CollUtil.isNotEmpty(upEnts)) {
buildPBomAddChild(parent, facCode, oldPBomUpdateChild);
newBomChildren.remove(upEnts.get(0));
}
}
}
return newBomChildren.stream().filter(u->!delResult.contains(u.getMaterialNo())).collect(Collectors.toList());
}
return newBomChildren;
}
/** /**
* Pbom明细对比 * Pbom明细对比
* @param pVo * @param pVo
@ -369,7 +442,7 @@ public abstract class EBomToPbomBase {
buildVirtualPackageComposition(lastVirtualPackage, ent); buildVirtualPackageComposition(lastVirtualPackage, ent);
} }
} }
newEnt.setBomRowId(0L); // newEnt.setBomRowId(0L);
newEnt.setChildBomRowId(0L); newEnt.setChildBomRowId(0L);
newEnt.setNum(sum); newEnt.setNum(sum);
return newEnt; return newEnt;

View File

@ -162,7 +162,9 @@ public abstract class VirtualPackageBase {
} }
} }
List<AddVirtrualMaterialDTO> addM = params.stream().filter(u -> StrUtil.isBlank(u.getMaterialNo())).collect(Collectors.toList()); List<AddVirtrualMaterialDTO> addM = params.stream().filter(u -> StrUtil.isBlank(u.getMaterialNo())).collect(Collectors.toList());
vMNos.putAll(SpringUtil.getBean(MaterialService.class).batchAddMaterial(addM)); ; if(CollUtil.isNotEmpty(addM)) {
vMNos.putAll(SpringUtil.getBean(MaterialService.class).batchAddMaterial(addM));
}
} }
} }

View File

@ -114,20 +114,18 @@ public class EBomToPBomForFormal31New extends FormalEBomToPbomBase {
} }
//子级 //子级
List<BomNewEbomParentVO> child = facBomDataMp.get(facCode).stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList()); List<BomNewEbomParentVO> child = facBomDataMp.get(facCode).stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList());
List<BomNewEbomParentVO> mergeChild = mergeChild(child); List<BomNewEbomParentVO> mergeChild=child;
//对比PBOM 版本是否一致跟节点除外 //直发包/发货前包不合并
// if(!parent.getMaterialNo().equals(vo.getMaterialNo()) && !VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){ if(!VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// continue; mergeChild = mergeChild(child);
// } }
// if(VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) || VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// if(compareContentIsSame(vo,mergeChild,facCode)){
// continue;
// }
// }
BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList); BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList);
if(Objects.isNull(parentEnt)){ if(Objects.isNull(parentEnt)){
continue; continue;
} }
//处理子级
mergeChild=handlerArtPackage(parentEnt,mergeChild,facCode,parentList);
//检查是否用户跟用户节点 //检查是否用户跟用户节点
if(parentEnt.getMaterialNo().equals(parent.getMaterialNo())) { if(parentEnt.getMaterialNo().equals(parent.getMaterialNo())) {
List<String> childMaterialNos = SpringUtil.getBean(BomNewPbomParentMapper.class).getPBomExistMaterialInChildForWorkList(parent.getMaterialNo()); List<String> childMaterialNos = SpringUtil.getBean(BomNewPbomParentMapper.class).getPBomExistMaterialInChildForWorkList(parent.getMaterialNo());

View File

@ -8,6 +8,7 @@ import com.alibaba.excel.enums.BooleanEnum;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.conmon.util.SessionUtil;
import com.nflg.product.bomnew.constant.ConvertToPBomModelEnum; import com.nflg.product.bomnew.constant.ConvertToPBomModelEnum;
import com.nflg.product.bomnew.constant.EBomConstant;
import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum; import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum;
import com.nflg.product.bomnew.mapper.master.BomNewPbomParentMapper; import com.nflg.product.bomnew.mapper.master.BomNewPbomParentMapper;
import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity;
@ -18,9 +19,7 @@ import com.nflg.product.bomnew.util.ListCommonUtil;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -30,6 +29,7 @@ import java.util.stream.Collectors;
public class EBomToPBomForFormalNew extends FormalEBomToPbomBase { public class EBomToPBomForFormalNew extends FormalEBomToPbomBase {
private Map<String, List<BomNewEbomParentVO>> facBomDataMp = new HashMap<>();
public EBomToPBomForFormalNew(BomNewEbomParentVO inParent, List<BomNewEbomParentVO> inAllBomDetail, List<String> inFacCodes, Long parentRowId, ConvertToPBomModelEnum convertModelEnum) { public EBomToPBomForFormalNew(BomNewEbomParentVO inParent, List<BomNewEbomParentVO> inAllBomDetail, List<String> inFacCodes, Long parentRowId, ConvertToPBomModelEnum convertModelEnum) {
@ -42,6 +42,39 @@ public class EBomToPBomForFormalNew extends FormalEBomToPbomBase {
} }
private void splitData() {
//1020数据
List<BomNewEbomParentVO> data1020 = new ArrayList<>();
List<BomNewEbomParentVO> deliveryPackage1020 = result.stream().filter(u -> u.getParentRowId().equals(parent.getRowId()) && u.getMaterialName().contains("仙桃")).collect(Collectors.toList());
if (CollUtil.isNotEmpty(deliveryPackage1020)) {
data1020.add(parent);
for (BomNewEbomParentVO data : deliveryPackage1020) {
List<BomNewEbomParentVO> subVos = getResultAllSubIncludeSelf(data);
data1020.addAll(subVos);
}
facBomDataMp.put(EBomConstant.XIAN_TAO_FACTORY_CODE_1020, data1020);
}
//1010 数据
List<BomNewEbomParentVO> data1010 = new ArrayList<>();
List<BomNewEbomParentVO> deliveryPackage1010 = result.stream().filter(u -> u.getParentRowId().equals(parent.getRowId())).collect(Collectors.toList()); //&& !u.getMaterialName().contains("仙桃")
if (CollUtil.isNotEmpty(deliveryPackage1010)) {
data1010.add(parent);
for (BomNewEbomParentVO data : deliveryPackage1010) {
List<BomNewEbomParentVO> subVos = new ArrayList<>();
if (!data.getMaterialName().contains("仙桃") ) { //只获取下降虚拟包(排除仙桃油漆包)
subVos=getResultAllSubIncludeSelf(data);
}
data1010.addAll(subVos);
}
facBomDataMp.put(EBomConstant.MAIN_FACTORY_CODE_1010, data1010);
}
}
/** /**
* 31項体层 * 31項体层
@ -53,10 +86,21 @@ public class EBomToPBomForFormalNew extends FormalEBomToPbomBase {
check(); check();
//bom 提层 //bom 提层
liftingLayer(); liftingLayer();
List<BomNewEbomParentVO> parentList = ListCommonUtil.toDistinct(result.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
splitData();
List<String> hasConvert = new ArrayList<>(); List<String> hasConvert = new ArrayList<>();
for (String facCode : facCodes) { for (String facCode : facCodes) {
//仙桃的不发1010工厂
if(EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode) && parent.getMaterialName().contains("仙桃") ){
continue;
}
List<BomNewEbomParentVO> parentList = ListCommonUtil.toDistinct(result.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
if(EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode)){
parentList = ListCommonUtil.toDistinct(facBomDataMp.get(facCode).stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()), BomNewEbomParentVO::getBomRowId);
}
//buildPBomParent(parent, facCode); //buildPBomParent(parent, facCode);
for (BomNewEbomParentVO vo : parentList) { for (BomNewEbomParentVO vo : parentList) {
String hasConvertKey = StrUtil.join("-", facCode, vo.getBomRowId()); String hasConvertKey = StrUtil.join("-", facCode, vo.getBomRowId());
@ -71,23 +115,17 @@ public class EBomToPBomForFormalNew extends FormalEBomToPbomBase {
} }
//子级 //子级
List<BomNewEbomParentVO> child = result.stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList()); List<BomNewEbomParentVO> child = result.stream().filter(u -> u.getParentRowId().equals(vo.getBomRowId()) && !childDelMaterialNos.contains(u.getMaterialNo())).distinct().collect(Collectors.toList());
List<BomNewEbomParentVO> mergeChild = mergeChild(child); List<BomNewEbomParentVO> mergeChild=child;
//直发包/发货前包不合并
//对比PBOM 版本是否一致跟节点除外 if(!VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// if(!parent.getMaterialNo().equals(vo.getMaterialNo()) && !VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){ mergeChild = mergeChild(child);
// continue; }
// }
// if(VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(vo.getVirtualPartType()) || VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(vo.getVirtualPartType())){
// if(compareContentIsSame(vo,mergeChild,facCode)){
// continue;
// }
// }
BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList); BomNewPbomParentEntity parentEnt = buildPBomParent(vo, facCode,parentList);
if(Objects.isNull(parentEnt)){ if(Objects.isNull(parentEnt)){
continue; continue;
} }
//处理子级
mergeChild=handlerArtPackage(parentEnt,mergeChild,facCode,parentList);
//检查是否用户跟用户节点 //检查是否用户跟用户节点
if(parentEnt.getMaterialNo().equals(parent.getMaterialNo())) { if(parentEnt.getMaterialNo().equals(parent.getMaterialNo())) {
List<String> childMaterialNos = SpringUtil.getBean(BomNewPbomParentMapper.class).getPBomExistMaterialInChildForWorkList(parent.getMaterialNo()); List<String> childMaterialNos = SpringUtil.getBean(BomNewPbomParentMapper.class).getPBomExistMaterialInChildForWorkList(parent.getMaterialNo());

View File

@ -2,6 +2,7 @@ package com.nflg.product.bomnew.service.domain.EBom.topbomnew;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
@ -25,6 +26,7 @@ import lombok.Getter;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public abstract class FormalEBomToPbomBase { public abstract class FormalEBomToPbomBase {
@ -131,6 +133,14 @@ public abstract class FormalEBomToPbomBase {
return false; return false;
}
/**
* pbom- 排除工艺包新增行更新行的处理
* 1
*/
private void pBomHandler(BomNewEbomParentVO pVo){
} }
//合并子级 //合并子级
@ -183,6 +193,7 @@ public abstract class FormalEBomToPbomBase {
else if (Objects.nonNull(oldParent) && oldParent.getStatus() < EBomStatusEnum.PUBLISHED.getValue()) { else if (Objects.nonNull(oldParent) && oldParent.getStatus() < EBomStatusEnum.PUBLISHED.getValue()) {
//if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy())) { //if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy())) {
if (ConvertToPBomModelEnum.OVERRIDE.equalsValue(convertMode.getValue())) { if (ConvertToPBomModelEnum.OVERRIDE.equalsValue(convertMode.getValue())) {
if (oldParent.getCreatedBy().equals(parentVo.getCreatedBy()) || VersionUtil.compare(parentVo.getCurrentVersion(),oldParent.getCurrentVersion())>0) {
SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().deleteByMap(ImmutableMap.of("parent_row_id", oldParent.getRowId())); SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().deleteByMap(ImmutableMap.of("parent_row_id", oldParent.getRowId()));
oldParent.setSourceRowId(parentVo.getBomRowId()); oldParent.setSourceRowId(parentVo.getBomRowId());
oldParent.setCreatedTime(LocalDateTime.now()); oldParent.setCreatedTime(LocalDateTime.now());
@ -191,6 +202,7 @@ public abstract class FormalEBomToPbomBase {
oldParent.setDeptRowId(SessionUtil.getDepartRowId()); oldParent.setDeptRowId(SessionUtil.getDepartRowId());
this.pBomParentResult.add(oldParent); this.pBomParentResult.add(oldParent);
return oldParent; return oldParent;
}
} else { } else {
// 降parentVo 及其子节点标记为不转换 // 降parentVo 及其子节点标记为不转换
@ -206,44 +218,75 @@ public abstract class FormalEBomToPbomBase {
} }
/** private BomNewPbomChildEntity buildPBomAddChild(BomNewPbomParentEntity parent, String facCode, BomNewPbomParentVO oldChild){
* 获取Pbom-下一个版本只是项目类别发生变化则生成小版本否则大版本 BomNewPbomChildEntity childEnt = new BomNewPbomChildEntity();
*/ BeanUtil.copyProperties(oldChild, childEnt, "sourceRowId");
private String getPBomNextVersion(BomNewPbomParentEntity oldPBomParent, List<BomNewEbomParentVO> newChildren){ childEnt.setRowId(IdWorker.getId());
//旧bom除T项之外 childEnt.setParentRowId(parent.getRowId());
List<BomNewPbomParentVO> oldBomDetail = SpringUtil.getBean(BomNewPbomParentService.class).getBaseMapper().getParentChild(oldPBomParent.getRowId()); childEnt.setFacCode(facCode);
List<BomNewPbomParentVO> oldBomNoTChildren = oldBomDetail.stream().filter(u -> !EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProjectType())).collect(Collectors.toList()); childEnt.setIdentityNo(StrUtil.join("-", parent.getMaterialNo(), oldChild.getMaterialNo()));
//新BOM 除T项外 childEnt.setCreatedTime(LocalDateTime.now());
List<BomNewEbomParentVO> newBomNoTChildren = newChildren.stream().filter(u -> !EBomConstant.PROJECT_TYPE_T.equalsIgnoreCase(u.getProjectType())).collect(Collectors.toList()); childEnt.setCreatedBy(SessionUtil.getUserCode());
Set<String> oldChildSet = oldBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet());
Set<String> newChildSet = newBomNoTChildren.stream().map(u -> u.getMaterialNoAndNum()).collect(Collectors.toSet()); this.pBomChildResult.add(childEnt);
if(oldChildSet.equals(newChildSet)){ return childEnt;
return VersionUtil.getNextVersionForSmallVersion(oldPBomParent.getCurrentVersion());
}
return VersionUtil.getNextVersion(oldPBomParent.getCurrentVersion());
} }
/** /**
* Pbom明细对比 * 处理PBOM新增物料
* @param pVo
* @param newChildren
* @param facCode
* @return 一样则返回true 否则返回 false
*/ */
protected boolean pBomSameIs(BomNewEbomParentVO pVo, List<BomNewEbomParentVO> newChildren, String facCode){ protected List<BomNewEbomParentVO> handlerArtPackage(BomNewPbomParentEntity parent , List<BomNewEbomParentVO> newBomChildren ,String facCode ,List<BomNewEbomParentVO> parentList){
BomNewPbomParentEntity oldParent = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery() BomNewPbomParentEntity oldParent = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery().eq(BomNewPbomParentEntity::getMaterialNo, parent.getMaterialNo())
.eq(BomNewPbomParentEntity::getMaterialNo, pVo.getMaterialNo())
.eq(BomNewPbomParentEntity::getFacCode, facCode).last(" order by current_version desc limit 1").one(); .eq(BomNewPbomParentEntity::getFacCode, facCode).last(" order by current_version desc limit 1").one();
//正式才需对比 List<String> delResult=new ArrayList<>();
if(Objects.nonNull(oldParent) && PBomStatusEnum.PUBLISH.getValue()<= oldParent.getStatus()){ //pBom为已发布时
List<BomNewPbomChildEntity> pBomChildList = SpringUtil.getBean(BomNewPbomChildService.class).lambdaQuery().eq(BomNewPbomChildEntity::getParentRowId, oldParent.getRowId()).list(); if(Objects.nonNull(oldParent) && PBomStatusEnum.PUBLISH.getValue()<= oldParent.getStatus()) {
Set<String> oldSet = pBomChildList.stream().map(u -> StrUtil.join("",u.getMaterialNo(), u.getNum(), u.getProjectType())).collect(Collectors.toSet()); List<BomNewPbomParentVO> oldChildren=SpringUtil.getBean(BomNewPbomParentService.class).getChild(oldParent.getRowId(),1);
Set<String> newSet = newChildren.stream().map(u -> StrUtil.join("", u.getMaterialNo(), u.getNum(), u.getProjectType())).collect(Collectors.toSet());
if(oldSet.equals(newSet)){ //pBom 手工新增物料
return true; List<BomNewPbomParentVO> oldPBomAddChildren = oldChildren.stream().filter(u -> StrUtil.isBlank(u.getOriginalMaterialNo())).collect(Collectors.toList());
Map<String, BomNewEbomParentVO> newBomChildrenMap = newBomChildren.stream().collect(Collectors.toMap(BomNewEbomParentVO::getMaterialNo, Function.identity(),(u,u1) -> u));
for (BomNewPbomParentVO oldPBomAddItem : oldPBomAddChildren) {
//加入当前BOM明细中
buildPBomAddChild(parent, facCode, oldPBomAddItem);
//如为工艺包且在当前BOM中不存在
if (!VirtualPackageTypeEnum.DELIVERY_PACKAGE.equalsValue(oldPBomAddItem.getVirtualPartType()) && !VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.equalsValue(oldPBomAddItem.getVirtualPartType()) && !VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(oldPBomAddItem.getVirtualPartType()) && BomConstant.ART_PACKAGE_MATERIAL_CATEGORY_CODE.equals(oldPBomAddItem.getMaterialCategoryCode()) && !newBomChildrenMap.containsKey(oldPBomAddItem.getMaterialNo())) {
//创建工艺包版本
BomNewPbomParentEntity artParent = buildPBomParent(Convert.convert(BomNewEbomParentVO.class, oldPBomAddItem), facCode, parentList);
//old 工艺包子级
List<BomNewPbomParentVO> oldArtChildren = SpringUtil.getBean(BomNewPbomParentService.class).getChild(oldPBomAddItem.getBomRowId(), 1);
for (BomNewPbomParentVO oldArtChild : oldArtChildren) {
//工艺包新增
if (StrUtil.isBlank(oldArtChild.getOriginalMaterialNo())) {
buildPBomAddChild(artParent, facCode, oldArtChild);
}
if(StrUtil.isNotBlank(oldArtChild.getOriginalMaterialNo()) && newBomChildrenMap.containsKey(oldArtChild.getOriginalMaterialNo())){
// newBomChildrenMap.get(oldArtChild.getOriginalMaterialNo()).setParentRowId(artParent.getRowId());
buildPBomAddChild(artParent, facCode, Convert.convert(BomNewPbomParentVO.class,newBomChildrenMap.get(oldArtChild.getOriginalMaterialNo()) ));
delResult.add(oldArtChild.getOriginalMaterialNo());
} }
} }
return false; }
}
//pBom中修改过的
List<BomNewPbomParentVO> oldPBomUpdateChildren = oldChildren.stream().filter(u -> StrUtil.isNotBlank(u.getOriginalMaterialNo())).collect(Collectors.toList());
for (BomNewPbomParentVO oldPBomUpdateChild : oldPBomUpdateChildren) {
if (!oldPBomUpdateChild.getOriginalMaterialNo().equals(oldPBomUpdateChild.getMaterialNo()) || !oldPBomUpdateChild.getOriginalProjectType().equals(oldPBomUpdateChild.getProjectType()) || !oldPBomUpdateChild.getOriginalNum().equals(oldPBomUpdateChild.getNum())) {
List<BomNewEbomParentVO> upEnts = newBomChildren.stream().filter(u -> u.getMaterialNo().equals(oldPBomUpdateChild.getOriginalMaterialNo())
&& u.getProjectType().equals(oldPBomUpdateChild.getOriginalProjectType()) && VUtils.compareSafely(u.getNum(),oldPBomUpdateChild.getOriginalNum())==0).collect(Collectors.toList());
if (CollUtil.isNotEmpty(upEnts)) {
upEnts.get(0).setMaterialNo(oldPBomUpdateChild.getMaterialNo());
upEnts.get(0).setNum(oldPBomUpdateChild.getNum());
upEnts.get(0).setProjectType(oldPBomUpdateChild.getProjectType());
}
}
}
return newBomChildren.stream().filter(u->!delResult.contains(u.getMaterialNo())).collect(Collectors.toList());
}
return newBomChildren;
} }
private BomNewPbomParentEntity buildParentEntity(BomNewEbomParentVO parentVo, String facCode, BomNewPbomParentEntity oldParent, String bomVersion) { private BomNewPbomParentEntity buildParentEntity(BomNewEbomParentVO parentVo, String facCode, BomNewPbomParentEntity oldParent, String bomVersion) {
@ -379,7 +422,7 @@ public abstract class FormalEBomToPbomBase {
buildVirtualPackageComposition(lastVirtualPackage, ent); buildVirtualPackageComposition(lastVirtualPackage, ent);
} }
} }
newEnt.setBomRowId(0L); // newEnt.setBomRowId(0L);
newEnt.setChildBomRowId(0L); newEnt.setChildBomRowId(0L);
newEnt.setNum(sum); newEnt.setNum(sum);
return newEnt; return newEnt;

View File

@ -312,7 +312,11 @@ public class OriginalBomToEBomV2Convert extends BaseConvert {
parentEntity.setMaterialName(baseMaterialVO.getMaterialName()); parentEntity.setMaterialName(baseMaterialVO.getMaterialName());
parentEntity.setMaterialDesc(baseMaterialVO.getMaterialDesc()); parentEntity.setMaterialDesc(baseMaterialVO.getMaterialDesc());
parentEntity.setMaterialTexture(baseMaterialVO.getMaterialTexture()); parentEntity.setMaterialTexture(baseMaterialVO.getMaterialTexture());
parentEntity.setMaterialUnit("KG"); parentEntity.setMaterialUnit(baseMaterialVO.getMaterialUnit());
if(!baseMaterialVO.getMaterialUnit().equalsIgnoreCase("KG")){
parentEntity.setNum(null);
}
// parentEntity.setMaterialUnit("KG");
parentEntity.setProjectType("L"); parentEntity.setProjectType("L");
parentEntity.setDrawingNo(baseMaterialVO.getDrawingNo()); parentEntity.setDrawingNo(baseMaterialVO.getDrawingNo());
parentEntity.setRegReplaceIs(1); parentEntity.setRegReplaceIs(1);
@ -321,6 +325,7 @@ public class OriginalBomToEBomV2Convert extends BaseConvert {
} }
} }
private BaseMaterialVO getCommonMaterialByRel(BomOriginalListVO parentEntity) { private BaseMaterialVO getCommonMaterialByRel(BomOriginalListVO parentEntity) {
@ -358,7 +363,11 @@ public class OriginalBomToEBomV2Convert extends BaseConvert {
childEntity.setUnitWeight(parentV.getUnitWeight()); childEntity.setUnitWeight(parentV.getUnitWeight());
childEntity.setNum(parentV.getUnitWeight()); childEntity.setNum(parentV.getUnitWeight());
childEntity.setCreatedBy(SessionUtil.getUserCode()); childEntity.setCreatedBy(SessionUtil.getUserCode());
childEntity.setMaterialUnit("KG"); if(!material.getMaterialUnit().equalsIgnoreCase("KG")){
childEntity.setNum(null);
}
childEntity.setMaterialUnit(material.getMaterialUnit());
// childEntity.setMaterialUnit("KG");
childEntity.setProjectType("L"); childEntity.setProjectType("L");
childEntity.setMaterialOriginalUnit(material.getMaterialUnit()); childEntity.setMaterialOriginalUnit(material.getMaterialUnit());
childEntity.setSourceRowId(parentV.getRowId().toString()); childEntity.setSourceRowId(parentV.getRowId().toString());

View File

@ -89,7 +89,7 @@ public class PBomUpgrade {
pbomParent.setCreatedBy(SessionUtil.getUserCode()); pbomParent.setCreatedBy(SessionUtil.getUserCode());
pbomParent.setStatus(PBomStatusEnum.WAIT_PUBLISH.getValue()); pbomParent.setStatus(PBomStatusEnum.WAIT_PUBLISH.getValue());
pbomParent.setEditStatus(PBomEditStatusEnum.HANDLER_CREATED.getValue()); pbomParent.setEditStatus(PBomEditStatusEnum.HANDLER_CREATED.getValue());
pbomParent.setCurrentVersion(VersionUtil.getNextVersion(parentVO.getCurrentVersion())); pbomParent.setCurrentVersion(VersionUtil.getPBomUpgradNextVersion(parentVO.getCurrentVersion()));
pbomParent.setDeptRowId(SessionUtil.getDepartRowId()); pbomParent.setDeptRowId(SessionUtil.getDepartRowId());
pbomParent.setDeptName(SessionUtil.getDepartName()); pbomParent.setDeptName(SessionUtil.getDepartName());
pbomParent.setDeviseName(SessionUtil.getRealName()); pbomParent.setDeviseName(SessionUtil.getRealName());

View File

@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.conmon.util.SessionUtil;
import com.nflg.product.bomnew.constant.PBomStatusEnum; import com.nflg.product.bomnew.constant.PBomStatusEnum;
import com.nflg.product.bomnew.constant.PbomSourceStatusEnum;
import com.nflg.product.bomnew.pojo.dto.TechnologyPackageParam; import com.nflg.product.bomnew.pojo.dto.TechnologyPackageParam;
import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity;
import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity;
@ -232,6 +233,7 @@ public class TechnologyPackageParamBuilder {
child.setCreatedTime(LocalDateTime.now()); child.setCreatedTime(LocalDateTime.now());
child.setModifyTime(LocalDateTime.now()); child.setModifyTime(LocalDateTime.now());
child.setSourceRowId(0L); child.setSourceRowId(0L);
child.setSourceStatus(PbomSourceStatusEnum.PBOM.getValue());
this.packageChildren.add(child); this.packageChildren.add(child);
return child; return child;
} }

View File

@ -7,6 +7,7 @@ import com.nflg.product.bomnew.inteface.ThrowExceptionFunction;
import com.nflg.product.bomnew.inteface.TrueHandleFunction; import com.nflg.product.bomnew.inteface.TrueHandleFunction;
import nflg.product.common.constant.STATE; import nflg.product.common.constant.STATE;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -89,4 +90,16 @@ public class VUtils {
} }
return list; return list;
} }
public static int compareSafely(BigDecimal a, BigDecimal b) {
if (a == null && b == null) {
return 0; // 两个都是null认为相等
} else if (a == null) {
return -1; // 只有a是null认为a更小
} else if (b == null) {
return -1; // 只有b是null认为b更小
} else {
return a.compareTo(b); // 两个都不为null直接比较
}
}
} }

View File

@ -5,7 +5,9 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import org.springframework.data.util.Version; import org.springframework.data.util.Version;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import static org.apache.naming.SelectorContext.prefix; import static org.apache.naming.SelectorContext.prefix;
@ -59,6 +61,7 @@ public class VersionUtil {
// Split the previous version number into its components // Split the previous version number into its components
String[] previousComponents = previousVersion.replace(versionPrefix, "").split("\\."); String[] previousComponents = previousVersion.replace(versionPrefix, "").split("\\.");
previousComponents= filterNumericStrings(previousComponents).toArray(new String[0]);
int previousMajor = Integer.parseInt(previousComponents[0]); int previousMajor = Integer.parseInt(previousComponents[0]);
int previousMinor = previousComponents.length < 2 ? 0 : Integer.parseInt(previousComponents[1]); int previousMinor = previousComponents.length < 2 ? 0 : Integer.parseInt(previousComponents[1]);
@ -86,6 +89,43 @@ public class VersionUtil {
return nextVersion; return nextVersion;
} }
/**
* 过滤出数组中仅包含数字的字符串
*
* @param array 输入的字符串数组
* @return 包含数字字符串的列表
*/
public static List<String> filterNumericStrings(String[] array) {
List<String> result = new ArrayList<>();
for (String s : array) {
if (isNumeric(s)) {
result.add(s);
}
}
return result;
}
/**
* 检查给定的字符串是否表示一个数字
* 支持整数浮点数和科学计数法表示的数字
*
* @param str 要检查的字符串
* @return 如果字符串表示一个数字则返回true否则返回false
*/
private static boolean isNumeric(String str) {
if (str == null || str.isEmpty()) {
return false;
}
try {
// 尝试将字符串转换为Double类型
Double.parseDouble(str);
return true;
} catch (NumberFormatException e) {
// 如果转换失败说明不是有效的数字格式
return false;
}
}
/** /**
* 版本比较 * 版本比较
* @param version1 * @param version1
@ -122,4 +162,45 @@ public class VersionUtil {
return Integer.compare(split1.length, split2.length); return Integer.compare(split1.length, split2.length);
} }
/**
* 获取PBOM 升级版本号PBOM升级版本号规则
* @param version
* @return
*/
public static String getPBomUpgradNextVersion(String version) {
if (version == null || version.isEmpty()) {
throw new IllegalArgumentException("输入版本号不能为空");
}
char lastChar = version.charAt(version.length() - 1);
boolean isLetter = Character.isLetter(lastChar);
if (!isLetter) {
return version + ".a";
} else {
int lastCharIndex = version.length() - 1;
char newLastChar = (char) (lastChar + 1);
if (newLastChar > 'z') {
// Handle case where the last character is 'z'
StringBuilder sb = new StringBuilder(version.substring(0, lastCharIndex));
if(!sb.toString().contains(".")) {
sb.append(".");
}
sb.append("a").append('a');
return sb.toString();
} else {
return version.substring(0, lastCharIndex) + newLastChar;
}
}
}
private static String getNextLetter(char currentLetter) {
char nextLetter = (char) (currentLetter + 1);
if (nextLetter > 'z') {
return "a" + getNextLetter('a');
} else {
return "" + nextLetter;
}
}
} }